docs\\10-dix.html 229 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666
  1. <!DOCTYPE html><html lang="zh-cmn-Hans"><head>
  2. <meta charset="utf-8">
  3. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  4. <style type="text/css">
  5. .anim-fade-in{-webkit-animation-name:fade-in;animation-name:fade-in;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.anim-fade-in.fast{-webkit-animation-duration:300ms;animation-duration:300ms}@-webkit-keyframes fade-in{0%{opacity:0}100%{opacity:1}}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.anim-fade-up{opacity:0;-webkit-animation-name:fade-up;animation-name:fade-up;-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-animation-delay:1s;animation-delay:1s}@-webkit-keyframes fade-up{0%{opacity:0.8;-webkit-transform:translateY(100%);transform:translateY(100%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fade-up{0%{opacity:0.8;-webkit-transform:translateY(100%);transform:translateY(100%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.anim-fade-down{-webkit-animation-name:fade-down;animation-name:fade-down;-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes fade-down{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0.5;-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes fade-down{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0.5;-webkit-transform:translateY(100%);transform:translateY(100%)}}.anim-grow-x{width:0%;-webkit-animation-name:grow-x;animation-name:grow-x;-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-delay:0.5s;animation-delay:0.5s}@-webkit-keyframes grow-x{to{width:100%}}@keyframes grow-x{to{width:100%}}.anim-shrink-x{-webkit-animation-name:shrink-x;animation-name:shrink-x;-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-delay:0.5s;animation-delay:0.5s}@-webkit-keyframes shrink-x{to{width:0%}}@keyframes shrink-x{to{width:0%}}.anim-scale-in{-webkit-animation-name:scale-in;animation-name:scale-in;-webkit-animation-duration:0.15s;animation-duration:0.15s;-webkit-animation-timing-function:cubic-bezier(0.2, 0, 0.13, 1.5);animation-timing-function:cubic-bezier(0.2, 0, 0.13, 1.5)}@-webkit-keyframes scale-in{0%{opacity:0;-webkit-transform:scale(0.5);transform:scale(0.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes scale-in{0%{opacity:0;-webkit-transform:scale(0.5);transform:scale(0.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.anim-pulse{-webkit-animation-name:pulse;animation-name:pulse;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-webkit-keyframes pulse{0%{opacity:0.3}10%{opacity:1}100%{opacity:0.3}}@keyframes pulse{0%{opacity:0.3}10%{opacity:1}100%{opacity:0.3}}.anim-pulse-in{-webkit-animation-name:pulse-in;animation-name:pulse-in;-webkit-animation-duration:0.5s;animation-duration:0.5s}@-webkit-keyframes pulse-in{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}50%{-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes pulse-in{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}50%{-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}.border{border:1px #e1e4e8 solid !important}.border-top{border-top:1px #e1e4e8 solid !important}.border-right{border-right:1px #e1e4e8 solid !important}.border-bottom{border-bottom:1px #e1e4e8 solid !important}.border-left{border-left:1px #e1e4e8 solid !important}.border-y{border-top:1px #e1e4e8 solid !important;border-bottom:1px #e1e4e8 solid !important}.border-dashed{border-style:dashed !important}.border-blue{border-color:#0366d6 !important}.border-blue-light{border-color:#c8e1ff !important}.border-green{border-color:#34d058 !important}.border-green-light{border-color:#a2cbac !important}.border-red{border-color:#d73a49 !important}.border-red-light{border-color:#cea0a5 !important}.border-purple{border-color:#6f42c1 !important}.border-yellow{border-color:#d9d0a5 !important}.border-gray-light{border-color:#eaecef !important}.border-gray-dark{border-color:#d1d5da !important}.border-black-fade{border-color:rgba(27,31,35,0.15) !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:3px !important}.rounded-2{border-radius:6px !important}.box-shadow{box-shadow:0 1px 1px rgba(0,0,0,0.1) !important}.box-shadow-medium{box-shadow:0 1px 5px rgba(0,0,0,0.15) !important}.box-shadow-large{box-shadow:0 1px 15px rgba(0,0,0,0.15) !important}.box-shadow-extra-large{box-shadow:0 10px 50px rgba(0,0,0,0.07) !important}.box-shadow-none{box-shadow:none !important}.bg-white{background-color:#fff !important}.bg-blue{background-color:#0366d6 !important}.bg-blue-light{background-color:#f1f8ff !important}.bg-gray-dark{background-color:#24292e !important}.bg-gray{background-color:#f6f8fa !important}.bg-gray-light{background-color:#fafbfc !important}.bg-green{background-color:#28a745 !important}.bg-green-light{background-color:#dcffe4 !important}.bg-red{background-color:#d73a49 !important}.bg-red-light{background-color:#ffdce0 !important}.bg-yellow{background-color:#ffd33d !important}.bg-yellow-light{background-color:#fff5b1 !important}.bg-purple{background-color:#6f42c1 !important}.bg-purple-light{background-color:#f5f0ff !important}.bg-shade-gradient{background-image:-webkit-linear-gradient(270deg, rgba(0,0,0,0.065), transparent) !important;background-image:linear-gradient(180deg, rgba(0,0,0,0.065), transparent) !important;background-repeat:no-repeat !important;background-size:100% 200px !important}.text-blue{color:#0366d6 !important}.text-red{color:#cb2431 !important}.text-gray-light{color:#6a737d !important}.text-gray{color:#586069 !important}.text-gray-dark{color:#24292e !important}.text-green{color:#28a745 !important}.text-orange{color:#a04100 !important}.text-orange-light{color:#e36209 !important}.text-purple{color:#6f42c1 !important}.text-white{color:#fff !important}.text-inherit{color:inherit !important}.text-pending{color:#b08800 !important}.bg-pending{color:#dbab09 !important}.link-gray{color:#586069 !important}.link-gray:hover{color:#0366d6 !important}.link-gray-dark{color:#24292e !important}.link-gray-dark:hover{color:#0366d6 !important}.link-hover-blue:hover{color:#0366d6 !important}.muted-link{color:#586069 !important}.muted-link:hover{color:#0366d6 !important;text-decoration:none}.flex-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}@media (min-width: 544px){.flex-sm-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-sm-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-sm-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-sm-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-sm-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-sm-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-sm-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-sm-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-sm-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-sm-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-sm-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-sm-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-sm-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-sm-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-sm-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-sm-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-sm-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-sm-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-sm-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-sm-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-sm-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-sm-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-sm-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-sm-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-sm-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-sm-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-sm-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-sm-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-sm-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-sm-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}}@media (min-width: 768px){.flex-md-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-md-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-md-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-md-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-md-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-md-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-md-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-md-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-md-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-md-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-md-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-md-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-md-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-md-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-md-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-md-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-md-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-md-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-md-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-md-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-md-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-md-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-md-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-md-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-md-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-md-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-md-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-md-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-md-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-md-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}}@media (min-width: 1012px){.flex-lg-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-lg-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-lg-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-lg-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-lg-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-lg-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-lg-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-lg-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-lg-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-lg-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-lg-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-lg-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-lg-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-lg-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-lg-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-lg-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-lg-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-lg-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-lg-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-lg-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-lg-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-lg-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-lg-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-lg-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-lg-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-lg-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-lg-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-lg-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-lg-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-lg-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}}@media (min-width: 1280px){.flex-xl-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-xl-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-xl-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-xl-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-xl-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-xl-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-xl-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-xl-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-xl-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-xl-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-xl-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-xl-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-xl-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-xl-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-xl-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-xl-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-xl-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-xl-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-xl-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-xl-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-xl-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-xl-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-xl-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-xl-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-xl-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-xl-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-xl-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-xl-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-xl-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-xl-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.top-0{top:0 !important}.right-0{right:0 !important}.bottom-0{bottom:0 !important}.left-0{left:0 !important}.v-align-middle{vertical-align:middle !important}.v-align-top{vertical-align:top !important}.v-align-bottom{vertical-align:bottom !important}.v-align-text-top{vertical-align:text-top !important}.v-align-text-bottom{vertical-align:text-bottom !important}.overflow-hidden{overflow:hidden !important}.overflow-scroll{overflow:scroll !important}.overflow-auto{overflow:auto !important}.clearfix::before{display:table;content:""}.clearfix::after{display:table;clear:both;content:""}.float-right{float:right !important}.float-left{float:left !important}.float-none{float:none !important}@media (min-width: 544px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width: 1012px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width: 1280px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.width-fit{max-width:100% !important}.width-full{width:100% !important}.height-full{height:100% !important}.min-width-0{min-width:0 !important}.direction-rtl{direction:rtl !important}.direction-ltr{direction:ltr !important}@media (min-width: 544px){.direction-sm-rtl{direction:rtl !important}.direction-sm-ltr{direction:ltr !important}}@media (min-width: 768px){.direction-md-rtl{direction:rtl !important}.direction-md-ltr{direction:ltr !important}}@media (min-width: 1012px){.direction-lg-rtl{direction:rtl !important}.direction-lg-ltr{direction:ltr !important}}@media (min-width: 1280px){.direction-xl-rtl{direction:rtl !important}.direction-xl-ltr{direction:ltr !important}}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mt-n0{margin-top:-0 !important}.mr-n0{margin-right:-0 !important}.mb-n0{margin-bottom:-0 !important}.ml-n0{margin-left:-0 !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:4px !important}.mt-1{margin-top:4px !important}.mr-1{margin-right:4px !important}.mb-1{margin-bottom:4px !important}.ml-1{margin-left:4px !important}.mt-n1{margin-top:-4px !important}.mr-n1{margin-right:-4px !important}.mb-n1{margin-bottom:-4px !important}.ml-n1{margin-left:-4px !important}.mx-1{margin-right:4px !important;margin-left:4px !important}.my-1{margin-top:4px !important;margin-bottom:4px !important}.m-2{margin:8px !important}.mt-2{margin-top:8px !important}.mr-2{margin-right:8px !important}.mb-2{margin-bottom:8px !important}.ml-2{margin-left:8px !important}.mt-n2{margin-top:-8px !important}.mr-n2{margin-right:-8px !important}.mb-n2{margin-bottom:-8px !important}.ml-n2{margin-left:-8px !important}.mx-2{margin-right:8px !important;margin-left:8px !important}.my-2{margin-top:8px !important;margin-bottom:8px !important}.m-3{margin:16px !important}.mt-3{margin-top:16px !important}.mr-3{margin-right:16px !important}.mb-3{margin-bottom:16px !important}.ml-3{margin-left:16px !important}.mt-n3{margin-top:-16px !important}.mr-n3{margin-right:-16px !important}.mb-n3{margin-bottom:-16px !important}.ml-n3{margin-left:-16px !important}.mx-3{margin-right:16px !important;margin-left:16px !important}.my-3{margin-top:16px !important;margin-bottom:16px !important}.m-4{margin:24px !important}.mt-4{margin-top:24px !important}.mr-4{margin-right:24px !important}.mb-4{margin-bottom:24px !important}.ml-4{margin-left:24px !important}.mt-n4{margin-top:-24px !important}.mr-n4{margin-right:-24px !important}.mb-n4{margin-bottom:-24px !important}.ml-n4{margin-left:-24px !important}.mx-4{margin-right:24px !important;margin-left:24px !important}.my-4{margin-top:24px !important;margin-bottom:24px !important}.m-5{margin:32px !important}.mt-5{margin-top:32px !important}.mr-5{margin-right:32px !important}.mb-5{margin-bottom:32px !important}.ml-5{margin-left:32px !important}.mt-n5{margin-top:-32px !important}.mr-n5{margin-right:-32px !important}.mb-n5{margin-bottom:-32px !important}.ml-n5{margin-left:-32px !important}.mx-5{margin-right:32px !important;margin-left:32px !important}.my-5{margin-top:32px !important;margin-bottom:32px !important}.m-6{margin:40px !important}.mt-6{margin-top:40px !important}.mr-6{margin-right:40px !important}.mb-6{margin-bottom:40px !important}.ml-6{margin-left:40px !important}.mt-n6{margin-top:-40px !important}.mr-n6{margin-right:-40px !important}.mb-n6{margin-bottom:-40px !important}.ml-n6{margin-left:-40px !important}.mx-6{margin-right:40px !important;margin-left:40px !important}.my-6{margin-top:40px !important;margin-bottom:40px !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}@media (min-width: 544px){.m-sm-0{margin:0 !important}.mt-sm-0{margin-top:0 !important}.mr-sm-0{margin-right:0 !important}.mb-sm-0{margin-bottom:0 !important}.ml-sm-0{margin-left:0 !important}.mt-sm-n0{margin-top:-0 !important}.mr-sm-n0{margin-right:-0 !important}.mb-sm-n0{margin-bottom:-0 !important}.ml-sm-n0{margin-left:-0 !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}}@media (min-width: 544px){.m-sm-1{margin:4px !important}.mt-sm-1{margin-top:4px !important}.mr-sm-1{margin-right:4px !important}.mb-sm-1{margin-bottom:4px !important}.ml-sm-1{margin-left:4px !important}.mt-sm-n1{margin-top:-4px !important}.mr-sm-n1{margin-right:-4px !important}.mb-sm-n1{margin-bottom:-4px !important}.ml-sm-n1{margin-left:-4px !important}.mx-sm-1{margin-right:4px !important;margin-left:4px !important}.my-sm-1{margin-top:4px !important;margin-bottom:4px !important}}@media (min-width: 544px){.m-sm-2{margin:8px !important}.mt-sm-2{margin-top:8px !important}.mr-sm-2{margin-right:8px !important}.mb-sm-2{margin-bottom:8px !important}.ml-sm-2{margin-left:8px !important}.mt-sm-n2{margin-top:-8px !important}.mr-sm-n2{margin-right:-8px !important}.mb-sm-n2{margin-bottom:-8px !important}.ml-sm-n2{margin-left:-8px !important}.mx-sm-2{margin-right:8px !important;margin-left:8px !important}.my-sm-2{margin-top:8px !important;margin-bottom:8px !important}}@media (min-width: 544px){.m-sm-3{margin:16px !important}.mt-sm-3{margin-top:16px !important}.mr-sm-3{margin-right:16px !important}.mb-sm-3{margin-bottom:16px !important}.ml-sm-3{margin-left:16px !important}.mt-sm-n3{margin-top:-16px !important}.mr-sm-n3{margin-right:-16px !important}.mb-sm-n3{margin-bottom:-16px !important}.ml-sm-n3{margin-left:-16px !important}.mx-sm-3{margin-right:16px !important;margin-left:16px !important}.my-sm-3{margin-top:16px !important;margin-bottom:16px !important}}@media (min-width: 544px){.m-sm-4{margin:24px !important}.mt-sm-4{margin-top:24px !important}.mr-sm-4{margin-right:24px !important}.mb-sm-4{margin-bottom:24px !important}.ml-sm-4{margin-left:24px !important}.mt-sm-n4{margin-top:-24px !important}.mr-sm-n4{margin-right:-24px !important}.mb-sm-n4{margin-bottom:-24px !important}.ml-sm-n4{margin-left:-24px !important}.mx-sm-4{margin-right:24px !important;margin-left:24px !important}.my-sm-4{margin-top:24px !important;margin-bottom:24px !important}}@media (min-width: 544px){.m-sm-5{margin:32px !important}.mt-sm-5{margin-top:32px !important}.mr-sm-5{margin-right:32px !important}.mb-sm-5{margin-bottom:32px !important}.ml-sm-5{margin-left:32px !important}.mt-sm-n5{margin-top:-32px !important}.mr-sm-n5{margin-right:-32px !important}.mb-sm-n5{margin-bottom:-32px !important}.ml-sm-n5{margin-left:-32px !important}.mx-sm-5{margin-right:32px !important;margin-left:32px !important}.my-sm-5{margin-top:32px !important;margin-bottom:32px !important}}@media (min-width: 544px){.m-sm-6{margin:40px !important}.mt-sm-6{margin-top:40px !important}.mr-sm-6{margin-right:40px !important}.mb-sm-6{margin-bottom:40px !important}.ml-sm-6{margin-left:40px !important}.mt-sm-n6{margin-top:-40px !important}.mr-sm-n6{margin-right:-40px !important}.mb-sm-n6{margin-bottom:-40px !important}.ml-sm-n6{margin-left:-40px !important}.mx-sm-6{margin-right:40px !important;margin-left:40px !important}.my-sm-6{margin-top:40px !important;margin-bottom:40px !important}}@media (min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0{margin-top:0 !important}.mr-md-0{margin-right:0 !important}.mb-md-0{margin-bottom:0 !important}.ml-md-0{margin-left:0 !important}.mt-md-n0{margin-top:-0 !important}.mr-md-n0{margin-right:-0 !important}.mb-md-n0{margin-bottom:-0 !important}.ml-md-n0{margin-left:-0 !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}}@media (min-width: 768px){.m-md-1{margin:4px !important}.mt-md-1{margin-top:4px !important}.mr-md-1{margin-right:4px !important}.mb-md-1{margin-bottom:4px !important}.ml-md-1{margin-left:4px !important}.mt-md-n1{margin-top:-4px !important}.mr-md-n1{margin-right:-4px !important}.mb-md-n1{margin-bottom:-4px !important}.ml-md-n1{margin-left:-4px !important}.mx-md-1{margin-right:4px !important;margin-left:4px !important}.my-md-1{margin-top:4px !important;margin-bottom:4px !important}}@media (min-width: 768px){.m-md-2{margin:8px !important}.mt-md-2{margin-top:8px !important}.mr-md-2{margin-right:8px !important}.mb-md-2{margin-bottom:8px !important}.ml-md-2{margin-left:8px !important}.mt-md-n2{margin-top:-8px !important}.mr-md-n2{margin-right:-8px !important}.mb-md-n2{margin-bottom:-8px !important}.ml-md-n2{margin-left:-8px !important}.mx-md-2{margin-right:8px !important;margin-left:8px !important}.my-md-2{margin-top:8px !important;margin-bottom:8px !important}}@media (min-width: 768px){.m-md-3{margin:16px !important}.mt-md-3{margin-top:16px !important}.mr-md-3{margin-right:16px !important}.mb-md-3{margin-bottom:16px !important}.ml-md-3{margin-left:16px !important}.mt-md-n3{margin-top:-16px !important}.mr-md-n3{margin-right:-16px !important}.mb-md-n3{margin-bottom:-16px !important}.ml-md-n3{margin-left:-16px !important}.mx-md-3{margin-right:16px !important;margin-left:16px !important}.my-md-3{margin-top:16px !important;margin-bottom:16px !important}}@media (min-width: 768px){.m-md-4{margin:24px !important}.mt-md-4{margin-top:24px !important}.mr-md-4{margin-right:24px !important}.mb-md-4{margin-bottom:24px !important}.ml-md-4{margin-left:24px !important}.mt-md-n4{margin-top:-24px !important}.mr-md-n4{margin-right:-24px !important}.mb-md-n4{margin-bottom:-24px !important}.ml-md-n4{margin-left:-24px !important}.mx-md-4{margin-right:24px !important;margin-left:24px !important}.my-md-4{margin-top:24px !important;margin-bottom:24px !important}}@media (min-width: 768px){.m-md-5{margin:32px !important}.mt-md-5{margin-top:32px !important}.mr-md-5{margin-right:32px !important}.mb-md-5{margin-bottom:32px !important}.ml-md-5{margin-left:32px !important}.mt-md-n5{margin-top:-32px !important}.mr-md-n5{margin-right:-32px !important}.mb-md-n5{margin-bottom:-32px !important}.ml-md-n5{margin-left:-32px !important}.mx-md-5{margin-right:32px !important;margin-left:32px !important}.my-md-5{margin-top:32px !important;margin-bottom:32px !important}}@media (min-width: 768px){.m-md-6{margin:40px !important}.mt-md-6{margin-top:40px !important}.mr-md-6{margin-right:40px !important}.mb-md-6{margin-bottom:40px !important}.ml-md-6{margin-left:40px !important}.mt-md-n6{margin-top:-40px !important}.mr-md-n6{margin-right:-40px !important}.mb-md-n6{margin-bottom:-40px !important}.ml-md-n6{margin-left:-40px !important}.mx-md-6{margin-right:40px !important;margin-left:40px !important}.my-md-6{margin-top:40px !important;margin-bottom:40px !important}}@media (min-width: 1012px){.m-lg-0{margin:0 !important}.mt-lg-0{margin-top:0 !important}.mr-lg-0{margin-right:0 !important}.mb-lg-0{margin-bottom:0 !important}.ml-lg-0{margin-left:0 !important}.mt-lg-n0{margin-top:-0 !important}.mr-lg-n0{margin-right:-0 !important}.mb-lg-n0{margin-bottom:-0 !important}.ml-lg-n0{margin-left:-0 !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}}@media (min-width: 1012px){.m-lg-1{margin:4px !important}.mt-lg-1{margin-top:4px !important}.mr-lg-1{margin-right:4px !important}.mb-lg-1{margin-bottom:4px !important}.ml-lg-1{margin-left:4px !important}.mt-lg-n1{margin-top:-4px !important}.mr-lg-n1{margin-right:-4px !important}.mb-lg-n1{margin-bottom:-4px !important}.ml-lg-n1{margin-left:-4px !important}.mx-lg-1{margin-right:4px !important;margin-left:4px !important}.my-lg-1{margin-top:4px !important;margin-bottom:4px !important}}@media (min-width: 1012px){.m-lg-2{margin:8px !important}.mt-lg-2{margin-top:8px !important}.mr-lg-2{margin-right:8px !important}.mb-lg-2{margin-bottom:8px !important}.ml-lg-2{margin-left:8px !important}.mt-lg-n2{margin-top:-8px !important}.mr-lg-n2{margin-right:-8px !important}.mb-lg-n2{margin-bottom:-8px !important}.ml-lg-n2{margin-left:-8px !important}.mx-lg-2{margin-right:8px !important;margin-left:8px !important}.my-lg-2{margin-top:8px !important;margin-bottom:8px !important}}@media (min-width: 1012px){.m-lg-3{margin:16px !important}.mt-lg-3{margin-top:16px !important}.mr-lg-3{margin-right:16px !important}.mb-lg-3{margin-bottom:16px !important}.ml-lg-3{margin-left:16px !important}.mt-lg-n3{margin-top:-16px !important}.mr-lg-n3{margin-right:-16px !important}.mb-lg-n3{margin-bottom:-16px !important}.ml-lg-n3{margin-left:-16px !important}.mx-lg-3{margin-right:16px !important;margin-left:16px !important}.my-lg-3{margin-top:16px !important;margin-bottom:16px !important}}@media (min-width: 1012px){.m-lg-4{margin:24px !important}.mt-lg-4{margin-top:24px !important}.mr-lg-4{margin-right:24px !important}.mb-lg-4{margin-bottom:24px !important}.ml-lg-4{margin-left:24px !important}.mt-lg-n4{margin-top:-24px !important}.mr-lg-n4{margin-right:-24px !important}.mb-lg-n4{margin-bottom:-24px !important}.ml-lg-n4{margin-left:-24px !important}.mx-lg-4{margin-right:24px !important;margin-left:24px !important}.my-lg-4{margin-top:24px !important;margin-bottom:24px !important}}@media (min-width: 1012px){.m-lg-5{margin:32px !important}.mt-lg-5{margin-top:32px !important}.mr-lg-5{margin-right:32px !important}.mb-lg-5{margin-bottom:32px !important}.ml-lg-5{margin-left:32px !important}.mt-lg-n5{margin-top:-32px !important}.mr-lg-n5{margin-right:-32px !important}.mb-lg-n5{margin-bottom:-32px !important}.ml-lg-n5{margin-left:-32px !important}.mx-lg-5{margin-right:32px !important;margin-left:32px !important}.my-lg-5{margin-top:32px !important;margin-bottom:32px !important}}@media (min-width: 1012px){.m-lg-6{margin:40px !important}.mt-lg-6{margin-top:40px !important}.mr-lg-6{margin-right:40px !important}.mb-lg-6{margin-bottom:40px !important}.ml-lg-6{margin-left:40px !important}.mt-lg-n6{margin-top:-40px !important}.mr-lg-n6{margin-right:-40px !important}.mb-lg-n6{margin-bottom:-40px !important}.ml-lg-n6{margin-left:-40px !important}.mx-lg-6{margin-right:40px !important;margin-left:40px !important}.my-lg-6{margin-top:40px !important;margin-bottom:40px !important}}@media (min-width: 1280px){.m-xl-0{margin:0 !important}.mt-xl-0{margin-top:0 !important}.mr-xl-0{margin-right:0 !important}.mb-xl-0{margin-bottom:0 !important}.ml-xl-0{margin-left:0 !important}.mt-xl-n0{margin-top:-0 !important}.mr-xl-n0{margin-right:-0 !important}.mb-xl-n0{margin-bottom:-0 !important}.ml-xl-n0{margin-left:-0 !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}}@media (min-width: 1280px){.m-xl-1{margin:4px !important}.mt-xl-1{margin-top:4px !important}.mr-xl-1{margin-right:4px !important}.mb-xl-1{margin-bottom:4px !important}.ml-xl-1{margin-left:4px !important}.mt-xl-n1{margin-top:-4px !important}.mr-xl-n1{margin-right:-4px !important}.mb-xl-n1{margin-bottom:-4px !important}.ml-xl-n1{margin-left:-4px !important}.mx-xl-1{margin-right:4px !important;margin-left:4px !important}.my-xl-1{margin-top:4px !important;margin-bottom:4px !important}}@media (min-width: 1280px){.m-xl-2{margin:8px !important}.mt-xl-2{margin-top:8px !important}.mr-xl-2{margin-right:8px !important}.mb-xl-2{margin-bottom:8px !important}.ml-xl-2{margin-left:8px !important}.mt-xl-n2{margin-top:-8px !important}.mr-xl-n2{margin-right:-8px !important}.mb-xl-n2{margin-bottom:-8px !important}.ml-xl-n2{margin-left:-8px !important}.mx-xl-2{margin-right:8px !important;margin-left:8px !important}.my-xl-2{margin-top:8px !important;margin-bottom:8px !important}}@media (min-width: 1280px){.m-xl-3{margin:16px !important}.mt-xl-3{margin-top:16px !important}.mr-xl-3{margin-right:16px !important}.mb-xl-3{margin-bottom:16px !important}.ml-xl-3{margin-left:16px !important}.mt-xl-n3{margin-top:-16px !important}.mr-xl-n3{margin-right:-16px !important}.mb-xl-n3{margin-bottom:-16px !important}.ml-xl-n3{margin-left:-16px !important}.mx-xl-3{margin-right:16px !important;margin-left:16px !important}.my-xl-3{margin-top:16px !important;margin-bottom:16px !important}}@media (min-width: 1280px){.m-xl-4{margin:24px !important}.mt-xl-4{margin-top:24px !important}.mr-xl-4{margin-right:24px !important}.mb-xl-4{margin-bottom:24px !important}.ml-xl-4{margin-left:24px !important}.mt-xl-n4{margin-top:-24px !important}.mr-xl-n4{margin-right:-24px !important}.mb-xl-n4{margin-bottom:-24px !important}.ml-xl-n4{margin-left:-24px !important}.mx-xl-4{margin-right:24px !important;margin-left:24px !important}.my-xl-4{margin-top:24px !important;margin-bottom:24px !important}}@media (min-width: 1280px){.m-xl-5{margin:32px !important}.mt-xl-5{margin-top:32px !important}.mr-xl-5{margin-right:32px !important}.mb-xl-5{margin-bottom:32px !important}.ml-xl-5{margin-left:32px !important}.mt-xl-n5{margin-top:-32px !important}.mr-xl-n5{margin-right:-32px !important}.mb-xl-n5{margin-bottom:-32px !important}.ml-xl-n5{margin-left:-32px !important}.mx-xl-5{margin-right:32px !important;margin-left:32px !important}.my-xl-5{margin-top:32px !important;margin-bottom:32px !important}}@media (min-width: 1280px){.m-xl-6{margin:40px !important}.mt-xl-6{margin-top:40px !important}.mr-xl-6{margin-right:40px !important}.mb-xl-6{margin-bottom:40px !important}.ml-xl-6{margin-left:40px !important}.mt-xl-n6{margin-top:-40px !important}.mr-xl-n6{margin-right:-40px !important}.mb-xl-n6{margin-bottom:-40px !important}.ml-xl-n6{margin-left:-40px !important}.mx-xl-6{margin-right:40px !important;margin-left:40px !important}.my-xl-6{margin-top:40px !important;margin-bottom:40px !important}}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-right:0 !important;padding-left:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:4px !important}.pt-1{padding-top:4px !important}.pr-1{padding-right:4px !important}.pb-1{padding-bottom:4px !important}.pl-1{padding-left:4px !important}.px-1{padding-right:4px !important;padding-left:4px !important}.py-1{padding-top:4px !important;padding-bottom:4px !important}.p-2{padding:8px !important}.pt-2{padding-top:8px !important}.pr-2{padding-right:8px !important}.pb-2{padding-bottom:8px !important}.pl-2{padding-left:8px !important}.px-2{padding-right:8px !important;padding-left:8px !important}.py-2{padding-top:8px !important;padding-bottom:8px !important}.p-3{padding:16px !important}.pt-3{padding-top:16px !important}.pr-3{padding-right:16px !important}.pb-3{padding-bottom:16px !important}.pl-3{padding-left:16px !important}.px-3{padding-right:16px !important;padding-left:16px !important}.py-3{padding-top:16px !important;padding-bottom:16px !important}.p-4{padding:24px !important}.pt-4{padding-top:24px !important}.pr-4{padding-right:24px !important}.pb-4{padding-bottom:24px !important}.pl-4{padding-left:24px !important}.px-4{padding-right:24px !important;padding-left:24px !important}.py-4{padding-top:24px !important;padding-bottom:24px !important}.p-5{padding:32px !important}.pt-5{padding-top:32px !important}.pr-5{padding-right:32px !important}.pb-5{padding-bottom:32px !important}.pl-5{padding-left:32px !important}.px-5{padding-right:32px !important;padding-left:32px !important}.py-5{padding-top:32px !important;padding-bottom:32px !important}.p-6{padding:40px !important}.pt-6{padding-top:40px !important}.pr-6{padding-right:40px !important}.pb-6{padding-bottom:40px !important}.pl-6{padding-left:40px !important}.px-6{padding-right:40px !important;padding-left:40px !important}.py-6{padding-top:40px !important;padding-bottom:40px !important}@media (min-width: 544px){.p-sm-0{padding:0 !important}.pt-sm-0{padding-top:0 !important}.pr-sm-0{padding-right:0 !important}.pb-sm-0{padding-bottom:0 !important}.pl-sm-0{padding-left:0 !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}}@media (min-width: 544px){.p-sm-1{padding:4px !important}.pt-sm-1{padding-top:4px !important}.pr-sm-1{padding-right:4px !important}.pb-sm-1{padding-bottom:4px !important}.pl-sm-1{padding-left:4px !important}.px-sm-1{padding-right:4px !important;padding-left:4px !important}.py-sm-1{padding-top:4px !important;padding-bottom:4px !important}}@media (min-width: 544px){.p-sm-2{padding:8px !important}.pt-sm-2{padding-top:8px !important}.pr-sm-2{padding-right:8px !important}.pb-sm-2{padding-bottom:8px !important}.pl-sm-2{padding-left:8px !important}.px-sm-2{padding-right:8px !important;padding-left:8px !important}.py-sm-2{padding-top:8px !important;padding-bottom:8px !important}}@media (min-width: 544px){.p-sm-3{padding:16px !important}.pt-sm-3{padding-top:16px !important}.pr-sm-3{padding-right:16px !important}.pb-sm-3{padding-bottom:16px !important}.pl-sm-3{padding-left:16px !important}.px-sm-3{padding-right:16px !important;padding-left:16px !important}.py-sm-3{padding-top:16px !important;padding-bottom:16px !important}}@media (min-width: 544px){.p-sm-4{padding:24px !important}.pt-sm-4{padding-top:24px !important}.pr-sm-4{padding-right:24px !important}.pb-sm-4{padding-bottom:24px !important}.pl-sm-4{padding-left:24px !important}.px-sm-4{padding-right:24px !important;padding-left:24px !important}.py-sm-4{padding-top:24px !important;padding-bottom:24px !important}}@media (min-width: 544px){.p-sm-5{padding:32px !important}.pt-sm-5{padding-top:32px !important}.pr-sm-5{padding-right:32px !important}.pb-sm-5{padding-bottom:32px !important}.pl-sm-5{padding-left:32px !important}.px-sm-5{padding-right:32px !important;padding-left:32px !important}.py-sm-5{padding-top:32px !important;padding-bottom:32px !important}}@media (min-width: 544px){.p-sm-6{padding:40px !important}.pt-sm-6{padding-top:40px !important}.pr-sm-6{padding-right:40px !important}.pb-sm-6{padding-bottom:40px !important}.pl-sm-6{padding-left:40px !important}.px-sm-6{padding-right:40px !important;padding-left:40px !important}.py-sm-6{padding-top:40px !important;padding-bottom:40px !important}}@media (min-width: 768px){.p-md-0{padding:0 !important}.pt-md-0{padding-top:0 !important}.pr-md-0{padding-right:0 !important}.pb-md-0{padding-bottom:0 !important}.pl-md-0{padding-left:0 !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}}@media (min-width: 768px){.p-md-1{padding:4px !important}.pt-md-1{padding-top:4px !important}.pr-md-1{padding-right:4px !important}.pb-md-1{padding-bottom:4px !important}.pl-md-1{padding-left:4px !important}.px-md-1{padding-right:4px !important;padding-left:4px !important}.py-md-1{padding-top:4px !important;padding-bottom:4px !important}}@media (min-width: 768px){.p-md-2{padding:8px !important}.pt-md-2{padding-top:8px !important}.pr-md-2{padding-right:8px !important}.pb-md-2{padding-bottom:8px !important}.pl-md-2{padding-left:8px !important}.px-md-2{padding-right:8px !important;padding-left:8px !important}.py-md-2{padding-top:8px !important;padding-bottom:8px !important}}@media (min-width: 768px){.p-md-3{padding:16px !important}.pt-md-3{padding-top:16px !important}.pr-md-3{padding-right:16px !important}.pb-md-3{padding-bottom:16px !important}.pl-md-3{padding-left:16px !important}.px-md-3{padding-right:16px !important;padding-left:16px !important}.py-md-3{padding-top:16px !important;padding-bottom:16px !important}}@media (min-width: 768px){.p-md-4{padding:24px !important}.pt-md-4{padding-top:24px !important}.pr-md-4{padding-right:24px !important}.pb-md-4{padding-bottom:24px !important}.pl-md-4{padding-left:24px !important}.px-md-4{padding-right:24px !important;padding-left:24px !important}.py-md-4{padding-top:24px !important;padding-bottom:24px !important}}@media (min-width: 768px){.p-md-5{padding:32px !important}.pt-md-5{padding-top:32px !important}.pr-md-5{padding-right:32px !important}.pb-md-5{padding-bottom:32px !important}.pl-md-5{padding-left:32px !important}.px-md-5{padding-right:32px !important;padding-left:32px !important}.py-md-5{padding-top:32px !important;padding-bottom:32px !important}}@media (min-width: 768px){.p-md-6{padding:40px !important}.pt-md-6{padding-top:40px !important}.pr-md-6{padding-right:40px !important}.pb-md-6{padding-bottom:40px !important}.pl-md-6{padding-left:40px !important}.px-md-6{padding-right:40px !important;padding-left:40px !important}.py-md-6{padding-top:40px !important;padding-bottom:40px !important}}@media (min-width: 1012px){.p-lg-0{padding:0 !important}.pt-lg-0{padding-top:0 !important}.pr-lg-0{padding-right:0 !important}.pb-lg-0{padding-bottom:0 !important}.pl-lg-0{padding-left:0 !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}}@media (min-width: 1012px){.p-lg-1{padding:4px !important}.pt-lg-1{padding-top:4px !important}.pr-lg-1{padding-right:4px !important}.pb-lg-1{padding-bottom:4px !important}.pl-lg-1{padding-left:4px !important}.px-lg-1{padding-right:4px !important;padding-left:4px !important}.py-lg-1{padding-top:4px !important;padding-bottom:4px !important}}@media (min-width: 1012px){.p-lg-2{padding:8px !important}.pt-lg-2{padding-top:8px !important}.pr-lg-2{padding-right:8px !important}.pb-lg-2{padding-bottom:8px !important}.pl-lg-2{padding-left:8px !important}.px-lg-2{padding-right:8px !important;padding-left:8px !important}.py-lg-2{padding-top:8px !important;padding-bottom:8px !important}}@media (min-width: 1012px){.p-lg-3{padding:16px !important}.pt-lg-3{padding-top:16px !important}.pr-lg-3{padding-right:16px !important}.pb-lg-3{padding-bottom:16px !important}.pl-lg-3{padding-left:16px !important}.px-lg-3{padding-right:16px !important;padding-left:16px !important}.py-lg-3{padding-top:16px !important;padding-bottom:16px !important}}@media (min-width: 1012px){.p-lg-4{padding:24px !important}.pt-lg-4{padding-top:24px !important}.pr-lg-4{padding-right:24px !important}.pb-lg-4{padding-bottom:24px !important}.pl-lg-4{padding-left:24px !important}.px-lg-4{padding-right:24px !important;padding-left:24px !important}.py-lg-4{padding-top:24px !important;padding-bottom:24px !important}}@media (min-width: 1012px){.p-lg-5{padding:32px !important}.pt-lg-5{padding-top:32px !important}.pr-lg-5{padding-right:32px !important}.pb-lg-5{padding-bottom:32px !important}.pl-lg-5{padding-left:32px !important}.px-lg-5{padding-right:32px !important;padding-left:32px !important}.py-lg-5{padding-top:32px !important;padding-bottom:32px !important}}@media (min-width: 1012px){.p-lg-6{padding:40px !important}.pt-lg-6{padding-top:40px !important}.pr-lg-6{padding-right:40px !important}.pb-lg-6{padding-bottom:40px !important}.pl-lg-6{padding-left:40px !important}.px-lg-6{padding-right:40px !important;padding-left:40px !important}.py-lg-6{padding-top:40px !important;padding-bottom:40px !important}}@media (min-width: 1280px){.p-xl-0{padding:0 !important}.pt-xl-0{padding-top:0 !important}.pr-xl-0{padding-right:0 !important}.pb-xl-0{padding-bottom:0 !important}.pl-xl-0{padding-left:0 !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}}@media (min-width: 1280px){.p-xl-1{padding:4px !important}.pt-xl-1{padding-top:4px !important}.pr-xl-1{padding-right:4px !important}.pb-xl-1{padding-bottom:4px !important}.pl-xl-1{padding-left:4px !important}.px-xl-1{padding-right:4px !important;padding-left:4px !important}.py-xl-1{padding-top:4px !important;padding-bottom:4px !important}}@media (min-width: 1280px){.p-xl-2{padding:8px !important}.pt-xl-2{padding-top:8px !important}.pr-xl-2{padding-right:8px !important}.pb-xl-2{padding-bottom:8px !important}.pl-xl-2{padding-left:8px !important}.px-xl-2{padding-right:8px !important;padding-left:8px !important}.py-xl-2{padding-top:8px !important;padding-bottom:8px !important}}@media (min-width: 1280px){.p-xl-3{padding:16px !important}.pt-xl-3{padding-top:16px !important}.pr-xl-3{padding-right:16px !important}.pb-xl-3{padding-bottom:16px !important}.pl-xl-3{padding-left:16px !important}.px-xl-3{padding-right:16px !important;padding-left:16px !important}.py-xl-3{padding-top:16px !important;padding-bottom:16px !important}}@media (min-width: 1280px){.p-xl-4{padding:24px !important}.pt-xl-4{padding-top:24px !important}.pr-xl-4{padding-right:24px !important}.pb-xl-4{padding-bottom:24px !important}.pl-xl-4{padding-left:24px !important}.px-xl-4{padding-right:24px !important;padding-left:24px !important}.py-xl-4{padding-top:24px !important;padding-bottom:24px !important}}@media (min-width: 1280px){.p-xl-5{padding:32px !important}.pt-xl-5{padding-top:32px !important}.pr-xl-5{padding-right:32px !important}.pb-xl-5{padding-bottom:32px !important}.pl-xl-5{padding-left:32px !important}.px-xl-5{padding-right:32px !important;padding-left:32px !important}.py-xl-5{padding-top:32px !important;padding-bottom:32px !important}}@media (min-width: 1280px){.p-xl-6{padding:40px !important}.pt-xl-6{padding-top:40px !important}.pr-xl-6{padding-right:40px !important}.pb-xl-6{padding-bottom:40px !important}.pl-xl-6{padding-left:40px !important}.px-xl-6{padding-right:40px !important;padding-left:40px !important}.py-xl-6{padding-top:40px !important;padding-bottom:40px !important}}.h1{font-size:26px !important}@media (min-width: 768px){.h1{font-size:32px !important}}.h2{font-size:22px !important}@media (min-width: 768px){.h2{font-size:24px !important}}.h3{font-size:18px !important}@media (min-width: 768px){.h3{font-size:20px !important}}.h4{font-size:16px !important}.h5{font-size:14px !important}.h6{font-size:12px !important}.h1,.h2,.h3,.h4,.h5,.h6{font-weight:600 !important}.f1{font-size:26px !important}@media (min-width: 768px){.f1{font-size:32px !important}}.f2{font-size:22px !important}@media (min-width: 768px){.f2{font-size:24px !important}}.f3{font-size:18px !important}@media (min-width: 768px){.f3{font-size:20px !important}}.f4{font-size:16px !important}@media (min-width: 768px){.f4{font-size:16px !important}}.f5{font-size:14px !important}.f6{font-size:12px !important}.f00-light{font-size:40px !important;font-weight:300 !important}@media (min-width: 768px){.f00-light{font-size:48px !important}}.f0-light{font-size:32px !important;font-weight:300 !important}@media (min-width: 768px){.f0-light{font-size:40px !important}}.f1-light{font-size:26px !important;font-weight:300 !important}@media (min-width: 768px){.f1-light{font-size:32px !important}}.f2-light{font-size:22px !important;font-weight:300 !important}@media (min-width: 768px){.f2-light{font-size:24px !important}}.f3-light{font-size:18px !important;font-weight:300 !important}@media (min-width: 768px){.f3-light{font-size:20px !important}}.text-small{font-size:12px !important}.lead{margin-bottom:30px;font-size:20px;font-weight:300;color:#555}.lh-condensed-ultra{line-height:1 !important}.lh-condensed{line-height:1.25 !important}.lh-default{line-height:1.5 !important}.text-right{text-align:right !important}.text-left{text-align:left !important}.text-center{text-align:center !important}@media (min-width: 544px){.text-sm-right{text-align:right !important}.text-sm-left{text-align:left !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.text-md-right{text-align:right !important}.text-md-left{text-align:left !important}.text-md-center{text-align:center !important}}@media (min-width: 1012px){.text-lg-right{text-align:right !important}.text-lg-left{text-align:left !important}.text-lg-center{text-align:center !important}}@media (min-width: 1280px){.text-xl-right{text-align:right !important}.text-xl-left{text-align:left !important}.text-xl-center{text-align:center !important}}.text-normal{font-weight:normal !important}.text-bold{font-weight:600 !important}.text-italic{font-style:italic !important}.text-uppercase{text-transform:uppercase !important}.no-underline{text-decoration:none !important}.no-wrap{white-space:nowrap !important}.ws-normal{white-space:normal !important}.wb-break-all{word-break:break-all !important}.text-emphasized{font-weight:600;color:#24292e}.list-style-none{list-style:none !important}.text-shadow-dark{text-shadow:0 1px 1px rgba(0,0,0,0.25),0 1px 25px rgba(0,0,0,0.75)}.text-shadow-light{text-shadow:0 1px 0 rgba(255,255,255,0.5)}.v-hidden{visibility:hidden !important}.v-visible{visibility:visible !important}.d-table{display:table !important}.d-table-cell{display:table-cell !important}.table-fixed{table-layout:fixed !important}.d-block{display:block !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-none{display:none !important}@media (min-width: 544px){.d-sm-table{display:table !important}.d-sm-table-cell{display:table-cell !important}.d-sm-block{display:block !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-sm-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-sm-none{display:none !important}}@media (min-width: 768px){.d-md-table{display:table !important}.d-md-table-cell{display:table-cell !important}.d-md-block{display:block !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-md-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-md-none{display:none !important}}@media (min-width: 1012px){.d-lg-table{display:table !important}.d-lg-table-cell{display:table-cell !important}.d-lg-block{display:block !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-lg-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-lg-none{display:none !important}}@media (min-width: 1280px){.d-xl-table{display:table !important}.d-xl-table-cell{display:table-cell !important}.d-xl-block{display:block !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-xl-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-xl-none{display:none !important}}@media (max-width: 544px){.hide-sm{display:none !important}}@media (min-width: 544px) and (max-width: 768px){.hide-md{display:none !important}}@media (min-width: 768px) and (max-width: 1012px){.hide-lg{display:none !important}}@media (min-width: 1012px){.hide-xl{display:none !important}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);word-wrap:normal;border:0}fieldset{padding:0;margin:0;border:0}label{font-weight:600}.form-control,.form-select{min-height:34px;padding:6px 8px;font-size:14px;line-height:20px;color:#24292e;vertical-align:middle;background-color:#fff;background-repeat:no-repeat;background-position:right 8px center;border:1px solid #d1d5da;border-radius:3px;outline:none;box-shadow:inset 0 1px 2px rgba(27,31,35,0.075)}.form-control.focus,.form-control:focus,.form-select.focus,.form-select:focus{border-color:#2188ff;outline:none;box-shadow:inset 0 1px 2px rgba(27,31,35,0.075),0 0 0 0.2em rgba(3,102,214,0.3)}.input-contrast{background-color:#fafbfc}.input-contrast:focus{background-color:#fff}::-webkit-input-placeholder{color:#6a737d}::-moz-placeholder{color:#6a737d}:-ms-input-placeholder{color:#6a737d}::placeholder{color:#6a737d}.input-sm{min-height:28px;padding-top:3px;padding-bottom:3px;font-size:12px;line-height:20px}.input-lg{padding:4px 10px;font-size:16px}.input-block{display:block;width:100%}.input-monospace{font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace}.input-hide-webkit-autofill::-webkit-contacts-auto-fill-button{position:absolute;right:0;display:none !important;pointer-events:none;visibility:hidden}.form-checkbox{padding-left:20px;margin:15px 0;vertical-align:middle}.form-checkbox label em.highlight{position:relative;left:-4px;padding:2px 4px;font-style:normal;background:#fffbdd;border-radius:3px}.form-checkbox input[type=checkbox],.form-checkbox input[type=radio]{float:left;margin:5px 0 0 -20px;vertical-align:middle}.form-checkbox .note{display:block;margin:0;font-size:12px;font-weight:normal;color:#586069}.form-checkbox-details{display:none}.form-checkbox-details-trigger:checked ~ * .form-checkbox-details,.form-checkbox-details-trigger:checked ~ .form-checkbox-details{display:block}.hfields{margin:15px 0}.hfields::before{display:table;content:""}.hfields::after{display:table;clear:both;content:""}.hfields .form-group{float:left;margin:0 30px 0 0}.hfields .form-group dt label{display:inline-block;margin:5px 0 0;color:#586069}.hfields .form-group dt img{position:relative;top:-2px}.hfields .btn{float:left;margin:28px 25px 0 -20px}.hfields .form-select{margin-top:5px}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none;appearance:none}.form-actions::before{display:table;content:""}.form-actions::after{display:table;clear:both;content:""}.form-actions .btn{float:right}.form-actions .btn+.btn{margin-right:5px}.form-warning{padding:8px 10px;margin:10px 0;font-size:14px;color:#735c0f;background:#fffbdd;border:1px solid #d9d0a5;border-radius:3px}.form-warning p{margin:0;line-height:1.5}.form-warning a{font-weight:600}.form-select{display:inline-block;max-width:100%;height:34px;padding-right:24px;padding-right:8px \9;background:#fff url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAUCAMAAACzvE1FAAAADFBMVEUzMzMzMzMzMzMzMzMKAG/3AAAAA3RSTlMAf4C/aSLHAAAAPElEQVR42q3NMQ4AIAgEQTn//2cLdRKppSGzBYwzVXvznNWs8C58CiussPJj8h6NwgorrKRdTvuV9v16Afn0AYFOB7aYAAAAAElFTkSuQmCC") no-repeat right 8px center;background-image:none \9;background-size:8px 10px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-select::-ms-expand{opacity:0}.form-select[multiple]{height:auto}.select-sm{height:28px;min-height:28px;padding-top:3px;padding-bottom:3px;font-size:12px}.select-sm[multiple]{height:auto;min-height:0}.form-group{margin:15px 0}.form-group .form-control{width:440px;max-width:100%;margin-right:5px;background-color:#fafbfc}.form-group .form-control:focus{background-color:#fff}.form-group .form-control.shorter{width:130px}.form-group .form-control.short{width:250px}.form-group .form-control.long{width:100%}.form-group textarea.form-control{width:100%;height:200px;min-height:200px}.form-group textarea.form-control.short{height:50px;min-height:50px}.form-group dt{margin:0 0 6px}.form-group label{position:relative}.form-group.flattened dt{float:left;margin:0;line-height:32px}.form-group.flattened dd{line-height:32px}.form-group dd h4{margin:4px 0 0}.form-group dd h4.is-error{color:#cb2431}.form-group dd h4.is-success{color:#28a745}.form-group dd h4+.note{margin-top:0}.form-group.required dt label::after{padding-left:5px;color:#cb2431;content:"*"}.form-group .success,.form-group .error,.form-group .indicator{display:none;font-size:12px;font-weight:600}.form-group.loading{opacity:0.5}.form-group.loading .indicator{display:inline}.form-group.loading .spinner{display:inline-block;vertical-align:middle}.form-group.successful .success{display:inline;color:#28a745}.form-group.warn .warning,.form-group.warn .error,.form-group.errored .warning,.form-group.errored .error{position:absolute;z-index:10;display:block;max-width:450px;padding:5px 8px;margin:4px 0 0;font-size:13px;font-weight:normal;border-style:solid;border-width:1px;border-radius:3px}.form-group.warn .warning::after,.form-group.warn .warning::before,.form-group.warn .error::after,.form-group.warn .error::before,.form-group.errored .warning::after,.form-group.errored .warning::before,.form-group.errored .error::after,.form-group.errored .error::before{position:absolute;bottom:100%;left:10px;z-index:15;width:0;height:0;pointer-events:none;content:" ";border:solid transparent}.form-group.warn .warning::after,.form-group.warn .error::after,.form-group.errored .warning::after,.form-group.errored .error::after{border-width:5px}.form-group.warn .warning::before,.form-group.warn .error::before,.form-group.errored .warning::before,.form-group.errored .error::before{margin-left:-1px;border-width:6px}.form-group.warn .warning{color:#735c0f;background-color:#fffbdd;border-color:#d9d0a5}.form-group.warn .warning::after{border-bottom-color:#fffbdd}.form-group.warn .warning::before{border-bottom-color:#d9d0a5}.form-group.errored label{color:#cb2431}.form-group.errored .error{color:#86181d;background-color:#ffdce0;border-color:#cea0a5}.form-group.errored .error::after{border-bottom-color:#ffdce0}.form-group.errored .error::before{border-bottom-color:#cea0a5}.note{min-height:17px;margin:4px 0 2px;font-size:12px;color:#586069}.note .spinner{margin-right:3px;vertical-align:middle}.css-truncate.css-truncate-target,.css-truncate .css-truncate-target{display:inline-block;max-width:125px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:top}.css-truncate.expandable.zeroclipboard-is-hover .css-truncate-target,.css-truncate.expandable.zeroclipboard-is-hover.css-truncate-target,.css-truncate.expandable:hover .css-truncate-target,.css-truncate.expandable:hover.css-truncate-target{max-width:10000px !important}.TableObject{display:table}.TableObject-item{display:table-cell;width:1%;white-space:nowrap;vertical-align:middle}.TableObject-item--primary{width:99%}.labels{position:relative}.label,.Label{display:inline-block;padding:3px 4px;font-size:12px;font-weight:600;line-height:1;color:#fff;border-radius:2px;box-shadow:inset 0 -1px 0 rgba(27,31,35,0.12)}.label:hover,.Label:hover{text-decoration:none}.Label--gray{color:#586069;background-color:#eaecef}.Label--outline{margin-top:-1px;margin-bottom:-1px;font-weight:normal;color:#586069;background-color:transparent;border:1px solid rgba(27,31,35,0.15);box-shadow:none}.Label--outline-green{color:#28a745;border:1px solid #34d058}.Label--gray-darker{background-color:#6a737d}.Label--orange{background-color:#d15704}.state,.State{display:inline-block;padding:4px 8px;font-weight:600;line-height:20px;color:#fff;text-align:center;background-color:#6a737d;border-radius:3px}.State--green{background-color:#2cbe4e}.State--purple{background-color:#6f42c1}.State--red{background-color:#cb2431}.State--small{padding:0.125em 4px;font-size:12px}.State--small .octicon{width:1em}.Counter{display:inline-block;padding:2px 5px;font-size:12px;font-weight:600;line-height:1;color:#586069;background-color:rgba(27,31,35,0.08);border-radius:20px}.Counter--gray-light{color:#24292e;background-color:rgba(27,31,35,0.15)}.Counter--gray{color:#fff;background-color:#6a737d}.avatar{display:inline-block;overflow:hidden;line-height:1;vertical-align:middle;border-radius:3px}.avatar-small{border-radius:2px}.avatar-link{float:left;line-height:1}.avatar-group-item{display:inline-block;margin-bottom:3px}.avatar-parent-child{position:relative}.avatar-child{position:absolute;right:-15%;bottom:-9%;background-color:#fff;border-radius:2px;box-shadow:-2px -2px 0 rgba(255,255,255,0.8)}.markdown-body{font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body::before{display:table;content:""}.markdown-body::after{display:table;clear:both;content:""}.markdown-body>*:first-child{margin-top:0 !important}.markdown-body>*:last-child{margin-bottom:0 !important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#cb2431}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre{margin-top:0;margin-bottom:16px}.markdown-body hr{height:0.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}.markdown-body blockquote{padding:0 1em;color:#6a737d;border-left:0.25em solid #dfe2e5}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:solid 1px #c6cbd1;border-bottom-color:#959da5;border-radius:3px;box-shadow:inset 0 -1px 0 #959da5}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 tt,.markdown-body h1 code,.markdown-body h2 tt,.markdown-body h2 code,.markdown-body h3 tt,.markdown-body h3 code,.markdown-body h4 tt,.markdown-body h4 code,.markdown-body h5 tt,.markdown-body h5 code,.markdown-body h6 tt,.markdown-body h6 code{font-size:inherit}.markdown-body h1{padding-bottom:0.3em;font-size:2em;border-bottom:1px solid #eaecef}.markdown-body h2{padding-bottom:0.3em;font-size:1.5em;border-bottom:1px solid #eaecef}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:0.875em}.markdown-body h6{font-size:0.85em;color:#6a737d}.markdown-body ul,.markdown-body ol{padding-left:2em}.markdown-body ul.no-list,.markdown-body ol.no-list{padding:0;list-style-type:none}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:0.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto}.markdown-body table th{font-weight:600}.markdown-body table th,.markdown-body table td{padding:6px 13px;border:1px solid #dfe2e5}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body table img{background-color:transparent}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #dfe2e5}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#24292e}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:0;padding-top:0.2em;padding-bottom:0.2em;margin:0;font-size:85%;background-color:rgba(27,31,35,0.05);border-radius:3px}.markdown-body code::before,.markdown-body code::after,.markdown-body tt::before,.markdown-body tt::after{letter-spacing:-0.2em;content:"\00a0"}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:3px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body pre code::before,.markdown-body pre code::after,.markdown-body pre tt::before,.markdown-body pre tt::after{content:normal}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:600;background:#f6f8fa;border-top:0}/*!
  6. * GitHub Light v0.3.0
  7. * Copyright (c) 2012 - 2016 GitHub, Inc.
  8. * Licensed under MIT (https://github.com/primer/github-syntax-theme-generator/blob/master/LICENSE)
  9. */.pl-c{color:#969896}.pl-c1,.pl-s .pl-v{color:#0086b3}.pl-e,.pl-en{color:#795da3}.pl-smi,.pl-s .pl-s1{color:#333}.pl-ent{color:#63a35c}.pl-k{color:#a71d5d}.pl-s,.pl-pds,.pl-s .pl-pse .pl-s1,.pl-sr,.pl-sr .pl-cce,.pl-sr .pl-sre,.pl-sr .pl-sra{color:#183691}.pl-v,.pl-smw{color:#ed6a43}.pl-bu{color:#b52a1d}.pl-ii{color:#f8f8f8;background-color:#b52a1d}.pl-c2{color:#f8f8f8;background-color:#b52a1d}.pl-c2::before{content:"^M"}.pl-sr .pl-cce{font-weight:bold;color:#63a35c}.pl-ml{color:#693a17}.pl-mh,.pl-mh .pl-en,.pl-ms{font-weight:bold;color:#1d3e81}.pl-mq{color:#008080}.pl-mi{font-style:italic;color:#333}.pl-mb{font-weight:bold;color:#333}.pl-md{color:#bd2c00;background-color:#ffecec}.pl-mi1{color:#55a532;background-color:#eaffea}.pl-mc{color:#ef9700;background-color:#ffe3b4}.pl-mi2{color:#d8d8d8;background-color:#808080}.pl-mdr{font-weight:bold;color:#795da3}.pl-mo{color:#1d3e81}.pl-ba{color:#595e62}.pl-sg{color:#c0c0c0}.pl-corl{text-decoration:underline;color:#183691}kbd{display:inline-block;padding:3px 5px;font:11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #c6cbd1;border-bottom-color:#959da5;border-radius:3px;box-shadow:inset 0 -1px 0 #959da5}.badmono{font-family:sans-serif;font-weight:600}.diffstat{font-size:12px;font-weight:600;color:#586069;white-space:nowrap;cursor:default}.block-diff-deleted,.block-diff-added,.block-diff-neutral{display:inline-block;width:8px;height:8px;margin-left:1px}.block-diff-deleted,.text-red .block-diff-neutral{background-color:#cb2431}.block-diff-added,.block-diff-neutral{background-color:#2cbe4e}.block-diff-neutral{background-color:#d1d5da}.tab-size[data-tab-size="1"]{-moz-tab-size:1;-o-tab-size:1;tab-size:1}.tab-size[data-tab-size="2"]{-moz-tab-size:2;-o-tab-size:2;tab-size:2}.tab-size[data-tab-size="3"]{-moz-tab-size:3;-o-tab-size:3;tab-size:3}.tab-size[data-tab-size="4"]{-moz-tab-size:4;-o-tab-size:4;tab-size:4}.tab-size[data-tab-size="5"]{-moz-tab-size:5;-o-tab-size:5;tab-size:5}.tab-size[data-tab-size="6"]{-moz-tab-size:6;-o-tab-size:6;tab-size:6}.tab-size[data-tab-size="7"]{-moz-tab-size:7;-o-tab-size:7;tab-size:7}.tab-size[data-tab-size="8"]{-moz-tab-size:8;-o-tab-size:8;tab-size:8}.tab-size[data-tab-size="9"]{-moz-tab-size:9;-o-tab-size:9;tab-size:9}.tab-size[data-tab-size="10"]{-moz-tab-size:10;-o-tab-size:10;tab-size:10}.tab-size[data-tab-size="11"]{-moz-tab-size:11;-o-tab-size:11;tab-size:11}.tab-size[data-tab-size="12"]{-moz-tab-size:12;-o-tab-size:12;tab-size:12}.task-list-item{list-style-type:none}.task-list-item label{font-weight:normal}.task-list-item.enabled label{cursor:pointer}.task-list-item+.task-list-item{margin-top:3px}.task-list-item .handle{display:none}.task-list-item-checkbox{margin:0 0.2em 0.25em -1.6em;vertical-align:middle}.reorderable-task-lists .markdown-body .contains-task-list{padding:0}.reorderable-task-lists .markdown-body li:not(.task-list-item){margin-left:26px}.reorderable-task-lists .markdown-body ol:not(.contains-task-list) li,.reorderable-task-lists .markdown-body ul:not(.contains-task-list) li{margin-left:0}.reorderable-task-lists .markdown-body li p{margin-top:0}.reorderable-task-lists .markdown-body .task-list-item{padding-right:15px;padding-left:42px;margin-right:-15px;margin-left:-15px;border:1px solid transparent}.reorderable-task-lists .markdown-body .task-list-item+.task-list-item{margin-top:0}.reorderable-task-lists .markdown-body .task-list-item .contains-task-list{padding-top:4px}.reorderable-task-lists .markdown-body .task-list-item .handle{display:block;float:left;width:20px;padding:2px 0 0 2px;margin-left:-43px;opacity:0}.reorderable-task-lists .markdown-body .task-list-item .drag-handle{fill:#333}.reorderable-task-lists .markdown-body .task-list-item.hovered{background:#fafafa;border-top-color:#ededed;border-bottom-color:#ededed}.reorderable-task-lists .markdown-body .task-list-item.hovered>.handle{opacity:1}.reorderable-task-lists .markdown-body .task-list-item.is-dragging{opacity:0}.reorderable-task-lists .markdown-body .task-list-item.is-ghost{border-right-color:#ededed;border-left-color:#ededed}.review-comment-contents .markdown-body .task-list-item{padding-left:42px;margin-right:-12px;margin-left:-12px;border-top-left-radius:3px;border-bottom-left-radius:3px}.review-comment-contents .markdown-body .task-list-item.hovered{border-left-color:#ededed}#user-content-toc{overflow:visible}#user-content-toc tr{border-top:0}#user-content-toc td{padding:0 20px;background-color:#f7f7f7;border:0;border-radius:3px}#user-content-toc ul{padding-left:0;font-weight:600;list-style:none}#user-content-toc ul li{padding-left:0.2em}#user-content-toc ul ul{font-weight:normal}#user-content-toc ul ul li::before{float:left;margin-top:-0.2em;margin-right:0.2em;font-size:1.2em;line-height:1;color:#aaa;content:"\231e"}#user-content-toc ul ul ul{padding-left:0.9em}#user-content-toctitle h2{margin-top:1em;margin-bottom:0.5em;font-size:1.25em;border-bottom:0}*{box-sizing:border-box}html{font-size:14px;-webkit-text-size-adjust:100%;text-size-adjust:100%}body{width:100%;padding:0;margin:0;font:1rem/1.42 -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";color:#333;background-color:#fafbfc}button,input,textarea{margin:0;font-family:inherit;font-size:inherit}button{padding:0;margin:0;background:none;border:0}table{border-spacing:0;border-collapse:collapse}a{color:#0366d6;text-decoration:none}a:active{color:inherit}strong{font-weight:600}pre{word-wrap:break-word;white-space:pre-wrap}code,pre{font-family:Consolas, "Liberation Mono", Courier, monospace}hr{background:#eee;border-color:transparent}input[type="checkbox"][disabled]{opacity:0.25}textarea[disabled]::-webkit-input-placeholder{color:#000}.color-icons .octicon-comment-discussion{color:#333}.color-icons .octicon-issue-closed{color:#cb2431}.color-icons .octicon-issue-opened{color:#28a745}.color-icons .octicon-git-branch{color:#28a745}.color-icons .octicon-git-pull-request{color:#28a745}.color-icons .octicon-git-commit{color:#586069}.color-icons .opened{color:#28a745}.color-icons .closed{color:#cb2431}.color-icons .merged{color:#6f42c1}footer{padding:12px 0;font-size:14px;border-top:1px solid #ddd}footer .octicon{float:left;color:#aaa}footer ul{float:right;padding-left:0;margin-top:0;margin-bottom:0}footer li{float:left;line-height:32px;color:#aaa;list-style-type:none}footer li+li{margin-left:15px}footer li a{color:inherit}footer form{display:inline}footer .switch-to-desktop{display:inline;color:inherit}.clearfix::before,.clearfix::after{display:table;line-height:0;content:""}.clearfix::after{clear:both}.protip{margin:20px 0;font-size:13px;color:#666;text-align:center}.labels{position:relative;display:block}.label{font-size:10px}.switcher{position:relative;padding:15px 15px 15px 35px}.switcher.open .switcher-icon-open{display:none}.switcher.open .switcher-icon-close,.switcher.open .switcher-options{display:block}.switcher-toggle{display:block;font-weight:600;color:inherit}.switcher-toggle-meta{display:block;font-size:85%;font-weight:normal;color:#586069}.switcher-options{position:relative;display:none;padding-top:6px}.switcher-option{display:block;padding:6px 0;font-weight:600}.switcher-option .octicon-check{position:absolute;left:-19px}.switcher-option .css-truncate-target{max-width:80%}.switcher-icon{float:left;margin-top:1px;margin-left:-20px;color:#586069}.switcher-icon-open,.switcher-icon-close{position:relative;top:1px;float:right;width:auto;margin-right:0;margin-left:0;color:#586069}.switcher-icon-close{display:none}.octicon.switcher-icon-close{display:none}.octicon.switcher-icon-open{display:block}.bubble{padding:0;margin:0 15px 15px;overflow:hidden;word-break:break-word;word-wrap:break-word;white-space:normal;background:#fff;border:1px solid #ddd;border-radius:3px}.nav-bar+.bubble,.tabs+.bubble{margin-top:15px}.bubble.padded{padding:10px}.bubble.no-padding .bubble-content{padding:0}.bubble.no-margin{margin:0}.bubble.bubble-warn{color:#4c4a42;background-color:#fff9ea;border-color:#dfd8c2}.bubble-title{display:block;padding:10px 15px;margin:0;font-size:14px;color:#444;border-bottom:1px solid #ddd}.bubble-title .octicon{width:16px;margin-right:2px;margin-left:-3px;color:#586069;text-align:center}.bubble-title time{float:right;font-size:12px;font-weight:normal;line-height:20px;color:#586069}.bubble-content{padding:15px}.bubble-content .markdown-body{padding:0}.bubble-actions{display:table;width:100%;text-align:center;table-layout:fixed}.bubble-content+.bubble-actions,.repo-list+.bubble-actions{border-top:1px solid #ddd}.bubble-action-form{display:table-cell}.bubble-action{display:table-cell;padding:10px 15px;font-weight:500;line-height:1.5;color:#0366d6}.bubble-action+.bubble-action,.bubble-action+.bubble-action-form,.bubble-action-form+.bubble-action,.bubble-action-form+.bubble-action-form{border-left:1px solid #ddd}.bubble-disabled{background:#f5f5f5;border-color:#ccc;box-shadow:inset 0 0 10px rgba(0,0,0,0.1)}.bubble-disabled .bubble-title{color:#586069}.bubble-disabled .bubble-content{font-size:15px;color:#586069;text-align:center}.bubble-disabled .bubble-content.full-bleed{padding:15px}.bubble-disabled .bubble-action{color:#586069}ol ol,ul ol{list-style-type:lower-roman}ul ul ol,ul ol ol,ol ul ol,ol ol ol{list-style-type:lower-alpha}.list{padding:0;margin:0;list-style:none;background-color:#fff}.list:first-child .list-heading:first-child{border-top:0}.list .list-item-template{display:none}.list.list-rendered:empty{display:none}.list.list-rendered .list-item-template{display:block}.list-item{position:relative;display:block;width:100%;padding:14px 15px 14px 35px;line-height:inherit;text-align:left}.list-item+.list-item,.list-item+.list-heading,.list-heading+.list-item{border-top:1px solid #eee}.list-item.with-avatar{padding-left:45px}.list-item.no-padding{padding-left:15px}.list-item>.octicon{position:absolute;top:14px;left:12px;width:16px;text-align:center;vertical-align:bottom}.list-item>.list-item-chevron{top:50%;right:15px;left:auto;margin-top:-10px;font-size:20px;color:#586069}.list-item .avatar{position:absolute;top:14px;left:15px;border-radius:2px}.list-item .meta{float:right;margin-bottom:5px;margin-left:5px;font-size:11px;color:#6a737d}.list-item .meta ~ .list-item-title{margin-right:55px}.list-item .meta .octicon-star{vertical-align:top}.list-item .nwo-link{display:block;margin-bottom:2px;font-size:12px;font-weight:600;color:#586069}.list-item .ref{color:#586069}.list-item .byline{display:block;margin:0;font-size:12px;color:#586069}.list-item .byline strong{font-weight:normal;color:#444}.list-item .labels{margin-top:2px}.list-item.read{background-color:#fafbfc}.list-item.read .list-item-title{color:#586069}.list-item.read>.octicon{color:#586069}.list-item.read .list-action-archive{display:none}.list-item .filename{max-width:100%}.list-item mark{font-weight:600;color:inherit;background-color:inherit}.list-item-title{display:block;margin-bottom:3px;font-weight:600;line-height:1.2;color:#0366d6;word-wrap:break-word}.list-heading{position:relative;padding:7px 15px;clear:both;font-size:12px;font-weight:600;color:#586069;background-color:#f5f5f5;border-top:1px solid #eee}.list-heading::before{display:table;content:""}.list-heading::after{display:table;clear:both;content:""}.list-heading a,.list-heading .btn-link{color:inherit}.list-heading .btn-link>.octicon{opacity:0.65}.list-heading .path-item{float:left}.list-action-form{float:right;margin-top:-10px;margin-right:-15px}.list-action-form>.btn-link{padding:10px 15px;color:#ccc}.list-action-form ~ .list-item-title{margin-right:30px}.list-empty .list-item{padding:45px;font-weight:600;color:#586069;text-align:center}.list-options .list-item .list-item-title{color:#586069}.list-options .list-item>.octicon{color:#fff}.list-options .selected .list-item-title{color:#333}.list-options .selected>.octicon{color:#444}.repo-list-item .repo-name{max-width:80%;margin-right:32px}.repo-list .private{background-color:#fffdef}.repo-list .author-avatar{border-radius:2px}.repo-list .octicon{color:#586069}.repo-list .octicon-lock{color:rgba(27,31,35,0.7)}.repo-list .no-repo{padding:15px;color:#586069;text-align:center}.files-list{word-wrap:break-word}.files-list+.files-list{border-top:1px solid #ddd}.files-list .meta{float:none;margin:5px 0 0}.files-list .warning{font-weight:600;background-color:#fffccc}.files-list .simplified-path{color:#888}.files-list .octicon{top:16px}.files-list .octicon-file-directory{color:#80a6cd}.user-list .follow-list-info{font-size:12px;color:#666}.bubble.auth-form-container{margin-top:30px;margin-bottom:30px}.bubble.auth-form-container label{display:block;margin:0 0 5px}.bubble.auth-form-container .bubble-title{color:#fff;background-color:#586873}.bubble.auth-form-container p{margin:0}.bubble.auth-form-container .form-control{display:block;width:100%;margin:0 0 15px}.auth-form-message{padding:10px}.login-heading{margin-bottom:5px;font-size:13px}.login-heading+p{margin-top:0}.login-note{position:relative;padding:0 15px;font-size:13px}.login-note p{padding-left:22.5px;color:#586069}.login-note.no-icon p{padding-left:0}.login-note .octicon{position:absolute;top:0;left:15px;color:#586069}.login-note .btn{margin-bottom:15px}.u2f-auth-form-body{display:block;padding:10px 20px 20px}.u2f-auth-form-body.unavailable{display:none}section.blog{padding:0 15px}section.blog .pagination{margin-top:20px}section.blog .pagination .next_page{float:right}.post-title{padding:15px 15px 0;margin:0 -15px 5px;margin-bottom:20px;font-size:24px;font-style:normal;font-weight:normal;color:#495961;background-color:rgba(0,0,0,0.01)}.byline{margin-bottom:15px;font-size:13px;color:#586069}.byline span,.byline span img,.byline a{vertical-align:top;border-radius:3px}.byline a{color:#586069}.byline .author{margin-left:12px}.post-content h3{border-bottom:1px solid #eee}.post-content ol{list-style-type:decimal}.post-content ul{list-style-type:disc}.post-content img{width:100%;box-sizing:border-box;padding:3px;border:1px solid #d8d8d8}.post-content img.emoji{width:inherit;border:0}.post-content .anchor{display:none}.post-content .user-mention{color:#333}.post-content code{white-space:normal}.post-content iframe{max-width:100%;height:inherit}.posts h3,.recent-posts h3{padding:0;margin:15px 0 5px;font-size:14px;font-style:normal;font-weight:normal;color:#586069}.posts ul,.recent-posts ul{padding-left:0}.posts li,.recent-posts li{margin-bottom:10px;line-height:1.2;list-style-type:none}.posts li a,.recent-posts li a{font-size:20px;font-style:normal;font-weight:normal}.recent-posts{padding:15px;margin:15px 0 0;background-color:#fff;border-top:1px solid #eee}.recent-posts h3{margin-top:0}.recent-posts p{margin-bottom:0}.recent-posts li a{font-size:16px}.btn{display:inline-block;padding:9px 15px;margin:0;font-size:13px;font-weight:600;line-height:1.5;color:#333;text-align:center;text-shadow:0 1px 0 rgba(255,255,255,0.9);white-space:nowrap;vertical-align:middle;background-image:-webkit-linear-gradient(#fafafa, #eaeaea);background-image:linear-gradient(#fafafa, #eaeaea);border:1px solid #ddd;border-bottom-color:#cecece;border-radius:3px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn:active{background-color:#6a737d;background-image:none;border-color:#444;box-shadow:0 1px 3px rgba(0,0,0,0.075),inset 0 0 5px rgba(0,0,0,0.2)}.btn:disabled,.btn.disabled{pointer-events:none;opacity:0.3}.btn .count{position:relative;margin:0 0 0 3px;font-size:11px;font-weight:100;color:rgba(0,0,0,0.4);text-shadow:none;border-radius:10px}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-image:-webkit-linear-gradient(#8add6d, #60b044);background-image:linear-gradient(#8add6d, #60b044);border-color:#5ca941}.btn-danger{color:#900}.btn-block{display:block;width:100%;text-align:center}.btn-block+.btn-block{margin-top:10px}.section-title button{float:right;padding:0;margin:0;font-size:12px;color:#586069;background:transparent;border:0;box-shadow:none}.section-title button .octicon{color:#586069}.btn-link{display:inline;padding:0;font-size:inherit;color:#0366d6;white-space:nowrap;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.mobile.commit{display:block;float:none;width:100%;padding:15px;color:#213f4d;background-color:#e6f1f6;border-bottom:1px solid #d1e2eb}.mobile.commit .commit-desc pre{padding:0;margin:0;font-size:12px}.commit-title{margin:0 0 5px;font-size:13px;font-weight:600}.commit-list .message{color:#333}.commit-authorship{padding:7.5px 0;font-size:12px;line-height:24px;color:#586069;background-color:#fff}.commit-authorship .avatar{float:left;margin-right:8px;margin-left:15px;border-radius:3px}.commit-authorship a{font-weight:600}.diff-view .file{position:relative;margin-bottom:15px;border-top:1px solid #d1d5da;border-bottom:1px solid #d1d5da}.diff-view .file:last-child:not(:only-child){border-bottom:0}.diff-view .file .meta{padding:5px 10px 3px;font-size:12px;color:#555;text-align:left;text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(#fff, #f5f5f5);background-image:linear-gradient(#fff, #f5f5f5);border-bottom:1px solid #d8d8d8}.diff-view .file .meta .info{position:relative;padding:6px 0;padding-left:30px;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;line-height:1.2}.diff-view .file .meta .file-label{padding-left:0;margin-left:0;word-break:break-all;border-left:0 none;box-shadow:inset 0 0 0 transparent}.diff-view .file .meta span.icon{display:inline-block;padding:3px;margin:5px 5px 0 0;line-height:0;background:#f7f7f7;border:1px solid #ccc;border-right-color:#e5e5e5;border-bottom-color:#e5e5e5;border-radius:3px}.diff-view .file .meta .octicon-file-text{color:#aaa}.diff-view .file .file-label a{color:inherit}.diff-view .file .highlight{overflow:auto;overflow-x:auto;overflow-y:hidden}.diff-view .file .empty{padding:5px 10px;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:12px;line-height:24px;color:#555}.diff-view .file .file-code{border-spacing:0;border-collapse:separate;background-color:#fff}.diff-view .file .file-diff-line{position:relative;cursor:pointer}.diff-view .file .blob-num{padding:0 3px;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:12px;line-height:18px;color:rgba(0,0,0,0.3);text-align:right;vertical-align:top}.diff-view .file .blob-num::before{content:attr(data-line-number)}.diff-view .file .blob-code{padding-right:10px;padding-left:10px}.diff-view .file .blob-code-inner{font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:12px;color:#333;white-space:pre}.diff-view .file .blob-code-inner .x-first{border-top-left-radius:0.2em;border-bottom-left-radius:0.2em}.diff-view .file .blob-code-inner .x-last{border-top-right-radius:0.2em;border-bottom-right-radius:0.2em}.diff-view .file.soft-wrap .blob-code-inner{word-wrap:break-word;white-space:pre-wrap}.diff-view .file .prose .blob-code-inner{white-space:pre-wrap}.diff-view .file .blob-code-hunk{color:#586069;background-color:#f8f8ff}.diff-view .file .blob-num-hunk{background-color:#f3f3ff;border-color:#e4e4ff}.diff-view .file .blob-code-addition{background-color:#eaffea}.diff-view .file .blob-code-addition .x{background-color:#a6f3a6}.diff-view .file .blob-num-addition{background-color:#dbffdb;border-color:#c1e9c1}.diff-view .file .blob-code-deletion{background-color:#ffecec}.diff-view .file .blob-code-deletion .x{background-color:#f8cbcb}.diff-view .file .blob-num-deletion{background-color:#ffdddd;border-color:#f1c0c0}.diff-view .file span.no-nl-marker{position:relative;top:1px;margin-left:4px;color:#cb2431;vertical-align:middle}.diff-view .inline-comments{background-color:#fafbfc}.diff-view table .discussion-block{border-right:1px solid #ddd}.diff-view .inline-comment-form-container{width:100vw;border-right:1px solid #ddd}.add-inline-comment{cursor:pointer}.inline-comment-form{background-color:#fafbfc}.inline-comment-form .inline-note-reply{background-color:transparent;border-top:0}.inline-comment-form-container{padding:15px}.inline-comment-form-container .discussion-reply{padding:0}.comment-holder+.inline-comment-form-container{padding-top:0}.inline-comment-form-container .inline-comment-form,.inline-comment-form-container.open .inline-comment-form-actions{display:none}.inline-comment-form-container .inline-comment-form-actions,.inline-comment-form-container.open .inline-comment-form{display:block}.line-comments{padding:0;border:solid #ddd;border-width:1px 0}.inline-comments .discussion-block{max-width:100vw}.inline-comments .bubble-content{padding-top:10px;padding-bottom:10px}.inline-comments .markdown-body{font-size:85%}.inline-comments:last-child .line-comments{border-bottom:0}.timeline-inline-comments{width:100%;overflow:hidden}.timeline-inline-comments .inline-comment-form-container:last-child{border-bottom:1px solid #ddd}.timeline-review-comment-thread .diff-view .file{margin-bottom:0}.timeline-review-comment-thread .file-code{width:100%}.inline-note-sign-in-container{padding:15px;font-size:85%;text-align:center}.inline-note-sign-in-container .btn{margin-bottom:15px}.inline-comment-form-template-container{display:none}.diffstat{position:absolute;top:4px;left:0}.highlighted-blob{white-space:pre-wrap}.mobile-toc{background-color:#fff}.mobile-toc.open .switcher-options{display:block}.mobile-toc .diffstat{position:static}.mobile-toc .switcher-option{font-size:85%;font-weight:normal}.mobile-toc .switcher-option .octicon{float:left;margin-left:-20px;color:#ccc}.mobile-toc .switcher-option .octicon-diff-removed{color:#cb2431}.mobile-toc .switcher-option .octicon-diff-renamed{color:#677a85}.mobile-toc .switcher-option .octicon-diff-modified{color:#d0b44c}.mobile-toc .switcher-option .octicon-diff-added{color:#28a745}.add-comment-label,.review-cancel-button,.is-review-pending .start-review-label{display:none}.start-review-label,.is-review-pending .review-cancel-button,.is-review-pending .submit-review-button,.is-review-pending .add-comment-label{display:inline-block}.is-review-pending .submit-review-button{width:auto}.discussion-header{padding:15px 15px 0;background:#fff}.discussion-header .state{font-size:12px;line-height:16px;border-radius:2px}.discussion-header .discussion-block-title{padding:10px 0 15px}.discussion-header .pull-request-description-toggle .pull-request-description{display:block}.discussion-header .pull-request-description-toggle .pull-request-description-full{display:none}.discussion-header .pull-request-description-toggle.open .pull-request-description{display:none}.discussion-header .pull-request-description-toggle.open .pull-request-description-full{display:block}.discussion-header .branches{padding:7.5px 0;margin:0;font-size:12px;color:#aaa;cursor:pointer}.discussion-header .branches .branch-name{position:relative;display:inline-block;padding-left:20px;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;color:#586069}.discussion-header .branches .branch-name .octicon{position:absolute;top:0;left:0}.discussion-header .branches .octicon-git-branch{width:16px;text-align:left}.discussion-header .branches .octicon-arrow-up{display:block;width:100%;margin-left:20px}.discussion-header .branches .css-truncate-target{max-width:90%}.discussion-title{margin-bottom:0;font-size:16px;word-wrap:break-word}.discussion-labels{padding:15px 15px 0;background-color:#fff}.discussion-labels .octicon{position:relative;top:2px;margin-right:2px;color:#586069}.discussion-starting-comment{position:relative}.discussion-starting-comment+.discussion-reply-container{margin-top:-1px}.discussion-starting-comment .avatar{position:absolute;left:15px;margin-right:10px;border-radius:2px}.discussion-starting-comment time{margin:0 15px;color:#586069}.discussion-starting-comment .username,.discussion-starting-comment .num{color:#666}.discussion-starting-comment .discussion-title .num{font-weight:100;color:#aaa}.discussion-starting-comment .discussion-block-title{padding-left:60px}.discussion-comment{padding:15px;background:#fff;border-bottom:1px solid #ddd}.commit-comments-header{padding:0 15px;font-size:14px}.commit-comments-header-sha{font-weight:normal}.discussion-block-title{position:relative;padding:10px 15px;font-size:12px;line-height:16px;color:#586069;background-color:#fff;border-bottom:1px solid #eee}.discussion-block-title::before{display:table;content:""}.discussion-block-title::after{display:table;clear:both;content:""}.discussion-block-title .avatar{float:left;margin-right:10px;border-radius:3px}.discussion-block-title .timestamp{color:#586069}.discussion-block-title .username{font-weight:600;color:#444}.discussion-block-meta{margin-left:42px}.discussion-block-meta .editor{color:#444}.commit{float:left;margin:0 10px 0 0}.bubble.is-pending{border-color:#d9d0a5}.bubble.is-pending .discussion-block-title{background-color:#fffbdd;border-color:#d9d0a5}.bubble .commit-message{padding:0;margin:0;color:#444;white-space:pre-wrap}.discussion-block{padding:15px}.discussion-block>.bubble{margin:0}.discussion-block-header{padding:25px 15px 7.5px;font-size:12px;font-weight:600;color:#586069;background-color:#f5f5f5;border-top:1px solid #ddd}.discussion-event{position:relative;padding:15px}.discussion-event .branch{font-weight:600;color:#444;white-space:nowrap;vertical-align:middle}.discussion-event .branch.css-truncate-target{max-width:165px}.discussion-event .timestamp{color:inherit}.timeline-truncation-container{padding-right:0;padding-left:0}.timeline-truncation-container+.discussion-block{padding-top:15px;border-top:1px solid #eee}.timeline-truncation-container .switch-to-desktop{color:#0366d6}.timeline-truncation-title{margin-top:0;margin-bottom:5px;font-weight:600;color:#586069}.issue-event{position:relative;padding-left:40px;font-size:13px;color:#586069}.issue-event:last-of-type{border-bottom:0}.issue-event .avatar{position:absolute;top:0;left:15px}.issue-event strong{color:#444}.issue-event .meta{margin:0.5em 0 0;font-size:12px;color:#586069}.issue-event .label{font-size:90%}.issue-event-icon{position:absolute;top:16px;left:15px;width:16px;color:#999;text-align:center}.issue-event-icon-open{color:#28a745}.issue-event-icon-closed{color:#cb2431}.issue-event-icon-merged{color:#6f42c1}.issue-event-icon-locked{color:#333}.issue-event-icon-unlocked{color:#28a745}.closed-event{padding-bottom:15px;border-bottom:5px solid #ddd}.dead-pull-request-review-comment{position:relative;display:block;padding-left:20px;margin:0 15px 15px;font-size:12px;color:#586069}.dead-pull-request-review-comment .octicon{position:absolute;top:0;left:0}.dead-pull-request-review-comment .username{font-weight:600;color:#586069}.timeline-review-comment-thread-container.dead .octicon{color:#aaa}.timeline-review-comment-thread-container.dead.open .octicon-unfold,.timeline-review-comment-thread-container.dead.open .show-diff{display:none}.timeline-review-comment-thread-container.dead:not(.open) .octicon-fold,.timeline-review-comment-thread-container.dead:not(.open) .hide-diff,.timeline-review-comment-thread-container.dead:not(.open) .timeline-review-comment-thread{display:none}.cross-reference .bubble-title{font-size:12px;color:#737b7c;background-image:-webkit-linear-gradient(#f8fbfc, #eef1f4);background-image:linear-gradient(#f8fbfc, #eef1f4);border-bottom:1px solid #e0e2e5}.cross-reference .bubble-title a{color:#737b7c}.cross-reference .bubble-title.private{padding-left:30px;background-color:#fffdef;background-image:none}.cross-reference .bubble-title .octicon-lock{float:left;margin-left:-20px;color:rgba(27,31,35,0.7)}.cross-reference .bubble-content a{color:#444}.timeline-commits-container{padding:15px;font-size:12px;line-height:16px;color:#666}.timeline-commits-container .octicon-repo-push{position:absolute;top:1px;left:1px;margin-right:10px;color:#aaa}.timeline-commits-container .author{font-weight:600;color:#666}.timeline-commits-container .timestamp{color:#666}.timeline-commits-container .timeline-commits{width:100%;margin-top:7.5px}.timeline-commits-container .timeline-commits td{padding:4px 0}.timeline-commits-container .commit-message a{color:#666;word-break:break-word}.commit-meta{width:36px;text-align:right}.commit-meta a{color:#aaa}.commit-meta .octicon{position:inline-block}.commit-meta .octicon-x{color:#cb2431}.commit-meta .octicon-check{margin-left:3px;color:#28a745}.commits-header{position:relative;padding-left:25px}.commit-avatar-container{width:25px}.commit-avatar-container .avatar{border-radius:2px}.timeline-review-container .file-header{padding:3px 10px 5px;background-color:#f7f7f7;border-top:1px solid #d1d5da;border-radius:0}.timeline-review-container .file-header:first-child{border-top:0;border-radius:3px 3px 0 0}.timeline-review-container .file-info{font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:12px}.timeline-review-container .bubble{margin-top:15px}.timeline-review-container .inline-comment-form{background-color:#fff}.timeline-review-container .inline-comment-form-container{padding:10px 15px}.timeline-review-container.is-pending{border-color:#d9d0a5}.timeline-review-container.is-pending .label,.timeline-review-container.is-pending .file-header{color:#735c0f;background-color:#fffbdd}.timeline-review-container.is-pending .bubble{border-color:#d9d0a5}.timeline-review-container .file-code{width:auto;min-width:100%;white-space:nowrap;table-layout:fixed}.timeline-review-header{display:table;font-size:12px;color:#666}.timeline-review-icon{display:table-cell;width:24px;vertical-align:top}.timeline-review-icon .octicon{margin-top:-1px;color:#6a737d}.timeline-review-icon .octicon-eye{margin-top:0}.timeline-review-icon .octicon-x{margin-top:0;margin-left:2px}.timeline-review-icon .octicon-check{margin-left:2px}.timeline-review-avatar{display:table-cell;padding-right:5px}.timeline-review-meta{display:table-cell;vertical-align:top}.timeline-review-meta .author{color:#666}.discussion-item-review-comment{border-bottom:1px solid #eaecef}.discussion-item-review-comment:last-child{border-bottom:0}.outdated-comment .timeline-review-comment-thread,.outdated-comment .hide-outdated-button{display:none}.outdated-comment .file-header{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.outdated-comment.open .timeline-review-comment-thread,.outdated-comment.open .hide-outdated-button{display:block}.outdated-comment.open .show-outdated-button{display:none}.outdated-comment.open .file-header{border-bottom-right-radius:0;border-bottom-left-radius:0}.outdated-comment-label{line-height:22px}.user-mention,.team-mention{font-weight:600;color:#24292e}.discussion-create{margin:15px 15px 0}.discussion-create .form-control{margin-bottom:8px}.discussion-create .btn{margin-top:7.5px;margin-bottom:15px}.discussion-block+.discussion-block,.discussion-block+.discussion-event,.discussion-block+.timeline-commits-container,.discussion-event+.discussion-event,.discussion-event+.discussion-block,.discussion-event+.timeline-commits-container,.timeline-commits-container+.discussion-event,.timeline-commits-container+.discussion-block,.timeline-commits-container+.timeline-commits-container{border-top:1px solid #eee}.discussion-reply{padding:15px;text-align:right;background-color:#fff;border-top:1px solid #ddd}.discussion-reply .btn{margin-top:8px}.discussion-reply .btn+.btn{margin-left:8px}.comment-sign-in-container{padding:15px;font-size:13px;text-align:center}.comment-sign-in-container .btn{margin:0 0 15px}.thread-subscription-status{padding:15px;background-color:#fff;border-top:1px solid #ddd}.thread-subscription-status .octicon-radio-tower{float:left;color:#ccc}.thread-subscription-description{position:relative;min-height:30px;padding-left:42px;margin-top:0;font-size:13px;color:#586069}.thread-subscription-description .octicon{position:absolute;left:0}.line-comment-info{position:relative;padding:7.5px 15px;font-size:12px;color:#586069;border-bottom:1px solid #ddd}.line-comment-info::before,.line-comment-info::after{position:absolute;width:0;height:0;content:""}.line-comment-info::before{bottom:-8px;left:15px;z-index:10;border-top:8px solid #ddd;border-right:8px solid transparent;border-left:8px solid transparent}.line-comment-info::after{bottom:-7px;left:16px;z-index:20;border-top:7px solid #fff;border-right:7px solid transparent;border-left:7px solid transparent}.mobile-featured-carousel{margin:10px 0;overflow:auto;-webkit-overflow-scrolling:touch}.mobile-featured-carousel .mobile-featured-collections{padding:0;margin:0 15px;white-space:nowrap;list-style-type:none}.mobile-featured-carousel .mobile-featured-collection{display:inline-block;width:100%;padding:0;margin:0 5px 0 0}.mobile-featured-carousel .mobile-featured-collection:last-child{margin-right:15px}.mobile-featured-carousel .mobile-featured-collection-head{display:table;width:100%;height:150px;border-radius:3px}.mobile-featured-carousel .mobile-featured-collection-title{display:table-cell;padding:10px;font-size:18px;font-weight:500;color:#fff;text-align:center;white-space:pre-line;vertical-align:middle}.showcase-collection .header{padding:20px 15px;background:#555 url("/images/modules/home/octicons-bg.png") center repeat}.showcase-collection .header .avatar{width:20px;height:20px;vertical-align:middle;border-radius:2px}.showcase-collection .title{margin:0;font-size:18px;font-weight:500;color:#fff}.showcase-collection .description{margin:15px;font-size:15px}.showcase-collection .showcase-items .title-meta-info{margin-left:5px;font-size:12px;font-weight:normal;color:#586069}.showcase-collection .showcase-items .bubble-title{font-weight:600;line-height:30px;color:#4183c4}.showcase-collection .showcase-items .avatar{width:30px;height:30px;margin-right:5px;vertical-align:middle;border-radius:2px}.flash{position:relative;padding:15px;font-size:14px;font-weight:600;color:#264c72;background-color:#dbeaf9;border-bottom:solid 1px #bac6d3}.flash+.flash{margin-top:5px}.flash .container{margin-right:0;margin-left:0}.flash .octicon-x{display:none}.flash .flash-action{float:right;margin-top:-5px}.flash.flash-warn{color:#4c4a42;background-color:#fff9ea;border-color:#dfd8c2}.flash.flash-error{color:#911;background-color:#fcdede;border-color:#d2b2b2}.flash-messages.container{margin:0 0 15px}.touchable{-webkit-tap-highlight-color:transparent}.nav-bar{position:relative;overflow:visible;color:rgba(255,255,255,0.75);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#1e2327}.nav-bar-inner{height:50px;margin:0 2px;line-height:50px;text-align:center}.nav-bar-inner .header-button{position:absolute;padding:5px 8px;line-height:1;color:inherit;background:transparent;border:0;border-radius:5px}.nav-bar-inner .header-button:active,.nav-bar-inner .header-button:focus{outline:0;box-shadow:none}.nav-bar-inner .header-context-button{top:8px;right:8px}.nav-bar-inner .header-nav-button{top:8px;left:8px}.nav-bar-inner .octicon-lock{top:-1px;margin-right:5px}.nav-bar-inner .brand-logo-invertocat .octicon,.nav-bar-inner .brand-logo-wordmark .octicon{margin-top:-8px;color:#fff;vertical-align:text-top}.nav-bar-inner.has-notifications{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.nav-bar-inner.has-notifications .header-button{position:static;max-width:44px;padding:0 12px}.nav-bar-inner.has-notifications .header-context-button{padding-top:14px}.nav-bar-inner.has-notifications .header-notification-button{position:relative;padding-top:14px}.unread-notifications-indicator{position:absolute;top:7px;right:5px;display:block;width:14px;height:14px;background-color:#2188ff;border:2px solid #1e2327;border-radius:50%}.nav-bar-title-text{position:relative;max-width:75%;padding:0 5px;margin:0 auto;overflow:hidden;font-size:14px;text-align:center;text-overflow:ellipsis;white-space:nowrap}.has-notifications .nav-bar-title-text{position:static;max-width:none;margin:0;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1}.nav-bar-meta{padding:7.5px 15px;font-size:75%;text-align:center;border-top:1px solid #ddd}.nav-bar-tabs{position:absolute;z-index:9000;display:none;width:100%;height:0;padding:7.5px 0;overflow:hidden;font-size:16px;background-color:#1e2327;background-clip:padding-box}.nav-bar-tabs ul{padding:0;margin:0;list-style:none}.nav-bar-tabs a{position:relative;display:block;padding:8px 15px 8px 45px;color:rgba(255,255,255,0.75)}.nav-bar-tabs a .avatar,.nav-bar-tabs a .octicon{float:left;margin-top:3px;margin-left:-30px}.nav-bar-tabs a .octicon{width:20px;text-align:center}.nav-bar-tabs .section-title{padding:15px 0 0 15px;margin-top:7.5px;margin-bottom:0;font-size:12px;text-transform:uppercase}.nav-bar-tabs .unread-notifications-indicator{position:static;display:inline-block;vertical-align:-2px}.nav-is-open .nav-bar-tabs{display:block;height:auto}.markdown-body{font-size:15px}.markdown-body blockquote{margin-right:0;margin-left:0}.markdown-body code{white-space:normal}.markdown-body.email-format{line-height:1.5em !important}.markdown-body.email-format div{white-space:pre-wrap}.markdown-body .email-hidden-reply{display:none;white-space:pre-wrap}.markdown-body .email-hidden-reply.expanded{display:block}.markdown-body .email-quoted-reply,.markdown-body .email-signature-reply{padding:0 15px;margin-bottom:15px;color:#586069;border-left:4px solid #ddd}.breadcrumb{padding:15px;font-size:12px;color:#586069;border-bottom:1px solid #ddd}.breadcrumb .separator{margin:0 0.25em}.breadcrumb .octicon{margin-top:-1px;margin-right:5px}.breadcrumb a{font-weight:600}.breadcrumb strong{color:#444}.tabs{display:table;width:100%;table-layout:fixed}.tabs>a{display:table-cell;padding:10px 0;font-size:14px;font-weight:600;text-align:center;border-bottom:1px solid #ddd}.tabs>a.selected{color:#444;background-color:#fff;border-right:1px solid #ddd;border-bottom-color:#fff;border-left:1px solid #ddd}.tabs>a:first-child{border-left:0}.tabs>a:last-child{border-right:0}.pagination{position:relative;z-index:2;display:table;padding:0;margin-top:0;margin-bottom:-1px;background-color:#fafbfc}.pagination a,.pagination span,.pagination em{display:table-cell;width:1%;padding:10px 15px;color:#555;text-align:center;border:1px solid #ddd;border-left-color:#fff}.pagination a:first-child,.pagination span:first-child,.pagination em:first-child{border-left:0}.pagination a:last-child,.pagination span:last-child,.pagination em:last-child{border-right:0}.pagination span>a{padding:0}.pagination .current{font-style:normal;font-weight:600;color:#fff;background-color:#6a737d;background-image:-webkit-linear-gradient(#6a737d, #999);background-image:linear-gradient(#6a737d, #999);border-color:#6a737d}.pagination .gap,.pagination .disabled{color:#ccc}.oauth-header{padding:15px 15px 0;margin:0 0 15px;background:#fff;border-bottom:1px solid #ddd}.oauth-header::before{display:table;content:""}.oauth-header::after{display:table;clear:both;content:""}.oauth-header h1{margin-bottom:0;font-size:18px}.oauth-header .lead{margin-top:0;font-size:14px;color:#586069}.oauth-connection-illustration{position:relative;float:right;width:auto;margin-top:12px;margin-left:10px}.oauth-connection-illustration .oauth-image{float:left;padding:2px;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);border-radius:3px}.oauth-connection-illustration .oauth-image img{display:block;width:48px;height:48px;border-radius:3px}.oauth-connection-illustration .oauth-image.oauth-image-user{margin-top:20px;margin-left:-20px}.oauth-main .oauth-permissions-icon{float:left;margin-top:4px;margin-left:0;color:#586069;text-align:center}.oauth-main .permission-title{display:block;margin-bottom:2px;color:#000}.oauth-main .permission-summary,.oauth-main .permission-note{margin-left:34px}.oauth-main .permission-summary{line-height:1}.oauth-main .permission-summary .access-details{position:relative;color:#586069}.oauth-main .permission-note{margin-bottom:0;font-size:12px;color:#586069}.oauth-main .permission-note ul{padding-left:18px;margin:1em 0;list-style-type:disc}.oauth-main em.highlight{position:relative;padding:2px 3px;margin-right:-2px;margin-left:-3px;font-style:normal;color:#4c4a42;background:#fff9ea;border-radius:3px}.oauth-requests-summary{display:table;width:100%;table-layout:fixed}.oauth-requests-summary .octicon,.oauth-requests-summary .access-details{margin:0}.oauth-requests-summary .access-details{padding:0 10px 0 40px}.oauth-requests-summary .access-details p:first-child{margin-top:0}.oauth-requests-summary .access-details p:last-child{margin-bottom:0}.oauth-requests-summary .access-details .secondary-details{font-size:12px;color:#586069}.oauth-requests-summary .octicon-organization.approved{color:#28a745}.added-permission{color:#28a745}.oauth-permission-title{margin:15px 15px 5px}.oauth-secondary{font-size:12px}.oauth-secondary .no-description{margin-top:0;color:#586069}.oauth-secondary .learn-more,.oauth-secondary .existing-access{padding-top:15px;margin-bottom:5px;border-top:1px solid #eee}.oauth-secondary .features-list{padding:0;margin:0;list-style:none}.oauth-secondary .features-list li{margin-top:10px}.oauth-secondary .features-list li:first-child{margin-top:0}.oauth-secondary .features-list .list-divider{margin:15px -15px;border-top:1px solid #eee}.oauth-secondary .features-list .octicon{margin-right:5px;color:#60b044}.oauth-permissions-details .content{display:none}.oauth-permissions-details.open .content{display:block}.oauth-permissions-details.default .default-access{display:inline}.oauth-permissions-details.full .full-access{display:inline}.oauth-user-permissions .full-access,.oauth-user-permissions .limited-access,.oauth-user-permissions .limited-access-emails-followers,.oauth-user-permissions .limited-access-emails-profile,.oauth-user-permissions .limited-access-followers-profile,.oauth-user-permissions .limited-access-profile,.oauth-user-permissions .limited-access-followers,.oauth-user-permissions .limited-access-emails,.oauth-user-permissions .no-access{display:none}.oauth-user-permissions.limited.limited-email .limited-access-emails{display:inline}.oauth-user-permissions.limited.limited-email.limited-profile .limited-access-emails,.oauth-user-permissions.limited.limited-email.limited-profile .limited-access-profile{display:none}.oauth-user-permissions.limited.limited-email.limited-profile .limited-access-emails-profile{display:inline}.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-emails,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-profile,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-followers,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-emails-profile,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-emails-followers,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-followers-profile{display:none}.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access{display:inline}.oauth-user-permissions.limited.limited-email.limited-follow .limited-access-emails,.oauth-user-permissions.limited.limited-email.limited-follow .limited-access-followers{display:none}.oauth-user-permissions.limited.limited-email.limited-follow .limited-access-emails-followers{display:inline}.oauth-user-permissions.limited.limited-follow .limited-access-followers{display:inline}.oauth-user-permissions.limited.limited-follow.limited-profile .limited-access-followers,.oauth-user-permissions.limited.limited-follow.limited-profile .limited-access-profile{display:none}.oauth-user-permissions.limited.limited-follow.limited-profile .limited-access-followers-profile{display:inline}.oauth-user-permissions.limited.limited-profile .limited-access-profile{display:inline}.oauth-repo-permissions .default-access,.oauth-repo-permissions .public-access,.oauth-repo-permissions .full-access{display:none}.oauth-repo-permissions.public .public-access{display:inline}.oauth-delete-repo-permissions .octicon-alert{color:#cb2431}.oauth-repo-status-permissions .no-access,.oauth-repo-status-permissions .full-access{display:none}.oauth-notifications-permissions .no-access,.oauth-notifications-permissions .read-access,.oauth-notifications-permissions .via-public-access,.oauth-notifications-permissions .via-full-access{display:none}.oauth-notifications-permissions.read .read-access{display:inline}.oauth-notifications-permissions.via-public .via-public-access{display:inline}.oauth-notifications-permissions.via-public .octicon{display:none}.oauth-notifications-permissions.via-full .via-full-access{display:inline}.oauth-gist-permissions .no-access,.oauth-gist-permissions .full-access{display:none}.oauth-granular-permissions .no-access,.oauth-granular-permissions .read-access,.oauth-granular-permissions .write-access,.oauth-granular-permissions .full-access{display:none}.oauth-granular-permissions.none .no-access{display:inline}.oauth-granular-permissions.read .read-access{display:inline}.oauth-granular-permissions.write .write-access{display:inline}.oauth-granular-permissions.full .full-access{display:inline}.oauth-connect{padding-bottom:15px;margin:0 15px}.issues-reset-query-wrapper{padding:15px;background-color:#fff;border-bottom:solid 1px #eee}.subset-files-tab{background-color:#e6f1f6}.branch-action{padding:15px;font-size:12px;color:#586069;background-color:#fff;border-top:1px solid #eee}.discussion-block-header+.branch-action{border-top-color:#ddd}.branch-action-with-icon{padding-left:35px}.branch-action-heading{margin-top:0;margin-bottom:0;font-size:14px;color:#24292e}.branch-action-icon{float:left;width:16px;margin-left:-23px;text-align:center}.branch-action-expandable{border-top:1px solid #eee}.discussion-block-header+.branch-action-expandable{border-top-color:#ddd}.branch-action-expandable .list-item{padding-right:40px}.branch-action-expandable .list-items-overflow{max-height:170px;-webkit-overflow-scrolling:touch;overflow-y:auto;font-size:13px;background-color:#f5f5f5;border-top:1px solid #eee}.branch-action-expandable .list-items-overflow .list-item{padding-top:7px;padding-bottom:7px}.branch-action-expandable .list-items-overflow .list-item-state-icon{top:8px}.branch-action-expandable .octicon-fold,.branch-action-expandable .list-items-overflow{display:none}.branch-action-expandable.open .octicon-fold,.branch-action-expandable.open .list-items-overflow{display:block}.branch-action-expandable.open .octicon-unfold{display:none}.branch-action-expandable .list-item:first-child .list-item-chevron{top:14px;margin-top:2px;font-size:18px}.branch-actions-details{margin-right:-25px}.merge-branch{position:relative}.merge-branch .is-loading .octicon{display:none}.merge-branch .is-loading .mergeable-state-loading{display:inline-block;width:16px;height:16px;background-image:url("/images/spinners/octocat-spinner-16px.gif")}.merge-branch .mergeable-state-message{margin-top:0;margin-bottom:0;font-size:12px;color:#586069}.merge-branch .mergeable-state-message.required{display:block;color:#586069}.merge-branch .merge-branch-form,.merge-branch .mergeable-state-message{display:none}.merge-branch.open{border-top:3px solid #ddd}.merge-branch.open .octicon-git-pull-request,.merge-branch.open .merge-message{display:none}.merge-branch.open.mergeable-state-clean .merge-branch-form{display:block}.merge-branch.open.mergeable-state-unstable .mergeable-state-message.unstable{display:block}.merge-branch.open.mergeable-state-dirty .mergeable-state-message.dirty{display:block}.merge-branch.open.mergeable-state-blocked .mergeable-state-message.blocked{display:block}.merge-branch.mergeable-state-error .mergeable-state-message.error{display:block}.merge-commit-message{margin:7.5px 0}.merge-commit-title{font-weight:600}.merge-form-author{margin-bottom:15px;font-size:12px;line-height:20px;color:#586069}.merge-form-author .avatar{margin-right:5px}.merge-options{margin-right:0;margin-left:0;color:#24292e}.merge-options .list-item{padding-top:10px;padding-bottom:10px}.merge-options .byline{font-weight:normal}.merge-option-radio{position:absolute;top:12px;left:12px;margin-right:3px}.merge-branch-form .btn-merge{display:block}.merge-branch-form .btn-squash,.merge-branch-form .btn-rebase{display:none}.merge-branch-form.is-squashing .btn-merge,.merge-branch-form.is-squashing .btn-rebase{display:none}.merge-branch-form.is-squashing .btn-squash{display:block}.merge-branch-form.is-rebasing .merge-commit-title,.merge-branch-form.is-rebasing .merge-commit-message{display:none}.merge-branch-form.is-rebasing .btn-merge,.merge-branch-form.is-rebasing .btn-squash{display:none}.merge-branch-form.is-rebasing .btn-rebase{display:block}.repository-meta{margin:15px;font-size:13px;color:#666}.repository-meta-url{word-wrap:break-word}.branch-selector{position:relative;padding-left:19px;font-weight:600}.branch-selector .octicon.octicon-git-branch{position:absolute;top:1px;left:0}.branch-selector .octicon.octicon-chevron-up,.branch-selector .octicon.octicon-chevron-down{position:relative;top:1px;float:right;width:auto;margin-right:0;margin-left:0}.branch-selector .octicon.octicon-chevron-up{display:none}.branch-selector label{display:block;font-size:inherit}.branch-selector-toggle{display:none}.branch-selector-toggle:checked ~ label .octicon-chevron-up{display:block}.branch-selector-toggle:checked ~ label .octicon-chevron-down{display:none}.branch-selector-toggle:checked ~ .branch-selector-options{display:block}.branch-selector-options{position:relative;display:none;padding-top:6px;font-size:13px;font-weight:normal}.branch-selector-option{display:block;padding:6px 0;font-size:14px;font-weight:600}.branch-selector-option .octicon-check{position:absolute;left:-19px}.branch-selector-all-branches{display:block;padding:6px 0}.latest-commit .commit-author{position:relative;padding-top:8px;padding-bottom:8px;font-size:12px;line-height:20px;color:#586069;background:#fff}.latest-commit .bubble-content strong{color:#555}.pulse-control{padding:15px;font-size:11px;text-align:right}.trending-text-for{padding-right:5px}.trending-text-in{padding-right:5px;padding-left:5px}.pulse-summary{margin:0 0 30px}.pulse-summary:last-of-type{margin-bottom:0}.pulse-summary .summary-title{padding:0;margin:0 0 5px;font-size:14px}.pulse-summary .bar-graph{display:table;width:100%;margin:0;border-radius:3px}.pulse-summary .bar{display:table-cell;height:15px;background-color:#6a737d}.pulse-summary .bar.closed{background-color:#cb2431}.pulse-summary .bar.open{background-color:#28a745}.pulse-summary .bar.merged{background-color:#6f42c1}.pulse-summary .bar.proposed{background-color:#28a745}.pulse-summary .summary-box{display:table;width:100%;padding:0;margin:0;color:#586069;border:1px solid #f2f2f4}.pulse-summary .summary-box li{display:table-cell;width:50%;padding:15px 0;text-align:center}.pulse-summary .summary-box li:first-child{border-right:1px solid #f2f2f4}.pulse-summary .summary-box .count{display:block;font-size:16px;color:#444}.pulse-summary .summary-box .count .octicon{margin-top:2px}.user-bar-graph{position:relative;height:103px;background:#fff}.max-commits{position:absolute;top:3px;right:15px;font-size:10px;color:#586069}.user-bar-item{position:relative;float:left;width:20px;height:75px;margin:0 5px 5px 0}.user-bar-item img{position:absolute;bottom:-28px;margin-right:5px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.user-bar{position:absolute;bottom:0;width:20px;max-height:75px;padding:0 0 3px;margin:0;font-size:12px;color:#586069;background-color:#fc9a28;border-top-left-radius:3px;border-top-right-radius:3px;opacity:0.8}.y-axis-bar{position:absolute;left:0;width:100%;height:1px;background:#eaeaea}.y-axis-bar.top{top:0}.y-axis-bar.middle{top:36px}.y-axis-bar.bottom{bottom:27px;border-color:#ccc}.bar-graph{height:30px;padding:0;margin:15px 0}.bar-graph a{position:relative;display:block;float:left;height:10px;padding:0;margin:0}.bar-graph a .label{position:absolute;bottom:-23px;font-size:13px;color:#586069}.bar-graph a:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.bar-graph a:first-child .label{left:0}.bar-graph a:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px}.bar-graph a:last-child .label{right:0}.file-browser-header{max-width:100%;border-bottom:1px solid #ddd}.file-browser-header>.TableObject-item{padding:15px}.file-browser-header>.TableObject-item:first-child{white-space:normal;border-right:solid 1px #ddd}.file-browser-header .octicon{color:#586069}.history-link{margin-top:4px;font-size:12px;font-weight:600;color:#586069;vertical-align:top}p.history-link{padding:15px;margin:0;font-size:13px;border-bottom:1px solid #ddd}p.history-link a{color:#586069}.blob-breadcrumb{position:relative;padding-left:40px}.blob-breadcrumb .filetype-icon{position:absolute;top:15px;left:15px}.blob-history{position:relative;display:none;color:#7b878c;background:#f5f9fc;border-bottom:1px solid #d2d9dd}.blob-history a{display:block;padding:15px 15px 15px 41px;font-size:13px;color:#0366d6}.blob-history .octicon{color:#7b878c}.blob-history .octicon-history{position:absolute;top:16px;left:15px}.blob-history .commit-ref{float:right;margin:2px 0 0 10px;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:12px;font-weight:600;color:#7b787c}.blob-history-label{float:right;color:#0366d6}.blob-history-checkbox{position:absolute;top:0;left:0;opacity:0}.blob-history-checkbox:checked ~ .blob-history{display:block}.blob-file-content{background-color:#fff}.blob-file-content pre{margin:0;overflow:scroll;word-wrap:normal;white-space:pre}.blob-file-content .code-body pre{padding:15px 0}.blob-file-content .code-body pre .line{padding:0 15px}.blob-file-content-blankslate{padding:15px;margin-top:0;margin-bottom:0}.markdown-body{padding:15px}.subscription-settings-bubble .bubble-content{padding:0 15px}.reponav-wrapper{position:relative;z-index:2;height:36px;margin-top:-1px;overflow-y:hidden;background-color:#1e2327}.reponav{padding-right:7px;padding-bottom:20px;padding-left:7px;margin-top:-6px;-webkit-overflow-scrolling:touch;overflow-x:auto;color:rgba(255,255,255,0.75);text-align:center;white-space:nowrap}.reponav-item{display:inline-block;padding:10px 8px;color:rgba(255,255,255,0.75)}.reponav-item .Counter{color:inherit;background-color:rgba(255,255,255,0.15)}.reponav-item.selected{font-weight:600;color:#fff}.server-stats{color:#586069;background:#333}.server-stats .stats{padding-left:0;margin:0}.server-stats .stats li{padding:15px;list-style:none;border-bottom:1px solid rgba(0,0,0,0.7);box-shadow:0 1px 0 rgba(255,255,255,0.1)}.server-stats a,.server-stats strong{font-weight:600;color:#fff}.server-stats .serverstats-branch{padding:15px;margin:0;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace}.server-stats .serverstats-branch .current-branch{max-width:90%}.octicon{display:inline-block;vertical-align:text-top;fill:currentColor}.profile-header{position:relative;min-height:140px;padding:15px 15px 10px 140px;overflow:visible;line-height:1.5}.profile-header .avatar{position:absolute;top:15px;left:15px;margin-right:15px;border-radius:3px}.profile-header h1{margin:0;font-size:16px;color:#333}.profile-header h3{margin:0;font-size:12px;font-weight:normal;color:#586069}.user-profile-bio{padding:0 15px 15px;white-space:pre-wrap}.user-profile-company>div{display:inline-block}.details{padding:0;margin:7.5px 0 0}.details li{margin-bottom:0;font-size:12px;line-height:1.8}.details-item{font-size:13px;line-height:24px;list-style:none}.details-item .css-truncate-target{max-width:88%}.details-item .octicon{width:16px;color:#586069;text-align:center}.user-following-container{display:block;padding:0 15px 15px}.user-following-container.loading{opacity:0.5}.user-following-container .follow,.user-following-container.on .unfollow{display:block}.user-following-container.on .follow,.user-following-container .unfollow{display:none}.language-color{position:relative;top:1px;display:inline-block;width:12px;height:12px;border-radius:50%}.profile-timeline-wrapper{position:relative;z-index:0;overflow:hidden;word-break:break-word;word-wrap:break-word;white-space:normal;background-color:#fff}.profile-timeline-wrapper .form-select{width:116px}.profile-timeline .timeline-item-icon{float:left;width:32px;height:32px;margin-top:-7px;margin-left:-40px;line-height:29px;color:#586069;text-align:center;background-color:#f6f8fa;border:2px solid #fff;border-radius:50%}.profile-timeline .profile-timeline-month-line{background-color:#fff}.profile-timeline .profile-timeline-month-line .profile-timeline-month-heading{top:-10px}.profile-timeline .profile-timeline-month-line::after{display:block;width:100%;height:1px;margin-top:-4px;content:"";background-color:#f6f8fa}.profile-timeline .profile-timeline-line::before{position:absolute;top:0;bottom:0;left:15px;z-index:-1;display:block;width:2px;content:"";background-color:#f6f8fa}.profile-timeline .profile-timeline-card-wrapper{border-top:solid 2px #fff;border-bottom:solid 2px #fff}.profile-timeline .profile-timeline-card-wrapper h4{margin:0}.profile-timeline .profile-timeline-card-footer{height:45px;line-height:45px}.profile-timeline .profile-timeline-card-footer .diffstat{position:inherit !important;top:0}.profile-timeline .progress-bar{height:10px;border-radius:2px}.profile-timeline .col-5{width:30%}.profile-rollup-wrapper .css-truncate-target{max-width:72%}.profile-rollup-icon .octicon{vertical-align:middle}.profile-rollup-event-title.css-truncate-target{max-width:100%}.profile-rollup-wrapper+.profile-rollup-wrapper{border-top:1px solid #f6f8fa}.profile-timeline-card-wrapper+.profile-timeline-card-wrapper{margin-top:8px}.profile-rollup-wrapper+.profile-timeline-card-wrapper{margin-top:0}.profile-timeline-month-line+.profile-timeline-card-wrapper{margin-top:8px}.profile-rollup-content{display:none}.profile-rollup-toggle .css-truncate-target{max-width:90%}.profile-rollup-toggle-closed{display:none}.profile-rollup-toggle-open{display:inline-block}.open .profile-rollup-content,.open .profile-rollup-toggle-closed{display:block}.open .btn-link .profile-rollup-toggle-closed{display:inline-block}.open .profile-rollup-toggle-open{display:none}.inbox-zero{padding:30px 15px;color:#586069;text-align:center;background-color:#fff;border-top:1px solid #eee}.inbox-unavailable{padding:30px 15px;color:#586069;text-align:center;background-color:#fff;border-top:1px solid #eee}.subscription-settings-bubble .form-checkbox{padding:0 15px 0 40px}.subscription-settings-bubble .form-checkbox input[type="radio"]{position:relative;top:2px}.subscription-settings-bubble .form-checkbox .note{padding-left:0}.mobile-search .list-item em,.mobile-search .list-item-title em,.mobile-search .list-item .byline em{padding:1px;padding-top:1px;font-style:normal;font-weight:600;text-shadow:none;background-color:rgba(255,255,140,0.5);border-radius:3px}.mobile-search .description{display:block;padding-bottom:5px;margin:0;font-size:12px;color:#000}.mobile-search .description strong{font-weight:normal;color:#444}.mobile-search .issue-list-item .octicon-comment-discussion{margin-left:5px;color:#586069}.mobile-search .user-list-item{min-height:73px}.mobile-search .user-list-item .user-list-info,.mobile-search .user-list-item .byline{padding-left:45px}.dashboard-search{display:block;margin:15px}.dashboard-search .dashboard-search-input{width:100%;margin:0}.topic-tag{display:inline-block;padding:0.3em 0.9em;margin:0.25em 0.5em 0.25em 0;background-color:#e7f3ff;border-radius:3px}.branch-groups{padding-top:15px;background:#fff}.branch-groups .bubble-title{background-color:#f5f5f5}.branches-list{border-bottom:1px solid #ddd}.branches-list:last-child{border-bottom:0}.branches-list .branch-name{display:inline-block;padding:2px 6px;margin-left:15px;font:12px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;color:rgba(0,0,0,0.5);background-color:rgba(209,227,237,0.5);border-radius:3px}.branches-list .branch-name .octicon{margin:1px -2px 0 0;color:#b0c4ce}.branches-list a.branch-name{color:#0366d6}.branch-list-item .branch-name{max-width:80%;margin-right:10px}.branch-list-item .meta{margin-top:3px}.branch-list-item .branch-meta{display:block;margin-top:3px;margin-left:0;font-size:12px;color:#586069}.gist-mobile-blob{border-top:1px solid #ddd}.gist-meta{margin-top:15px}.render-container{padding:30px;line-height:0;text-align:center;background:#dfe2e5}.render-container .render-viewer{display:none;width:100%;height:100%;border:0}.render-container .octospinner{display:none}.render-container .render-viewer-error,.render-container .render-viewer-fatal,.render-container .render-viewer-invalid{display:none}.render-container.is-render-automatic .octospinner{display:inline-block}.render-container.is-render-requested .octospinner{display:inline-block}.render-container.is-render-requested.is-render-failed .render-viewer-error{display:inline-block}.render-container.is-render-requested.is-render-failed .render-viewer,.render-container.is-render-requested.is-render-failed .render-viewer-fatal,.render-container.is-render-requested.is-render-failed .render-viewer-invalid,.render-container.is-render-requested.is-render-failed .octospinner{display:none}.render-container.is-render-requested.is-render-failed-fatal .render-viewer-fatal{display:inline-block}.render-container.is-render-requested.is-render-failed-fatal .render-viewer,.render-container.is-render-requested.is-render-failed-fatal .render-viewer-error,.render-container.is-render-requested.is-render-failed-fatal .render-viewer-invalid,.render-container.is-render-requested.is-render-failed-fatal .octospinner{display:none}.render-container.is-render-requested.is-render-failed-invalid .render-viewer-invalid{display:inline-block}.render-container.is-render-requested.is-render-failed-invalid .render-viewer,.render-container.is-render-requested.is-render-failed-invalid .render-viewer-error,.render-container.is-render-requested.is-render-failed-invalid .render-viewer-fatal,.render-container.is-render-requested.is-render-failed-invalid .octospinner{display:none}.render-container.is-render-ready.is-render-requested:not(.is-render-failed){height:500px;padding:0;background:none}.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .render-viewer{display:block}.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .render-viewer-error,.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .render-viewer-fatal,.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .octospinner{display:none}.render-notice{padding:20px 15px;font-size:14px;color:#4c4a42;background-color:#fff9ea;border-color:#dfd8c2}
  10. @media (min-width: 992px) {
  11. .container{
  12. width: 980px;
  13. margin-right: auto;
  14. margin-left: auto;
  15. position: relative;
  16. margin-top: 16px;
  17. margin-bottom: 16px;
  18. border: 1px solid #ddd;
  19. border-radius: 3px;
  20. }
  21. }
  22. </style>
  23. </head>
  24. <body><div id="readme" class="container"><article class="markdown-body entry-content"><h2 id="installation-de-dovecot-et-de-l-authentification">Installation de <strong>dovecot</strong> et de l&apos;authentification</h2>
  25. <p>Pour l&apos;instant, pour r&#xE9;cup&#xE9;rer ses &#xE9;mails, il faut d&apos;abord avoir un compte sur le serveur et se loguer. Ensuite, avec la commande mailx, on peut voir ses messages.</p>
  26. <p>Exemple:</p>
  27. <pre><code class="language-shell">ericadmin@aijan:~$ mailx
  28. &quot;/var/mail/ericadmin&quot;: 2 messages 2 non lus
  29. &gt;U 1 Eric Streit dim. mai 20 08:4 20/742 essai d envoi &#xE0; root
  30. U 2 Eric Streit dim. mai 20 08:5 19/736 un autre essai
  31. ?</code></pre>
  32. <p>Nous allons installer dovecot qui est un serveur <strong>pop/imap</strong> et d&apos;authentification <strong>SASL</strong>. Nous pourrons ensuite nous connecter sur le serveur avec un client mail comme <strong>thunderbird</strong>, et r&#xE9;cup&#xE9;rer et envoyer nos messages avec celui-ci.</p>
  33. <h3 id="installation-des-programmes">Installation des programmes</h3>
  34. <p>Nous n&apos;installerons que les programmes n&#xE9;cessaires &#xE0; la gestion du protocole <strong>imap</strong> des courriers. Nous n&apos;utilisons pas le protocole <strong>pop3</strong>.</p>
  35. <p>Tout d&apos;abord, faites une copie de /etc/postfix/main.conf et /etc/postfix/master.conf:</p>
  36. <pre><code class="language-shell"># cp master.cf master.cf.orig
  37. # cp main.cf main.cf.orig</code></pre>
  38. <p>Nous allons maintenant configurer nos boites &#xE9;mail; 2 syst&#xE8;mes sont courants: fichier unique qui contient tous vos messages (type mbox) ou r&#xE9;pertoire avec un fichier par &#xE9;mail (type maildir). Par d&#xE9;faut, le type est mbox.
  39. Nous allons changer cela (question de go&#xFB;t ...) Pour cela, nous aurons besoins des programmes utilitaires install&#xE9;s avec dovecot.</p>
  40. <h3 id="choix-de-la-base-de-donn-es">Choix de la base de donn&#xE9;es</h3>
  41. <p>Nous utiliserons la base de donn&#xE9;es <strong>sqlite</strong>. Il est bien s&#xFB;r pr&#xE9;f&#xE9;rable d&apos;utiliser une base de donn&#xE9;es plus traditionnelle comme <strong>mysql</strong> ou <strong>postgresql</strong> si le nombre d&apos;utilisateurs est important. Mon serveur de mails n&apos;aura que moins de 10 adresses &#xE9;mail, donc, <strong>sqlite</strong> suffira.</p>
  42. <pre><code class="language-shell">root@adara:/home/www# apt install dovecot-common dovecot-imapd dovecot-sqlite
  43. Lecture des listes de paquets... Fait
  44. Construction de l arbre des d&#xE9;pendances
  45. Lecture des informations d &#xE9;tat... Fait
  46. Note : s&#xE9;lection de &#xAB; dovecot-core &#xBB; au lieu de &#xAB; dovecot-common &#xBB;
  47. The following additional packages will be installed:
  48. libexttextcat-2.0-0 libexttextcat-data libstemmer0d
  49. Paquets sugg&#xE9;r&#xE9;s :
  50. dovecot-gssapi dovecot-sieve dovecot-pgsql dovecot-mysql dovecot-ldap dovecot-pop3d dovecot-lmtpd dovecot-managesieved dovecot-solr dovecot-lucene ufw
  51. Les NOUVEAUX paquets suivants seront install&#xE9;s :
  52. dovecot-core dovecot-imapd dovecot-sqlite libexttextcat-2.0-0 libexttextcat-data libstemmer0d
  53. 0 mis &#xE0; jour, 6 nouvellement install&#xE9;s, 0 &#xE0; enlever et 0 non mis &#xE0; jour.
  54. Il est n&#xE9;cessaire de prendre 5 062 ko dans les archives.
  55. Apr&#xE8;s cette op&#xE9;ration, 12,2 Mo d espace disque suppl&#xE9;mentaires seront utilis&#xE9;s.
  56. Souhaitez-vous continuer ? [O/n] o
  57. R&#xE9;ception de:1 http://debian.mirrors.ovh.net/debian stretch/main amd64 libexttextcat-data all 3.4.4-2 [167 kB]
  58. R&#xE9;ception de:2 http://debian.mirrors.ovh.net/debian stretch/main amd64 libexttextcat-2.0-0 amd64 3.4.4-2+b1 [16,2 kB]
  59. R&#xE9;ception de:3 http://debian.mirrors.ovh.net/debian stretch/main amd64 libstemmer0d amd64 0+svn585-1+b2 [63,3 kB]
  60. R&#xE9;ception de:4 http://debian.mirrors.ovh.net/debian stretch/main amd64 dovecot-core amd64 1:2.2.27-3+deb9u2 [3 324 kB]
  61. R&#xE9;ception de:5 http://debian.mirrors.ovh.net/debian stretch/main amd64 dovecot-imapd amd64 1:2.2.27-3+deb9u2 [814 kB]
  62. R&#xE9;ception de:6 http://debian.mirrors.ovh.net/debian stretch/main amd64 dovecot-sqlite amd64 1:2.2.27-3+deb9u2 [677 kB]
  63. 5 062 ko r&#xE9;ceptionn&#xE9;s en 0s (6 873 ko/s)
  64. S&#xE9;lection du paquet libexttextcat-data pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  65. (Lecture de la base de donn&#xE9;es... 26792 fichiers et r&#xE9;pertoires d&#xE9;j&#xE0; install&#xE9;s.)
  66. Pr&#xE9;paration du d&#xE9;paquetage de .../0-libexttextcat-data_3.4.4-2_all.deb ...
  67. D&#xE9;paquetage de libexttextcat-data (3.4.4-2) ...
  68. S&#xE9;lection du paquet libexttextcat-2.0-0:amd64 pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  69. Pr&#xE9;paration du d&#xE9;paquetage de .../1-libexttextcat-2.0-0_3.4.4-2+b1_amd64.deb ...
  70. D&#xE9;paquetage de libexttextcat-2.0-0:amd64 (3.4.4-2+b1) ...
  71. S&#xE9;lection du paquet libstemmer0d:amd64 pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  72. Pr&#xE9;paration du d&#xE9;paquetage de .../2-libstemmer0d_0+svn585-1+b2_amd64.deb ...
  73. D&#xE9;paquetage de libstemmer0d:amd64 (0+svn585-1+b2) ...
  74. S&#xE9;lection du paquet dovecot-core pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  75. Pr&#xE9;paration du d&#xE9;paquetage de .../3-dovecot-core_1%3a2.2.27-3+deb9u2_amd64.deb ...
  76. D&#xE9;paquetage de dovecot-core (1:2.2.27-3+deb9u2) ...
  77. S&#xE9;lection du paquet dovecot-imapd pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  78. Pr&#xE9;paration du d&#xE9;paquetage de .../4-dovecot-imapd_1%3a2.2.27-3+deb9u2_amd64.deb ...
  79. D&#xE9;paquetage de dovecot-imapd (1:2.2.27-3+deb9u2) ...
  80. S&#xE9;lection du paquet dovecot-sqlite pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  81. Pr&#xE9;paration du d&#xE9;paquetage de .../5-dovecot-sqlite_1%3a2.2.27-3+deb9u2_amd64.deb ...
  82. D&#xE9;paquetage de dovecot-sqlite (1:2.2.27-3+deb9u2) ...
  83. Param&#xE9;trage de libstemmer0d:amd64 (0+svn585-1+b2) ...
  84. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour libc-bin (2.24-11+deb9u3) ...
  85. Param&#xE9;trage de libexttextcat-data (3.4.4-2) ...
  86. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour systemd (232-25+deb9u3) ...
  87. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour man-db (2.7.6.1-2) ...
  88. Param&#xE9;trage de libexttextcat-2.0-0:amd64 (3.4.4-2+b1) ...
  89. Param&#xE9;trage de dovecot-core (1:2.2.27-3+deb9u2) ...
  90. Creating config file /etc/dovecot/dovecot.conf with new version
  91. Creating config file /etc/dovecot/dovecot-dict-auth.conf.ext with new version
  92. Creating config file /etc/dovecot/dovecot-dict-sql.conf.ext with new version
  93. Creating config file /etc/dovecot/dovecot-sql.conf.ext with new version
  94. Creating config file /etc/dovecot/conf.d/10-auth.conf with new version
  95. Creating config file /etc/dovecot/conf.d/10-director.conf with new version
  96. Creating config file /etc/dovecot/conf.d/10-logging.conf with new version
  97. Creating config file /etc/dovecot/conf.d/10-mail.conf with new version
  98. Creating config file /etc/dovecot/conf.d/10-master.conf with new version
  99. Creating config file /etc/dovecot/conf.d/10-tcpwrapper.conf with new version
  100. Creating config file /etc/dovecot/conf.d/15-lda.conf with new version
  101. Creating config file /etc/dovecot/conf.d/15-mailboxes.conf with new version
  102. Creating config file /etc/dovecot/conf.d/90-acl.conf with new version
  103. Creating config file /etc/dovecot/conf.d/90-plugin.conf with new version
  104. Creating config file /etc/dovecot/conf.d/90-quota.conf with new version
  105. Creating config file /etc/dovecot/conf.d/auth-checkpassword.conf.ext with new version
  106. Creating config file /etc/dovecot/conf.d/auth-deny.conf.ext with new version
  107. Creating config file /etc/dovecot/conf.d/auth-dict.conf.ext with new version
  108. Creating config file /etc/dovecot/conf.d/auth-master.conf.ext with new version
  109. Creating config file /etc/dovecot/conf.d/auth-passwdfile.conf.ext with new version
  110. Creating config file /etc/dovecot/conf.d/auth-sql.conf.ext with new version
  111. Creating config file /etc/dovecot/conf.d/auth-static.conf.ext with new version
  112. Creating config file /etc/dovecot/conf.d/auth-system.conf.ext with new version
  113. Creating config file /etc/dovecot/conf.d/auth-vpopmail.conf.ext with new version
  114. Created symlink /etc/systemd/system/multi-user.target.wants/dovecot.service &#x2192; /lib/systemd/system/dovecot.service.
  115. Param&#xE9;trage de dovecot-imapd (1:2.2.27-3+deb9u2) ...
  116. Creating config file /etc/dovecot/conf.d/20-imap.conf with new version
  117. Param&#xE9;trage de dovecot-sqlite (1:2.2.27-3+deb9u2) ...
  118. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour libc-bin (2.24-11+deb9u3) ...
  119. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour systemd (232-25+deb9u3) ...
  120. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour dovecot-core (1:2.2.27-3+deb9u2) ...
  121. root@adara:/home/www#</code></pre>
  122. <h3 id="configuration-du-type-de-bo-te-aux-lettres">Configuration du type de bo&#xEE;te aux lettres</h3>
  123. <p>C&apos;est ici que l&apos;on configure si on veut un fichier unique qui contient tous les messages (type inbox) ou un fichier par &#xE9;mail (type Maildir).</p>
  124. <p>Cela se passe dans le fichier /etc/postfix/main.cf</p>
  125. <p>On rajoute les lignes suivantes:</p>
  126. <pre><code>home_mailbox = Maildir/
  127. mailbox_command =</code></pre><p>Si ces lignes existaient avant, il faut les commenter (ajout d&apos;un # en d&#xE9;but de ligne.)
  128. On recharge le fichier de conf</p>
  129. <pre><code>service postfix reload</code></pre><p>Et on teste:</p>
  130. <pre><code class="language-shell">eric@aldebaran:~/Devs/Travail/Installation serveur/Tutorial$ mail ericadmin@aijan.yojik.net
  131. Cc:
  132. Subject: Re-essai
  133. re-essai de aldebaran
  134. .
  135. eric@aldebaran:~/Devs/Travail/Installation serveur/Tutorial$</code></pre>
  136. <p>J&apos;envoie un courrier &#xE0; partir de mon desktop.
  137. V&#xE9;rification sur le serveur:</p>
  138. <pre><code class="language-shell">ericadmin@aijan:~$ ls
  139. bin index.html Maildir mbox
  140. ericadmin@aijan:~$</code></pre>
  141. <p>Le r&#xE9;pertoire Maildir a bien &#xE9;t&#xE9; cr&#xE9;&#xE9;.
  142. V&#xE9;rification de la r&#xE9;ception des messages:</p>
  143. <pre><code class="language-shell">ricadmin@aijan:~$ cd Maildir/
  144. ericadmin@aijan:~/Maildir$ ls
  145. cur new tmp
  146. ericadmin@aijan:~/Maildir$ cd new/
  147. ericadmin@aijan:~/Maildir/new$ ls
  148. 1526897441.V801Icc005dM227044.aijan 1526897501.V801Icc0060M464181.aijan 1526897576.V801Icc0061M979030.aijan
  149. ericadmin@aijan:~/Maildir/new$
  150. ericadmin@aijan:~/Maildir/new$ cat 1526897576.V801Icc0061M979030.aijan
  151. Return-Path: &lt;eric@aldebaran.yojik.net&gt;
  152. X-Original-To: ericadmin@aijan.yojik.net
  153. Delivered-To: ericadmin@aijan.yojik.net
  154. Received: from aldebaran.yojik.net (unknown [IPv6:2a01:e0a:54:c220:6423:417b:6ef:ee21])
  155. by aijan.yojik.net (Postfix) with ESMTP id EC11BD00903
  156. for &lt;ericadmin@aijan.yojik.net&gt;; Mon, 21 May 2018 12:12:56 +0200 (CEST)
  157. Received: by aldebaran.yojik.net (Postfix, from userid 1000)
  158. id 8B42920620A; Mon, 21 May 2018 12:12:56 +0200 (CEST)
  159. To: &lt;ericadmin@aijan.yojik.net&gt;
  160. Subject: Re-essai
  161. X-Mailer: mail (GNU Mailutils 3.1.1)
  162. Message-Id: &lt;20180521101256.8B42920620A@aldebaran.yojik.net&gt;
  163. Date: Mon, 21 May 2018 12:12:56 +0200 (CEST)
  164. From: eric@aldebaran.yojik.net (Eric Streit)
  165. re-essai de aldebaran
  166. .
  167. ericadmin@aijan:~/Maildir/new$</code></pre>
  168. <p>Les messages sont bien re&#xE7;us. Par contre, mailx ne fonctionne plus (uniquement avec des fichiers mbox.)
  169. Pour lire nos messages, il nous faut installer le lecteur de courriers <strong>mutt</strong>.</p>
  170. <pre><code class="language-shell">root@aijan:/etc/postfix# apt install mutt
  171. Lecture des listes de paquets... Fait
  172. Construction de l&apos;arbre des d&#xE9;pendances
  173. Lecture des informations d&apos;&#xE9;tat... Fait
  174. The following additional packages will be installed:
  175. libgmime-2.6-0 libgpgme11 libnotmuch4 libtalloc2 libtokyocabinet9
  176. Paquets sugg&#xE9;r&#xE9;s :
  177. gpgsm urlview mixmaster
  178. Les NOUVEAUX paquets suivants seront install&#xE9;s :
  179. libgmime-2.6-0 libgpgme11 libnotmuch4 libtalloc2 libtokyocabinet9 mutt
  180. 0 mis &#xE0; jour, 6 nouvellement install&#xE9;s, 0 &#xE0; enlever et 12 non mis &#xE0; jour.
  181. Il est n&#xE9;cessaire de prendre 2 433 ko dans les archives.
  182. Apr&#xE8;s cette op&#xE9;ration, 8 665 ko d&apos;espace disque suppl&#xE9;mentaires seront utilis&#xE9;s.
  183. Souhaitez-vous continuer ? [O/n] o
  184. R&#xE9;ception de:1 http://deb.debian.org/debian stretch/main amd64 libtokyocabinet9 amd64 1.4.48-11+b1 [367 kB]
  185. R&#xE9;ception de:2 http://deb.debian.org/debian stretch/main amd64 libgpgme11 amd64 1.8.0-3+b2 [160 kB]
  186. R&#xE9;ception de:3 http://deb.debian.org/debian stretch/main amd64 libgmime-2.6-0 amd64 2.6.22+dfsg2-1 [232 kB]
  187. R&#xE9;ception de:4 http://deb.debian.org/debian stretch/main amd64 libtalloc2 amd64 2.1.8-1 [36,3 kB]
  188. ....</code></pre>
  189. <p>On teste; on le lance avec la commande suivante:</p>
  190. <pre><code class="language-shell">ericadmin@aijan:~$ mutt -f ./Maildir/
  191. GPGME : protocole CMS non disponible
  192. 3 gard&#xE9;(s), 0 effac&#xE9;(s).
  193. ericadmin@aijan:~$</code></pre>
  194. <p>R&#xE9;sultat: (extrait de l&apos;&#xE9;cran)</p>
  195. <pre><code class="language-shell">q:Quitter d:Effacer u:R&#xE9;cup s:Sauver m:Message r:R&#xE9;pondre g:Groupe ?:Aide
  196. 1 O + mai 21 root (0,1K) Essai
  197. 2 O F mai 21 To root@localho (0,1K) essai d&apos;envoi &#xE0; root
  198. 3 O + mai 21 Eric Streit (0,1K) Re-essai
  199. NeoMutt: ./Maildir/ [Msgs:3 Old:3 1,6K](threads/date)-</code></pre>
  200. <p>Nos &#xE9;mails sont bien l&#xE0; :) Nous pourrons supprimer mutt plus tard si nous voulons gagner un peu de place.</p>
  201. <h2 id="architecture">Architecture</h2>
  202. <p>Avant de continuer &#xE0; configurer notre serveur mail, il serait utile d&apos;avoir une vue d&apos;ensemble du syst&#xE8;me que nous allons configurer. Pour l&apos;instant, nous n&apos;avons apport&#xE9; que peu de modifications aux fichiers de configuration (nous avons seulement chang&#xE9; le type de format de nos bo&#xEE;tes aux lettres :</p>
  203. <pre><code>mbox -&gt; Maildir</code></pre><p>Si nous regardons quels ports sont &#xE9;cout&#xE9;s; nous voyons que nous avons pour l&apos;instant:</p>
  204. <pre><code>le port 22 (SSH)
  205. le port 25 (Postfix)
  206. le port 80 (Apache)
  207. le port 443 (Apache)
  208. le port 53 et 953 (Bind)</code></pre><p>et le port 143 (imap) de dovecot, mais dovecot n&apos;est pas encore int&#xE9;gr&#xE9; &#xE0; notre serveur mail et est <strong>non-configur&#xE9;</strong>.</p>
  209. <pre><code class="language-shell">root@aijan:/home/ericadmin# netstat -tlnp
  210. Connexions Internet actives (seulement serveurs)
  211. Proto Recv-Q Send-Q Adresse locale Adresse distante Etat PID/Program name
  212. tcp 0 0 192.168.111.240:53 0.0.0.0:* LISTEN 536/named
  213. tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 536/named
  214. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 603/sshd
  215. tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 850/master
  216. tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 536/named
  217. tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 676/apache2
  218. tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 607/dovecot
  219. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 676/apache2
  220. tcp6 0 0 :::53 :::* LISTEN 536/named
  221. tcp6 0 0 :::22 :::* LISTEN 603/sshd
  222. tcp6 0 0 :::25 :::* LISTEN 850/master
  223. tcp6 0 0 ::1:953 :::* LISTEN 536/named
  224. tcp6 0 0 :::143 :::* LISTEN 607/dovecot
  225. root@aijan:/home/ericadmin#</code></pre>
  226. <p>Notez la commande <strong>netstat -tlnp</strong> pour voir les ports ouverts ainsi que les programmes qui les g&#xE8;rent.</p>
  227. <p><img src="Images/dessin.svg" alt="Notre serveur de mail"></p>
  228. <p>Nous n&apos;utiliserons pas le protocole Pop3 (ni sa variante pop3s). Le protocole Imap offre bien plus de possibilit&#xE9;s. (parties rouges entour&#xE9;es de noir)</p>
  229. <h2 id="sch-ma-d-ensemble">Sch&#xE9;ma d&apos;ensemble</h2>
  230. <p>Les parties impl&#xE9;ment&#xE9;es sont en rouge sur le dessin suivant:</p>
  231. <p><img src="Images/dessin1.svg" alt="Notre serveur de mail"></p>
  232. <h2 id="explication-">Explication:</h2>
  233. <h3 id="les-ports-servis-par-postfix">Les ports servis par Postfix</h3>
  234. <ol>
  235. <li>Le port 25 est utilis&#xE9; pour la communication entre serveurs smtp; il permet une connexion &quot;en clair&quot; ou chiffr&#xE9;e. Il peut &#xEA;tre aussi utilis&#xE9; pour l&apos;envoi des mails &#xE0; partir d&apos;un client. Nous l&apos;avons d&apos;ailleurs fait avec la commande <strong>mail</strong> et <strong>telnet</strong>.</li>
  236. <li>Le port 587 est le port &quot;submission&quot;, port utilis&#xE9; par d&#xE9;faut par les <strong>clients mail</strong> pour <strong>envoyer</strong> du courrier sur le serveur (thunderbird, etc ...) qui le dispatche ensuite, soit dans les bo&#xEE;tes de courrier locales, soit &#xE0; un destinataire ext&#xE9;rieur.</li>
  237. <li>Le port 465 est un port qui a &#xE9;t&#xE9; r&#xE9;serv&#xE9; pour les communications chiffr&#xE9;es (SMTP over SSL): il &#xE9;tait utilis&#xE9; avant que STARTTLS ne soit utilis&#xE9;; il a &#xE9;t&#xE9; enlev&#xE9; des ports standards de mail.</li>
  238. </ol>
  239. <p>Le premier port (25) est un port d&apos;entr&#xE9;e-sortie r&#xE9;serv&#xE9; &#xE0; la communication entre serveurs (&quot;mais permet aussi la submission de messages avec authentification&quot;.) Souvenez-vous que le port 25 est bloqu&#xE9; par de nombreux FAI. La communication peut &#xEA;tre chiffr&#xE9;e ou non, suivant les possibilit&#xE9;s du serveur et du client, et donc, les mots de passe peuvent passer en clair. La communication commence en mode &quot;clair&quot; et apr&#xE8;s n&#xE9;gociation, passe en mode &quot;chiffr&#xE9;e&quot; si celle-ci est disponible: (STARTTLS)</p>
  240. <p>Les 2 derniers ports (465 et 587) sont des ports d&apos;entr&#xE9;e de vos messages envoy&#xE9;s par des clients, apr&#xE8;s authentification, en mode chiffr&#xE9; ou non.</p>
  241. <h2 id="les-ports-servis-par-dovecot">Les ports servis par Dovecot</h2>
  242. <ol>
  243. <li>Les ports 143 et 993 sont des ports r&#xE9;serv&#xE9;s au protocole IMAP(s).</li>
  244. <li>Les port 110 et 995 sont des ports r&#xE9;serv&#xE9;s au protocole POP3(s), mais nous ne l&apos;utiliserons pas.</li>
  245. </ol>
  246. <p>Ces ports sont servis par Dovecot. Il permettent de g&#xE9;rer notre bo&#xEE;te mail, r&#xE9;cup&#xE9;rer, effacer nos messages, cr&#xE9;er des dossiers dans lesquels nous pouvons trier nos messages.</p>
  247. <h2 id="ce-que-nous-allons-impl-menter">Ce que nous allons impl&#xE9;menter</h2>
  248. <p>Nous impl&#xE9;menterons une politique particuli&#xE8;re, comme celle d&#xE9;crite ici:
  249. <a href="https://samhobbs.co.uk/2013/12/raspberry-pi-email-server-part-2-dovecot">RasperryPi Email server Part 2</a>
  250. Cet auteur s&#xE9;pare les communications entre serveurs (port 25) et client-serveur (ports 587 et 465). Il emp&#xEA;che les communications non-chifr&#xE9;es entre client et serveur, et utilise le port 465 pour les communications chiffr&#xE9;es (d&#xE9;pr&#xE9;ci&#xE9; par le standard.)
  251. Jusqu&apos;&#xE0; maintenant, nous n&apos;avons utilis&#xE9; ni dovecot, ni base de donn&#xE9;es; l&apos;authentification se faisant directement sur le serveur en acc&#xE9;dant &#xE0; notre compte sur le serveur (login par identifiant/mot de passe ou clef SSH).
  252. Nous allons impl&#xE9;menter l&apos;acc&#xE8;s par <strong>Imap</strong> et <strong>Imaps</strong> de nos courriers &#xE0; partir de n&apos;importe quelle machine et avec authentification (toujours pas de comptes virtuels.) L&apos;authentification se faisait avant en se connectant sur nos comptes en <strong>SSH</strong>. Nous avons d&#xE9;j&#xE0; g&#xE9;n&#xE9;r&#xE9; auparavant nos clefs de chiffrage avec <strong>certbot</strong>. (voir le chapitre suivant ...)
  253. Elles sont situ&#xE9;es dans <strong>/etc/letsencrypt/live/atom.yojik.net</strong>.
  254. Dovecot est un serveur Imap et pop3. Il assure en plus l&apos;authentification.</p>
  255. <h2 id="configuration-de-dovecot">Configuration de Dovecot</h2>
  256. <ul>
  257. <li><p>Indiquer &#xE0; Dovecot d&apos;&#xE9;couter sur toutes les interfaces, en IPV4 et IPV6. Le fichier &#xE0; configurer (apr&#xE8;s copie) est <strong>/etc/dovecot/dovecot.conf</strong>; changer la ligne qui contient:</p>
  258. <blockquote>
  259. <p>listen =
  260. en
  261. listen = *, ::</p>
  262. </blockquote>
  263. </li>
  264. <li><p>Il faut lui indiquer <strong>o&#xF9;</strong> sont stock&#xE9;s nos mails et sous quel <strong>format</strong>. Cela se configure dans le fichier:</p>
  265. <p> /etc/dovecot/conf.d/10-mail.conf
  266. Voici un extrait du contenu original:</p>
  267. </li>
  268. </ul>
  269. <pre><code> ## Mailbox locations and namespaces
  270. ##
  271. mail_location = mbox:~/mail:INBOX=/var/mail/%u
  272. Le format par d&#xE9;faut est **mbox** situ&#xE9; dans **/var/mail/user**
  273. Nous allons changer cela en:
  274. mail_location = maildir:~/Maildir
  275. Dovecot utilisera notre bo&#xEE;te aux lettres situ&#xE9;e dans le home de chaque user, et dans le r&#xE9;pertoire Maildir.
  276. Souvenez-vous que nous avions configur&#xE9; Postfix afin qu&apos;il utilise le format Maidir.</code></pre><ul>
  277. <li><p>Indiquer &#xE0; Postfix d&apos;utiliser dovecot pour l&apos;acc&#xE8;s aux mails ainsi que pour l&apos;authentification.</p>
  278. <p> Nous allons modifier le fichier <strong>/etc/postfix/main.cf</strong> et ajouter les lignes suivantes:</p>
  279. <pre><code> smtpd_sasl_type = dovecot
  280. smtpd_sasl_path = private/auth
  281. smtpd_sasl_auth_enable = yes</code></pre><p> Nous allons indiquer &#xE0; Dovecot de r&#xE9;pondre aux demandes d&apos;authentification de postfix:
  282. Apr&#xE8;s avoir fait une sauvegarde du fichier original /etc/dovecot/conf.d/10-master.conf (toujours sauvegarder les fichiers avant modifications!), nous allons modifier le m&#xE9;canisme d&apos;authentification de docvecot. Pour cela nous allons remplacer la partie intitul&#xE9;e <strong>service auth</strong> par ce qui suit:</p>
  283. </li>
  284. </ul>
  285. <pre><code> service auth {
  286. unix_listener /var/spool/postfix/private/auth {
  287. mode = 0660
  288. user = postfix
  289. group = postfix
  290. }</code></pre><ul>
  291. <li><p>Autorisons maintenant le <strong>plain login</strong>; nous allons modifier le fichier <strong>/etc/dovecot/conf.d/10-auth.conf</strong> en ajoutant ou modifiant les lignes suivantes:</p>
  292. <pre><code> disable_plaintext_auth = no
  293. auth_mechanisms = plain login</code></pre><p> On relance postfix et dovecot pour prendre en compte les modifications.</p>
  294. <pre><code> root@atom:/etc/postfix# systemctl restart postfix
  295. root@atom:/etc/postfix# systemctl restart dovecot</code></pre><p> On v&#xE9;rifie que tout s&apos;est bien pass&#xE9; avec la commande:</p>
  296. <pre><code> root@atom:/etc/postfix# tail -f /var/log/daemon.log
  297. Nov 26 12:47:22 atom systemd[1]: Stopped Postfix Mail Transport Agent (instance -).
  298. Nov 26 12:47:22 atom systemd[1]: Starting Postfix Mail Transport Agent (instance -)...
  299. Nov 26 12:47:23 atom systemd[1]: Started Postfix Mail Transport Agent (instance -).
  300. Nov 26 12:47:23 atom systemd[1]: Starting Postfix Mail Transport Agent...
  301. Nov 26 12:47:23 atom systemd[1]: Started Postfix Mail Transport Agent.
  302. Nov 26 12:47:28 atom systemd[1]: Stopping Dovecot IMAP/POP3 email server...
  303. Nov 26 12:47:29 atom systemd[1]: Stopped Dovecot IMAP/POP3 email server.
  304. Nov 26 12:47:29 atom systemd[1]: Starting Dovecot IMAP/POP3 email server...
  305. Nov 26 12:47:29 atom systemd[1]: dovecot.service: PID file /var/run/dovecot/master.pid not readable (yet?) after start: No such file or directory
  306. Nov 26 12:47:29 atom systemd[1]: Started Dovecot IMAP/POP3 email server.</code></pre></li>
  307. </ul>
  308. <pre><code> On quitte avec Ctrl C.
  309. C&apos;est bon.</code></pre><ul>
  310. <li><p>Test 1</p>
  311. <p> Nous allons nous connecter avec telnet; voici la capture de la session:</p>
  312. <p> Tout d&apos;abord, cr&#xE9;ation d&apos;un nouvel utilisateur de nom testmail et mot de passe testmail (oui, rien de bien original). A partir du compte root, nous allons envoyer un message &#xE0; cet utilisateur (voir au-dessus pour comment faire avec la commande mail.)</p>
  313. <p> Testons si le message est bien arriv&#xE9;:</p>
  314. </li>
  315. </ul>
  316. <pre><code class="language-shell">root@atom:/etc/postfix# adduser testmail
  317. Ajout de l&apos;utilisateur &#xAB; testmail25 &#xBB; ...
  318. Ajout du nouveau groupe &#xAB; testmail25 &#xBB; (1001) ...
  319. Ajout du nouvel utilisateur &#xAB; testmail25 &#xBB; (1001) avec le groupe &#xAB; testmail25 &#xBB; ...
  320. Cr&#xE9;ation du r&#xE9;pertoire personnel &#xAB; /home/testmail25 &#xBB;...
  321. Copie des fichiers depuis &#xAB; /etc/skel &#xBB;...
  322. Entrez le nouveau mot de passe UNIX :
  323. Retapez le nouveau mot de passe UNIX :
  324. passwd: password updated successfully
  325. Changing the user information for testmail
  326. Enter the new value, or press ENTER for the default
  327. Full Name []:
  328. Room Number []:
  329. Work Phone []:
  330. Home Phone []:
  331. Other []:
  332. Cette information est-elle correcte ? [O/n]o
  333. root@atom:/etc/postfix# mail testmail
  334. Cc:
  335. Subject: Essai 7
  336. Essai 7
  337. .
  338. root@atom:/etc/postfix# su - testmail
  339. testmail25@atom:~$ mutt -f ./Maildir/
  340. GPGME : protocole CMS non disponible
  341. 1 gard&#xE9;(s), 0 effac&#xE9;(s).</code></pre>
  342. <p> Le message est bien arriv&#xE9;. Essayons avec les commandes Imap; il nous faut installer telnet avant:</p>
  343. <pre><code> apt install telnet</code></pre><p> Nous pouvons donc nous connecter aux ports suivants: 143 et 993.</p>
  344. <pre><code class="language-shell">root@aijan:/home/ericadmin# telnet localhost 143
  345. Trying ::1...
  346. Connected to localhost.
  347. Escape character is &apos;^]&apos;.
  348. * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
  349. x1 LOGIN testmail testmail
  350. x1 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE] Logged in
  351. x2 SELECT Inbox
  352. * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
  353. * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
  354. * 1 EXISTS
  355. * 1 RECENT
  356. * OK [UNSEEN 1] First unseen.
  357. * OK [UIDVALIDITY 1527165527] UIDs valid
  358. * OK [UIDNEXT 2] Predicted next UID
  359. x2 OK [READ-WRITE] Select completed (0.000 + 0.000 secs).
  360. x4 LOGOUT
  361. * BYE Logging out
  362. x4 OK Logout completed (0.000 + 0.000 secs).
  363. Connection closed by foreign host.
  364. root@aijan:/home/ericadmin#</code></pre>
  365. <p> &#xC7;a marche: <em>OK [UNSEEN 1] First unseen.</em></p>
  366. <p>Nous nous sommes connect&#xE9;s avec le mot de passe en clait (testmail pour l&apos;utilisateur testmail.)</p>
  367. <ul>
  368. <li><p>Test 2: envoi de mail</p>
  369. <pre><code> Connexion sur le port 25 (postfix) en utilisant l&apos;authentification g&#xE9;r&#xE9;e par dovecot.
  370. Nous avons chiffr&#xE9; le mot de passe avec la commande suivante:
  371. printf &apos;\0%s\0%s&apos; &apos;testmail&apos; &apos;testmail&apos; | openssl base64
  372. AHRlc3RtYWlsAHRlc3RtYWls</code></pre></li>
  373. </ul>
  374. <pre><code class="language-shell">root@aijan:/home/ericadmin# telnet localhost 25
  375. Trying ::1...
  376. Connected to localhost.
  377. Escape character is &apos;^]&apos;.
  378. 220 aijan.yojik.net ESMTP Postfix (Debian/GNU)
  379. ehlo localhost
  380. 250-aijan.yojik.net
  381. 250-PIPELINING
  382. 250-SIZE 10240000
  383. 250-VRFY
  384. 250-ETRN
  385. 250-STARTTLS
  386. 250-AUTH PLAIN LOGIN
  387. 250-ENHANCEDSTATUSCODES
  388. 250-8BITMIME
  389. 250-DSN
  390. 250 SMTPUTF8
  391. AUTH PLAIN AHRlc3RtYWlsAHRlc3RtYWls
  392. 235 2.7.0 Authentication successful
  393. mail from: testmail
  394. 250 2.1.0 Ok
  395. data
  396. 554 5.5.1 Error: no valid recipients
  397. rcpt to: ericounet26200@gmail.com
  398. 250 2.1.5 Ok
  399. data
  400. 354 End data with &lt;CR&gt;&lt;LF&gt;.&lt;CR&gt;&lt;LF&gt;
  401. Subject: mon, premier mail avec sasl
  402. mon premier mail avec sasl
  403. .
  404. 250 2.0.0 Ok: queued as A664BD004A1
  405. quit
  406. 221 2.0.0 Bye
  407. Connection closed by foreign host.
  408. root@aijan:/home/ericadmin#</code></pre>
  409. <p> V&#xE9;rification de la bonne r&#xE9;ception du message: le message est bien re&#xE7;u.</p>
  410. <h2 id="configuration-des-certificats">Configuration des certificats</h2>
  411. <p>Jusqu&apos;&#xE0; pr&#xE9;sent, nous avons utilis&#xE9; les certificats fournis par Debian &#xE0; l&apos;installation.
  412. Nous allons utiliser les certificats que nous avons cr&#xE9;&#xE9;s auparavant avec letsencrypt.
  413. Il y a 2 lignes &#xE0; modifier dans /etc/postfix/main.cf:</p>
  414. <blockquote>
  415. <p>smtpd_tls_cert_file = /etc/letsencrypt/live/toto.yojik.net/fullchain.pem
  416. smtpd_tls_key_file = /etc/letsencrypt/live/toto.yojik.net/privkey.pem</p>
  417. </blockquote>
  418. <p>Bien entendu, modifiez la partie <strong>toto.yojik.net</strong> par le nom de votre serveur mail et pour lequel vous avez g&#xE9;n&#xE9;r&#xE9; les certificats.
  419. Il y a 3 lignes &#xE0; ajouter/modifier dans /etc/dovecot/conf.d/10-ssl.conf</p>
  420. <blockquote>
  421. <p>ssl = required
  422. ssl_cert = &lt;/etc/letsencrypt/live/toto.yojik.net/fullchain.pem
  423. ssl_key = &lt;/etc/letsencrypt/live/toto.yojik.net/privkey.pem</p>
  424. </blockquote>
  425. <p>Comme avant, personnalisez avec votre nom de serveur mail.
  426. Relancez vos serveurs avec les commandes suivantes:</p>
  427. <pre><code class="language-shell">root@aijan:/home/ericadmin# systemctl restart postfix
  428. root@aijan:/home/ericadmin# systemctl restart dovecot</code></pre>
  429. <p>Bien v&#xE9;rifier dans les logs (/var/log/daemon.log) que tout s&apos;est bien pass&#xE9; (pas d&apos;erreur de frappe par exemple ...)</p>
  430. <h3 id="test">Test</h3>
  431. <p>Nous allons refaire les tests d&#xE9;j&#xE0; r&#xE9;alis&#xE9;s pr&#xE9;c&#xE9;demment pour v&#xE9;rifier que &quot;rien n&apos;est cass&#xE9;&quot; suite &#xE0; la modification de nos certificats.</p>
  432. <pre><code class="language-shell">root@aijan:/home/ericadmin# telnet localhost 25
  433. Trying ::1...
  434. Connected to localhost.
  435. Escape character is &apos;^]&apos;.
  436. 220 aijan.yojik.net ESMTP Postfix (Debian/GNU)
  437. ehlo aijan.yojik.net
  438. 250-aijan.yojik.net
  439. 250-PIPELINING
  440. 250-SIZE 10240000
  441. 250-VRFY
  442. 250-ETRN
  443. 250-STARTTLS
  444. 250-AUTH PLAIN LOGIN
  445. 250-ENHANCEDSTATUSCODES
  446. 250-8BITMIME
  447. 250-DSN
  448. 250 SMTPUTF8
  449. AUTH PLAIN AHRlc3RtYWlsAHRlc3RtYWls
  450. 235 2.7.0 Authentication successful
  451. mail from: testmail
  452. 250 2.1.0 Ok
  453. rcpt to: ericounet26200@gmail.com
  454. 250 2.1.5 Ok
  455. data
  456. 354 End data with &lt;CR&gt;&lt;LF&gt;.&lt;CR&gt;&lt;LF&gt;
  457. subject: essai
  458. un essai
  459. .
  460. 250 2.0.0 Ok: queued as 9EEF6D0002E
  461. quit
  462. 502 5.5.2 Error: command not recognized
  463. quit
  464. 221 2.0.0 Bye
  465. Connection closed by foreign host.
  466. root@aijan:/home/ericadmin#
  467. </code></pre>
  468. <p>&#xC7;a fonctionne. L&apos;authentification avec les nouveaux certificats est assur&#xE9;e.</p>
  469. <h3 id="test-de-la-connexion-sur-le-port-993-partir-d-un-ordinateur-ext-rieur">Test de la connexion sur le port 993 &#xE0; partir d&apos;un ordinateur ext&#xE9;rieur</h3>
  470. <pre><code>eric@aldebaran:~$ openssl s_client -connect yojik.net:993
  471. CONNECTED(00000003)
  472. depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
  473. verify return:1
  474. depth=1 C = US, O = Let&apos;s Encrypt, CN = Let&apos;s Encrypt Authority X3
  475. verify return:1
  476. depth=0 CN = atom.yojik.net
  477. verify return:1
  478. ---
  479. Certificate chain
  480. 0 s:/CN=atom.yojik.net
  481. i:/C=US/O=Let&apos;s Encrypt/CN=Let&apos;s Encrypt Authority X3
  482. 1 s:/C=US/O=Let&apos;s Encrypt/CN=Let&apos;s Encrypt Authority X3
  483. i:/O=Digital Signature Trust Co./CN=DST Root CA X3
  484. ---
  485. Server certificate
  486. -----BEGIN CERTIFICATE-----
  487. MIIFVTCCBD2gAwIBAgISA2ymxMSWOd9z4d5MhK1RarzkMA0GCSqGSIb3DQEBCwUA
  488. MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
  489. ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xODExMTExNTI2NDhaFw0x
  490. OTAyMDkxNTI2NDhaMBkxFzAVBgNVBAMTDmF0b20ueW9qaWsubmV0MIIBIjANBgkq
  491. hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr+SwsS/VwilSnazx4Y9Xj9OIzYPx2s5W
  492. kxocZT7BMdO0oKNKolbe6AJMGrNKf5TjQu9EN+yal6rNZUOrrR7dS2gKvRjyH2mW
  493. 5JniCW/osYVkHglgjvNbihQP4IBY9brvvtIW9reKyA9adq5zHHRW2RNaBG18oXFa
  494. mQb+uFGiCkpyjGK7XYmPkVA7DM6TtciFBGeTmY15vF4aniPQtu1TuksEc+WDvWfR
  495. K9ebYXghqBJd1OigtgVhOpDiSAnxjtx9wcjHuic/9wU8iI2VdkOB0xoMxlRNjQSZ
  496. DWgRCiZr/LwtoX6bSWzJex1kW7Q/zQnvA1eaKqD6mCIp5uO7KiK5AQIDAQABo4IC
  497. ZDCCAmAwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
  498. BQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQyxrlKdL9RV+v8Y7YwH4mV0iq4
  499. EDAfBgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBvBggrBgEFBQcBAQRj
  500. MGEwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3NwLmludC14My5sZXRzZW5jcnlwdC5v
  501. cmcwLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5jcnlwdC5v
  502. cmcvMBkGA1UdEQQSMBCCDmF0b20ueW9qaWsubmV0MEwGA1UdIARFMEMwCAYGZ4EM
  503. AQIBMDcGCysGAQQBgt8TAQEBMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMubGV0
  504. c2VuY3J5cHQub3JnMIIBBQYKKwYBBAHWeQIEAgSB9gSB8wDxAHcA4mlLribo6UAJ
  505. 6IYbtjuD1D7n/nSI+6SPKJMBnd3x2/4AAAFnA5jZtQAABAMASDBGAiEAshqJHr2M
  506. l6n+9Dd31jkskn3lxh5iC7FTfPZoKxZGT6ECIQDDby9vNMmzh8eYysYr5UuTE4R9
  507. VOko3rzQZgj51O/nEQB2AGPy283oO8wszwtyhCdXazOkjWF3j711pjixx2hUS9iN
  508. AAABZwOY2bgAAAQDAEcwRQIhAPTO+Wry4Fl2+HddFMsWpfYJQ7dkXtW93N1+z77y
  509. ofgMAiB76ad1N7+AVOh4YvrRboK31F5cs3YJnKmKxINWkrI70TANBgkqhkiG9w0B
  510. AQsFAAOCAQEAJ1BYUTWpCIIYD0FKB9vuCEfYrg1NNHhYYr0jUKR49EPLO8DS1aRp
  511. KK1tr9EZti2lOYaEOKNo4dQkLLKgsF1kovHreosvXPF2oXRbN6UdVu+67fhIokD5
  512. FIS9pphaxIHEC4A9h7JK0LHJHMG9ySRDBbtz9Y0b7z5jGIxX0yzaqBcPJVG26SJm
  513. uyiys2bklC+N3mYAVYb/c3VWdCWzusHks+HCTx2y+YkqVkvCepdQYFoUKpk6ScSc
  514. Fz6r0DWBXGmhJLg0K+KxfXGUtTtwDjnBZCocX3FrQsQNrbYtvLyK2QhDv1Mr6V96
  515. P11a4LV3qq2eTfoIiNd9m2iqCJ7/pSWIjw==
  516. -----END CERTIFICATE-----
  517. subject=/CN=atom.yojik.net
  518. issuer=/C=US/O=Let&apos;s Encrypt/CN=Let&apos;s Encrypt Authority X3
  519. ---
  520. No client certificate CA names sent
  521. Peer signing digest: SHA512
  522. Server Temp Key: ECDH, P-384, 384 bits
  523. ---
  524. SSL handshake has read 3236 bytes and written 334 bytes
  525. Verification: OK
  526. ---
  527. New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384
  528. Server public key is 2048 bit
  529. Secure Renegotiation IS supported
  530. Compression: NONE
  531. Expansion: NONE
  532. No ALPN negotiated
  533. SSL-Session:
  534. Protocol : TLSv1.2
  535. Cipher : ECDHE-RSA-AES256-GCM-SHA384
  536. Session-ID: D488F9943CD771D5DF400C676729BDF315F5CBD01128E922D7DBCC0D80B467F3
  537. Session-ID-ctx:
  538. Master-Key: 45BF00E99AA29FB83E1395741E3A506800473105882554C46B50639665B600000E1F3048F051EF5E12D6C0804A0698D8
  539. PSK identity: None
  540. PSK identity hint: None
  541. SRP username: None
  542. TLS session ticket lifetime hint: 7200 (seconds)
  543. TLS session ticket:
  544. 0000 - 59 1e 77 bc e8 c1 0e f8-c9 f2 38 f8 f9 f0 e9 4f Y.w.......8....O
  545. 0010 - 4b 91 2a 39 73 cc a6 85-f2 22 96 ae 4a a3 84 b8 K.*9s....&quot;..J...
  546. 0020 - e8 de 9b 34 74 1a d9 e7-88 f5 d1 bb 4c 2d 59 f2 ...4t.......L-Y.
  547. 0030 - 0e 99 1e bd b7 82 ef 32-ab 0c 1a 33 c0 dd 31 6a .......2...3..1j
  548. 0040 - 5b 38 fc c5 27 29 d7 a3-ae f0 a5 bb 66 a0 b4 eb [8..&apos;)......f...
  549. 0050 - 7c 95 f2 16 cb 92 5c f3-7f c0 30 33 ec 77 f0 a8 |.....\...03.w..
  550. 0060 - 8f 5e 9c f7 de c9 4f 95-1a 0e 09 27 7a 45 b0 db .^....O....&apos;zE..
  551. 0070 - 84 ba 72 37 f1 a2 f5 95-43 0c e2 eb a3 18 94 a8 ..r7....C.......
  552. 0080 - b3 d4 d7 15 4c 81 08 a2-17 3f 7b 15 fe 81 d8 5c ....L....?{....\
  553. 0090 - 74 60 ac 5e 2a 5a 22 07-6f ba 03 4f d5 46 5a 04 t`.^*Z&quot;.o..O.FZ.
  554. Start Time: 1543235404
  555. Timeout : 7200 (sec)
  556. Verify return code: 0 (ok)
  557. Extended master secret: yes
  558. ---
  559. * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
  560. 1 Login testmail testmail
  561. 1 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE] Logged in
  562. QUIT
  563. DONE
  564. eric@aldebaran:~$</code></pre><p>Le <strong>OK [CAPABILITY ...</strong> indique que la connexion s&apos;est faite normalement; les caract&#xE9;ristiques du certificat sont affich&#xE9;es au-dessus. Le <strong>Logged: in</strong> indique que l&apos;authentification a march&#xE9;.</p>
  565. <p>Nous avons donc test&#xE9; les ports 25, 143 et 993 avec succ&#xE8;s.</p>
  566. <h2 id="configuration-d-un-port-qui-n-accepte-que-les-communications-chiffr-es-">Configuration d&apos;un port qui n&apos;accepte que les communications chiffr&#xE9;es.</h2>
  567. <p>Pour l&apos;instant, postfix n&apos;&#xE9;coute que le port 25 (vous pouvez le v&#xE9;rifier avec la commande <strong>netstat -tlpn</strong>.
  568. Dans le fichier /etc/postfix/master.cf, seul la ligne suivante est active (d&#xE9;comment&#xE9;e):</p>
  569. <pre><code>smtp inet n - y - - smtpd</code></pre><p>Nous allons mettre postfix en &#xE9;coute du port 465:
  570. Dans le fichier /etc/postfix/master.cf, la ligne &#xE0; d&#xE9;commenter est la suivante:</p>
  571. <pre><code class="language-shell"># smtps inet n - - - - smtpd</code></pre>
  572. <p>pour obtenir:</p>
  573. <pre><code class="language-shell">smtps inet n - - - - smtpd</code></pre>
  574. <h3 id="test">Test</h3>
  575. <p>On relance postfix et on regarde les ports servis:</p>
  576. <pre><code class="language-shell">root@aijan:/home/ericadmin# service postfix restart
  577. root@aijan:/home/ericadmin# netstat -tlpn
  578. Connexions Internet actives (seulement serveurs)
  579. Proto Recv-Q Send-Q Adresse locale Adresse distante Etat PID/Program name
  580. tcp 0 0 192.168.111.240:53 0.0.0.0:* LISTEN 552/named
  581. tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 552/named
  582. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 580/sshd
  583. tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 2159/master
  584. tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 552/named
  585. tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 649/apache2
  586. tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 1792/dovecot
  587. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 649/apache2
  588. tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN 2159/master
  589. tcp6 0 0 :::53 :::* LISTEN 552/named
  590. tcp6 0 0 :::22 :::* LISTEN 580/sshd
  591. tcp6 0 0 :::25 :::* LISTEN 2159/master
  592. tcp6 0 0 ::1:953 :::* LISTEN 552/named
  593. tcp6 0 0 :::143 :::* LISTEN 1792/dovecot
  594. tcp6 0 0 :::465 :::* LISTEN 2159/master
  595. root@aijan:/home/ericadmin#
  596. </code></pre>
  597. <p>Le port 465 est ouvert et servi par postfix.</p>
  598. <h3 id="test-de-connexion-sur-le-port-465">test de connexion sur le port 465</h3>
  599. <pre><code class="language-shell">root@aijan:/home/ericadmin# telnet localhost 465
  600. Trying ::1...
  601. Connected to localhost.
  602. Escape character is &apos;^]&apos;.
  603. 220 aijan.yojik.net ESMTP Postfix (Debian/GNU)
  604. ehlo aijan.yojik.net
  605. 250-aijan.yojik.net
  606. 250-PIPELINING
  607. 250-SIZE 10240000
  608. 250-VRFY
  609. 250-ETRN
  610. 250-STARTTLS
  611. 250-AUTH PLAIN LOGIN
  612. 250-ENHANCEDSTATUSCODES
  613. 250-8BITMIME
  614. 250-DSN
  615. 250 SMTPUTF8
  616. quit
  617. 221 2.0.0 Bye
  618. Connection closed by foreign host.
  619. root@aijan:/home/ericadmin#</code></pre>
  620. <p>La connexion se fait normalement.
  621. Nous allons maintenant bloquer les communications non-chiffr&#xE9;es; les param&#xE8;tres &#xE0; modifier sont dans /etc/postfix/master.conf (2 premiers param&#xE8;tres de la ligne smtps &#xE0; d&#xE9;commenter.)</p>
  622. <pre><code class="language-shell">smtps inet n - - - - smtpd
  623. -o syslog_name=postfix/smtps
  624. -o smtpd_tls_wrappermode=yes</code></pre>
  625. <h3 id="test">Test</h3>
  626. <ol>
  627. <li>Essai avec communication non-chifr&#xE9;e:</li>
  628. </ol>
  629. <pre><code class="language-shell">root@aijan:/home/ericadmin# telnet localhost 465
  630. Trying ::1...
  631. Connected to localhost.
  632. Escape character is &apos;^]&apos;.
  633. Connection closed by foreign host.
  634. root@aijan:/home/ericadmin#</code></pre>
  635. <p>La communication est <strong>refus&#xE9;e</strong>.</p>
  636. <ol start="2">
  637. <li>Essai avec communication chiffr&#xE9;e (nous utilisons <strong>openssl</strong> pour cela):</li>
  638. </ol>
  639. <pre><code class="language-shell">root@adara:/etc# openssl s_client -connect localhost:465 -quiet
  640. depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
  641. verify return:1
  642. depth=1 C = US, O = Let&apos;s Encrypt, CN = Let&apos;s Encrypt Authority X3
  643. verify return:1
  644. depth=0 CN = adara.yojik.eu
  645. verify return:1
  646. 220 adara.yojik.eu ESMTP Postfix (Debian/GNU)
  647. ehlo me
  648. 250-adara.yojik.eu
  649. 250-PIPELINING
  650. 250-SIZE 10240000
  651. 250-VRFY
  652. 250-ETRN
  653. 250-AUTH PLAIN LOGIN
  654. 250-ENHANCEDSTATUSCODES
  655. 250-8BITMIME
  656. 250-DSN
  657. 250 SMTPUTF8
  658. quit
  659. 221 2.0.0 Bye
  660. root@adara:/etc#</code></pre>
  661. <p>La communication est <strong>accept&#xE9;e</strong> et fonctionne. Nous voyons aussi que notre certificat Letsencrypt a &#xE9;t&#xE9; v&#xE9;rifi&#xE9;.</p>
  662. <p>Il reste une modification &#xE0; faire pour n&apos;autoriser que les communications chiffr&#xE9;es:
  663. Dans /etc/postfix/main.cf ajouter ou modifier la ligne suivante:</p>
  664. <pre><code>smtpd_tls_auth_only = yes</code></pre><p>Et rechargez Postfix.</p>
  665. <h3 id="test">Test</h3>
  666. <pre><code class="language-shell">root@aijan:/home/ericadmin# telnet localhost 25
  667. Trying ::1...
  668. Connected to localhost.
  669. Escape character is &apos;^]&apos;.
  670. 220 aijan.yojik.net ESMTP Postfix (Debian/GNU)
  671. ehlo aijan.yojik.net
  672. 250-aijan.yojik.net
  673. 250-PIPELINING
  674. 250-SIZE 10240000
  675. 250-VRFY
  676. 250-ETRN
  677. 250-STARTTLS
  678. 250-ENHANCEDSTATUSCODES
  679. 250-8BITMIME
  680. 250-DSN
  681. 250 SMTPUTF8
  682. quit
  683. 221 2.0.0 Bye
  684. Connection closed by foreign host.
  685. root@aijan:/home/ericadmin#</code></pre>
  686. <p>On voit que la ligne &quot;250-AUTH PLAIN LOGIN&quot; est absente, ce qui confirme que Postfix a bien pris en compte notre derni&#xE8;re modification.</p>
  687. <h2 id="interdiction-de-communications-non-chiffr-es-sur-le-port-465">Interdiction de communications non-chiffr&#xE9;es sur le port 465</h2>
  688. <p>Nous allons rajouter/modifier une &quot;restriction&quot; &#xE0; la ligne g&#xE9;rant le port 465 dans /etc/postfix/master.cf</p>
  689. <pre><code class="language-shell">smtps inet n - - - - smtpd
  690. -o syslog_name=postfix/smtps
  691. -o smtpd_tls_wrappermode=yes
  692. -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject</code></pre>
  693. <p>La derni&#xE8;re ligne est rajout&#xE9;e, d&#xE9;-comment&#xE9;e, modifi&#xE9;e (suivant le cas). On recharge postfix et on teste.</p>
  694. <h3 id="test">Test</h3>
  695. <pre><code class="language-shell">root@aijan:/etc/postfix# telnet localhost 465
  696. Trying ::1...
  697. Connected to localhost.
  698. Escape character is &apos;^]&apos;.
  699. quit
  700. Connection closed by foreign host.
  701. root@aijan:/etc/postfix#</code></pre>
  702. <p>&#xC7;a fonctionne.</p>
  703. <h2 id="ajout-de-la-gestion-du-port-587">Ajout de la gestion du port 587</h2>
  704. <p>Dans le fichier /etc/postfix/master.cf, d&#xE9;-commentez les lignes suivantes et modifiez les comme indiqu&#xE9;. Ce sont les m&#xEA;mes modifications que celles effectu&#xE9;es pour le port 465.</p>
  705. <pre><code class="language-shell">submission inet n - y - - smtpd
  706. -o syslog_name=postfix/submission
  707. -o smtpd_tls_security_level=encrypt
  708. -o smtpd_sasl_auth_enable=yes
  709. Ainsi que
  710. -o smtpd_recipient_restrictions=</code></pre>
  711. <h3 id="test">Test</h3>
  712. <pre><code class="language-shell">root@aijan:/etc/bind# netstat -tlnp
  713. Connexions Internet actives (seulement serveurs)
  714. Proto Recv-Q Send-Q Adresse locale Adresse distante Etat PID/Program name
  715. tcp 0 0 192.168.111.240:53 0.0.0.0:* LISTEN 3410/named
  716. tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 3410/named
  717. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 580/sshd
  718. tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 4080/master
  719. tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 3410/named
  720. tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 649/apache2
  721. tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 2668/dovecot
  722. tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 4080/master
  723. tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 2668/dovecot
  724. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 649/apache2
  725. tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN 4080/master
  726. tcp6 0 0 :::53 :::* LISTEN 3410/named
  727. tcp6 0 0 :::22 :::* LISTEN 580/sshd
  728. tcp6 0 0 :::25 :::* LISTEN 4080/master
  729. tcp6 0 0 ::1:953 :::* LISTEN 3410/named
  730. tcp6 0 0 :::993 :::* LISTEN 2668/dovecot
  731. tcp6 0 0 :::587 :::* LISTEN 4080/master
  732. tcp6 0 0 :::143 :::* LISTEN 2668/dovecot
  733. tcp6 0 0 :::465 :::* LISTEN 4080/master
  734. root@aijan:/etc/bind#</code></pre>
  735. <p>Le port 587 est g&#xE9;r&#xE9;.</p>
  736. <h2 id="ajout-de-la-gesion-du-port-993-imap-avec-ssl-tls-">Ajout de la gesion du port 993 (imap avec SSL/TLS)</h2>
  737. <p>Nous allons modifier la configuration de dovecot pour la prise en charge de ce port.</p>
  738. <p>Il n&apos;est pas encore &quot;servi&quot; comme nous l&apos;avons vu avec la commande <strong>netstat -tlpn</strong> (vu auparavant.)</p>
  739. <p>Le fichier &#xE0; modifier est: /etc/dovecot/conf.d/10-master.conf
  740. La partie du fichier &#xE0; modifier est la suivante:</p>
  741. <pre><code class="language-shell">service imap-login {
  742. inet_listener imap {
  743. #port = 143
  744. }
  745. inet_listener imaps {
  746. #port = 993
  747. #ssl = yes
  748. }</code></pre>
  749. <p>pour donner ceci:</p>
  750. <pre><code class="language-shell">service imap-login {
  751. inet_listener imap {
  752. port = 143
  753. }
  754. inet_listener imaps {
  755. port = 993
  756. ssl = yes
  757. }</code></pre>
  758. <p>Dans le fichier /etc/dovecot/conf.d/10-ssl.conf:</p>
  759. <pre><code class="language-shell"> ssl = yes
  760. ssl_protocols = !SSLv3</code></pre>
  761. <h3 id="test">Test</h3>
  762. <pre><code class="language-shell">root@aijan:/etc/dovecot# netstat -tlpn
  763. Connexions Internet actives (seulement serveurs)
  764. Proto Recv-Q Send-Q Adresse locale Adresse distante Etat PID/Program name
  765. tcp 0 0 192.168.111.240:53 0.0.0.0:* LISTEN 552/named
  766. tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 552/named
  767. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 580/sshd
  768. tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 2376/master
  769. tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 552/named
  770. tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 649/apache2
  771. tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 2668/dovecot
  772. tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 2668/dovecot
  773. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 649/apache2
  774. tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN 2376/master
  775. tcp6 0 0 :::53 :::* LISTEN 552/named
  776. tcp6 0 0 :::22 :::* LISTEN 580/sshd
  777. tcp6 0 0 :::25 :::* LISTEN 2376/master
  778. tcp6 0 0 ::1:953 :::* LISTEN 552/named
  779. tcp6 0 0 :::993 :::* LISTEN 2668/dovecot
  780. tcp6 0 0 :::143 :::* LISTEN 2668/dovecot
  781. tcp6 0 0 :::465 :::* LISTEN 2376/master
  782. root@aijan:/etc/dovecot#</code></pre>
  783. <p>Le port 993 est actif.</p>
  784. <h2 id="mise-en-route">Mise en route</h2>
  785. <p>Pour l&apos;instant, notre Firewall n&apos;autorise aucune conenxion sur les port 143, 993, 465, 587. Nous allons ouvrir les ports. Avant cela, il nous faut supprimer l&apos;utilisateur <strong>testmail</strong> ...</p>
  786. <pre><code>userdel testmail</code></pre><p>Pensez &#xE0; supprimer le r&#xE9;pertoire home de cet utlisateur:</p>
  787. <pre><code>rm -Rf /home/testmail</code></pre><p>Ceci fait, ouvrons nos ports. Voici les lignes &#xE0; ajouter &#xE0; notre programme firewall.sh. Il suffira de le lancer et de sauver la configuration (comme d&#xE9;j&#xE0; vu pr&#xE9;c&#xE9;demment)</p>
  788. <pre><code class="language-shell"> #mail!!
  789. # Mail SMTP:25
  790. $IPT -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
  791. $IPT -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
  792. $IP6T -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
  793. $IP6T -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
  794. # Mail SMTP:587
  795. $IPT -t filter -A INPUT -p tcp --dport 587 -j ACCEPT
  796. $IPT -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT
  797. $IP6T -t filter -A INPUT -p tcp --dport 597 -j ACCEPT
  798. $IP6T -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT
  799. # Mail IMAP:143
  800. $IPT -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
  801. $IPT -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
  802. $IP6T -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
  803. $IP6T -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
  804. # Mail IMAPS:993
  805. $IPT -t filter -A INPUT -p tcp --dport 993 -j ACCEPT
  806. $IPT -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT
  807. $IP6T -t filter -A INPUT -p tcp --dport 993 -j ACCEPT
  808. $IP6T -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT
  809. # Mail 465
  810. $IPT -t filter -A INPUT -p tcp --dport 465 -j ACCEPT
  811. $IPT -t filter -A OUTPUT -p tcp --dport 465 -j ACCEPT
  812. $IP6T -t filter -A INPUT -p tcp --dport 465 -j ACCEPT
  813. $IP6T -t filter -A OUTPUT -p tcp --dport 465 -j ACCEPT</code></pre>
  814. <h3 id="test">Test</h3>
  815. <pre><code class="language-shell">root@aijan:/home/ericadmin/bin# ./firewall.sh restart
  816. firewall stopped [OK]
  817. firewall started [OK]
  818. root@aijan:/home/ericadmin/bin# iptables -L
  819. Chain INPUT (policy DROP)
  820. target prot opt source destination
  821. ACCEPT all -- anywhere anywhere
  822. ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
  823. ACCEPT tcp -- anywhere anywhere tcp dpt:domain
  824. ACCEPT udp -- anywhere anywhere udp dpt:domain
  825. ACCEPT tcp -- 192.168.111.150 anywhere
  826. ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
  827. ACCEPT tcp -- anywhere anywhere tcp dpt:http
  828. ACCEPT tcp -- anywhere anywhere tcp dpt:https
  829. ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
  830. ACCEPT tcp -- anywhere anywhere tcp dpt:submission
  831. ACCEPT tcp -- anywhere anywhere tcp dpt:imap2
  832. ACCEPT tcp -- anywhere anywhere tcp dpt:imaps
  833. ACCEPT tcp -- anywhere anywhere tcp dpt:urd
  834. Chain FORWARD (policy DROP)
  835. target prot opt source destination
  836. Chain OUTPUT (policy ACCEPT)
  837. target prot opt source destination
  838. ACCEPT all -- anywhere anywhere
  839. ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
  840. ACCEPT udp -- anywhere anywhere udp dpt:ntp
  841. ACCEPT tcp -- anywhere anywhere tcp dpt:http
  842. ACCEPT tcp -- anywhere anywhere tcp dpt:https
  843. ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
  844. ACCEPT tcp -- anywhere anywhere tcp dpt:submission
  845. ACCEPT tcp -- anywhere anywhere tcp dpt:imap2
  846. ACCEPT tcp -- anywhere anywhere tcp dpt:imaps
  847. ACCEPT tcp -- anywhere anywhere tcp dpt:urd
  848. root@aijan:/home/ericadmin/bin#</code></pre>
  849. <p>Les ports sont bien ouverts.
  850. Et on sauvegarde:</p>
  851. <pre><code>service netfilter-persistent save</code></pre><pre><code class="language-shell">root@aijan:/home/ericadmin/bin# service netfilter-persistent save
  852. [....] Saving netfilter rules...run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
  853. run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save
  854. done.
  855. root@aijan:/home/ericadmin/bin#</code></pre>
  856. <p>Les r&#xE8;gles IPV4 et IPV6 sont sauvegard&#xE9;es.</p>
  857. <h2 id="mise-en-place-du-fichier-auto-configuration-mozilla">Mise en place du fichier &quot;auto-configuration&quot; Mozilla</h2>
  858. <p>A voir ....</p>
  859. <h2 id="test-en-situation-">Test en situation ...</h2>
  860. <h3 id="lecture-des-messages">Lecture des messages</h3>
  861. <p>A partir de ma machine de bureau, test de connexion en IMAP, liste des messages, et lecture du contenu (port 993):</p>
  862. <pre><code class="language-shell">eric@aldebaran:~$ openssl s_client -connect atom.yojik.net:993 -quiet
  863. depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
  864. verify return:1
  865. depth=1 C = US, O = Let&apos;s Encrypt, CN = Let&apos;s Encrypt Authority X3
  866. verify return:1
  867. depth=0 CN = aijan.yojik.net
  868. verify return:1
  869. * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
  870. a login ericadmin eBnIDQ+FZZI=
  871. a OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE] Logged in
  872. b select inbox
  873. * FLAGS (\Answered \Flagged \Deleted \Seen \Draft NonJunk)
  874. * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft NonJunk \*)] Flags permitted.
  875. * 3 EXISTS
  876. * 0 RECENT
  877. * OK [UIDVALIDITY 1527410684] UIDs valid
  878. * OK [UIDNEXT 4] Predicted next UID
  879. b OK [READ-WRITE] Select completed (0.000 + 0.000 secs).
  880. c FETCH 1:* FLAGS
  881. * 1 FETCH (FLAGS (\Seen NonJunk))
  882. * 2 FETCH (FLAGS (\Seen NonJunk))
  883. * 3 FETCH (FLAGS (\Seen))
  884. c OK Fetch completed (0.001 + 0.000 secs).
  885. d Fetch BODY[TEXT]
  886. d BAD Error in IMAP command FETCH: Invalid arguments (0.000 + 0.000 secs).
  887. d fetch body
  888. d BAD Error in IMAP command FETCH: Invalid arguments (0.000 + 0.000 secs).
  889. d FETCH 1 body
  890. * 1 FETCH (BODY (&quot;text&quot; &quot;plain&quot; (&quot;charset&quot; &quot;us-ascii&quot;) NIL NIL &quot;7bit&quot; 10 2))
  891. d OK Fetch completed (0.002 + 0.000 + 0.001 secs).
  892. e fetch 2 body
  893. * 2 FETCH (BODY (&quot;text&quot; &quot;plain&quot; (&quot;charset&quot; &quot;us-ascii&quot;) NIL NIL &quot;7bit&quot; 3 1))
  894. e OK Fetch completed (0.001 + 0.000 secs).
  895. f fetch 2 body[]
  896. * 2 FETCH (BODY[] {466}
  897. Return-Path: &lt;ericadmin@aijan.yojik.net&gt;
  898. X-Original-To: root@localhost
  899. Delivered-To: root@localhost
  900. Received: by aijan.yojik.net (Postfix, from userid 1000)
  901. id 6D42CD00904; Mon, 21 May 2018 12:11:41 +0200 (CEST)
  902. To: &lt;root@localhost&gt;
  903. Subject: essai d&apos;envoi &#xE0; root
  904. X-Mailer: mail (GNU Mailutils 3.1.1)
  905. Message-Id: &lt;20180521101141.6D42CD00904@aijan.yojik.net&gt;
  906. Date: Mon, 21 May 2018 12:11:41 +0200 (CEST)
  907. From: ericadmin@aijan.yojik.net (Eric Streit)
  908. .
  909. )
  910. f OK Fetch completed (0.001 + 0.000 secs).
  911. g fetch 3 body[]
  912. * 3 FETCH (BODY[] {735}
  913. Return-Path: &lt;eric@aldebaran.yojik.net&gt;
  914. X-Original-To: ericadmin@aijan.yojik.net
  915. Delivered-To: ericadmin@aijan.yojik.net
  916. Received: from aldebaran.yojik.net (unknown [IPv6:2a01:e0a:54:c220:6423:417b:6ef:ee21])
  917. by aijan.yojik.net (Postfix) with ESMTP id EC11BD00903
  918. for &lt;ericadmin@aijan.yojik.net&gt;; Mon, 21 May 2018 12:12:56 +0200 (CEST)
  919. Received: by aldebaran.yojik.net (Postfix, from userid 1000)
  920. id 8B42920620A; Mon, 21 May 2018 12:12:56 +0200 (CEST)
  921. To: &lt;ericadmin@aijan.yojik.net&gt;
  922. Subject: Re-essai
  923. X-Mailer: mail (GNU Mailutils 3.1.1)
  924. Message-Id: &lt;20180521101256.8B42920620A@aldebaran.yojik.net&gt;
  925. Date: Mon, 21 May 2018 12:12:56 +0200 (CEST)
  926. From: eric@aldebaran.yojik.net (Eric Streit)
  927. re-essai de aldebaran
  928. .
  929. )
  930. g OK Fetch completed (0.001 + 0.000 secs).
  931. h logout
  932. * BYE Logging out
  933. h OK Logout completed (0.000 + 0.000 secs).
  934. eric@aldebaran:~$</code></pre>
  935. <p>A partir de ma machine de bureau, test de connexion en IMAP, liste des messages, et lecture du contenu (port 143):</p>
  936. <pre><code class="language-shell">eric@aldebaran:~$ telnet aijan.yojik.net 143
  937. Trying 192.168.111.240...
  938. Connected to aijan.yojik.net.
  939. Escape character is &apos;^]&apos;.
  940. * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
  941. ehlo aldebaran.yojik.eu
  942. ehlo BAD Error in IMAP command received by server.
  943. a login ericadmin eBnIDQ+FZZI=
  944. a OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE] Logged in
  945. b select inbox
  946. * FLAGS (\Answered \Flagged \Deleted \Seen \Draft NonJunk)
  947. * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft NonJunk \*)] Flags permitted.
  948. * 3 EXISTS
  949. * 0 RECENT
  950. * OK [UIDVALIDITY 1527410684] UIDs valid
  951. * OK [UIDNEXT 4] Predicted next UID
  952. b OK [READ-WRITE] Select completed (0.000 + 0.000 secs).
  953. c logout
  954. * BYE Logging out
  955. c OK Logout completed (0.000 + 0.000 secs).
  956. Connection closed by foreign host.
  957. eric@aldebaran:~$</code></pre>
  958. <p>La r&#xE9;cup&#xE9;ration des messages s&apos;est bien pass&#xE9;e.</p>
  959. <h3 id="envoi-de-messages">Envoi de messages</h3>
  960. <p>Image de la configuration &#xE0; faire sur <strong>thunderbird</strong>:</p>
  961. <p>L&apos;envoi de messages &#xE0; partir de Thunderbird fonctionne. Il faut bien configurer le port smtp &#xE0; 465 ...</p>
  962. <p>Image de la configuration &#xE0; faire.</p>
  963. <p>L&apos;envoi sur mon serveur personnel a &#xE9;chou&#xE9;: l&apos;adresse IPV4 fournie par FREE &#xE9;tait sur une liste de blocage (anti-spams). J&apos;ai demand&#xE9; &#xE0; &#xEA;tre enlev&#xE9; de cette liste, ce qui va prendre 48H environ.</p>
  964. <p>R&#xE9;-essai ensuite ...</p>
  965. <ol>
  966. <li>Envoi d&apos;un message sur le compte du serveur &#xE0; partir de la machine de bureau (thunderbird): OK.</li>
  967. <li>R&#xE9;ception des messages sur la machine de bureau (thunderbird): OK.</li>
  968. <li>Envoi d&apos;un message &#xE0; partir du compte du serveur (thunderbird): &#xE7;a OK.</li>
  969. </ol>
  970. <h2 id="installation-d-un-analyseur-des-logs-mail">Installation d&apos;un analyseur des logs mail</h2>
  971. <h3 id="installation">Installation</h3>
  972. <pre><code class="language-shell">apt-get install pflogsumm</code></pre>
  973. <h3 id="utilisation">Utilisation</h3>
  974. <pre><code>pflogsumm -d today /var/log/mail.log</code></pre><p>Vous obtiendrez une analyse approfondie des logs de la partie mail.</p>
  975. <pre><code class="language-shell">root@adara:/home/ericadmin# pflogsumm -d today /var/log/mail.log
  976. Postfix log summaries for Jul 1
  977. Grand Totals
  978. messages
  979. 24 received
  980. 23 delivered
  981. 0 forwarded
  982. 0 deferred
  983. 0 bounced
  984. 29 rejected (55%)
  985. 0 reject warnings
  986. 0 held
  987. 0 discarded (0%)
  988. 2248k bytes received
  989. 2248k bytes delivered
  990. 17 senders
  991. 13 sending hosts/domains
  992. 3 recipients
  993. 2 recipient hosts/domains
  994. Per-Hour Traffic Summary
  995. time received delivered deferred bounced rejected
  996. --
  997. 0000-0100 0 0 0 0 0
  998. 0100-0200 0 0 0 0 0
  999. 0200-0300 0 0 0 0 0
  1000. 0300-0400 0 0 0 0 3
  1001. 0400-0500 0 0 0 0 7
  1002. 0500-0600 0 0 0 0 1
  1003. 0600-0700 1 1 0 0 1
  1004. 0700-0800 2 2 0 0 1
  1005. 0800-0900 4 4 0 0 7
  1006. 0900-1000 4 4 0 0 2
  1007. 1000-1100 10 9 0 0 2
  1008. 1100-1200 2 2 0 0 1
  1009. 1200-1300 0 0 0 0 2
  1010. 1300-1400 0 0 0 0 0
  1011. 1400-1500 0 0 0 0 0
  1012. 1500-1600 1 1 0 0 2
  1013. 1600-1700 0 0 0 0 0
  1014. 1700-1800 0 0 0 0 0
  1015. 1800-1900 0 0 0 0 0
  1016. 1900-2000 0 0 0 0 0
  1017. 2000-2100 0 0 0 0 0
  1018. 2100-2200 0 0 0 0 0
  1019. 2200-2300 0 0 0 0 0
  1020. 2300-2400 0 0 0 0 0
  1021. Host/Domain Summary: Message Delivery
  1022. --
  1023. sent cnt bytes defers avg dly max dly host/domain
  1024. -- - - - - --
  1025. 21 2241k 0 4,6 s 47,0 s yojik.eu
  1026. 2 7008 0 0,8 s 1,0 s picapo.net
  1027. Host/Domain Summary: Messages Received
  1028. msg cnt bytes host/domain
  1029. -- - --
  1030. 7 1918k yojik.eu
  1031. 4 12773 lists.oasis-open.org
  1032. 2 29818 nongnu.org
  1033. 1 61932 sg.booking.com
  1034. 1 53567 bounces.amazon.fr
  1035. 1 46492 bounce.newsletter.delamaison.fr
  1036. 1 36499 mail.bitwarden.com
  1037. 1 36232 infos.materiel.net
  1038. 1 25976 newsdesmarq.ccemails.com
  1039. 1 20320 tradepubs.nl00.net
  1040. 1 6892 5v7mfyjapqzjtpqc.fncpq.3-xsveaq.na6.bnc.salesforce.com
  1041. 1 4987 hussein.org
  1042. 1 2021 inhrr.gob.ve
  1043. Senders by message count
  1044. 6 goulya@yojik.eu
  1045. 2 m17n-list-bounces+eric=yojik.eu@nongnu.org
  1046. 1 bounces+3318447-412f-eric=yojik.eu@mail.bitwarden.com
  1047. 1 bounces+4713178-1151-eric=yojik.eu@sg.booking.com
  1048. 1 email@newsdesmarq.ccemails.com
  1049. 1 do_not_reply=netgear.com__413ah3rz7vwihm9c.ly8u7ddmyngfvref@5v7mfyjapqzjtpqc.fncpq.3-xsveaq.na6.bnc.salesforce.com
  1050. 1 eric@yojik.eu
  1051. 1 20180701072218f38c0af2e0e840cf938ae502e570p0eu@bounces.amazon.fr
  1052. 1 bounce-419_HTML-28507929-182305-7304800-452@bounce.newsletter.delamaison.fr
  1053. 1 p-m8bl38j2p7vg88u3n3hrzdpp4rcbq9n7x8cvc2fn23u5pwpnseghvzq-BHP30@infos.materiel.net
  1054. 1 Offers@tradepubs.nl00.net
  1055. 1 info@hussein.org
  1056. 1 docbook-apps-return-14782-eric=yojik.eu@lists.oasis-open.org
  1057. 1 docbook-apps-return-14783-eric=yojik.eu@lists.oasis-open.org
  1058. 1 docbook-apps-return-14784-eric=yojik.eu@lists.oasis-open.org
  1059. 1 docbook-return-3958-eric=yojik.eu@lists.oasis-open.org
  1060. 1 maria.rueda@inhrr.gob.ve
  1061. Recipients by message count
  1062. 15 eric@yojik.eu
  1063. 6 goulya@yojik.eu
  1064. 2 nico@picapo.net
  1065. Senders by message size
  1066. --
  1067. 1917k goulya@yojik.eu
  1068. 61932 bounces+4713178-1151-eric=yojik.eu@sg.booking.com
  1069. 53567 20180701072218f38c0af2e0e840cf938ae502e570p0eu@bounces.amazon.fr
  1070. 46492 bounce-419_HTML-28507929-182305-7304800-452@bounce.newsletter.delamaison.fr
  1071. 36499 bounces+3318447-412f-eric=yojik.eu@mail.bitwarden.com
  1072. 36232 p-m8bl38j2p7vg88u3n3hrzdpp4rcbq9n7x8cvc2fn23u5pwpnseghvzq-BHP30@infos.materiel.net
  1073. 29818 m17n-list-bounces+eric=yojik.eu@nongnu.org
  1074. 25976 email@newsdesmarq.ccemails.com
  1075. 20320 Offers@tradepubs.nl00.net
  1076. 6892 do_not_reply=netgear.com__413ah3rz7vwihm9c.ly8u7ddmyngfvref@5v7mfyjapqzjtpqc.fncpq.3-xsveaq.na6.bnc.salesforce.com
  1077. 4987 info@hussein.org
  1078. 4275 docbook-apps-return-14782-eric=yojik.eu@lists.oasis-open.org
  1079. 3589 docbook-return-3958-eric=yojik.eu@lists.oasis-open.org
  1080. 2564 docbook-apps-return-14784-eric=yojik.eu@lists.oasis-open.org
  1081. 2345 docbook-apps-return-14783-eric=yojik.eu@lists.oasis-open.org
  1082. 2021 maria.rueda@inhrr.gob.ve
  1083. 1124 eric@yojik.eu
  1084. Recipients by message size
  1085. --
  1086. 1916k goulya@yojik.eu
  1087. 333462 eric@yojik.eu
  1088. 7008 nico@picapo.net
  1089. message deferral detail: none
  1090. message bounce detail (by relay): none
  1091. message reject detail
  1092. RCPT
  1093. blocked using zen.spamhaus.org (total: 2)
  1094. 1 amazonaws.com
  1095. 1 b941c024.business.dg-w.de
  1096. cannot find your hostname (total: 25)
  1097. 9 183.159.95.6
  1098. 3 210.239.8.55
  1099. 3 114.228.155.122
  1100. 2 2406:fc00:1:7:214:22ff:fe08:eb34
  1101. 2 117.63.127.41
  1102. 2 159.89.236.50
  1103. 1 140.127.1.29
  1104. 1 37.49.227.169
  1105. 1 80.211.61.89
  1106. 1 222.95.187.160
  1107. Client host rejected: Access denied (total: 2)
  1108. 2 80.211.61.89
  1109. message reject warning detail: none
  1110. message hold detail: none
  1111. message discard detail: none
  1112. smtp delivery failures: none
  1113. Warnings
  1114. --
  1115. smtpd (total: 16)
  1116. 6 hostname host89-61-211-80.serverdedicati.aruba.it does not reso...
  1117. 3 hostname host-210.239.8.55.n-cube.ne.jp does not resolve to add...
  1118. 2 mm-115-58-214-37.mogilev.dynamic.pppoe.byfly.by[37.214.58.115]:...
  1119. 2 hostname 41.127.63.117.broad.cz.js.dynamic.163data.com.cn does ...
  1120. 1 hostname hn.kd.ny.adsl does not resolve to address 115.57.125.2...
  1121. 1 hostname mails.npust.edu.tw does not resolve to address 140.127...
  1122. 1 hostname 82-64-48-5.subs.proxad.net does not resolve to address...
  1123. Fatal Errors: none
  1124. Panics: none
  1125. Master daemon messages: none
  1126. root@adara:/home/ericadmin#</code></pre>
  1127. <p>Bien: la configuration est quasi termin&#xE9;e: il nous reste &#xE0; ajouter SPF, DKIM, Dane et DNSSEC. et les comptes virtuels ...</p>
  1128. <h2 id="installation-de-rainloop-webmail-">Installation de rainloop (webmail)</h2>
  1129. <p>T&#xE9;l&#xE9;charger la version communautaire sur le site, et la d&#xE9;compresser dans votre r&#xE9;pertoire web (/home/www/ pour moi)</p>
  1130. <p>Installation des d&#xE9;pendances: librairies et programmes</p>
  1131. <p><em>Partie &#xE0; am&#xE9;liorer .....</em></p>
  1132. <pre><code class="language-shell">root@adara:/home/ericadmin# apt install unzip
  1133. Lecture des listes de paquets... Fait
  1134. Construction de l&apos;arbre des d&#xE9;pendances
  1135. Lecture des informations d&apos;&#xE9;tat... Fait
  1136. Paquets sugg&#xE9;r&#xE9;s :
  1137. zip
  1138. Les NOUVEAUX paquets suivants seront install&#xE9;s :
  1139. unzip
  1140. 0 mis &#xE0; jour, 1 nouvellement install&#xE9;s, 0 &#xE0; enlever et 0 non mis &#xE0; jour.
  1141. Il est n&#xE9;cessaire de prendre 170 ko dans les archives.
  1142. Apr&#xE8;s cette op&#xE9;ration, 547 ko d&apos;espace disque suppl&#xE9;mentaires seront utilis&#xE9;s.
  1143. R&#xE9;ception de:1 http://debian.mirrors.ovh.net/debian stretch/main amd64 unzip amd64 6.0-21 [170 kB]
  1144. 170 ko r&#xE9;ceptionn&#xE9;s en 0s (5 565 ko/s)
  1145. S&#xE9;lection du paquet unzip pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1146. (Lecture de la base de donn&#xE9;es... 27662 fichiers et r&#xE9;pertoires d&#xE9;j&#xE0; install&#xE9;s.)
  1147. Pr&#xE9;paration du d&#xE9;paquetage de .../unzip_6.0-21_amd64.deb ...
  1148. D&#xE9;paquetage de unzip (6.0-21) ...
  1149. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour mime-support (3.60) ...
  1150. Param&#xE9;trage de unzip (6.0-21) ...
  1151. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour man-db (2.7.6.1-2) ...
  1152. root@adara:/home/ericadmin/# mc
  1153. root@adara:/home/ericadmin/bin#
  1154. root@adara:/home/www# cd /home/www
  1155. root@adara:/home/www# mkdir rainloop
  1156. root@adara:/etc# apt search php | grep curl
  1157. WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
  1158. php-curl/stable 1:7.0+49 all
  1159. php7.0-curl/stable,stable 7.0.27-0+deb9u1 amd64
  1160. root@adara:/etc# apt install php7.0-curl
  1161. Lecture des listes de paquets... Fait
  1162. Construction de l&apos;arbre des d&#xE9;pendances
  1163. Lecture des informations d&apos;&#xE9;tat... Fait
  1164. The following additional packages will be installed:
  1165. libcurl3 php-common php7.0-common psmisc
  1166. Les NOUVEAUX paquets suivants seront install&#xE9;s :
  1167. libcurl3 php-common php7.0-common php7.0-curl psmisc
  1168. 0 mis &#xE0; jour, 5 nouvellement install&#xE9;s, 0 &#xE0; enlever et 0 non mis &#xE0; jour.
  1169. Il est n&#xE9;cessaire de prendre 1 333 ko dans les archives.
  1170. Apr&#xE8;s cette op&#xE9;ration, 6 149 ko d&apos;espace disque suppl&#xE9;mentaires seront utilis&#xE9;s.
  1171. Souhaitez-vous continuer ? [O/n] o
  1172. R&#xE9;ception de:1 http://debian.mirrors.ovh.net/debian stretch/main amd64 psmisc amd64 22.21-2.1+b2 [123 kB]
  1173. R&#xE9;ception de:2 http://debian.mirrors.ovh.net/debian stretch/main amd64 php-common all 1:49 [14,1 kB]
  1174. R&#xE9;ception de:3 http://debian.mirrors.ovh.net/debian stretch/main amd64 php7.0-common amd64 7.0.27-0+deb9u1 [877 kB]
  1175. R&#xE9;ception de:4 http://security.debian.org/debian-security stretch/updates/main amd64 libcurl3 amd64 7.52.1-5+deb9u6 [291 kB]
  1176. R&#xE9;ception de:5 http://debian.mirrors.ovh.net/debian stretch/main amd64 php7.0-curl amd64 7.0.27-0+deb9u1 [27,4 kB]
  1177. 1 333 ko r&#xE9;ceptionn&#xE9;s en 0s (3 062 ko/s)
  1178. S&#xE9;lection du paquet libcurl3:amd64 pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1179. (Lecture de la base de donn&#xE9;es... 27680 fichiers et r&#xE9;pertoires d&#xE9;j&#xE0; install&#xE9;s.)
  1180. Pr&#xE9;paration du d&#xE9;paquetage de .../libcurl3_7.52.1-5+deb9u6_amd64.deb ...
  1181. D&#xE9;paquetage de libcurl3:amd64 (7.52.1-5+deb9u6) ...
  1182. S&#xE9;lection du paquet psmisc pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1183. Pr&#xE9;paration du d&#xE9;paquetage de .../psmisc_22.21-2.1+b2_amd64.deb ...
  1184. D&#xE9;paquetage de psmisc (22.21-2.1+b2) ...
  1185. S&#xE9;lection du paquet php-common pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1186. Pr&#xE9;paration du d&#xE9;paquetage de .../php-common_1%3a49_all.deb ...
  1187. D&#xE9;paquetage de php-common (1:49) ...
  1188. S&#xE9;lection du paquet php7.0-common pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1189. Pr&#xE9;paration du d&#xE9;paquetage de .../php7.0-common_7.0.27-0+deb9u1_amd64.deb ...
  1190. D&#xE9;paquetage de php7.0-common (7.0.27-0+deb9u1) ...
  1191. S&#xE9;lection du paquet php7.0-curl pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1192. Pr&#xE9;paration du d&#xE9;paquetage de .../php7.0-curl_7.0.27-0+deb9u1_amd64.deb ...
  1193. D&#xE9;paquetage de php7.0-curl (7.0.27-0+deb9u1) ...
  1194. Param&#xE9;trage de psmisc (22.21-2.1+b2) ...
  1195. Param&#xE9;trage de libcurl3:amd64 (7.52.1-5+deb9u6) ...
  1196. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour libc-bin (2.24-11+deb9u3) ...
  1197. Param&#xE9;trage de php-common (1:49) ...
  1198. Created symlink /etc/systemd/system/timers.target.wants/phpsessionclean.timer &#x2192; /lib/systemd/system/phpsessionclean.timer.
  1199. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour man-db (2.7.6.1-2) ...
  1200. Param&#xE9;trage de php7.0-common (7.0.27-0+deb9u1) ...
  1201. Creating config file /etc/php/7.0/mods-available/calendar.ini with new version
  1202. Creating config file /etc/php/7.0/mods-available/ctype.ini with new version
  1203. Creating config file /etc/php/7.0/mods-available/exif.ini with new version
  1204. Creating config file /etc/php/7.0/mods-available/fileinfo.ini with new version
  1205. Creating config file /etc/php/7.0/mods-available/ftp.ini with new version
  1206. Creating config file /etc/php/7.0/mods-available/gettext.ini with new version
  1207. Creating config file /etc/php/7.0/mods-available/iconv.ini with new version
  1208. Creating config file /etc/php/7.0/mods-available/pdo.ini with new version
  1209. Creating config file /etc/php/7.0/mods-available/phar.ini with new version
  1210. Creating config file /etc/php/7.0/mods-available/posix.ini with new version
  1211. Creating config file /etc/php/7.0/mods-available/shmop.ini with new version
  1212. Creating config file /etc/php/7.0/mods-available/sockets.ini with new version
  1213. Creating config file /etc/php/7.0/mods-available/sysvmsg.ini with new version
  1214. Creating config file /etc/php/7.0/mods-available/sysvsem.ini with new version
  1215. Creating config file /etc/php/7.0/mods-available/sysvshm.ini with new version
  1216. Creating config file /etc/php/7.0/mods-available/tokenizer.ini with new version
  1217. Param&#xE9;trage de php7.0-curl (7.0.27-0+deb9u1) ...
  1218. Creating config file /etc/php/7.0/mods-available/curl.ini with new version
  1219. root@adara:/etc# apt search php | grep iconv
  1220. WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
  1221. libhtml-wikiconverter-phpwiki-perl/stable 0.51-2 all
  1222. php-symfony-polyfill-iconv/stable 1.2.0-1 all
  1223. root@adara:/etc# apt install php-symfony-polyfill-iconv
  1224. Lecture des listes de paquets... Fait
  1225. Construction de l&apos;arbre des d&#xE9;pendances
  1226. Lecture des informations d&apos;&#xE9;tat... Fait
  1227. Les NOUVEAUX paquets suivants seront install&#xE9;s :
  1228. php-symfony-polyfill-iconv
  1229. 0 mis &#xE0; jour, 1 nouvellement install&#xE9;s, 0 &#xE0; enlever et 0 non mis &#xE0; jour.
  1230. Il est n&#xE9;cessaire de prendre 124 ko dans les archives.
  1231. Apr&#xE8;s cette op&#xE9;ration, 1 585 ko d&apos;espace disque suppl&#xE9;mentaires seront utilis&#xE9;s.
  1232. R&#xE9;ception de:1 http://debian.mirrors.ovh.net/debian stretch/main amd64 php-symfony-polyfill-iconv all 1.2.0-1 [124 kB]
  1233. 124 ko r&#xE9;ceptionn&#xE9;s en 0s (817 ko/s)
  1234. S&#xE9;lection du paquet php-symfony-polyfill-iconv pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1235. (Lecture de la base de donn&#xE9;es... 27826 fichiers et r&#xE9;pertoires d&#xE9;j&#xE0; install&#xE9;s.)
  1236. Pr&#xE9;paration du d&#xE9;paquetage de .../php-symfony-polyfill-iconv_1.2.0-1_all.deb ...
  1237. D&#xE9;paquetage de php-symfony-polyfill-iconv (1.2.0-1) ...
  1238. Param&#xE9;trage de php-symfony-polyfill-iconv (1.2.0-1) ...
  1239. root@adara:/etc# apt search php | grep json
  1240. WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
  1241. jsonlint/stable 1.5.0-1 all
  1242. php-json/stable 1:7.0+49 all
  1243. php-json-schema/stable 1.6.1-2 all
  1244. php7.0-json/stable,stable 7.0.27-0+deb9u1 amd64
  1245. root@adara:/etc# apt install php-json
  1246. Lecture des listes de paquets... Fait
  1247. Construction de l&apos;arbre des d&#xE9;pendances
  1248. Lecture des informations d&apos;&#xE9;tat... Fait
  1249. The following additional packages will be installed:
  1250. php7.0-json
  1251. Les NOUVEAUX paquets suivants seront install&#xE9;s :
  1252. php-json php7.0-json
  1253. 0 mis &#xE0; jour, 2 nouvellement install&#xE9;s, 0 &#xE0; enlever et 0 non mis &#xE0; jour.
  1254. Il est n&#xE9;cessaire de prendre 22,0 ko dans les archives.
  1255. Apr&#xE8;s cette op&#xE9;ration, 80,9 ko d&apos;espace disque suppl&#xE9;mentaires seront utilis&#xE9;s.
  1256. Souhaitez-vous continuer ? [O/n] o
  1257. R&#xE9;ception de:1 http://debian.mirrors.ovh.net/debian stretch/main amd64 php7.0-json amd64 7.0.27-0+deb9u1 [17,0 kB]
  1258. R&#xE9;ception de:2 http://debian.mirrors.ovh.net/debian stretch/main amd64 php-json all 1:7.0+49 [5 050 B]
  1259. 22,0 ko r&#xE9;ceptionn&#xE9;s en 0s (839 ko/s)
  1260. S&#xE9;lection du paquet php7.0-json pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1261. (Lecture de la base de donn&#xE9;es... 27895 fichiers et r&#xE9;pertoires d&#xE9;j&#xE0; install&#xE9;s.)
  1262. Pr&#xE9;paration du d&#xE9;paquetage de .../php7.0-json_7.0.27-0+deb9u1_amd64.deb ...
  1263. D&#xE9;paquetage de php7.0-json (7.0.27-0+deb9u1) ...
  1264. S&#xE9;lection du paquet php-json pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1265. Pr&#xE9;paration du d&#xE9;paquetage de .../php-json_1%3a7.0+49_all.deb ...
  1266. D&#xE9;paquetage de php-json (1:7.0+49) ...
  1267. Param&#xE9;trage de php7.0-json (7.0.27-0+deb9u1) ...
  1268. Creating config file /etc/php/7.0/mods-available/json.ini with new version
  1269. Param&#xE9;trage de php-json (1:7.0+49) ...
  1270. root@adara:/etc# apt search php | grep libxml
  1271. WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
  1272. root@adara:/etc# apt search php | grep xml
  1273. WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
  1274. libsmokeqtxml4-3/stable 4:4.14.3-1.1 amd64
  1275. libsmokeqtxmlpatterns4-3/stable 4:4.14.3-1.1 amd64
  1276. php-horde-xml-element/stable 2.0.4-3 all
  1277. php-horde-xml-wbxml/stable 2.0.3-3 all
  1278. Horde_Xml_Wbxml provides an API for encoding and decoding WBXML documents used in SyncML and other wireless applications
  1279. php-sabre-xml/stable 1.4.2-1 all
  1280. php-symfony-polyfill-xml/stable 1.2.0-1 all
  1281. Symfony polyfill for xml&apos;s utf8_encode and utf8_decode functions
  1282. php-xml/stable 1:7.0+49 all
  1283. php-xml-htmlsax3/stable 3.0.0+really3.0.0-3 all
  1284. php-xml-rpc2/stable 1.1.3-0.1 all
  1285. php-xml-svg/stable 1.1.0-2 all
  1286. php-xmlrpc/stable 1:7.0+49 all
  1287. php7.0-xml/stable,stable 7.0.27-0+deb9u1 amd64
  1288. php7.0-xmlrpc/stable,stable 7.0.27-0+deb9u1 amd64
  1289. root@adara:/etc# apt install php-xml
  1290. Lecture des listes de paquets... Fait
  1291. Construction de l&apos;arbre des d&#xE9;pendances
  1292. Lecture des informations d&apos;&#xE9;tat... Fait
  1293. The following additional packages will be installed:
  1294. libxslt1.1 php7.0-xml
  1295. Les NOUVEAUX paquets suivants seront install&#xE9;s :
  1296. libxslt1.1 php-xml php7.0-xml
  1297. 0 mis &#xE0; jour, 3 nouvellement install&#xE9;s, 0 &#xE0; enlever et 0 non mis &#xE0; jour.
  1298. Il est n&#xE9;cessaire de prendre 351 ko dans les archives.
  1299. Apr&#xE8;s cette op&#xE9;ration, 992 ko d&apos;espace disque suppl&#xE9;mentaires seront utilis&#xE9;s.
  1300. Souhaitez-vous continuer ? [O/n] o
  1301. R&#xE9;ception de:1 http://debian.mirrors.ovh.net/debian stretch/main amd64 libxslt1.1 amd64 1.1.29-2.1 [233 kB]
  1302. R&#xE9;ception de:2 http://debian.mirrors.ovh.net/debian stretch/main amd64 php7.0-xml amd64 7.0.27-0+deb9u1 [112 kB]
  1303. R&#xE9;ception de:3 http://debian.mirrors.ovh.net/debian stretch/main amd64 php-xml all 1:7.0+49 [5 068 B]
  1304. 351 ko r&#xE9;ceptionn&#xE9;s en 0s (7 580 ko/s)
  1305. S&#xE9;lection du paquet libxslt1.1:amd64 pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1306. (Lecture de la base de donn&#xE9;es... 27907 fichiers et r&#xE9;pertoires d&#xE9;j&#xE0; install&#xE9;s.)
  1307. Pr&#xE9;paration du d&#xE9;paquetage de .../libxslt1.1_1.1.29-2.1_amd64.deb ...
  1308. D&#xE9;paquetage de libxslt1.1:amd64 (1.1.29-2.1) ...
  1309. S&#xE9;lection du paquet php7.0-xml pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1310. Pr&#xE9;paration du d&#xE9;paquetage de .../php7.0-xml_7.0.27-0+deb9u1_amd64.deb ...
  1311. D&#xE9;paquetage de php7.0-xml (7.0.27-0+deb9u1) ...
  1312. S&#xE9;lection du paquet php-xml pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1313. Pr&#xE9;paration du d&#xE9;paquetage de .../php-xml_1%3a7.0+49_all.deb ...
  1314. D&#xE9;paquetage de php-xml (1:7.0+49) ...
  1315. Param&#xE9;trage de libxslt1.1:amd64 (1.1.29-2.1) ...
  1316. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour libc-bin (2.24-11+deb9u3) ...
  1317. Param&#xE9;trage de php7.0-xml (7.0.27-0+deb9u1) ...
  1318. Creating config file /etc/php/7.0/mods-available/dom.ini with new version
  1319. Creating config file /etc/php/7.0/mods-available/simplexml.ini with new version
  1320. Creating config file /etc/php/7.0/mods-available/wddx.ini with new version
  1321. Creating config file /etc/php/7.0/mods-available/xml.ini with new version
  1322. Creating config file /etc/php/7.0/mods-available/xmlreader.ini with new version
  1323. Creating config file /etc/php/7.0/mods-available/xmlwriter.ini with new version
  1324. Creating config file /etc/php/7.0/mods-available/xsl.ini with new version
  1325. Param&#xE9;trage de php-xml (1:7.0+49) ...
  1326. root@adara:/etc# apt search php | grep dom
  1327. WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
  1328. Convert to/from Koremutake Memorable Random Strings
  1329. php-dompdf/stable 0.6.2+dfsg-3 all
  1330. php-fdomdocument/stable 1.6.1-2 all
  1331. PHP Pear module for handling international domain names
  1332. PHP module for detecting registered domains and public suffixes
  1333. php-random-compat/stable 2.0.2-2 all
  1334. PHP 5.x polyfill for random_bytes() and random_int() from PHP 7
  1335. php-symfony-dom-crawler/stable 2.8.7+dfsg-1.3 all
  1336. root@adara:/etc# apt install php-symfony-dom-crawler
  1337. Lecture des listes de paquets... Fait
  1338. Construction de l&apos;arbre des d&#xE9;pendances
  1339. Lecture des informations d&apos;&#xE9;tat... Fait
  1340. The following additional packages will be installed:
  1341. php-symfony-polyfill-mbstring
  1342. Paquets sugg&#xE9;r&#xE9;s :
  1343. php-symfony-css-selector php-mbstring
  1344. Les NOUVEAUX paquets suivants seront install&#xE9;s :
  1345. php-symfony-dom-crawler php-symfony-polyfill-mbstring
  1346. 0 mis &#xE0; jour, 2 nouvellement install&#xE9;s, 0 &#xE0; enlever et 0 non mis &#xE0; jour.
  1347. Il est n&#xE9;cessaire de prendre 41,6 ko dans les archives.
  1348. Apr&#xE8;s cette op&#xE9;ration, 225 ko d&apos;espace disque suppl&#xE9;mentaires seront utilis&#xE9;s.
  1349. Souhaitez-vous continuer ? [O/n] o
  1350. R&#xE9;ception de:1 http://debian.mirrors.ovh.net/debian stretch/main amd64 php-symfony-polyfill-mbstring all 1.2.0-1 [12,0 kB]
  1351. R&#xE9;ception de:2 http://debian.mirrors.ovh.net/debian stretch/main amd64 php-symfony-dom-crawler all 2.8.7+dfsg-1.3 [29,6 kB]
  1352. 41,6 ko r&#xE9;ceptionn&#xE9;s en 0s (199 ko/s)
  1353. S&#xE9;lection du paquet php-symfony-polyfill-mbstring pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1354. (Lecture de la base de donn&#xE9;es... 27947 fichiers et r&#xE9;pertoires d&#xE9;j&#xE0; install&#xE9;s.)
  1355. Pr&#xE9;paration du d&#xE9;paquetage de .../php-symfony-polyfill-mbstring_1.2.0-1_all.deb ...
  1356. D&#xE9;paquetage de php-symfony-polyfill-mbstring (1.2.0-1) ...
  1357. S&#xE9;lection du paquet php-symfony-dom-crawler pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1358. Pr&#xE9;paration du d&#xE9;paquetage de .../php-symfony-dom-crawler_2.8.7+dfsg-1.3_all.deb ...
  1359. D&#xE9;paquetage de php-symfony-dom-crawler (2.8.7+dfsg-1.3) ...
  1360. Param&#xE9;trage de php-symfony-polyfill-mbstring (1.2.0-1) ...
  1361. Param&#xE9;trage de php-symfony-dom-crawler (2.8.7+dfsg-1.3) ...
  1362. root@adara:/etc# apt search php | grep openssl
  1363. WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
  1364. root@adara:/etc# apt search php | grep ssl
  1365. WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
  1366. root@adara:/etc# apt install php7.0 libapache2-mod-php7.0 php7.0-curl php7.0-xml
  1367. Lecture des listes de paquets... Fait
  1368. Construction de l&apos;arbre des d&#xE9;pendances
  1369. Lecture des informations d&apos;&#xE9;tat... Fait
  1370. php7.0-curl is already the newest version (7.0.27-0+deb9u1).
  1371. php7.0-xml is already the newest version (7.0.27-0+deb9u1).
  1372. php7.0-xml pass&#xE9; en &#xAB; install&#xE9; manuellement &#xBB;.
  1373. The following additional packages will be installed:
  1374. libmagic-mgc libmagic1 php7.0-cli php7.0-opcache php7.0-readline
  1375. Paquets sugg&#xE9;r&#xE9;s :
  1376. php-pear file
  1377. Les NOUVEAUX paquets suivants seront install&#xE9;s :
  1378. libapache2-mod-php7.0 libmagic-mgc libmagic1 php7.0 php7.0-cli php7.0-opcache php7.0-readline
  1379. 0 mis &#xE0; jour, 7 nouvellement install&#xE9;s, 0 &#xE0; enlever et 0 non mis &#xE0; jour.
  1380. Il est n&#xE9;cessaire de prendre 2 984 ko dans les archives.
  1381. Apr&#xE8;s cette op&#xE9;ration, 14,3 Mo d&apos;espace disque suppl&#xE9;mentaires seront utilis&#xE9;s.
  1382. Souhaitez-vous continuer ? [O/n] o
  1383. R&#xE9;ception de:1 http://debian.mirrors.ovh.net/debian stretch/main amd64 libmagic-mgc amd64 1:5.30-1+deb9u1 [222 kB]
  1384. R&#xE9;ception de:2 http://debian.mirrors.ovh.net/debian stretch/main amd64 libmagic1 amd64 1:5.30-1+deb9u1 [111 kB]
  1385. R&#xE9;ception de:3 http://debian.mirrors.ovh.net/debian stretch/main amd64 php7.0-opcache amd64 7.0.27-0+deb9u1 [77,5 kB]
  1386. R&#xE9;ception de:4 http://debian.mirrors.ovh.net/debian stretch/main amd64 php7.0-readline amd64 7.0.27-0+deb9u1 [12,2 kB]
  1387. R&#xE9;ception de:5 http://debian.mirrors.ovh.net/debian stretch/main amd64 php7.0-cli amd64 7.0.27-0+deb9u1 [1 284 kB]
  1388. R&#xE9;ception de:6 http://debian.mirrors.ovh.net/debian stretch/main amd64 libapache2-mod-php7.0 amd64 7.0.27-0+deb9u1 [1 224 kB]
  1389. R&#xE9;ception de:7 http://debian.mirrors.ovh.net/debian stretch/main amd64 php7.0 all 7.0.27-0+deb9u1 [52,9 kB]
  1390. 2 984 ko r&#xE9;ceptionn&#xE9;s en 0s (10,9 Mo/s)
  1391. S&#xE9;lection du paquet libmagic-mgc pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1392. (Lecture de la base de donn&#xE9;es... 27977 fichiers et r&#xE9;pertoires d&#xE9;j&#xE0; install&#xE9;s.)
  1393. Pr&#xE9;paration du d&#xE9;paquetage de .../0-libmagic-mgc_1%3a5.30-1+deb9u1_amd64.deb ...
  1394. D&#xE9;paquetage de libmagic-mgc (1:5.30-1+deb9u1) ...
  1395. S&#xE9;lection du paquet libmagic1:amd64 pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1396. Pr&#xE9;paration du d&#xE9;paquetage de .../1-libmagic1_1%3a5.30-1+deb9u1_amd64.deb ...
  1397. D&#xE9;paquetage de libmagic1:amd64 (1:5.30-1+deb9u1) ...
  1398. S&#xE9;lection du paquet php7.0-opcache pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1399. Pr&#xE9;paration du d&#xE9;paquetage de .../2-php7.0-opcache_7.0.27-0+deb9u1_amd64.deb ...
  1400. D&#xE9;paquetage de php7.0-opcache (7.0.27-0+deb9u1) ...
  1401. S&#xE9;lection du paquet php7.0-readline pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1402. Pr&#xE9;paration du d&#xE9;paquetage de .../3-php7.0-readline_7.0.27-0+deb9u1_amd64.deb ...
  1403. D&#xE9;paquetage de php7.0-readline (7.0.27-0+deb9u1) ...
  1404. S&#xE9;lection du paquet php7.0-cli pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1405. Pr&#xE9;paration du d&#xE9;paquetage de .../4-php7.0-cli_7.0.27-0+deb9u1_amd64.deb ...
  1406. D&#xE9;paquetage de php7.0-cli (7.0.27-0+deb9u1) ...
  1407. S&#xE9;lection du paquet libapache2-mod-php7.0 pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1408. Pr&#xE9;paration du d&#xE9;paquetage de .../5-libapache2-mod-php7.0_7.0.27-0+deb9u1_amd64.deb ...
  1409. D&#xE9;paquetage de libapache2-mod-php7.0 (7.0.27-0+deb9u1) ...
  1410. S&#xE9;lection du paquet php7.0 pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1411. Pr&#xE9;paration du d&#xE9;paquetage de .../6-php7.0_7.0.27-0+deb9u1_all.deb ...
  1412. D&#xE9;paquetage de php7.0 (7.0.27-0+deb9u1) ...
  1413. Param&#xE9;trage de php7.0-readline (7.0.27-0+deb9u1) ...
  1414. Creating config file /etc/php/7.0/mods-available/readline.ini with new version
  1415. Param&#xE9;trage de php7.0-opcache (7.0.27-0+deb9u1) ...
  1416. Creating config file /etc/php/7.0/mods-available/opcache.ini with new version
  1417. Param&#xE9;trage de libmagic-mgc (1:5.30-1+deb9u1) ...
  1418. Param&#xE9;trage de libmagic1:amd64 (1:5.30-1+deb9u1) ...
  1419. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour libc-bin (2.24-11+deb9u3) ...
  1420. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour man-db (2.7.6.1-2) ...
  1421. Param&#xE9;trage de php7.0-cli (7.0.27-0+deb9u1) ...
  1422. update-alternatives: utilisation de &#xAB; /usr/bin/php7.0 &#xBB; pour fournir &#xAB; /usr/bin/php &#xBB; (php) en mode automatique
  1423. update-alternatives: utilisation de &#xAB; /usr/bin/phar7.0 &#xBB; pour fournir &#xAB; /usr/bin/phar &#xBB; (phar) en mode automatique
  1424. update-alternatives: utilisation de &#xAB; /usr/bin/phar.phar7.0 &#xBB; pour fournir &#xAB; /usr/bin/phar.phar &#xBB; (phar.phar) en mode automatique
  1425. Creating config file /etc/php/7.0/cli/php.ini with new version
  1426. php_invoke: Enable module fileinfo for cli sapi
  1427. php_invoke: Enable module dom for cli sapi
  1428. php_invoke: Enable module xmlwriter for cli sapi
  1429. php_invoke: Enable module sysvsem for cli sapi
  1430. php_invoke: Enable module ftp for cli sapi
  1431. php_invoke: Enable module curl for cli sapi
  1432. php_invoke: Enable module xml for cli sapi
  1433. php_invoke: Enable module gettext for cli sapi
  1434. php_invoke: Enable module ctype for cli sapi
  1435. php_invoke: Enable module json for cli sapi
  1436. php_invoke: Enable module sockets for cli sapi
  1437. php_invoke: Enable module sysvmsg for cli sapi
  1438. php_invoke: Enable module xsl for cli sapi
  1439. php_invoke: Enable module simplexml for cli sapi
  1440. php_invoke: Enable module xmlreader for cli sapi
  1441. php_invoke: Enable module exif for cli sapi
  1442. php_invoke: Enable module shmop for cli sapi
  1443. php_invoke: Enable module sysvshm for cli sapi
  1444. php_invoke: Enable module pdo for cli sapi
  1445. php_invoke: Enable module tokenizer for cli sapi
  1446. php_invoke: Enable module calendar for cli sapi
  1447. php_invoke: Enable module wddx for cli sapi
  1448. php_invoke: Enable module iconv for cli sapi
  1449. php_invoke: Enable module posix for cli sapi
  1450. php_invoke: Enable module phar for cli sapi
  1451. Param&#xE9;trage de libapache2-mod-php7.0 (7.0.27-0+deb9u1) ...
  1452. Creating config file /etc/php/7.0/apache2/php.ini with new version
  1453. php_invoke: Enable module fileinfo for apache2 sapi
  1454. php_invoke: Enable module dom for apache2 sapi
  1455. php_invoke: Enable module xmlwriter for apache2 sapi
  1456. php_invoke: Enable module sysvsem for apache2 sapi
  1457. php_invoke: Enable module ftp for apache2 sapi
  1458. php_invoke: Enable module curl for apache2 sapi
  1459. php_invoke: Enable module xml for apache2 sapi
  1460. php_invoke: Enable module gettext for apache2 sapi
  1461. php_invoke: Enable module ctype for apache2 sapi
  1462. php_invoke: Enable module json for apache2 sapi
  1463. php_invoke: Enable module sockets for apache2 sapi
  1464. php_invoke: Enable module sysvmsg for apache2 sapi
  1465. php_invoke: Enable module xsl for apache2 sapi
  1466. php_invoke: Enable module simplexml for apache2 sapi
  1467. php_invoke: Enable module xmlreader for apache2 sapi
  1468. php_invoke: Enable module exif for apache2 sapi
  1469. php_invoke: Enable module shmop for apache2 sapi
  1470. php_invoke: Enable module sysvshm for apache2 sapi
  1471. php_invoke: Enable module pdo for apache2 sapi
  1472. php_invoke: Enable module tokenizer for apache2 sapi
  1473. php_invoke: Enable module calendar for apache2 sapi
  1474. php_invoke: Enable module wddx for apache2 sapi
  1475. php_invoke: Enable module iconv for apache2 sapi
  1476. php_invoke: Enable module posix for apache2 sapi
  1477. php_invoke: Enable module phar for apache2 sapi
  1478. Module mpm_event disabled.
  1479. Enabling module mpm_prefork.
  1480. apache2_switch_mpm Switch to prefork
  1481. apache2_invoke: Enable module php7.0
  1482. Param&#xE9;trage de php7.0 (7.0.27-0+deb9u1) ...
  1483. root@adara:/etc# mc</code></pre>
  1484. <h3 id="mise-en-route-du-webmail-dans-apache">Mise en route du webmail dans apache</h3>
  1485. <pre><code class="language-shell">root@adara:/etc# a2ensite webmail
  1486. Enabling site webmail.
  1487. To activate the new configuration, you need to run:
  1488. systemctl reload apache2
  1489. root@adara:/etc# cd /home/www
  1490. root@adara:/home/www# ls
  1491. divers faqfctt goulya homepage New-FSI rainloop wordpress
  1492. root@adara:/home/www# cd rainloop/
  1493. root@adara:/home/www/rainloop# find . -type d -exec chmod 755 {} \;
  1494. root@adara:/home/www/rainloop# find . -type f -exec chmod 644 {} \;
  1495. root@adara:/home/www/rainloop# chown -R www-data:www-data .
  1496. root@adara:/home/www/rainloop# service apache2 restart
  1497. root@adara:/home/www/rainloop# mc
  1498. root@adara:/home/www/rainloop# service apache2 restart</code></pre>
  1499. <h3 id="installation-de-l-interface-sqlite-de-php">Installation de l&apos;interface sqlite de php</h3>
  1500. <pre><code class="language-shell">root@adara:/home/www/rainloop# apt search php | grep sqlite
  1501. WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
  1502. php-sqlite3/stable 1:7.0+49 all
  1503. php7.0-sqlite3/stable,stable 7.0.27-0+deb9u1 amd64
  1504. root@adara:/home/www/rainloop# apt install php7.0-sqlite3
  1505. Lecture des listes de paquets... Fait
  1506. Construction de l&apos;arbre des d&#xE9;pendances
  1507. Lecture des informations d&apos;&#xE9;tat... Fait
  1508. Les NOUVEAUX paquets suivants seront install&#xE9;s :
  1509. php7.0-sqlite3
  1510. 0 mis &#xE0; jour, 1 nouvellement install&#xE9;s, 0 &#xE0; enlever et 0 non mis &#xE0; jour.
  1511. Il est n&#xE9;cessaire de prendre 24,8 ko dans les archives.
  1512. Apr&#xE8;s cette op&#xE9;ration, 111 ko d&apos;espace disque suppl&#xE9;mentaires seront utilis&#xE9;s.
  1513. R&#xE9;ception de:1 http://debian.mirrors.ovh.net/debian stretch/main amd64 php7.0-sqlite3 amd64 7.0.27-0+deb9u1 [24,8 kB]
  1514. 24,8 ko r&#xE9;ceptionn&#xE9;s en 0s (299 ko/s)
  1515. S&#xE9;lection du paquet php7.0-sqlite3 pr&#xE9;c&#xE9;demment d&#xE9;s&#xE9;lectionn&#xE9;.
  1516. (Lecture de la base de donn&#xE9;es... 28052 fichiers et r&#xE9;pertoires d&#xE9;j&#xE0; install&#xE9;s.)
  1517. Pr&#xE9;paration du d&#xE9;paquetage de .../php7.0-sqlite3_7.0.27-0+deb9u1_amd64.deb ...
  1518. D&#xE9;paquetage de php7.0-sqlite3 (7.0.27-0+deb9u1) ...
  1519. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour libapache2-mod-php7.0 (7.0.27-0+deb9u1) ...
  1520. Param&#xE9;trage de php7.0-sqlite3 (7.0.27-0+deb9u1) ...
  1521. Creating config file /etc/php/7.0/mods-available/sqlite3.ini with new version
  1522. Creating config file /etc/php/7.0/mods-available/pdo_sqlite.ini with new version
  1523. Traitement des actions diff&#xE9;r&#xE9;es (&#xAB; triggers &#xBB;) pour libapache2-mod-php7.0 (7.0.27-0+deb9u1) ...
  1524. root@adara:/home/www/rainloop# service apache2 restart
  1525. root@adara:/home/www/rainloop#</code></pre>
  1526. <p>Ajouter https avec:</p>
  1527. <pre><code>certbot --apache</code></pre><p>et suivre les instructions.</p>
  1528. <p>Relancez apache.</p>
  1529. </article></div><div style="background-color: #b4b2b2;width: 50px;height:50px;line-height: 50px;text-align: center;position: fixed;bottom: 10px;right: 10px;padding-top:5px;" onclick="document.documentElement.scrollTop = document.body.scrollTop =0;">
  1530. <svg t="1533629773982" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1035" xlink="http://www.w3.org/1999/xlink" width="40" height="40"><defs><style type="text/css">@font-face { font-family: uc-nexus-iconfont; src: url("chrome-extension://pogijhnlcfmcppgimcaccdkmbedjkmhi/res/font_9qmmi8b8jsxxbt9.woff") format("woff"), url("chrome-extension://pogijhnlcfmcppgimcaccdkmbedjkmhi/res/font_9qmmi8b8jsxxbt9.ttf") format("truetype"); }
  1531. </style></defs><path d="M536.255427 195.182354c-7.804756-7.804756-17.966187-11.615549-28.311813-11.615549-9.43693 0-18.874883 3.449565-26.496467 10.163477-2.360767 1.452071-4.356214 3.267417-6.352685 5.262864L218.47792 455.611735c-15.607466 15.60542-15.607466 40.834011 0 56.43943 15.607466 15.607466 41.558511 15.607466 57.167001 0l193.46013-192.733583 0 600.526219c0 22.1423 17.787108 39.927361 39.927361 39.927361 22.140253 0 39.927361-17.785062 39.927361-39.927361L548.959773 319.317583 737.15704 508.422522c15.607466 15.607466 40.469714 15.607466 56.078203 0 15.607466-15.607466 15.425318-40.834011-0.182149-56.441477L536.255427 195.182354 536.255427 195.182354z" p-id="1036" fill="#333"/><path d="M101.784174 143.097092l816.674071 0c22.140253 0 39.925315-17.785062 39.925315-39.927361 0-22.140253-17.784038-39.925315-39.925315-39.925315L101.784174 63.244416c-22.140253 0-39.927361 17.785062-39.927361 39.925315C61.856813 125.31203 79.643921 143.097092 101.784174 143.097092L101.784174 143.097092z" p-id="1037" fill="#333"/></svg>
  1532. </div>
  1533. </body></html>