diff --git a/pr-preview/pr-6948/api.css b/pr-preview/pr-6948/api.css new file mode 100644 index 000000000..789afa4d1 --- /dev/null +++ b/pr-preview/pr-6948/api.css @@ -0,0 +1,2 @@ +body{font-size:18px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@font-face{font-family:"Proxima Nova";src:url("fonts/proxima-nova.otf") format("opentype");font-weight:300}@font-face{font-family:'Proxima Nova';src:url("fonts/proxima-nova-medium.otf") format("opentype");font-weight:400}@font-face{font-family:'Proxima Nova';src:url("fonts/proxima-nova-semibold.otf") format("opentype");font-weight:500 600}@font-face{font-family:'Proxima Nova';src:url("fonts/proxima-nova-bold.otf") format("opentype");font-weight:700}@font-face{font-family:'icomoon-v2';src:url("fonts/icomoon-v2.eot?itn2ph");src:url("fonts/icomoon-v2.eot?itn2ph#iefix") format("embedded-opentype"),url("fonts/icomoon-v2.ttf?itn2ph") format("truetype"),url("fonts/icomoon-v2.woff?itn2ph") format("woff"),url("fonts/icomoon-v2.svg?itn2ph#icomoon-v2") format("svg");font-weight:normal;font-style:normal;font-display:block}[class^="icon-"],[class*=" icon-"]{font-family:'icomoon-v2' !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-bar-chart:before{content:"\e913"}.icon-influx-logo:before{content:"\e900"}.icon-influx-logotype:before{content:"\e901"}.icon-alert-triangle:before{content:"\e902"}.icon-arrow-down:before{content:"\e903"}.icon-moon1:before{content:"\e904"}.icon-search:before{content:"\e905"}.icon-sun1:before{content:"\e906"}.icon-arrow-down-circle:before{content:"\e907"}.icon-arrow-down-left:before{content:"\e908"}.icon-arrow-down-right:before{content:"\e909"}.icon-arrow-left:before{content:"\e90a"}.icon-arrow-left-circle:before{content:"\e90b"}.icon-arrow-right:before{content:"\e90c"}.icon-arrow-right-circle:before{content:"\e90d"}.icon-arrow-up:before{content:"\e90e"}.icon-arrow-up-circle:before{content:"\e90f"}.icon-arrow-up-left:before{content:"\e910"}.icon-arrow-up-right:before{content:"\e911"}.icon-check:before{content:"\e912"}.icon-heart1:before{content:"\e914"}.icon-settings:before{content:"\e915"}.icon-zoom-in:before{content:"\e916"}.icon-zoom-out:before{content:"\e917"}.icon-chevron-down:before{content:"\e918"}.icon-chevron-left:before{content:"\e919"}.icon-chevron-right:before{content:"\e91a"}.icon-chevron-up:before{content:"\e91b"}.icon-menu:before{content:"\e91c"}.icon-download:before{content:"\e91d"}.icon-minus:before{content:"\e91e"}.icon-plus:before{content:"\e91f"}.icon-add-cell:before{content:"\e920"}.icon-alert:before{content:"\e921"}.icon-calendar:before{content:"\e922"}.icon-checkmark:before{content:"\e923"}.icon-cog-thick:before{content:"\e924"}.icon-dashboards:before{content:"\e925"}.icon-data-explorer:before{content:"\e926"}.icon-ui-download:before{content:"\e927"}.icon-duplicate:before{content:"\e928"}.icon-export:before{content:"\e929"}.icon-fullscreen:before{content:"\e92a"}.icon-influx-icon:before{content:"\e92b"}.icon-note:before{content:"\e92c"}.icon-organizations:before{content:"\e92d"}.icon-pause:before{content:"\e92e"}.icon-pencil:before{content:"\e92f"}.icon-play:before{content:"\e930"}.icon-ui-plus:before{content:"\e931"}.icon-refresh:before{content:"\e932"}.icon-remove:before{content:"\e933"}.icon-alert-circle:before{content:"\e934"}.icon-crown:before{content:"\e935"}.icon-trash:before{content:"\e936"}.icon-triangle:before{content:"\e937"}.icon-x:before{content:"\e938"}.icon-wrench-2:before{content:"\e939"}.icon-chat:before{content:"\e93a"}.icon-bell:before{content:"\e93b"}.icon-disks-nav:before{content:"\e93c"}.icon-wrench-nav:before{content:"\e93d"}.icon-user:before{content:"\e93e"}.icon-cloud:before{content:"\e93f"}.icon-users-trio:before{content:"\e940"}.icon-nav-chat:before{content:"\e941"}.icon-map2:before{content:"\e94c"}.icon-eye-closed:before{content:"\e956"}.icon-eye-open:before{content:"\e957"}.icon-book-pencil:before{content:"\e965"}.icon-heart:before{content:"\e9da"}.icon-loop2:before{content:"\ea2e"}.icon-github:before{content:"\eab0"}.icon-tux:before{content:"\eabd"}.icon-appleinc:before{content:"\eabe"}.icon-windows8:before{content:"\eac2"}@font-face{font-family:'icomoon-v3';src:url("fonts/icomoon-v3.eot") format("embedded-opentype");src:url("fonts/icomoon-v3.eot") format("embedded-opentype"),url("fonts/icomoon-v3.woff2") format("woff2"),url("fonts/icomoon-v3.ttf") format("truetype"),url("fonts/icomoon-v3.woff") format("woff"),url("fonts/icomoon-v3.svg") format("svg");font-weight:normal;font-style:normal}.cf-icon{font-family:'icomoon-v3';font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.cf-icon.add-cell-new:before{content:'\e976'}.cf-icon.alert-triangle-new:before{content:'\e977'}.cf-icon.annotate-new:before{content:'\e978'}.cf-icon.arrow-down-new:before{content:'\e979'}.cf-icon.arrow-left-new:before{content:'\e97a'}.cf-icon.arrow-right-new:before{content:'\e97b'}.cf-icon.arrow-up-new:before{content:'\e97c'}.cf-icon.bar-chart-new:before{content:'\e97d'}.cf-icon.build-outline-new:before{content:'\e97e'}.cf-icon.caret-down-new:before{content:'\e97f'}.cf-icon.caret-left-new:before{content:'\e980'}.cf-icon.caret-right-new:before{content:'\e981'}.cf-icon.caret-up-new:before{content:'\e982'}.cf-icon.checkmark-new:before{content:'\e983'}.cf-icon.clipboard-new:before{content:'\e984'}.cf-icon.clock-new:before{content:'\e985'}.cf-icon.cog-outline-new:before{content:'\e986'}.cf-icon.cog-solid-new:before{content:'\e987'}.cf-icon.crown-solid-new:before{content:'\e988'}.cf-icon.dark-mode-new:before{content:'\e989'}.cf-icon.download-new:before{content:'\e98a'}.cf-icon.duplicate-new:before{content:'\e98b'}.cf-icon.expand-new:before{content:'\e98c'}.cf-icon.export-new:before{content:'\e98d'}.cf-icon.eye-open-new:before{content:'\e98e'}.cf-icon.graph-line-new:before{content:'\e98f'}.cf-icon.handle-new:before{content:'\e990'}.cf-icon.home-outline-new:before{content:'\e991'}.cf-icon.info-new:before{content:'\e992'}.cf-icon.ingest-new:before{content:'\e993'}.cf-icon.light-mode-new:before{content:'\e994'}.cf-icon.lock-outline-new:before{content:'\e995'}.cf-icon.log-out-new:before{content:'\e996'}.cf-icon.pin-new:before{content:'\e997'}.cf-icon.plus-new:before{content:'\e998'}.cf-icon.question-mark-new:before{content:'\e999'}.cf-icon.refresh-new:before{content:'\e99a'}.cf-icon.remove-new:before{content:'\e99b'}.cf-icon.search-new:before{content:'\e99c'}.cf-icon.sidebar-close-new:before{content:'\e99d'}.cf-icon.sidebar-open-new:before{content:'\e99e'}.cf-icon.stop-new:before{content:'\e99f'}.cf-icon.switch-new:before{content:'\e9a0'}.cf-icon.text-new:before{content:'\e9a1'}.cf-icon.trash-new:before{content:'\e9a2'}.cf-icon.user-outline-new:before{content:'\e9a3'}.cf-icon.more:before{content:'\e974'}.cf-icon.drag-to-expand-white:before{content:'\e901';color:#fff}.cf-icon.drag-to-expand:before{content:'\e902'}.cf-icon.shield-solid:before{content:'\e903'}.cf-icon.lock:before{content:'\e900'}.cf-icon.heart-solid:before{content:'\e96f'}.cf-icon.bucket-outline:before{content:'\e961'}.cf-icon.chat:before{content:'\e933'}.cf-icon.currency-eur:before{content:'\e968'}.cf-icon.currency-gbp:before{content:'\e969'}.cf-icon.currency-usd:before{content:'\e96a'}.cf-icon.moon:before{content:'\e95c'}.cf-icon.share-solid:before{content:'\e96e'}.cf-icon.shield:before{content:'\e96b'}.cf-icon.sun:before{content:'\e95d'}.cf-icon.upgrade:before{content:'\e95f'}.cf-icon.merge:before{content:'\e975'}.cf-icon.add-cell:before{content:'\e925'}.cf-icon.alert-triangle:before{content:'\e926'}.cf-icon.alerts:before{content:'\e921'}.cf-icon.annotate:before{content:'\e953'}.cf-icon.annotate-plus:before{content:'\e952'}.cf-icon.authzero:before{content:'\e951'}.cf-icon.bar-chart:before{content:'\e913'}.cf-icon.bell:before{content:'\e934'}.cf-icon.bell-solid:before{content:'\e937'}.cf-icon.brush:before{content:'\e93d'}.cf-icon.capacitor2:before{content:'\e923'}.cf-icon.caret-down:before{content:'\e904'}.cf-icon.caret-left:before{content:'\e905'}.cf-icon.caret-right:before{content:'\e906'}.cf-icon.caret-up:before{content:'\e907'}.cf-icon.checkmark:before{content:'\e918'}.cf-icon.circle:before{content:'\e940'}.cf-icon.circle-thick:before{content:'\e90e'}.cf-icon.clock:before{content:'\e920'}.cf-icon.cog-outline:before{content:'\e91c'}.cf-icon.cog-thick:before{content:'\e90c'}.cf-icon.collapse:before{content:'\e91b'}.cf-icon.crown-outline:before{content:'\e908'}.cf-icon.crown2:before{content:'\e94b'}.cf-icon.cube:before{content:'\e90b'}.cf-icon.cubo:before{content:'\e95e'}.cf-icon.cubo-uniform:before{content:'\e93c'}.cf-icon.dash-f:before{content:'\e927'}.cf-icon.dash-h:before{content:'\e929'}.cf-icon.dash-j:before{content:'\e92b'}.cf-icon.disks:before{content:'\e950'}.cf-icon.download:before{content:'\e91d'}.cf-icon.duplicate:before{content:'\e917'}.cf-icon.erlenmeyer:before{content:'\e958'}.cf-icon.expand-a:before{content:'\e944'}.cf-icon.expand-b:before{content:'\e942'}.cf-icon.export:before{content:'\e90f'}.cf-icon.eye:before{content:'\e91f'}.cf-icon.eye-closed:before{content:'\e956'}.cf-icon.eye-open:before{content:'\e957'}.cf-icon.fn:before{content:'\e960'}.cf-icon.github:before{content:'\e928'}.cf-icon.google:before{content:'\e92a'}.cf-icon.group:before{content:'\e909'}.cf-icon.heroku:before{content:'\e947'}.cf-icon.heroku-simple:before{content:'\e948'}.cf-icon.import:before{content:'\e910'}.cf-icon.link:before{content:'\e92e'}.cf-icon.maximize:before{content:'\e955'}.cf-icon.minimize:before{content:'\e954'}.cf-icon.nav-chat:before{content:'\e941'}.cf-icon.oauth:before{content:'\e94f'}.cf-icon.octagon:before{content:'\e92d'}.cf-icon.okta:before{content:'\e912'}.cf-icon.pause:before{content:'\e94a'}.cf-icon.pencil:before{content:'\e92f'}.cf-icon.play:before{content:'\e914'}.cf-icon.plus:before{content:'\e90a'}.cf-icon.plus-skinny:before{content:'\e922'}.cf-icon.polaroid:before{content:'\e95b'}.cf-icon.pulse-c:before{content:'\e936'}.cf-icon.redo:before{content:'\e959'}.cf-icon.refresh:before{content:'\e949'}.cf-icon.remove:before{content:'\e90d'}.cf-icon.search:before{content:'\e916'}.cf-icon.server2:before{content:'\e94c'}.cf-icon.shuffle:before{content:'\e94e'}.cf-icon.square:before{content:'\e93e'}.cf-icon.square-check:before{content:'\e943'}.cf-icon.star:before{content:'\e930'}.cf-icon.stop:before{content:'\e931'}.cf-icon.text-block:before{content:'\e911'}.cf-icon.trash:before{content:'\e915'}.cf-icon.triangle:before{content:'\e92c'}.cf-icon.undo:before{content:'\e95a'}.cf-icon.user:before{content:'\e919'}.cf-icon.user-add:before{content:'\e91e'}.cf-icon.user-outline:before{content:'\e932'}.cf-icon.user-remove:before{content:'\e939'}.cf-icon.users-trio:before{content:'\e945'}.cf-icon.wand:before{content:'\e94d'}.cf-icon.wood:before{content:'\e970'}.cf-icon.wrench:before{content:'\e971'}.cf-icon.zap:before{content:'\e973'}.cf-icon.bell-ringing:before{content:'\e935'}.cf-icon.calendar:before{content:'\e938'}.cf-icon.cloud:before{content:'\e93f'}.cf-icon.cubo-nav:before{content:'\e91a'}.cf-icon.dashboards:before{content:'\e93a'}.cf-icon.disks-nav:before{content:'\e946'}.cf-icon.graphline-2:before{content:'\e924'}.cf-icon.users-duo:before{content:'\e93b'}.cf-icon.wrench-nav:before{content:'\e972'}.cf-icon.book:before{content:'\e966'}.cf-icon.book-code:before{content:'\e967'}.cf-icon.book-pencil:before{content:'\e965'}.cf-icon.bucket-solid:before{content:'\e962'}.cf-icon.funnel-outline:before{content:'\e963'}.cf-icon.funnel-solid:before{content:'\e964'}.cf-icon.layers:before{content:'\e96c'}.cf-icon.share:before{content:'\e96d'}@font-face{font-family:'icomoon-v4';src:url("fonts/icomoon-v4.eot") format("embedded-opentype");src:url("fonts/icomoon-v4.eot") format("embedded-opentype"),url("fonts/icomoon-v4.woff2") format("woff2"),url("fonts/icomoon-v4.ttf") format("truetype"),url("fonts/icomoon-v4.woff") format("woff"),url("fonts/icomoon-v4.svg") format("svg");font-weight:normal;font-style:normal}.cf-icon{font-family:'icomoon-v4';font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.cf-icon.FolderOpen:before{content:'\e956'}.cf-icon.Bill:before{content:'\e954'}.cf-icon.Logout:before{content:'\e950'}.cf-icon.PieChart:before{content:'\e957'}.cf-icon.CurrencyDollar:before{content:'\e952'}.cf-icon.Sync:before{content:'\e955'}.cf-icon.Subtract:before{content:'\e953'}.cf-icon.Timer:before{content:'\e94f'}.cf-icon.CaretOutlineRight:before{content:'\e94b'}.cf-icon.CollapseLeft:before{content:'\e94c'}.cf-icon.CollapseRight:before{content:'\e94d'}.cf-icon.DoubleCaretVertical:before{content:'\e94e'}.cf-icon.QuestionMark_Outline:before{content:'\e94a'}.cf-icon.Info_New:before{content:'\e949'}.cf-icon.SidebarClose:before{content:'\e947'}.cf-icon.SidebarOpen:before{content:'\e948'}.cf-icon.CaretDown_New:before{content:'\e912'}.cf-icon.CaretLeft_New:before{content:'\e913'}.cf-icon.CaretRight_New:before{content:'\e914'}.cf-icon.CaretUp_New:before{content:'\e915'}.cf-icon.Play:before{content:'\e900'}.cf-icon.Pause:before{content:'\e901'}.cf-icon.EyeOpen:before{content:'\e902'}.cf-icon.Flask:before{content:'\e903'}.cf-icon.AddCell_New:before{content:'\e904'}.cf-icon.QuestionMark:before{content:'\e905'}.cf-icon.AlertTriangle:before{content:'\e906'}.cf-icon.Annotate_New:before{content:'\e907'}.cf-icon.ArrowDown_New:before{content:'\e908'}.cf-icon.ArrowLeft_New:before{content:'\e909'}.cf-icon.ArrowRight_New:before{content:'\e90a'}.cf-icon.BarChart_New:before{content:'\e90b'}.cf-icon.Bell:before{content:'\e90c'}.cf-icon.BookCode:before{content:'\e90d'}.cf-icon.BookOutline:before{content:'\e90e'}.cf-icon.Braces:before{content:'\e90f'}.cf-icon.BucketSolid:before{content:'\e910'}.cf-icon.Calendar:before{content:'\e911'}.cf-icon.Chat:before{content:'\e916'}.cf-icon.Checkmark_New:before{content:'\e917'}.cf-icon.CircleThick:before{content:'\e918'}.cf-icon.Clipboard_New:before{content:'\e919'}.cf-icon.Clock_New:before{content:'\e91a'}.cf-icon.Cloud:before{content:'\e91b'}.cf-icon.CogOutline_New:before{content:'\e91c'}.cf-icon.CogSolid_New:before{content:'\e91d'}.cf-icon.Coppercoin:before{content:'\e91e'}.cf-icon.CrownSolid_New:before{content:'\e91f'}.cf-icon.Cube:before{content:'\e920'}.cf-icon.CuboSolid:before{content:'\e921'}.cf-icon.Cubouniform:before{content:'\e922'}.cf-icon.Darkmode_New:before{content:'\e923'}.cf-icon.DashH:before{content:'\e924'}.cf-icon.Download_New:before{content:'\e925'}.cf-icon.ExpandB:before{content:'\e926'}.cf-icon.Export_New:before{content:'\e927'}.cf-icon.EyeClosed:before{content:'\e928'}.cf-icon.FunnelSolid:before{content:'\e929'}.cf-icon.GraphLine_New:before{content:'\e92a'}.cf-icon.Group:before{content:'\e92b'}.cf-icon.History:before{content:'\e92c'}.cf-icon.Duplicate_New:before{content:'\e92d'}.cf-icon.Install:before{content:'\e92e'}.cf-icon.Layers:before{content:'\e92f'}.cf-icon.Lightmode_New:before{content:'\e930'}.cf-icon.Link:before{content:'\e931'}.cf-icon.Lock:before{content:'\e932'}.cf-icon.More:before{content:'\e933'}.cf-icon.Pencil:before{content:'\e934'}.cf-icon.Plus_New:before{content:'\e935'}.cf-icon.Refresh_New:before{content:'\e936'}.cf-icon.Remove_New:before{content:'\e937'}.cf-icon.Save:before{content:'\e938'}.cf-icon.SaveOutline:before{content:'\e951'}.cf-icon.Search_New:before{content:'\e939'}.cf-icon.Share:before{content:'\e93a'}.cf-icon.Shield:before{content:'\e93b'}.cf-icon.Star:before{content:'\e93c'}.cf-icon.StarSmile:before{content:'\e93d'}.cf-icon.Subscribe:before{content:'\e93e'}.cf-icon.Switch_New:before{content:'\e93f'}.cf-icon.Text_New:before{content:'\e940'}.cf-icon.Trash_New:before{content:'\e941'}.cf-icon.Undo:before{content:'\e942'}.cf-icon.Upload_New:before{content:'\e943'}.cf-icon.Upload_Outline:before{content:'\e944'}.cf-icon.User:before{content:'\e945'}.cf-icon.Zap:before{content:'\e946'}@font-face{font-family:'alert-icons';src:url("fonts/alert-icons.eot?d0dznh");src:url("fonts/alert-icons.eot?d0dznh#iefix") format("embedded-opentype"),url("fonts/alert-icons.ttf?d0dznh") format("truetype"),url("fonts/alert-icons.woff?d0dznh") format("woff"),url("fonts/alert-icons.svg?d0dznh#icomoon") format("svg");font-weight:normal;font-style:normal;font-display:block}[class^="alert-icon-"],[class*=" alert-icon-"]{font-family:'alert-icons' !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.alert-icon-caution:before{content:"\43"}.alert-icon-important:before{content:"\49"}.alert-icon-note:before{content:"\4e"}.alert-icon-tip:before{content:"\54"}.alert-icon-warning:before{content:"\57"}.v3{font-family:'icomoon-v3'}.v4{font-family:'icomoon-v4'}#loading{position:fixed;width:100vw;height:100vh;z-index:1000;background-color:#fff;opacity:1;transition:opacity .5s}@keyframes spinner{to{transform:rotate(360deg)}}.spinner:before{content:'';box-sizing:border-box;position:absolute;top:50%;left:50%;width:50px;height:50px;margin-top:-25px;margin-left:-25px;border-radius:50%;border:3px solid #E7E8EB;border-top-color:#513CC6;animation:spinner .6s linear infinite}#influx-header{font-family:"Proxima Nova",sans-serif;padding:10px;display:flex;align-items:center;justify-content:space-between;background-color:#202028}#influx-header a{text-decoration:none}#influx-header a.back{color:#fff;transition:color .2s}#influx-header a.back:hover{color:#00A3FF}#influx-header a.back:before{content:"\e919";font-family:'icomoon-v2';margin-right:.65rem}#influx-header a.btn{padding:.5rem .75rem .5rem .65rem;font-size:.85rem;font-weight:500;color:#D4D7DD;background:#383846;border-radius:4.5px;transition:all .2s}#influx-header a.btn:before{content:"\e934";display:inline-block;font-size:.95rem;margin-right:.5rem;font-family:'icomoon-v2'}#influx-header a.btn:hover{color:#fff;background:#00A3FF}@media (max-width: 600px){#influx-header span.version{display:none}}.cjtbAK h1,.cjtbAK h2,.cjtbAK h3,.cjtbAK h4,.cjtbAK h5,.cjtbAK h6,.cjtbAK p,.cjtbAK li,.cjtbAK th,.cjtbAK td{font-family:"Proxima Nova",sans-serif !important}#redoc h1,#redoc h2,#redoc h3{font-weight:500 !important}.dluJDj{padding:20px 0}.dTJWQH{color:#545667;font-size:2rem}.jIdpVJ{background:#2AA3FF;color:#fff;border:none;border-radius:3px;font-family:"Proxima Nova",sans-serif;font-size:.85rem;font-weight:500;transition:background-color .2s}.jIdpVJ:hover{background-color:#00A3FF}.WxWXp{color:#545667;font-size:1.75rem}.ioYTqA,.bxcHYI,.hoUoen{color:#545667}.espozG{color:#676978}.bnFPhO a{color:#2AA3FF}.bnFPhO a:visited{color:#2AA3FF}.redoc-json{font-family:"IBM Plex Mono",monospace !important}.flfxUM code,.gDsWLk code,.kTVySD{font-family:"IBM Plex Mono",monospace !important;color:#736ECD;background:#EDEDFF;border-color:#EDEDFF}.jsTAxL{color:#F95F53}.hLVzSF,.fDvFMp{background-color:rgba(103,215,78,0.2);color:#006F49}.byLrBg{background-color:rgba(249,95,83,0.1);color:#F95F53}.gZdDsM{background-color:#FAFAFC}.gpbcFk:hover,.sc-eTuwsz.active{background-color:#EEEFF2}.SmuWE,.gcUzvG,.bbViyS,.sc-hrWEMg label{font-family:"Proxima Nova",sans-serif !important}.fyUykq{font-weight:500}.cFwMcp.post{background-color:#066FC5}.cFwMcp.get{background-color:#34BB55}.cFwMcp.put{background-color:#9394FF}.cFwMcp.patch{background-color:#FFD255;color:rgba(56,56,70,0.75)}.cFwMcp.delete{background-color:#F95F53}.gcUzvG,.iNzLCk:hover{color:#BF2FE5}.dtUibw,.fLUKgj{background-color:#202028}.dtUibw h3,.dtUibw h4,.dtUibw h5,.dtUibw h6,.fLUKgj h3,.fLUKgj h4,.fLUKgj h5,.fLUKgj h6{font-family:"Proxima Nova",sans-serif !important;font-weight:500 !important}.irpqyy>.react-tabs__tab-panel{background-color:#0F0E15}.dHLKeu,.fVaxnA{padding-left:10px;background-color:#0F0E15}.irpqyy>ul>li{background-color:#0F0E15;border-radius:3px}.irpqyy>ul>li.react-tabs__tab--selected{color:#513CC6}.irpqyy>ul>li.tab-error{color:#DC4E58}.irpqyy>ul>li.tab-success{color:#009F5F}.bNYCAJ,.jBjYbV,.hOczRB,.fRsrDc,.hPskZd{font-family:"Proxima Nova",sans-serif;font-weight:500;letter-spacing:.04em;border-radius:3px}.bNYCAJ{background-color:#066FC5}.jBjYbV{background-color:#009F5F}.hOczRB{background-color:#9394FF}.fRsrDc{background-color:#FFD255;color:#383846}.hPskZd{background-color:#F95F53}.gzAoUb{background-color:#202028;font-family:"Proxima Nova",sans-serif}.iENVAs{font-family:"IBM Plex Mono",monospace}.dpMbau{font-family:"Proxima Nova",sans-serif}.fCJmC{font-family:"Proxima Nova",sans-serif}.fCJmC span{border-radius:3px}.kZHJcC{font-family:"IBM Plex Mono",monospace}.jCgylq .token.string{color:#67D74E}.jCgylq .token.string+a{color:#00A3FF}.jCgylq .token.boolean{color:#f955b0} +/*# sourceMappingURL=data:application/json;base64,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LHdDQUF3QyxxQ0FBcUMsQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsUUFBUSx3QkFBd0IsQ0FBQyxRQUFRLHdCQUF3QixDQUFDLFFBQVEsd0JBQXdCLENBQUMsUUFBUSx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsUUFBUSx3QkFBd0IsQ0FBQyxRQUFRLHdCQUF3QixDQUFDLHFDQUFxQyxDQUFDLFFBQVEscUNBQXFDLENBQUMsUUFBUSxxQ0FBcUMsQ0FBQyxPQUFPLHFDQUFxQyxDQUFDLFlBQVksaUJBQWlCLENBQUMsUUFBUSxxQ0FBcUMsQ0FBQyxzQkFBc0IsYUFBYSxDQUFDLHdCQUF3QixhQUFhLENBQUMsdUJBQXVCLGFBQWEiLCJmaWxlIjoic3RkaW4iLCJzb3VyY2VzQ29udGVudCI6WyJib2R5e2ZvbnQtc2l6ZToxOHB4Oy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlfUBmb250LWZhY2V7Zm9udC1mYW1pbHk6XCJQcm94aW1hIE5vdmFcIjtzcmM6dXJsKFwiZm9udHMvcHJveGltYS1ub3ZhLm90ZlwiKSBmb3JtYXQoXCJvcGVudHlwZVwiKTtmb250LXdlaWdodDozMDB9QGZvbnQtZmFjZXtmb250LWZhbWlseTonUHJveGltYSBOb3ZhJztzcmM6dXJsKFwiZm9udHMvcHJveGltYS1ub3ZhLW1lZGl1bS5vdGZcIikgZm9ybWF0KFwib3BlbnR5cGVcIik7Zm9udC13ZWlnaHQ6NDAwfUBmb250LWZhY2V7Zm9udC1mYW1pbHk6J1Byb3hpbWEgTm92YSc7c3JjOnVybChcImZvbnRzL3Byb3hpbWEtbm92YS1zZW1pYm9sZC5vdGZcIikgZm9ybWF0KFwib3BlbnR5cGVcIik7Zm9udC13ZWlnaHQ6NTAwIDYwMH1AZm9udC1mYWNle2ZvbnQtZmFtaWx5OidQcm94aW1hIE5vdmEnO3NyYzp1cmwoXCJmb250cy9wcm94aW1hLW5vdmEtYm9sZC5vdGZcIikgZm9ybWF0KFwib3BlbnR5cGVcIik7Zm9udC13ZWlnaHQ6NzAwfUBmb250LWZhY2V7Zm9udC1mYW1pbHk6J2ljb21vb24tdjInO3NyYzp1cmwoXCJmb250cy9pY29tb29uLXYyLmVvdD9pdG4ycGhcIik7c3JjOnVybChcImZvbnRzL2ljb21vb24tdjIuZW90P2l0bjJwaCNpZWZpeFwiKSBmb3JtYXQoXCJlbWJlZGRlZC1vcGVudHlwZVwiKSx1cmwoXCJmb250cy9pY29tb29uLXYyLnR0Zj9pdG4ycGhcIikgZm9ybWF0KFwidHJ1ZXR5cGVcIiksdXJsKFwiZm9udHMvaWNvbW9vbi12Mi53b2ZmP2l0bjJwaFwiKSBmb3JtYXQoXCJ3b2ZmXCIpLHVybChcImZvbnRzL2ljb21vb24tdjIuc3ZnP2l0bjJwaCNpY29tb29uLXYyXCIpIGZvcm1hdChcInN2Z1wiKTtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC1kaXNwbGF5OmJsb2NrfVtjbGFzc149XCJpY29uLVwiXSxbY2xhc3MqPVwiIGljb24tXCJde2ZvbnQtZmFtaWx5OidpY29tb29uLXYyJyAhaW1wb3J0YW50O3NwZWFrOm5ldmVyO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO3RleHQtdHJhbnNmb3JtOm5vbmU7bGluZS1oZWlnaHQ6MTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZX0uaWNvbi1iYXItY2hhcnQ6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MTNcIn0uaWNvbi1pbmZsdXgtbG9nbzpiZWZvcmV7Y29udGVudDpcIlxcZTkwMFwifS5pY29uLWluZmx1eC1sb2dvdHlwZTpiZWZvcmV7Y29udGVudDpcIlxcZTkwMVwifS5pY29uLWFsZXJ0LXRyaWFuZ2xlOmJlZm9yZXtjb250ZW50OlwiXFxlOTAyXCJ9Lmljb24tYXJyb3ctZG93bjpiZWZvcmV7Y29udGVudDpcIlxcZTkwM1wifS5pY29uLW1vb24xOmJlZm9yZXtjb250ZW50OlwiXFxlOTA0XCJ9Lmljb24tc2VhcmNoOmJlZm9yZXtjb250ZW50OlwiXFxlOTA1XCJ9Lmljb24tc3VuMTpiZWZvcmV7Y29udGVudDpcIlxcZTkwNlwifS5pY29uLWFycm93LWRvd24tY2lyY2xlOmJlZm9yZXtjb250ZW50OlwiXFxlOTA3XCJ9Lmljb24tYXJyb3ctZG93bi1sZWZ0OmJlZm9yZXtjb250ZW50OlwiXFxlOTA4XCJ9Lmljb24tYXJyb3ctZG93bi1yaWdodDpiZWZvcmV7Y29udGVudDpcIlxcZTkwOVwifS5pY29uLWFycm93LWxlZnQ6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MGFcIn0uaWNvbi1hcnJvdy1sZWZ0LWNpcmNsZTpiZWZvcmV7Y29udGVudDpcIlxcZTkwYlwifS5pY29uLWFycm93LXJpZ2h0OmJlZm9yZXtjb250ZW50OlwiXFxlOTBjXCJ9Lmljb24tYXJyb3ctcmlnaHQtY2lyY2xlOmJlZm9yZXtjb250ZW50OlwiXFxlOTBkXCJ9Lmljb24tYXJyb3ctdXA6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MGVcIn0uaWNvbi1hcnJvdy11cC1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MGZcIn0uaWNvbi1hcnJvdy11cC1sZWZ0OmJlZm9yZXtjb250ZW50OlwiXFxlOTEwXCJ9Lmljb24tYXJyb3ctdXAtcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MTFcIn0uaWNvbi1jaGVjazpiZWZvcmV7Y29udGVudDpcIlxcZTkxMlwifS5pY29uLWhlYXJ0MTpiZWZvcmV7Y29udGVudDpcIlxcZTkxNFwifS5pY29uLXNldHRpbmdzOmJlZm9yZXtjb250ZW50OlwiXFxlOTE1XCJ9Lmljb24tem9vbS1pbjpiZWZvcmV7Y29udGVudDpcIlxcZTkxNlwifS5pY29uLXpvb20tb3V0OmJlZm9yZXtjb250ZW50OlwiXFxlOTE3XCJ9Lmljb24tY2hldnJvbi1kb3duOmJlZm9yZXtjb250ZW50OlwiXFxlOTE4XCJ9Lmljb24tY2hldnJvbi1sZWZ0OmJlZm9yZXtjb250ZW50OlwiXFxlOTE5XCJ9Lmljb24tY2hldnJvbi1yaWdodDpiZWZvcmV7Y29udGVudDpcIlxcZTkxYVwifS5pY29uLWNoZXZyb24tdXA6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MWJcIn0uaWNvbi1tZW51OmJlZm9yZXtjb250ZW50OlwiXFxlOTFjXCJ9Lmljb24tZG93bmxvYWQ6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MWRcIn0uaWNvbi1taW51czpiZWZvcmV7Y29udGVudDpcIlxcZTkxZVwifS5pY29uLXBsdXM6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MWZcIn0uaWNvbi1hZGQtY2VsbDpiZWZvcmV7Y29udGVudDpcIlxcZTkyMFwifS5pY29uLWFsZXJ0OmJlZm9yZXtjb250ZW50OlwiXFxlOTIxXCJ9Lmljb24tY2FsZW5kYXI6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MjJcIn0uaWNvbi1jaGVja21hcms6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MjNcIn0uaWNvbi1jb2ctdGhpY2s6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MjRcIn0uaWNvbi1kYXNoYm9hcmRzOmJlZm9yZXtjb250ZW50OlwiXFxlOTI1XCJ9Lmljb24tZGF0YS1leHBsb3JlcjpiZWZvcmV7Y29udGVudDpcIlxcZTkyNlwifS5pY29uLXVpLWRvd25sb2FkOmJlZm9yZXtjb250ZW50OlwiXFxlOTI3XCJ9Lmljb24tZHVwbGljYXRlOmJlZm9yZXtjb250ZW50OlwiXFxlOTI4XCJ9Lmljb24tZXhwb3J0OmJlZm9yZXtjb250ZW50OlwiXFxlOTI5XCJ9Lmljb24tZnVsbHNjcmVlbjpiZWZvcmV7Y29udGVudDpcIlxcZTkyYVwifS5pY29uLWluZmx1eC1pY29uOmJlZm9yZXtjb250ZW50OlwiXFxlOTJiXCJ9Lmljb24tbm90ZTpiZWZvcmV7Y29udGVudDpcIlxcZTkyY1wifS5pY29uLW9yZ2FuaXphdGlvbnM6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MmRcIn0uaWNvbi1wYXVzZTpiZWZvcmV7Y29udGVudDpcIlxcZTkyZVwifS5pY29uLXBlbmNpbDpiZWZvcmV7Y29udGVudDpcIlxcZTkyZlwifS5pY29uLXBsYXk6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MzBcIn0uaWNvbi11aS1wbHVzOmJlZm9yZXtjb250ZW50OlwiXFxlOTMxXCJ9Lmljb24tcmVmcmVzaDpiZWZvcmV7Y29udGVudDpcIlxcZTkzMlwifS5pY29uLXJlbW92ZTpiZWZvcmV7Y29udGVudDpcIlxcZTkzM1wifS5pY29uLWFsZXJ0LWNpcmNsZTpiZWZvcmV7Y29udGVudDpcIlxcZTkzNFwifS5pY29uLWNyb3duOmJlZm9yZXtjb250ZW50OlwiXFxlOTM1XCJ9Lmljb24tdHJhc2g6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MzZcIn0uaWNvbi10cmlhbmdsZTpiZWZvcmV7Y29udGVudDpcIlxcZTkzN1wifS5pY29uLXg6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MzhcIn0uaWNvbi13cmVuY2gtMjpiZWZvcmV7Y29udGVudDpcIlxcZTkzOVwifS5pY29uLWNoYXQ6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5M2FcIn0uaWNvbi1iZWxsOmJlZm9yZXtjb250ZW50OlwiXFxlOTNiXCJ9Lmljb24tZGlza3MtbmF2OmJlZm9yZXtjb250ZW50OlwiXFxlOTNjXCJ9Lmljb24td3JlbmNoLW5hdjpiZWZvcmV7Y29udGVudDpcIlxcZTkzZFwifS5pY29uLXVzZXI6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5M2VcIn0uaWNvbi1jbG91ZDpiZWZvcmV7Y29udGVudDpcIlxcZTkzZlwifS5pY29uLXVzZXJzLXRyaW86YmVmb3Jle2NvbnRlbnQ6XCJcXGU5NDBcIn0uaWNvbi1uYXYtY2hhdDpiZWZvcmV7Y29udGVudDpcIlxcZTk0MVwifS5pY29uLW1hcDI6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5NGNcIn0uaWNvbi1leWUtY2xvc2VkOmJlZm9yZXtjb250ZW50OlwiXFxlOTU2XCJ9Lmljb24tZXllLW9wZW46YmVmb3Jle2NvbnRlbnQ6XCJcXGU5NTdcIn0uaWNvbi1ib29rLXBlbmNpbDpiZWZvcmV7Y29udGVudDpcIlxcZTk2NVwifS5pY29uLWhlYXJ0OmJlZm9yZXtjb250ZW50OlwiXFxlOWRhXCJ9Lmljb24tbG9vcDI6YmVmb3Jle2NvbnRlbnQ6XCJcXGVhMmVcIn0uaWNvbi1naXRodWI6YmVmb3Jle2NvbnRlbnQ6XCJcXGVhYjBcIn0uaWNvbi10dXg6YmVmb3Jle2NvbnRlbnQ6XCJcXGVhYmRcIn0uaWNvbi1hcHBsZWluYzpiZWZvcmV7Y29udGVudDpcIlxcZWFiZVwifS5pY29uLXdpbmRvd3M4OmJlZm9yZXtjb250ZW50OlwiXFxlYWMyXCJ9QGZvbnQtZmFjZXtmb250LWZhbWlseTonaWNvbW9vbi12Myc7c3JjOnVybChcImZvbnRzL2ljb21vb24tdjMuZW90XCIpIGZvcm1hdChcImVtYmVkZGVkLW9wZW50eXBlXCIpO3NyYzp1cmwoXCJmb250cy9pY29tb29uLXYzLmVvdFwiKSBmb3JtYXQoXCJlbWJlZGRlZC1vcGVudHlwZVwiKSx1cmwoXCJmb250cy9pY29tb29uLXYzLndvZmYyXCIpIGZvcm1hdChcIndvZmYyXCIpLHVybChcImZvbnRzL2ljb21vb24tdjMudHRmXCIpIGZvcm1hdChcInRydWV0eXBlXCIpLHVybChcImZvbnRzL2ljb21vb24tdjMud29mZlwiKSBmb3JtYXQoXCJ3b2ZmXCIpLHVybChcImZvbnRzL2ljb21vb24tdjMuc3ZnXCIpIGZvcm1hdChcInN2Z1wiKTtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTpub3JtYWx9LmNmLWljb257Zm9udC1mYW1pbHk6J2ljb21vb24tdjMnO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO3RleHQtdHJhbnNmb3JtOm5vbmU7bGluZS1oZWlnaHQ6MTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZX0uY2YtaWNvbi5hZGQtY2VsbC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk3Nid9LmNmLWljb24uYWxlcnQtdHJpYW5nbGUtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5NzcnfS5jZi1pY29uLmFubm90YXRlLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTc4J30uY2YtaWNvbi5hcnJvdy1kb3duLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTc5J30uY2YtaWNvbi5hcnJvdy1sZWZ0LW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTdhJ30uY2YtaWNvbi5hcnJvdy1yaWdodC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk3Yid9LmNmLWljb24uYXJyb3ctdXAtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5N2MnfS5jZi1pY29uLmJhci1jaGFydC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk3ZCd9LmNmLWljb24uYnVpbGQtb3V0bGluZS1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk3ZSd9LmNmLWljb24uY2FyZXQtZG93bi1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk3Zid9LmNmLWljb24uY2FyZXQtbGVmdC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk4MCd9LmNmLWljb24uY2FyZXQtcmlnaHQtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5ODEnfS5jZi1pY29uLmNhcmV0LXVwLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTgyJ30uY2YtaWNvbi5jaGVja21hcmstbmV3OmJlZm9yZXtjb250ZW50OidcXGU5ODMnfS5jZi1pY29uLmNsaXBib2FyZC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk4NCd9LmNmLWljb24uY2xvY2stbmV3OmJlZm9yZXtjb250ZW50OidcXGU5ODUnfS5jZi1pY29uLmNvZy1vdXRsaW5lLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTg2J30uY2YtaWNvbi5jb2ctc29saWQtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5ODcnfS5jZi1pY29uLmNyb3duLXNvbGlkLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTg4J30uY2YtaWNvbi5kYXJrLW1vZGUtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5ODknfS5jZi1pY29uLmRvd25sb2FkLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOThhJ30uY2YtaWNvbi5kdXBsaWNhdGUtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OGInfS5jZi1pY29uLmV4cGFuZC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk4Yyd9LmNmLWljb24uZXhwb3J0LW5ldzpiZWZvcmV7Y29udGVudDonXFxlOThkJ30uY2YtaWNvbi5leWUtb3Blbi1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk4ZSd9LmNmLWljb24uZ3JhcGgtbGluZS1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk4Zid9LmNmLWljb24uaGFuZGxlLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTkwJ30uY2YtaWNvbi5ob21lLW91dGxpbmUtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OTEnfS5jZi1pY29uLmluZm8tbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OTInfS5jZi1pY29uLmluZ2VzdC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk5Myd9LmNmLWljb24ubGlnaHQtbW9kZS1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk5NCd9LmNmLWljb24ubG9jay1vdXRsaW5lLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTk1J30uY2YtaWNvbi5sb2ctb3V0LW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTk2J30uY2YtaWNvbi5waW4tbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OTcnfS5jZi1pY29uLnBsdXMtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OTgnfS5jZi1pY29uLnF1ZXN0aW9uLW1hcmstbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OTknfS5jZi1pY29uLnJlZnJlc2gtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OWEnfS5jZi1pY29uLnJlbW92ZS1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk5Yid9LmNmLWljb24uc2VhcmNoLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTljJ30uY2YtaWNvbi5zaWRlYmFyLWNsb3NlLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTlkJ30uY2YtaWNvbi5zaWRlYmFyLW9wZW4tbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OWUnfS5jZi1pY29uLnN0b3AtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OWYnfS5jZi1pY29uLnN3aXRjaC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTlhMCd9LmNmLWljb24udGV4dC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTlhMSd9LmNmLWljb24udHJhc2gtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5YTInfS5jZi1pY29uLnVzZXItb3V0bGluZS1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTlhMyd9LmNmLWljb24ubW9yZTpiZWZvcmV7Y29udGVudDonXFxlOTc0J30uY2YtaWNvbi5kcmFnLXRvLWV4cGFuZC13aGl0ZTpiZWZvcmV7Y29udGVudDonXFxlOTAxJztjb2xvcjojZmZmfS5jZi1pY29uLmRyYWctdG8tZXhwYW5kOmJlZm9yZXtjb250ZW50OidcXGU5MDInfS5jZi1pY29uLnNoaWVsZC1zb2xpZDpiZWZvcmV7Y29udGVudDonXFxlOTAzJ30uY2YtaWNvbi5sb2NrOmJlZm9yZXtjb250ZW50OidcXGU5MDAnfS5jZi1pY29uLmhlYXJ0LXNvbGlkOmJlZm9yZXtjb250ZW50OidcXGU5NmYnfS5jZi1pY29uLmJ1Y2tldC1vdXRsaW5lOmJlZm9yZXtjb250ZW50OidcXGU5NjEnfS5jZi1pY29uLmNoYXQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzMyd9LmNmLWljb24uY3VycmVuY3ktZXVyOmJlZm9yZXtjb250ZW50OidcXGU5NjgnfS5jZi1pY29uLmN1cnJlbmN5LWdicDpiZWZvcmV7Y29udGVudDonXFxlOTY5J30uY2YtaWNvbi5jdXJyZW5jeS11c2Q6YmVmb3Jle2NvbnRlbnQ6J1xcZTk2YSd9LmNmLWljb24ubW9vbjpiZWZvcmV7Y29udGVudDonXFxlOTVjJ30uY2YtaWNvbi5zaGFyZS1zb2xpZDpiZWZvcmV7Y29udGVudDonXFxlOTZlJ30uY2YtaWNvbi5zaGllbGQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTk2Yid9LmNmLWljb24uc3VuOmJlZm9yZXtjb250ZW50OidcXGU5NWQnfS5jZi1pY29uLnVwZ3JhZGU6YmVmb3Jle2NvbnRlbnQ6J1xcZTk1Zid9LmNmLWljb24ubWVyZ2U6YmVmb3Jle2NvbnRlbnQ6J1xcZTk3NSd9LmNmLWljb24uYWRkLWNlbGw6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyNSd9LmNmLWljb24uYWxlcnQtdHJpYW5nbGU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyNid9LmNmLWljb24uYWxlcnRzOmJlZm9yZXtjb250ZW50OidcXGU5MjEnfS5jZi1pY29uLmFubm90YXRlOmJlZm9yZXtjb250ZW50OidcXGU5NTMnfS5jZi1pY29uLmFubm90YXRlLXBsdXM6YmVmb3Jle2NvbnRlbnQ6J1xcZTk1Mid9LmNmLWljb24uYXV0aHplcm86YmVmb3Jle2NvbnRlbnQ6J1xcZTk1MSd9LmNmLWljb24uYmFyLWNoYXJ0OmJlZm9yZXtjb250ZW50OidcXGU5MTMnfS5jZi1pY29uLmJlbGw6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzNCd9LmNmLWljb24uYmVsbC1zb2xpZDpiZWZvcmV7Y29udGVudDonXFxlOTM3J30uY2YtaWNvbi5icnVzaDpiZWZvcmV7Y29udGVudDonXFxlOTNkJ30uY2YtaWNvbi5jYXBhY2l0b3IyOmJlZm9yZXtjb250ZW50OidcXGU5MjMnfS5jZi1pY29uLmNhcmV0LWRvd246YmVmb3Jle2NvbnRlbnQ6J1xcZTkwNCd9LmNmLWljb24uY2FyZXQtbGVmdDpiZWZvcmV7Y29udGVudDonXFxlOTA1J30uY2YtaWNvbi5jYXJldC1yaWdodDpiZWZvcmV7Y29udGVudDonXFxlOTA2J30uY2YtaWNvbi5jYXJldC11cDpiZWZvcmV7Y29udGVudDonXFxlOTA3J30uY2YtaWNvbi5jaGVja21hcms6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxOCd9LmNmLWljb24uY2lyY2xlOmJlZm9yZXtjb250ZW50OidcXGU5NDAnfS5jZi1pY29uLmNpcmNsZS10aGljazpiZWZvcmV7Y29udGVudDonXFxlOTBlJ30uY2YtaWNvbi5jbG9jazpiZWZvcmV7Y29udGVudDonXFxlOTIwJ30uY2YtaWNvbi5jb2ctb3V0bGluZTpiZWZvcmV7Y29udGVudDonXFxlOTFjJ30uY2YtaWNvbi5jb2ctdGhpY2s6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwYyd9LmNmLWljb24uY29sbGFwc2U6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxYid9LmNmLWljb24uY3Jvd24tb3V0bGluZTpiZWZvcmV7Y29udGVudDonXFxlOTA4J30uY2YtaWNvbi5jcm93bjI6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0Yid9LmNmLWljb24uY3ViZTpiZWZvcmV7Y29udGVudDonXFxlOTBiJ30uY2YtaWNvbi5jdWJvOmJlZm9yZXtjb250ZW50OidcXGU5NWUnfS5jZi1pY29uLmN1Ym8tdW5pZm9ybTpiZWZvcmV7Y29udGVudDonXFxlOTNjJ30uY2YtaWNvbi5kYXNoLWY6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyNyd9LmNmLWljb24uZGFzaC1oOmJlZm9yZXtjb250ZW50OidcXGU5MjknfS5jZi1pY29uLmRhc2gtajpiZWZvcmV7Y29udGVudDonXFxlOTJiJ30uY2YtaWNvbi5kaXNrczpiZWZvcmV7Y29udGVudDonXFxlOTUwJ30uY2YtaWNvbi5kb3dubG9hZDpiZWZvcmV7Y29udGVudDonXFxlOTFkJ30uY2YtaWNvbi5kdXBsaWNhdGU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxNyd9LmNmLWljb24uZXJsZW5tZXllcjpiZWZvcmV7Y29udGVudDonXFxlOTU4J30uY2YtaWNvbi5leHBhbmQtYTpiZWZvcmV7Y29udGVudDonXFxlOTQ0J30uY2YtaWNvbi5leHBhbmQtYjpiZWZvcmV7Y29udGVudDonXFxlOTQyJ30uY2YtaWNvbi5leHBvcnQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwZid9LmNmLWljb24uZXllOmJlZm9yZXtjb250ZW50OidcXGU5MWYnfS5jZi1pY29uLmV5ZS1jbG9zZWQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTk1Nid9LmNmLWljb24uZXllLW9wZW46YmVmb3Jle2NvbnRlbnQ6J1xcZTk1Nyd9LmNmLWljb24uZm46YmVmb3Jle2NvbnRlbnQ6J1xcZTk2MCd9LmNmLWljb24uZ2l0aHViOmJlZm9yZXtjb250ZW50OidcXGU5MjgnfS5jZi1pY29uLmdvb2dsZTpiZWZvcmV7Y29udGVudDonXFxlOTJhJ30uY2YtaWNvbi5ncm91cDpiZWZvcmV7Y29udGVudDonXFxlOTA5J30uY2YtaWNvbi5oZXJva3U6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0Nyd9LmNmLWljb24uaGVyb2t1LXNpbXBsZTpiZWZvcmV7Y29udGVudDonXFxlOTQ4J30uY2YtaWNvbi5pbXBvcnQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxMCd9LmNmLWljb24ubGluazpiZWZvcmV7Y29udGVudDonXFxlOTJlJ30uY2YtaWNvbi5tYXhpbWl6ZTpiZWZvcmV7Y29udGVudDonXFxlOTU1J30uY2YtaWNvbi5taW5pbWl6ZTpiZWZvcmV7Y29udGVudDonXFxlOTU0J30uY2YtaWNvbi5uYXYtY2hhdDpiZWZvcmV7Y29udGVudDonXFxlOTQxJ30uY2YtaWNvbi5vYXV0aDpiZWZvcmV7Y29udGVudDonXFxlOTRmJ30uY2YtaWNvbi5vY3RhZ29uOmJlZm9yZXtjb250ZW50OidcXGU5MmQnfS5jZi1pY29uLm9rdGE6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxMid9LmNmLWljb24ucGF1c2U6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0YSd9LmNmLWljb24ucGVuY2lsOmJlZm9yZXtjb250ZW50OidcXGU5MmYnfS5jZi1pY29uLnBsYXk6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxNCd9LmNmLWljb24ucGx1czpiZWZvcmV7Y29udGVudDonXFxlOTBhJ30uY2YtaWNvbi5wbHVzLXNraW5ueTpiZWZvcmV7Y29udGVudDonXFxlOTIyJ30uY2YtaWNvbi5wb2xhcm9pZDpiZWZvcmV7Y29udGVudDonXFxlOTViJ30uY2YtaWNvbi5wdWxzZS1jOmJlZm9yZXtjb250ZW50OidcXGU5MzYnfS5jZi1pY29uLnJlZG86YmVmb3Jle2NvbnRlbnQ6J1xcZTk1OSd9LmNmLWljb24ucmVmcmVzaDpiZWZvcmV7Y29udGVudDonXFxlOTQ5J30uY2YtaWNvbi5yZW1vdmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwZCd9LmNmLWljb24uc2VhcmNoOmJlZm9yZXtjb250ZW50OidcXGU5MTYnfS5jZi1pY29uLnNlcnZlcjI6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0Yyd9LmNmLWljb24uc2h1ZmZsZTpiZWZvcmV7Y29udGVudDonXFxlOTRlJ30uY2YtaWNvbi5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzZSd9LmNmLWljb24uc3F1YXJlLWNoZWNrOmJlZm9yZXtjb250ZW50OidcXGU5NDMnfS5jZi1pY29uLnN0YXI6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzMCd9LmNmLWljb24uc3RvcDpiZWZvcmV7Y29udGVudDonXFxlOTMxJ30uY2YtaWNvbi50ZXh0LWJsb2NrOmJlZm9yZXtjb250ZW50OidcXGU5MTEnfS5jZi1pY29uLnRyYXNoOmJlZm9yZXtjb250ZW50OidcXGU5MTUnfS5jZi1pY29uLnRyaWFuZ2xlOmJlZm9yZXtjb250ZW50OidcXGU5MmMnfS5jZi1pY29uLnVuZG86YmVmb3Jle2NvbnRlbnQ6J1xcZTk1YSd9LmNmLWljb24udXNlcjpiZWZvcmV7Y29udGVudDonXFxlOTE5J30uY2YtaWNvbi51c2VyLWFkZDpiZWZvcmV7Y29udGVudDonXFxlOTFlJ30uY2YtaWNvbi51c2VyLW91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzMid9LmNmLWljb24udXNlci1yZW1vdmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzOSd9LmNmLWljb24udXNlcnMtdHJpbzpiZWZvcmV7Y29udGVudDonXFxlOTQ1J30uY2YtaWNvbi53YW5kOmJlZm9yZXtjb250ZW50OidcXGU5NGQnfS5jZi1pY29uLndvb2Q6YmVmb3Jle2NvbnRlbnQ6J1xcZTk3MCd9LmNmLWljb24ud3JlbmNoOmJlZm9yZXtjb250ZW50OidcXGU5NzEnfS5jZi1pY29uLnphcDpiZWZvcmV7Y29udGVudDonXFxlOTczJ30uY2YtaWNvbi5iZWxsLXJpbmdpbmc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzNSd9LmNmLWljb24uY2FsZW5kYXI6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzOCd9LmNmLWljb24uY2xvdWQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzZid9LmNmLWljb24uY3Viby1uYXY6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxYSd9LmNmLWljb24uZGFzaGJvYXJkczpiZWZvcmV7Y29udGVudDonXFxlOTNhJ30uY2YtaWNvbi5kaXNrcy1uYXY6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0Nid9LmNmLWljb24uZ3JhcGhsaW5lLTI6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyNCd9LmNmLWljb24udXNlcnMtZHVvOmJlZm9yZXtjb250ZW50OidcXGU5M2InfS5jZi1pY29uLndyZW5jaC1uYXY6YmVmb3Jle2NvbnRlbnQ6J1xcZTk3Mid9LmNmLWljb24uYm9vazpiZWZvcmV7Y29udGVudDonXFxlOTY2J30uY2YtaWNvbi5ib29rLWNvZGU6YmVmb3Jle2NvbnRlbnQ6J1xcZTk2Nyd9LmNmLWljb24uYm9vay1wZW5jaWw6YmVmb3Jle2NvbnRlbnQ6J1xcZTk2NSd9LmNmLWljb24uYnVja2V0LXNvbGlkOmJlZm9yZXtjb250ZW50OidcXGU5NjInfS5jZi1pY29uLmZ1bm5lbC1vdXRsaW5lOmJlZm9yZXtjb250ZW50OidcXGU5NjMnfS5jZi1pY29uLmZ1bm5lbC1zb2xpZDpiZWZvcmV7Y29udGVudDonXFxlOTY0J30uY2YtaWNvbi5sYXllcnM6YmVmb3Jle2NvbnRlbnQ6J1xcZTk2Yyd9LmNmLWljb24uc2hhcmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTk2ZCd9QGZvbnQtZmFjZXtmb250LWZhbWlseTonaWNvbW9vbi12NCc7c3JjOnVybChcImZvbnRzL2ljb21vb24tdjQuZW90XCIpIGZvcm1hdChcImVtYmVkZGVkLW9wZW50eXBlXCIpO3NyYzp1cmwoXCJmb250cy9pY29tb29uLXY0LmVvdFwiKSBmb3JtYXQoXCJlbWJlZGRlZC1vcGVudHlwZVwiKSx1cmwoXCJmb250cy9pY29tb29uLXY0LndvZmYyXCIpIGZvcm1hdChcIndvZmYyXCIpLHVybChcImZvbnRzL2ljb21vb24tdjQudHRmXCIpIGZvcm1hdChcInRydWV0eXBlXCIpLHVybChcImZvbnRzL2ljb21vb24tdjQud29mZlwiKSBmb3JtYXQoXCJ3b2ZmXCIpLHVybChcImZvbnRzL2ljb21vb24tdjQuc3ZnXCIpIGZvcm1hdChcInN2Z1wiKTtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTpub3JtYWx9LmNmLWljb257Zm9udC1mYW1pbHk6J2ljb21vb24tdjQnO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO3RleHQtdHJhbnNmb3JtOm5vbmU7bGluZS1oZWlnaHQ6MTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZX0uY2YtaWNvbi5Gb2xkZXJPcGVuOmJlZm9yZXtjb250ZW50OidcXGU5NTYnfS5jZi1pY29uLkJpbGw6YmVmb3Jle2NvbnRlbnQ6J1xcZTk1NCd9LmNmLWljb24uTG9nb3V0OmJlZm9yZXtjb250ZW50OidcXGU5NTAnfS5jZi1pY29uLlBpZUNoYXJ0OmJlZm9yZXtjb250ZW50OidcXGU5NTcnfS5jZi1pY29uLkN1cnJlbmN5RG9sbGFyOmJlZm9yZXtjb250ZW50OidcXGU5NTInfS5jZi1pY29uLlN5bmM6YmVmb3Jle2NvbnRlbnQ6J1xcZTk1NSd9LmNmLWljb24uU3VidHJhY3Q6YmVmb3Jle2NvbnRlbnQ6J1xcZTk1Myd9LmNmLWljb24uVGltZXI6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0Zid9LmNmLWljb24uQ2FyZXRPdXRsaW5lUmlnaHQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0Yid9LmNmLWljb24uQ29sbGFwc2VMZWZ0OmJlZm9yZXtjb250ZW50OidcXGU5NGMnfS5jZi1pY29uLkNvbGxhcHNlUmlnaHQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0ZCd9LmNmLWljb24uRG91YmxlQ2FyZXRWZXJ0aWNhbDpiZWZvcmV7Y29udGVudDonXFxlOTRlJ30uY2YtaWNvbi5RdWVzdGlvbk1hcmtfT3V0bGluZTpiZWZvcmV7Y29udGVudDonXFxlOTRhJ30uY2YtaWNvbi5JbmZvX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTQ5J30uY2YtaWNvbi5TaWRlYmFyQ2xvc2U6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0Nyd9LmNmLWljb24uU2lkZWJhck9wZW46YmVmb3Jle2NvbnRlbnQ6J1xcZTk0OCd9LmNmLWljb24uQ2FyZXREb3duX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTEyJ30uY2YtaWNvbi5DYXJldExlZnRfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MTMnfS5jZi1pY29uLkNhcmV0UmlnaHRfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MTQnfS5jZi1pY29uLkNhcmV0VXBfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MTUnfS5jZi1pY29uLlBsYXk6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwMCd9LmNmLWljb24uUGF1c2U6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwMSd9LmNmLWljb24uRXllT3BlbjpiZWZvcmV7Y29udGVudDonXFxlOTAyJ30uY2YtaWNvbi5GbGFzazpiZWZvcmV7Y29udGVudDonXFxlOTAzJ30uY2YtaWNvbi5BZGRDZWxsX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTA0J30uY2YtaWNvbi5RdWVzdGlvbk1hcms6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwNSd9LmNmLWljb24uQWxlcnRUcmlhbmdsZTpiZWZvcmV7Y29udGVudDonXFxlOTA2J30uY2YtaWNvbi5Bbm5vdGF0ZV9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwNyd9LmNmLWljb24uQXJyb3dEb3duX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTA4J30uY2YtaWNvbi5BcnJvd0xlZnRfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MDknfS5jZi1pY29uLkFycm93UmlnaHRfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MGEnfS5jZi1pY29uLkJhckNoYXJ0X05ldzpiZWZvcmV7Y29udGVudDonXFxlOTBiJ30uY2YtaWNvbi5CZWxsOmJlZm9yZXtjb250ZW50OidcXGU5MGMnfS5jZi1pY29uLkJvb2tDb2RlOmJlZm9yZXtjb250ZW50OidcXGU5MGQnfS5jZi1pY29uLkJvb2tPdXRsaW5lOmJlZm9yZXtjb250ZW50OidcXGU5MGUnfS5jZi1pY29uLkJyYWNlczpiZWZvcmV7Y29udGVudDonXFxlOTBmJ30uY2YtaWNvbi5CdWNrZXRTb2xpZDpiZWZvcmV7Y29udGVudDonXFxlOTEwJ30uY2YtaWNvbi5DYWxlbmRhcjpiZWZvcmV7Y29udGVudDonXFxlOTExJ30uY2YtaWNvbi5DaGF0OmJlZm9yZXtjb250ZW50OidcXGU5MTYnfS5jZi1pY29uLkNoZWNrbWFya19OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxNyd9LmNmLWljb24uQ2lyY2xlVGhpY2s6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxOCd9LmNmLWljb24uQ2xpcGJvYXJkX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTE5J30uY2YtaWNvbi5DbG9ja19OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxYSd9LmNmLWljb24uQ2xvdWQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxYid9LmNmLWljb24uQ29nT3V0bGluZV9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxYyd9LmNmLWljb24uQ29nU29saWRfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MWQnfS5jZi1pY29uLkNvcHBlcmNvaW46YmVmb3Jle2NvbnRlbnQ6J1xcZTkxZSd9LmNmLWljb24uQ3Jvd25Tb2xpZF9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxZid9LmNmLWljb24uQ3ViZTpiZWZvcmV7Y29udGVudDonXFxlOTIwJ30uY2YtaWNvbi5DdWJvU29saWQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyMSd9LmNmLWljb24uQ3Vib3VuaWZvcm06YmVmb3Jle2NvbnRlbnQ6J1xcZTkyMid9LmNmLWljb24uRGFya21vZGVfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MjMnfS5jZi1pY29uLkRhc2hIOmJlZm9yZXtjb250ZW50OidcXGU5MjQnfS5jZi1pY29uLkRvd25sb2FkX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTI1J30uY2YtaWNvbi5FeHBhbmRCOmJlZm9yZXtjb250ZW50OidcXGU5MjYnfS5jZi1pY29uLkV4cG9ydF9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyNyd9LmNmLWljb24uRXllQ2xvc2VkOmJlZm9yZXtjb250ZW50OidcXGU5MjgnfS5jZi1pY29uLkZ1bm5lbFNvbGlkOmJlZm9yZXtjb250ZW50OidcXGU5MjknfS5jZi1pY29uLkdyYXBoTGluZV9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyYSd9LmNmLWljb24uR3JvdXA6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyYid9LmNmLWljb24uSGlzdG9yeTpiZWZvcmV7Y29udGVudDonXFxlOTJjJ30uY2YtaWNvbi5EdXBsaWNhdGVfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MmQnfS5jZi1pY29uLkluc3RhbGw6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyZSd9LmNmLWljb24uTGF5ZXJzOmJlZm9yZXtjb250ZW50OidcXGU5MmYnfS5jZi1pY29uLkxpZ2h0bW9kZV9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzMCd9LmNmLWljb24uTGluazpiZWZvcmV7Y29udGVudDonXFxlOTMxJ30uY2YtaWNvbi5Mb2NrOmJlZm9yZXtjb250ZW50OidcXGU5MzInfS5jZi1pY29uLk1vcmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzMyd9LmNmLWljb24uUGVuY2lsOmJlZm9yZXtjb250ZW50OidcXGU5MzQnfS5jZi1pY29uLlBsdXNfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MzUnfS5jZi1pY29uLlJlZnJlc2hfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MzYnfS5jZi1pY29uLlJlbW92ZV9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzNyd9LmNmLWljb24uU2F2ZTpiZWZvcmV7Y29udGVudDonXFxlOTM4J30uY2YtaWNvbi5TYXZlT3V0bGluZTpiZWZvcmV7Y29udGVudDonXFxlOTUxJ30uY2YtaWNvbi5TZWFyY2hfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MzknfS5jZi1pY29uLlNoYXJlOmJlZm9yZXtjb250ZW50OidcXGU5M2EnfS5jZi1pY29uLlNoaWVsZDpiZWZvcmV7Y29udGVudDonXFxlOTNiJ30uY2YtaWNvbi5TdGFyOmJlZm9yZXtjb250ZW50OidcXGU5M2MnfS5jZi1pY29uLlN0YXJTbWlsZTpiZWZvcmV7Y29udGVudDonXFxlOTNkJ30uY2YtaWNvbi5TdWJzY3JpYmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzZSd9LmNmLWljb24uU3dpdGNoX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTNmJ30uY2YtaWNvbi5UZXh0X05ldzpiZWZvcmV7Y29udGVudDonXFxlOTQwJ30uY2YtaWNvbi5UcmFzaF9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0MSd9LmNmLWljb24uVW5kbzpiZWZvcmV7Y29udGVudDonXFxlOTQyJ30uY2YtaWNvbi5VcGxvYWRfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5NDMnfS5jZi1pY29uLlVwbG9hZF9PdXRsaW5lOmJlZm9yZXtjb250ZW50OidcXGU5NDQnfS5jZi1pY29uLlVzZXI6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0NSd9LmNmLWljb24uWmFwOmJlZm9yZXtjb250ZW50OidcXGU5NDYnfUBmb250LWZhY2V7Zm9udC1mYW1pbHk6J2FsZXJ0LWljb25zJztzcmM6dXJsKFwiZm9udHMvYWxlcnQtaWNvbnMuZW90P2QwZHpuaFwiKTtzcmM6dXJsKFwiZm9udHMvYWxlcnQtaWNvbnMuZW90P2QwZHpuaCNpZWZpeFwiKSBmb3JtYXQoXCJlbWJlZGRlZC1vcGVudHlwZVwiKSx1cmwoXCJmb250cy9hbGVydC1pY29ucy50dGY/ZDBkem5oXCIpIGZvcm1hdChcInRydWV0eXBlXCIpLHVybChcImZvbnRzL2FsZXJ0LWljb25zLndvZmY/ZDBkem5oXCIpIGZvcm1hdChcIndvZmZcIiksdXJsKFwiZm9udHMvYWxlcnQtaWNvbnMuc3ZnP2QwZHpuaCNpY29tb29uXCIpIGZvcm1hdChcInN2Z1wiKTtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC1kaXNwbGF5OmJsb2NrfVtjbGFzc149XCJhbGVydC1pY29uLVwiXSxbY2xhc3MqPVwiIGFsZXJ0LWljb24tXCJde2ZvbnQtZmFtaWx5OidhbGVydC1pY29ucycgIWltcG9ydGFudDtzcGVhazpuZXZlcjtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDt0ZXh0LXRyYW5zZm9ybTpub25lO2xpbmUtaGVpZ2h0OjE7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGV9LmFsZXJ0LWljb24tY2F1dGlvbjpiZWZvcmV7Y29udGVudDpcIlxcNDNcIn0uYWxlcnQtaWNvbi1pbXBvcnRhbnQ6YmVmb3Jle2NvbnRlbnQ6XCJcXDQ5XCJ9LmFsZXJ0LWljb24tbm90ZTpiZWZvcmV7Y29udGVudDpcIlxcNGVcIn0uYWxlcnQtaWNvbi10aXA6YmVmb3Jle2NvbnRlbnQ6XCJcXDU0XCJ9LmFsZXJ0LWljb24td2FybmluZzpiZWZvcmV7Y29udGVudDpcIlxcNTdcIn0udjN7Zm9udC1mYW1pbHk6J2ljb21vb24tdjMnfS52NHtmb250LWZhbWlseTonaWNvbW9vbi12NCd9I2xvYWRpbmd7cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwdnc7aGVpZ2h0OjEwMHZoO3otaW5kZXg6MTAwMDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7b3BhY2l0eToxO3RyYW5zaXRpb246b3BhY2l0eSAuNXN9QGtleWZyYW1lcyBzcGlubmVye3Rve3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19LnNwaW5uZXI6YmVmb3Jle2NvbnRlbnQ6Jyc7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bGVmdDo1MCU7d2lkdGg6NTBweDtoZWlnaHQ6NTBweDttYXJnaW4tdG9wOi0yNXB4O21hcmdpbi1sZWZ0Oi0yNXB4O2JvcmRlci1yYWRpdXM6NTAlO2JvcmRlcjozcHggc29saWQgI0U3RThFQjtib3JkZXItdG9wLWNvbG9yOiM1MTNDQzY7YW5pbWF0aW9uOnNwaW5uZXIgLjZzIGxpbmVhciBpbmZpbml0ZX0jaW5mbHV4LWhlYWRlcntmb250LWZhbWlseTpcIlByb3hpbWEgTm92YVwiLHNhbnMtc2VyaWY7cGFkZGluZzoxMHB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YmFja2dyb3VuZC1jb2xvcjojMjAyMDI4fSNpbmZsdXgtaGVhZGVyIGF7dGV4dC1kZWNvcmF0aW9uOm5vbmV9I2luZmx1eC1oZWFkZXIgYS5iYWNre2NvbG9yOiNmZmY7dHJhbnNpdGlvbjpjb2xvciAuMnN9I2luZmx1eC1oZWFkZXIgYS5iYWNrOmhvdmVye2NvbG9yOiMwMEEzRkZ9I2luZmx1eC1oZWFkZXIgYS5iYWNrOmJlZm9yZXtjb250ZW50OlwiXFxlOTE5XCI7Zm9udC1mYW1pbHk6J2ljb21vb24tdjInO21hcmdpbi1yaWdodDouNjVyZW19I2luZmx1eC1oZWFkZXIgYS5idG57cGFkZGluZzouNXJlbSAuNzVyZW0gLjVyZW0gLjY1cmVtO2ZvbnQtc2l6ZTouODVyZW07Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOiNENEQ3REQ7YmFja2dyb3VuZDojMzgzODQ2O2JvcmRlci1yYWRpdXM6NC41cHg7dHJhbnNpdGlvbjphbGwgLjJzfSNpbmZsdXgtaGVhZGVyIGEuYnRuOmJlZm9yZXtjb250ZW50OlwiXFxlOTM0XCI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOi45NXJlbTttYXJnaW4tcmlnaHQ6LjVyZW07Zm9udC1mYW1pbHk6J2ljb21vb24tdjInfSNpbmZsdXgtaGVhZGVyIGEuYnRuOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZDojMDBBM0ZGfUBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCl7I2luZmx1eC1oZWFkZXIgc3Bhbi52ZXJzaW9ue2Rpc3BsYXk6bm9uZX19LmNqdGJBSyBoMSwuY2p0YkFLIGgyLC5janRiQUsgaDMsLmNqdGJBSyBoNCwuY2p0YkFLIGg1LC5janRiQUsgaDYsLmNqdGJBSyBwLC5janRiQUsgbGksLmNqdGJBSyB0aCwuY2p0YkFLIHRke2ZvbnQtZmFtaWx5OlwiUHJveGltYSBOb3ZhXCIsc2Fucy1zZXJpZiAhaW1wb3J0YW50fSNyZWRvYyBoMSwjcmVkb2MgaDIsI3JlZG9jIGgze2ZvbnQtd2VpZ2h0OjUwMCAhaW1wb3J0YW50fS5kbHVKRGp7cGFkZGluZzoyMHB4IDB9LmRUSldRSHtjb2xvcjojNTQ1NjY3O2ZvbnQtc2l6ZToycmVtfS5qSWRwVkp7YmFja2dyb3VuZDojMkFBM0ZGO2NvbG9yOiNmZmY7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czozcHg7Zm9udC1mYW1pbHk6XCJQcm94aW1hIE5vdmFcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZTouODVyZW07Zm9udC13ZWlnaHQ6NTAwO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMnN9LmpJZHBWSjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMwMEEzRkZ9Lld4V1hwe2NvbG9yOiM1NDU2Njc7Zm9udC1zaXplOjEuNzVyZW19LmlvWVRxQSwuYnhjSFlJLC5ob1VvZW57Y29sb3I6IzU0NTY2N30uZXNwb3pHe2NvbG9yOiM2NzY5Nzh9LmJuRlBoTyBhe2NvbG9yOiMyQUEzRkZ9LmJuRlBoTyBhOnZpc2l0ZWR7Y29sb3I6IzJBQTNGRn0ucmVkb2MtanNvbntmb250LWZhbWlseTpcIklCTSBQbGV4IE1vbm9cIixtb25vc3BhY2UgIWltcG9ydGFudH0uZmxmeFVNIGNvZGUsLmdEc1dMayBjb2RlLC5rVFZ5U0R7Zm9udC1mYW1pbHk6XCJJQk0gUGxleCBNb25vXCIsbW9ub3NwYWNlICFpbXBvcnRhbnQ7Y29sb3I6IzczNkVDRDtiYWNrZ3JvdW5kOiNFREVERkY7Ym9yZGVyLWNvbG9yOiNFREVERkZ9LmpzVEF4THtjb2xvcjojRjk1RjUzfS5oTFZ6U0YsLmZEdkZNcHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTAzLDIxNSw3OCwwLjIpO2NvbG9yOiMwMDZGNDl9LmJ5THJCZ3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ5LDk1LDgzLDAuMSk7Y29sb3I6I0Y5NUY1M30uZ1pkRHNNe2JhY2tncm91bmQtY29sb3I6I0ZBRkFGQ30uZ3BiY0ZrOmhvdmVyLC5zYy1lVHV3c3ouYWN0aXZle2JhY2tncm91bmQtY29sb3I6I0VFRUZGMn0uU211V0UsLmdjVXp2RywuYmJWaXlTLC5zYy1ocldFTWcgbGFiZWx7Zm9udC1mYW1pbHk6XCJQcm94aW1hIE5vdmFcIixzYW5zLXNlcmlmICFpbXBvcnRhbnR9LmZ5VXlrcXtmb250LXdlaWdodDo1MDB9LmNGd01jcC5wb3N0e2JhY2tncm91bmQtY29sb3I6IzA2NkZDNX0uY0Z3TWNwLmdldHtiYWNrZ3JvdW5kLWNvbG9yOiMzNEJCNTV9LmNGd01jcC5wdXR7YmFja2dyb3VuZC1jb2xvcjojOTM5NEZGfS5jRndNY3AucGF0Y2h7YmFja2dyb3VuZC1jb2xvcjojRkZEMjU1O2NvbG9yOnJnYmEoNTYsNTYsNzAsMC43NSl9LmNGd01jcC5kZWxldGV7YmFja2dyb3VuZC1jb2xvcjojRjk1RjUzfS5nY1V6dkcsLmlOekxDazpob3Zlcntjb2xvcjojQkYyRkU1fS5kdFVpYncsLmZMVUtnantiYWNrZ3JvdW5kLWNvbG9yOiMyMDIwMjh9LmR0VWlidyBoMywuZHRVaWJ3IGg0LC5kdFVpYncgaDUsLmR0VWlidyBoNiwuZkxVS2dqIGgzLC5mTFVLZ2ogaDQsLmZMVUtnaiBoNSwuZkxVS2dqIGg2e2ZvbnQtZmFtaWx5OlwiUHJveGltYSBOb3ZhXCIsc2Fucy1zZXJpZiAhaW1wb3J0YW50O2ZvbnQtd2VpZ2h0OjUwMCAhaW1wb3J0YW50fS5pcnBxeXk+LnJlYWN0LXRhYnNfX3RhYi1wYW5lbHtiYWNrZ3JvdW5kLWNvbG9yOiMwRjBFMTV9LmRITEtldSwuZlZheG5Be3BhZGRpbmctbGVmdDoxMHB4O2JhY2tncm91bmQtY29sb3I6IzBGMEUxNX0uaXJwcXl5PnVsPmxpe2JhY2tncm91bmQtY29sb3I6IzBGMEUxNTtib3JkZXItcmFkaXVzOjNweH0uaXJwcXl5PnVsPmxpLnJlYWN0LXRhYnNfX3RhYi0tc2VsZWN0ZWR7Y29sb3I6IzUxM0NDNn0uaXJwcXl5PnVsPmxpLnRhYi1lcnJvcntjb2xvcjojREM0RTU4fS5pcnBxeXk+dWw+bGkudGFiLXN1Y2Nlc3N7Y29sb3I6IzAwOUY1Rn0uYk5ZQ0FKLC5qQmpZYlYsLmhPY3pSQiwuZlJzckRjLC5oUHNrWmR7Zm9udC1mYW1pbHk6XCJQcm94aW1hIE5vdmFcIixzYW5zLXNlcmlmO2ZvbnQtd2VpZ2h0OjUwMDtsZXR0ZXItc3BhY2luZzouMDRlbTtib3JkZXItcmFkaXVzOjNweH0uYk5ZQ0FKe2JhY2tncm91bmQtY29sb3I6IzA2NkZDNX0uakJqWWJWe2JhY2tncm91bmQtY29sb3I6IzAwOUY1Rn0uaE9jelJCe2JhY2tncm91bmQtY29sb3I6IzkzOTRGRn0uZlJzckRje2JhY2tncm91bmQtY29sb3I6I0ZGRDI1NTtjb2xvcjojMzgzODQ2fS5oUHNrWmR7YmFja2dyb3VuZC1jb2xvcjojRjk1RjUzfS5nekFvVWJ7YmFja2dyb3VuZC1jb2xvcjojMjAyMDI4O2ZvbnQtZmFtaWx5OlwiUHJveGltYSBOb3ZhXCIsc2Fucy1zZXJpZn0uaUVOVkFze2ZvbnQtZmFtaWx5OlwiSUJNIFBsZXggTW9ub1wiLG1vbm9zcGFjZX0uZHBNYmF1e2ZvbnQtZmFtaWx5OlwiUHJveGltYSBOb3ZhXCIsc2Fucy1zZXJpZn0uZkNKbUN7Zm9udC1mYW1pbHk6XCJQcm94aW1hIE5vdmFcIixzYW5zLXNlcmlmfS5mQ0ptQyBzcGFue2JvcmRlci1yYWRpdXM6M3B4fS5rWkhKY0N7Zm9udC1mYW1pbHk6XCJJQk0gUGxleCBNb25vXCIsbW9ub3NwYWNlfS5qQ2d5bHEgLnRva2VuLnN0cmluZ3tjb2xvcjojNjdENzRFfS5qQ2d5bHEgLnRva2VuLnN0cmluZythe2NvbG9yOiMwMEEzRkZ9LmpDZ3lscSAudG9rZW4uYm9vbGVhbntjb2xvcjojZjk1NWIwfVxuXG4vKiMgc291cmNlTWFwcGluZ1VSTD1hcGkuY3NzLm1hcCAqLyJdfQ== */ \ No newline at end of file diff --git a/pr-preview/pr-6948/dark-theme.29c42cc9e01d0a9f87447d1ddde13836200d7525f27012563f2aed1baae53885.css b/pr-preview/pr-6948/dark-theme.29c42cc9e01d0a9f87447d1ddde13836200d7525f27012563f2aed1baae53885.css new file mode 100644 index 000000000..b24ccce5b --- /dev/null +++ b/pr-preview/pr-6948/dark-theme.29c42cc9e01d0a9f87447d1ddde13836200d7525f27012563f2aed1baae53885.css @@ -0,0 +1,2 @@ +body{font-size:18px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@font-face{font-family:"Proxima Nova";src:url("fonts/proxima-nova.otf") format("opentype");font-weight:300}@font-face{font-family:'Proxima Nova';src:url("fonts/proxima-nova-medium.otf") format("opentype");font-weight:400}@font-face{font-family:'Proxima Nova';src:url("fonts/proxima-nova-semibold.otf") format("opentype");font-weight:500 600}@font-face{font-family:'Proxima Nova';src:url("fonts/proxima-nova-bold.otf") format("opentype");font-weight:700}@font-face{font-family:'icomoon-v2';src:url("fonts/icomoon-v2.eot?itn2ph");src:url("fonts/icomoon-v2.eot?itn2ph#iefix") format("embedded-opentype"),url("fonts/icomoon-v2.ttf?itn2ph") format("truetype"),url("fonts/icomoon-v2.woff?itn2ph") format("woff"),url("fonts/icomoon-v2.svg?itn2ph#icomoon-v2") format("svg");font-weight:normal;font-style:normal;font-display:block}[class^="icon-"],[class*=" icon-"]{font-family:'icomoon-v2' !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-bar-chart:before{content:"\e913"}.icon-influx-logo:before{content:"\e900"}.icon-influx-logotype:before{content:"\e901"}.icon-alert-triangle:before{content:"\e902"}.icon-arrow-down:before{content:"\e903"}.icon-moon1:before{content:"\e904"}.icon-search:before{content:"\e905"}.icon-sun1:before{content:"\e906"}.icon-arrow-down-circle:before{content:"\e907"}.icon-arrow-down-left:before{content:"\e908"}.icon-arrow-down-right:before{content:"\e909"}.icon-arrow-left:before{content:"\e90a"}.icon-arrow-left-circle:before{content:"\e90b"}.icon-arrow-right:before{content:"\e90c"}.icon-arrow-right-circle:before{content:"\e90d"}.icon-arrow-up:before{content:"\e90e"}.icon-arrow-up-circle:before{content:"\e90f"}.icon-arrow-up-left:before{content:"\e910"}.icon-arrow-up-right:before{content:"\e911"}.icon-check:before{content:"\e912"}.icon-heart1:before{content:"\e914"}.icon-settings:before{content:"\e915"}.icon-zoom-in:before{content:"\e916"}.icon-zoom-out:before{content:"\e917"}.icon-chevron-down:before{content:"\e918"}.icon-chevron-left:before{content:"\e919"}.icon-chevron-right:before{content:"\e91a"}.icon-chevron-up:before{content:"\e91b"}.icon-menu:before{content:"\e91c"}.icon-download:before{content:"\e91d"}.icon-minus:before{content:"\e91e"}.icon-plus:before{content:"\e91f"}.icon-add-cell:before{content:"\e920"}.icon-alert:before{content:"\e921"}.icon-calendar:before{content:"\e922"}.icon-checkmark:before{content:"\e923"}.icon-cog-thick:before{content:"\e924"}.icon-dashboards:before{content:"\e925"}.icon-data-explorer:before{content:"\e926"}.icon-ui-download:before{content:"\e927"}.icon-duplicate:before{content:"\e928"}.icon-export:before{content:"\e929"}.icon-fullscreen:before{content:"\e92a"}.icon-influx-icon:before{content:"\e92b"}.icon-note:before{content:"\e92c"}.icon-organizations:before{content:"\e92d"}.icon-pause:before{content:"\e92e"}.icon-pencil:before{content:"\e92f"}.icon-play:before{content:"\e930"}.icon-ui-plus:before{content:"\e931"}.icon-refresh:before{content:"\e932"}.icon-remove:before{content:"\e933"}.icon-alert-circle:before{content:"\e934"}.icon-crown:before{content:"\e935"}.icon-trash:before{content:"\e936"}.icon-triangle:before{content:"\e937"}.icon-x:before{content:"\e938"}.icon-wrench-2:before{content:"\e939"}.icon-chat:before{content:"\e93a"}.icon-bell:before{content:"\e93b"}.icon-disks-nav:before{content:"\e93c"}.icon-wrench-nav:before{content:"\e93d"}.icon-user:before{content:"\e93e"}.icon-cloud:before{content:"\e93f"}.icon-users-trio:before{content:"\e940"}.icon-nav-chat:before{content:"\e941"}.icon-map2:before{content:"\e94c"}.icon-eye-closed:before{content:"\e956"}.icon-eye-open:before{content:"\e957"}.icon-book-pencil:before{content:"\e965"}.icon-heart:before{content:"\e9da"}.icon-loop2:before{content:"\ea2e"}.icon-github:before{content:"\eab0"}.icon-tux:before{content:"\eabd"}.icon-appleinc:before{content:"\eabe"}.icon-windows8:before{content:"\eac2"}@font-face{font-family:'icomoon-v3';src:url("fonts/icomoon-v3.eot") format("embedded-opentype");src:url("fonts/icomoon-v3.eot") format("embedded-opentype"),url("fonts/icomoon-v3.woff2") format("woff2"),url("fonts/icomoon-v3.ttf") format("truetype"),url("fonts/icomoon-v3.woff") format("woff"),url("fonts/icomoon-v3.svg") format("svg");font-weight:normal;font-style:normal}.cf-icon{font-family:'icomoon-v3';font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.cf-icon.add-cell-new:before{content:'\e976'}.cf-icon.alert-triangle-new:before{content:'\e977'}.cf-icon.annotate-new:before{content:'\e978'}.cf-icon.arrow-down-new:before{content:'\e979'}.cf-icon.arrow-left-new:before{content:'\e97a'}.cf-icon.arrow-right-new:before{content:'\e97b'}.cf-icon.arrow-up-new:before{content:'\e97c'}.cf-icon.bar-chart-new:before{content:'\e97d'}.cf-icon.build-outline-new:before{content:'\e97e'}.cf-icon.caret-down-new:before{content:'\e97f'}.cf-icon.caret-left-new:before{content:'\e980'}.cf-icon.caret-right-new:before{content:'\e981'}.cf-icon.caret-up-new:before{content:'\e982'}.cf-icon.checkmark-new:before{content:'\e983'}.cf-icon.clipboard-new:before{content:'\e984'}.cf-icon.clock-new:before{content:'\e985'}.cf-icon.cog-outline-new:before{content:'\e986'}.cf-icon.cog-solid-new:before{content:'\e987'}.cf-icon.crown-solid-new:before{content:'\e988'}.cf-icon.dark-mode-new:before{content:'\e989'}.cf-icon.download-new:before{content:'\e98a'}.cf-icon.duplicate-new:before{content:'\e98b'}.cf-icon.expand-new:before{content:'\e98c'}.cf-icon.export-new:before{content:'\e98d'}.cf-icon.eye-open-new:before{content:'\e98e'}.cf-icon.graph-line-new:before{content:'\e98f'}.cf-icon.handle-new:before{content:'\e990'}.cf-icon.home-outline-new:before{content:'\e991'}.cf-icon.info-new:before{content:'\e992'}.cf-icon.ingest-new:before{content:'\e993'}.cf-icon.light-mode-new:before{content:'\e994'}.cf-icon.lock-outline-new:before{content:'\e995'}.cf-icon.log-out-new:before{content:'\e996'}.cf-icon.pin-new:before{content:'\e997'}.cf-icon.plus-new:before{content:'\e998'}.cf-icon.question-mark-new:before{content:'\e999'}.cf-icon.refresh-new:before{content:'\e99a'}.cf-icon.remove-new:before{content:'\e99b'}.cf-icon.search-new:before{content:'\e99c'}.cf-icon.sidebar-close-new:before{content:'\e99d'}.cf-icon.sidebar-open-new:before{content:'\e99e'}.cf-icon.stop-new:before{content:'\e99f'}.cf-icon.switch-new:before{content:'\e9a0'}.cf-icon.text-new:before{content:'\e9a1'}.cf-icon.trash-new:before{content:'\e9a2'}.cf-icon.user-outline-new:before{content:'\e9a3'}.cf-icon.more:before{content:'\e974'}.cf-icon.drag-to-expand-white:before{content:'\e901';color:#fff}.cf-icon.drag-to-expand:before{content:'\e902'}.cf-icon.shield-solid:before{content:'\e903'}.cf-icon.lock:before{content:'\e900'}.cf-icon.heart-solid:before{content:'\e96f'}.cf-icon.bucket-outline:before{content:'\e961'}.cf-icon.chat:before{content:'\e933'}.cf-icon.currency-eur:before{content:'\e968'}.cf-icon.currency-gbp:before{content:'\e969'}.cf-icon.currency-usd:before{content:'\e96a'}.cf-icon.moon:before{content:'\e95c'}.cf-icon.share-solid:before{content:'\e96e'}.cf-icon.shield:before{content:'\e96b'}.cf-icon.sun:before{content:'\e95d'}.cf-icon.upgrade:before{content:'\e95f'}.cf-icon.merge:before{content:'\e975'}.cf-icon.add-cell:before{content:'\e925'}.cf-icon.alert-triangle:before{content:'\e926'}.cf-icon.alerts:before{content:'\e921'}.cf-icon.annotate:before{content:'\e953'}.cf-icon.annotate-plus:before{content:'\e952'}.cf-icon.authzero:before{content:'\e951'}.cf-icon.bar-chart:before{content:'\e913'}.cf-icon.bell:before{content:'\e934'}.cf-icon.bell-solid:before{content:'\e937'}.cf-icon.brush:before{content:'\e93d'}.cf-icon.capacitor2:before{content:'\e923'}.cf-icon.caret-down:before{content:'\e904'}.cf-icon.caret-left:before{content:'\e905'}.cf-icon.caret-right:before{content:'\e906'}.cf-icon.caret-up:before{content:'\e907'}.cf-icon.checkmark:before{content:'\e918'}.cf-icon.circle:before{content:'\e940'}.cf-icon.circle-thick:before{content:'\e90e'}.cf-icon.clock:before{content:'\e920'}.cf-icon.cog-outline:before{content:'\e91c'}.cf-icon.cog-thick:before{content:'\e90c'}.cf-icon.collapse:before{content:'\e91b'}.cf-icon.crown-outline:before{content:'\e908'}.cf-icon.crown2:before{content:'\e94b'}.cf-icon.cube:before{content:'\e90b'}.cf-icon.cubo:before{content:'\e95e'}.cf-icon.cubo-uniform:before{content:'\e93c'}.cf-icon.dash-f:before{content:'\e927'}.cf-icon.dash-h:before{content:'\e929'}.cf-icon.dash-j:before{content:'\e92b'}.cf-icon.disks:before{content:'\e950'}.cf-icon.download:before{content:'\e91d'}.cf-icon.duplicate:before{content:'\e917'}.cf-icon.erlenmeyer:before{content:'\e958'}.cf-icon.expand-a:before{content:'\e944'}.cf-icon.expand-b:before{content:'\e942'}.cf-icon.export:before{content:'\e90f'}.cf-icon.eye:before{content:'\e91f'}.cf-icon.eye-closed:before{content:'\e956'}.cf-icon.eye-open:before{content:'\e957'}.cf-icon.fn:before{content:'\e960'}.cf-icon.github:before{content:'\e928'}.cf-icon.google:before{content:'\e92a'}.cf-icon.group:before{content:'\e909'}.cf-icon.heroku:before{content:'\e947'}.cf-icon.heroku-simple:before{content:'\e948'}.cf-icon.import:before{content:'\e910'}.cf-icon.link:before{content:'\e92e'}.cf-icon.maximize:before{content:'\e955'}.cf-icon.minimize:before{content:'\e954'}.cf-icon.nav-chat:before{content:'\e941'}.cf-icon.oauth:before{content:'\e94f'}.cf-icon.octagon:before{content:'\e92d'}.cf-icon.okta:before{content:'\e912'}.cf-icon.pause:before{content:'\e94a'}.cf-icon.pencil:before{content:'\e92f'}.cf-icon.play:before{content:'\e914'}.cf-icon.plus:before{content:'\e90a'}.cf-icon.plus-skinny:before{content:'\e922'}.cf-icon.polaroid:before{content:'\e95b'}.cf-icon.pulse-c:before{content:'\e936'}.cf-icon.redo:before{content:'\e959'}.cf-icon.refresh:before{content:'\e949'}.cf-icon.remove:before{content:'\e90d'}.cf-icon.search:before{content:'\e916'}.cf-icon.server2:before{content:'\e94c'}.cf-icon.shuffle:before{content:'\e94e'}.cf-icon.square:before{content:'\e93e'}.cf-icon.square-check:before{content:'\e943'}.cf-icon.star:before{content:'\e930'}.cf-icon.stop:before{content:'\e931'}.cf-icon.text-block:before{content:'\e911'}.cf-icon.trash:before{content:'\e915'}.cf-icon.triangle:before{content:'\e92c'}.cf-icon.undo:before{content:'\e95a'}.cf-icon.user:before{content:'\e919'}.cf-icon.user-add:before{content:'\e91e'}.cf-icon.user-outline:before{content:'\e932'}.cf-icon.user-remove:before{content:'\e939'}.cf-icon.users-trio:before{content:'\e945'}.cf-icon.wand:before{content:'\e94d'}.cf-icon.wood:before{content:'\e970'}.cf-icon.wrench:before{content:'\e971'}.cf-icon.zap:before{content:'\e973'}.cf-icon.bell-ringing:before{content:'\e935'}.cf-icon.calendar:before{content:'\e938'}.cf-icon.cloud:before{content:'\e93f'}.cf-icon.cubo-nav:before{content:'\e91a'}.cf-icon.dashboards:before{content:'\e93a'}.cf-icon.disks-nav:before{content:'\e946'}.cf-icon.graphline-2:before{content:'\e924'}.cf-icon.users-duo:before{content:'\e93b'}.cf-icon.wrench-nav:before{content:'\e972'}.cf-icon.book:before{content:'\e966'}.cf-icon.book-code:before{content:'\e967'}.cf-icon.book-pencil:before{content:'\e965'}.cf-icon.bucket-solid:before{content:'\e962'}.cf-icon.funnel-outline:before{content:'\e963'}.cf-icon.funnel-solid:before{content:'\e964'}.cf-icon.layers:before{content:'\e96c'}.cf-icon.share:before{content:'\e96d'}@font-face{font-family:'icomoon-v4';src:url("fonts/icomoon-v4.eot") format("embedded-opentype");src:url("fonts/icomoon-v4.eot") format("embedded-opentype"),url("fonts/icomoon-v4.woff2") format("woff2"),url("fonts/icomoon-v4.ttf") format("truetype"),url("fonts/icomoon-v4.woff") format("woff"),url("fonts/icomoon-v4.svg") format("svg");font-weight:normal;font-style:normal}.cf-icon{font-family:'icomoon-v4';font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.cf-icon.FolderOpen:before{content:'\e956'}.cf-icon.Bill:before{content:'\e954'}.cf-icon.Logout:before{content:'\e950'}.cf-icon.PieChart:before{content:'\e957'}.cf-icon.CurrencyDollar:before{content:'\e952'}.cf-icon.Sync:before{content:'\e955'}.cf-icon.Subtract:before{content:'\e953'}.cf-icon.Timer:before{content:'\e94f'}.cf-icon.CaretOutlineRight:before{content:'\e94b'}.cf-icon.CollapseLeft:before{content:'\e94c'}.cf-icon.CollapseRight:before{content:'\e94d'}.cf-icon.DoubleCaretVertical:before{content:'\e94e'}.cf-icon.QuestionMark_Outline:before{content:'\e94a'}.cf-icon.Info_New:before{content:'\e949'}.cf-icon.SidebarClose:before{content:'\e947'}.cf-icon.SidebarOpen:before{content:'\e948'}.cf-icon.CaretDown_New:before{content:'\e912'}.cf-icon.CaretLeft_New:before{content:'\e913'}.cf-icon.CaretRight_New:before{content:'\e914'}.cf-icon.CaretUp_New:before{content:'\e915'}.cf-icon.Play:before{content:'\e900'}.cf-icon.Pause:before{content:'\e901'}.cf-icon.EyeOpen:before{content:'\e902'}.cf-icon.Flask:before{content:'\e903'}.cf-icon.AddCell_New:before{content:'\e904'}.cf-icon.QuestionMark:before{content:'\e905'}.cf-icon.AlertTriangle:before{content:'\e906'}.cf-icon.Annotate_New:before{content:'\e907'}.cf-icon.ArrowDown_New:before{content:'\e908'}.cf-icon.ArrowLeft_New:before{content:'\e909'}.cf-icon.ArrowRight_New:before{content:'\e90a'}.cf-icon.BarChart_New:before{content:'\e90b'}.cf-icon.Bell:before{content:'\e90c'}.cf-icon.BookCode:before{content:'\e90d'}.cf-icon.BookOutline:before{content:'\e90e'}.cf-icon.Braces:before{content:'\e90f'}.cf-icon.BucketSolid:before{content:'\e910'}.cf-icon.Calendar:before{content:'\e911'}.cf-icon.Chat:before{content:'\e916'}.cf-icon.Checkmark_New:before{content:'\e917'}.cf-icon.CircleThick:before{content:'\e918'}.cf-icon.Clipboard_New:before{content:'\e919'}.cf-icon.Clock_New:before{content:'\e91a'}.cf-icon.Cloud:before{content:'\e91b'}.cf-icon.CogOutline_New:before{content:'\e91c'}.cf-icon.CogSolid_New:before{content:'\e91d'}.cf-icon.Coppercoin:before{content:'\e91e'}.cf-icon.CrownSolid_New:before{content:'\e91f'}.cf-icon.Cube:before{content:'\e920'}.cf-icon.CuboSolid:before{content:'\e921'}.cf-icon.Cubouniform:before{content:'\e922'}.cf-icon.Darkmode_New:before{content:'\e923'}.cf-icon.DashH:before{content:'\e924'}.cf-icon.Download_New:before{content:'\e925'}.cf-icon.ExpandB:before{content:'\e926'}.cf-icon.Export_New:before{content:'\e927'}.cf-icon.EyeClosed:before{content:'\e928'}.cf-icon.FunnelSolid:before{content:'\e929'}.cf-icon.GraphLine_New:before{content:'\e92a'}.cf-icon.Group:before{content:'\e92b'}.cf-icon.History:before{content:'\e92c'}.cf-icon.Duplicate_New:before{content:'\e92d'}.cf-icon.Install:before{content:'\e92e'}.cf-icon.Layers:before{content:'\e92f'}.cf-icon.Lightmode_New:before{content:'\e930'}.cf-icon.Link:before{content:'\e931'}.cf-icon.Lock:before{content:'\e932'}.cf-icon.More:before{content:'\e933'}.cf-icon.Pencil:before{content:'\e934'}.cf-icon.Plus_New:before{content:'\e935'}.cf-icon.Refresh_New:before{content:'\e936'}.cf-icon.Remove_New:before{content:'\e937'}.cf-icon.Save:before{content:'\e938'}.cf-icon.SaveOutline:before{content:'\e951'}.cf-icon.Search_New:before{content:'\e939'}.cf-icon.Share:before{content:'\e93a'}.cf-icon.Shield:before{content:'\e93b'}.cf-icon.Star:before{content:'\e93c'}.cf-icon.StarSmile:before{content:'\e93d'}.cf-icon.Subscribe:before{content:'\e93e'}.cf-icon.Switch_New:before{content:'\e93f'}.cf-icon.Text_New:before{content:'\e940'}.cf-icon.Trash_New:before{content:'\e941'}.cf-icon.Undo:before{content:'\e942'}.cf-icon.Upload_New:before{content:'\e943'}.cf-icon.Upload_Outline:before{content:'\e944'}.cf-icon.User:before{content:'\e945'}.cf-icon.Zap:before{content:'\e946'}@font-face{font-family:'alert-icons';src:url("fonts/alert-icons.eot?d0dznh");src:url("fonts/alert-icons.eot?d0dznh#iefix") format("embedded-opentype"),url("fonts/alert-icons.ttf?d0dznh") format("truetype"),url("fonts/alert-icons.woff?d0dznh") format("woff"),url("fonts/alert-icons.svg?d0dznh#icomoon") format("svg");font-weight:normal;font-style:normal;font-display:block}[class^="alert-icon-"],[class*=" alert-icon-"]{font-family:'alert-icons' !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.alert-icon-caution:before{content:"\43"}.alert-icon-important:before{content:"\49"}.alert-icon-note:before{content:"\4e"}.alert-icon-tip:before{content:"\54"}.alert-icon-warning:before{content:"\57"}.v3{font-family:'icomoon-v3'}.v4{font-family:'icomoon-v4'}.tooltip{position:relative;display:inline-block;font-weight:500;color:#D6F622}.tooltip:hover{cursor:help}.tooltip:hover .tooltip-container{visibility:visible}.tooltip:hover .tooltip-text{opacity:1;transform:translate(-50%, -2.5rem)}.tooltip .tooltip-container{position:absolute;top:0;left:50%;transform:translateX(-50%);overflow:visible;visibility:hidden}.tooltip .tooltip-text{font-weight:500;position:absolute;border-radius:2px;padding:.15rem .75rem;font-size:0.9rem;line-height:1.75rem;left:50%;transform:translate(-50%, -1.75rem);transition:all 0.2s ease;white-space:nowrap;opacity:0;color:#202028;background-color:#D6F622}.tooltip .tooltip-text:after{content:'';position:absolute;left:50%;bottom:-14px;transform:translateX(-50%);border-top:8px solid #D6F622;border-right:8px solid transparent;border-bottom:8px solid transparent;border-left:8px solid transparent}.tooltip.shift-left .tooltip-text{left:75%;transform:translate(-75%, -1.75rem)}.tooltip.shift-left .tooltip-text:after{left:75%;transform:translateX(-75%)}.tooltip.shift-left:hover .tooltip-text{transform:translate(-75%, -2.5rem)}.tooltip.shift-right .tooltip-text{left:25%;transform:translate(-25%, -1.75rem)}.tooltip.shift-right .tooltip-text:after{left:25%;transform:translateX(-25%)}.tooltip.shift-right:hover .tooltip-text{transform:translate(-25%, -2.5rem)}.tooltip.right:hover .tooltip-container{visibility:visible}.tooltip.right:hover .tooltip-text{opacity:1;transform:translate(70%)}.tooltip.right .tooltip-container{left:0%;transform:translateX(60%)}.tooltip.right .tooltip-text{left:60%;transform:translate(60%);transition:all 0.2s ease}.tooltip.right .tooltip-text:after{top:50%;left:-14px;transform:translateY(-50%);border-top:16px solid transparent;border-right:16px solid #D6F622;border-bottom:16px solid transparent;border-left:8px solid transparent}th .tooltip{color:#D6F622}th .tooltip:hover .tooltip-container{visibility:visible}th .tooltip:hover .tooltip-text{opacity:1;transform:translate(-50%, 1.75rem)}th .tooltip .tooltip-text{transform:translate(-50%, 1rem)}th .tooltip .tooltip-text:after{content:'';position:absolute;height:0;left:50%;top:-14px;transform:translateX(-50%);border-top:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #D6F622;border-left:8px solid transparent}.datepicker{display:none}.datepicker.active{display:block}.datepicker-picker{background-color:#14141F;border-radius:2px;display:inline-block}.datepicker-picker span{-webkit-touch-callout:none;border:0;border-radius:2px;cursor:default;display:block;flex:1;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none}.datepicker-main{padding:2px}.datepicker-controls{display:flex}.datepicker-controls .button{align-items:center;background-color:#14141F;border:1px solid #dbdbdb;border-radius:2px;box-shadow:none;color:#FAFAFC;cursor:pointer;display:inline-flex;font-size:1rem;height:2.25em;justify-content:center;line-height:1.5;margin:0;padding:calc(.375em - 1px) 0.75em;position:relative;text-align:center;vertical-align:top;white-space:nowrap;transition:all .2s}.datepicker-controls .button:active{outline:none;border-color:#4a4a4a;color:#D4D7DD}.datepicker-controls .button:focus{outline:none;border-color:#3273dc;color:#D4D7DD}.datepicker-controls .button:focus:not(:active){box-shadow:0 0 0 0.125em rgba(50,115,220,0.25)}.datepicker-controls .button:hover{border-color:#b5b5b5;color:#FAFAFC}.datepicker-controls .button[disabled]{cursor:not-allowed}.datepicker-controls .view-switch{flex:auto}.datepicker-controls .next-btn{padding-left:.375rem;padding-right:.375rem;width:2.25rem}.datepicker-controls .prev-btn{padding-left:.375rem;padding-right:.375rem;width:2.25rem}.datepicker-controls .next-btn.disabled{visibility:hidden}.datepicker-controls .prev-btn.disabled{visibility:hidden}.datepicker-grid{display:flex;flex-wrap:wrap;width:15.75rem}.datepicker-view{display:flex}.datepicker-view .days-of-week{display:flex}.datepicker-view .days .datepicker-cell{flex-basis:14.2857142857%}.datepicker-view .dow{flex-basis:14.2857142857%;font-size:.875rem;font-weight:700;height:1.5rem;line-height:1.5rem}.datepicker-view .week{height:2.25rem;line-height:2.25rem;color:#b5b5b5;font-size:.75rem;width:2.25rem}.datepicker-view.datepicker-grid .datepicker-cell{flex-basis:25%;height:4.5rem;line-height:4.5rem}.datepicker-cell{height:2.25rem;line-height:2.25rem}.datepicker-cell:not(.disabled):hover{background-color:rgba(212,215,221,0.15);cursor:pointer}.datepicker-title{background-color:#f5f5f5;box-shadow:inset 0 -1px 1px rgba(10,10,10,0.1);font-weight:700;padding:.375rem .75rem;text-align:center}.datepicker-header .datepicker-controls{padding:2px 2px 0}.datepicker-header .datepicker-controls .button{border-color:transparent;font-weight:700}.datepicker-header .datepicker-controls .button:hover{background-color:rgba(212,215,221,0.15)}.datepicker-header .datepicker-controls .button:focus:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.datepicker-header .datepicker-controls .button:active{background-color:#00A3FF}.datepicker-header .datepicker-controls .button[disabled]{box-shadow:none}.datepicker-cell.focused:not(.selected){background-color:#00A3FF;color:#fff}.datepicker-cell.selected{background-color:#00A3FF;color:#fff;font-weight:600}.datepicker-cell.selected:hover{background-color:#00A3FF;color:#fff;font-weight:600}.datepicker-cell.disabled{color:#dbdbdb}.datepicker-cell.next:not(.disabled){color:#7a7a7a}.datepicker-cell.prev:not(.disabled){color:#7a7a7a}.datepicker-cell.next.selected{color:#e6e6e6}.datepicker-cell.prev.selected{color:#e6e6e6}.datepicker-cell.highlighted:not(.selected):not(.range):not(.today){background-color:rgba(212,215,221,0.25);border-radius:0}.datepicker-cell.highlighted:not(.selected):not(.range):not(.today):not(.disabled):hover{background-color:#eee}.datepicker-cell.highlighted:not(.selected):not(.range):not(.today).focused{background-color:#00A3FF;color:#fff}.datepicker-cell.today:not(.selected){background-color:#00d1b2}.datepicker-cell.today:not(.selected):not(.disabled){color:#fff}.datepicker-cell.today.focused:not(.selected){background-color:#00c4a7}.datepicker-input.in-edit{border-color:#2366d1}.datepicker-input.in-edit:active{box-shadow:0 0 0.25em 0.25em rgba(35,102,209,0.2)}.datepicker-input.in-edit:focus{box-shadow:0 0 0.25em 0.25em rgba(35,102,209,0.2)}@media (max-width: 22.5rem){.datepicker-view .week{width:1.96875rem}.calendar-weeks+.days .datepicker-grid{width:13.78125rem}}/*! normalize.scss v0.1.0 | MIT License | based on git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{height:100%}body{min-height:100%;font-family:"Proxima Nova",sans-serif;background:#07070E}body>img[referrerpolicy="no-referrer-when-downgrade"]{display:none}*{box-sizing:border-box}a{transition:color .2s, background-color .2s}.page-wrapper{display:flex;flex-grow:1}.bowlofsweets{display:none}@media (max-width: 800px){.page-wrapper{flex-direction:column}}.topnav{display:flex;padding:.75rem .75rem .65rem;justify-content:space-between;position:relative;box-sizing:border-box;z-index:99}.topnav .influx-home{font-family:'icomoon-v2';font-size:1.4rem;color:#fff;text-decoration:none;vertical-align:middle}.topnav .influx-home:hover{color:#00A3FF}.topnav .influx-home .icon-influx-logotype{margin-left:.6rem}.topnav .divider{height:100%;border-left:1px solid rgba(255,255,255,0.5);margin:0 1rem 0 .65rem}.topnav .docs-home{display:inline-block;vertical-align:text-top;font-weight:500;font-size:1.1rem;color:#fff;text-decoration:none}.topnav .docs-home:hover{color:#00A3FF}.topnav .topnav-left{margin-right:.15rem;padding:.25rem .15rem;z-index:1}.topnav .topnav-right{display:flex;position:absolute;right:.75rem;top:.75rem}.topnav .selector-dropdowns{display:flex;z-index:100;padding-right:.25rem}.topnav .product-list{position:relative}.topnav .product-list #product-dropdown{display:inline-block;width:100%;color:#fff;height:2rem;background:linear-gradient(225deg, #d30971,#9b2aff);background-attachment:fixed;font-weight:500;font-size:1.05rem;border-radius:6px;overflow:hidden;cursor:pointer}.topnav .product-list #product-dropdown:after{content:"\e918";font-family:'icomoon-v2';position:absolute;top:.45rem;right:.4rem;transition:all .3s}.topnav .product-list #product-dropdown .selected{padding:0 1.75rem 0 .75rem;line-height:0}.topnav .product-list #product-dropdown.open:after{transform:rotate(180deg)}.topnav .product-list #dropdown-items{opacity:0;height:0;pointer-events:none;margin-top:-10px;transition:opacity .2s, margin-top .5s}.topnav .product-list #dropdown-items.open{opacity:1;pointer-events:auto;margin-top:0;height:auto}.topnav .product-list #dropdown-items.open .product-group{margin:0 0 5px}.topnav .product-list #dropdown-items .product-group{background:linear-gradient(225deg, #d30971,#9b2aff);background-attachment:fixed;border-radius:6px;box-shadow:1px 3px 10px #07070E;margin:0 0 -10px;transition:margin .5s}.topnav .product-list #dropdown-items .product-group:last-child{margin:0}.topnav .product-list #dropdown-items .group-title{padding:.5rem .75rem .2rem;font-weight:bold;color:#181820;font-size:1rem}.topnav .product-list #dropdown-items .group-title p{margin:0;padding:.1rem .1rem .3rem;-o-border-image:linear-gradient(to right, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 100%) 1;border-image:linear-gradient(to right, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 100%) 1;border-bottom:2px solid}.topnav .product-list #dropdown-items ul.item-list{padding:0;margin:0;list-style:none}.topnav .product-list #dropdown-items ul.item-list.products[data-category]:before{content:attr(data-category);display:inline-block;margin:.5rem .75rem .15rem;font-size:.85rem;color:#181820,0.8;text-transform:uppercase;font-weight:bold;letter-spacing:.04rem;opacity:.75;mix-blend-mode:multiply}.topnav .product-list #dropdown-items a{display:block;text-decoration:none;font-size:1.05rem;font-weight:500;white-space:nowrap;color:#fff;padding:.3rem 1.5rem .3rem .75rem;background:rgba(255,255,255,0)}.topnav .product-list #dropdown-items a:hover{background:rgba(255,255,255,0.3)}.topnav .product-list #dropdown-items a.active{background:rgba(255,255,255,0.3)}.topnav .product-list #dropdown-items a:last-child{border-radius:0 0 2px 2px;position:relative}.topnav .product-list #dropdown-items a span.state{font-size:.9em;opacity:.65;font-style:italic}.topnav .buttons{display:flex;margin-left:.5rem}.topnav .theme-switch,.topnav #search-btn,.topnav .url-trigger{display:inline-block;padding:0;line-height:0;color:rgba(255,255,255,0.5);background:none;height:30px;width:30px;border:none;transition:color .2s, opacity .2s;-webkit-appearance:none;-moz-appearance:none;appearance:none;overflow:visible}.topnav .theme-switch:focus,.topnav #search-btn:focus,.topnav .url-trigger:focus{outline:none}.topnav .theme-switch:hover,.topnav #search-btn:hover,.topnav .url-trigger:hover{color:#fff;cursor:pointer}.topnav .theme-switch.theme-switch-dark,.topnav #search-btn.theme-switch-dark,.topnav .url-trigger.theme-switch-dark{display:none;font-size:1.15rem}.topnav .theme-switch.theme-switch-light,.topnav #search-btn.theme-switch-light,.topnav .url-trigger.theme-switch-light{display:inline-block;font-size:1.3rem}.topnav .url-trigger{font-size:1.1rem;vertical-align:top;z-index:1}.topnav .search-btn{width:0;opacity:0}.topnav.feature-board .back-btn{color:#FAFAFC;background:rgba(212,215,221,0.15);border:1px solid rgba(212,215,221,0);font-weight:500;text-decoration:none;padding:.35rem 1rem;border-radius:2px;font-size:.9rem;transition:border .2s}.topnav.feature-board .back-btn:before{content:'\e909';font-family:'icomoon-v4';font-weight:bold;line-height:0;margin:0 .5rem 0 -.25rem;vertical-align:middle}.topnav.feature-board .back-btn:hover{text-decoration:none;border:1px solid rgba(212,215,221,0.25)}@media (max-width: 800px){.docs-home .long{display:none}.docs-home .short:after{content:"s"}}@media (max-width: 600px){.icon-influx-logotype{display:none}.topnav{min-height:5.75rem}.topnav.feature-board{min-height:auto}.topnav-right{flex-direction:column-reverse;align-items:flex-end;width:calc(100% - 1.5rem)}.search-btn{display:none}.topnav .selector-dropdowns{width:100%;margin-top:.6rem;padding-right:0}.topnav .selector-dropdowns .product-list{width:calc(100vw - 1.6rem)}.topnav .selector-dropdowns .product-list .product-dropdown{width:100%}}.home-content{color:#FAFAFC;width:100%;max-width:1300px;margin:0 auto}.home-content .section{width:100%;margin:0 auto;padding:2rem 2rem 0;display:block;position:relative}.home-content .search .sidebar--search{font-size:1.1rem}.home-content .search .sidebar--search input{padding:.75em 2.35rem .75rem 1rem;border-radius:6px;position:relative;box-shadow:none}.home-content .search .sidebar--search input::-moz-placeholder{color:rgba(255,255,255,0.65)}.home-content .search .sidebar--search input::placeholder{color:rgba(255,255,255,0.65)}.home-content .search .sidebar--search:after{font-size:2rem;top:.45rem;right:.45rem}.home-content .search .sidebar--search .algolia-autocomplete{position:relative}.home-content .search .sidebar--search .algolia-autocomplete:after{content:"";position:absolute;display:block;border-radius:6px;top:0;left:0;box-shadow:2px 2px 6px rgba(15,14,21,0.5);height:100%;width:100%;mix-blend-mode:multiply;z-index:-1}.home-content .search .sidebar--search .algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu,.home-content .search .sidebar--search .algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{top:auto !important;left:0 !important;margin-bottom:1.5rem}.home-content .search .sidebar--search .algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:after,.home-content .search .sidebar--search .algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:after{content:"";box-shadow:2px 2px 6px rgba(15,14,21,0.5);height:100%;width:100%;mix-blend-mode:multiply}.home-content .padding-wrapper{padding:0 2rem}.home-content h1{text-align:center;color:#fff}.home-content .product-group{background:#14141F;padding:3rem;margin-bottom:2rem;border-radius:30px}.home-content .product-group .products{display:flex;flex-wrap:wrap;width:100%;margin:0 -1rem}.home-content .product-group .product{padding:0 1rem;display:flex;flex:1 1 33%;flex-direction:column;justify-content:space-between;max-width:33%;min-width:200px}.home-content .product-group .product .product-info p{margin-bottom:.5rem;font-size:1.1rem;line-height:1.5rem;color:rgba(212,215,221,0.7)}.home-content .product-group .product .product-info h3[state]::after{content:attr(state);margin-left:.5rem;font-size:1rem;padding:.25em .5em .25em .4em;background:linear-gradient(45deg, #d30971,#9b2aff);color:#fff;border-radius:4px;font-style:italic;vertical-align:middle}.home-content .product-group .product ul.product-links{padding-left:0;list-style:none}.home-content .product-group .product ul.product-links li:not(:last-child){margin-bottom:.35rem}.home-content .product-group .product ul.product-links a{text-decoration:none;color:#fff;font-weight:500;position:relative}.home-content .product-group .product ul.product-links a::before{content:"";position:absolute;bottom:-2px;height:2px;width:0%;background:linear-gradient(45deg, #d30971,#9b2aff);transition:width .2s}.home-content .product-group .product ul.product-links a::after{content:"\e90a";font-family:'icomoon-v4';font-weight:bold;font-size:1.3rem;display:inline-block;position:absolute;background:linear-gradient(45deg, #d30971,#9b2aff);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;right:0;transform:translateX(0.25rem);opacity:0;transition:transform .2s, opacity .2s}.home-content .product-group .product ul.product-links a:hover::before{width:100%}.home-content .product-group .product ul.product-links a:hover::after{transform:translateX(1.5rem);opacity:1}.home-content .product-group h2{display:inline-block;font-size:2.75rem;margin:0;color:#14141F;background:linear-gradient(45deg, #d30971,#9b2aff);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}.home-content .product-group h3{font-size:1.6rem;margin:1rem 0 0}.home-content .product-group h3 a{text-decoration:none;color:#fff;position:relative}.home-content .product-group h3 a::before{content:"";position:absolute;bottom:-2px;height:2px;width:0%;background:linear-gradient(45deg, #d30971,#9b2aff);transition:width .2s}.home-content .product-group h3 a:hover::before{width:100%}.home-content .product-group h3 .version{font-size:.9em;opacity:.5}.home-content .product-group h4{font-size:1.1rem;margin:1.5rem 0 .5rem;display:inline-block;padding-right:1rem;color:rgba(212,215,221,0.7);background:#14141F}.home-content .product-group .categories{display:flex;flex-direction:row;flex-wrap:wrap;width:calc(100% + 2rem)}.home-content .product-group .categories .category.full-width{width:100%}.home-content .product-group .categories .category.two-thirds{width:66.66%}.home-content .product-group .categories .category.two-thirds .product{max-width:50%}.home-content .product-group .categories .category.one-third{width:33.33%}.home-content .product-group .categories .category.one-third .product{max-width:100%}.home-content .product-group .category-head{margin:1rem 0 2rem}.home-content .product-group .category-head::after{content:"";display:block;border-top:1px solid #383846;margin-top:-1.15rem;width:calc(100% - 2rem)}.home-content #influxdb3{margin-top:1.75rem}.home-content #influxdb3 h2+p{margin-top:.75rem}.home-content #telegraf{background:linear-gradient(65deg, #020d66, #020a47);color:#fff;position:relative;overflow:hidden;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.home-content #telegraf .bg-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-image:url("/img/bg-texture-new.png");background-position:bottom}.home-content #telegraf h2{font-size:2.5rem;background:linear-gradient(270deg, #00A3FF,#5ee4e4);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}.home-content #telegraf h2+p{margin-top:.65rem}.home-content #telegraf ul.product-links{padding-left:0;margin:0 3rem 0 2rem;list-style:none}.home-content #telegraf ul.product-links li:not(:last-child){margin-bottom:.35rem}.home-content #telegraf ul.product-links a{text-decoration:none;color:#fff;font-weight:500;position:relative}.home-content #telegraf ul.product-links a::before{content:"";position:absolute;bottom:-2px;height:2px;width:0%;background:linear-gradient(270deg, #00A3FF,#5ee4e4);transition:width .2s}.home-content #telegraf ul.product-links a::after{content:"\e90a";font-family:'icomoon-v4';font-weight:bold;font-size:1.3rem;display:inline-block;position:absolute;background:linear-gradient(270deg, #00A3FF,#5ee4e4);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;right:0;transform:translateX(0.25rem);opacity:0;transition:transform .2s, opacity .2s}.home-content #telegraf ul.product-links a:hover::before{width:100%}.home-content #telegraf ul.product-links a:hover::after{transform:translateX(1.5rem);opacity:1}.home-content #learn-more{margin-bottom:2rem}.home-content #learn-more h3{font-size:1.8rem;margin:1rem 0 2rem}.home-content #learn-more .learn-items{display:flex;flex-direction:row;justify-content:flex-start}.home-content #learn-more .learn-items .item{max-width:25%;flex:1 1 0;display:flex;flex-direction:column;margin:0 .75rem}.home-content #learn-more .learn-items .item .icon svg{max-height:60px;max-width:60px}.home-content #learn-more .learn-items .item .icon .c1{fill:#fff}.home-content #learn-more .learn-items .item .icon .c2{fill:#07070E}.home-content #learn-more .learn-items .item .icon .magenta{fill:#d30971}.home-content #learn-more .learn-items .item h4{font-size:1.4rem;margin:1rem 0 0}.home-content #learn-more .learn-items .item p{margin:.5rem 0 1.5rem;line-height:1.7rem}.home-content #learn-more .learn-items .item p:last-child{margin-bottom:0}.home-content #learn-more .learn-items .item a{position:relative;display:inline;color:#fff;font-weight:500;text-decoration:none}.home-content #learn-more .learn-items .item a::before{content:"";display:inline-block;position:absolute;left:0;bottom:-4px;margin-top:.25rem;height:2px;background:linear-gradient(45deg, #d30971,#9b2aff);width:0;transition:width .2s}.home-content #learn-more .learn-items .item a::after{content:"\e90a";font-family:'icomoon-v4';font-weight:bold;font-size:1.3rem;display:inline-block;position:absolute;background:linear-gradient(270deg, #d30971,#9b2aff);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;right:0;transform:translateX(0.25rem);opacity:0;transition:transform .2s, opacity .2s}.home-content #learn-more .learn-items .item a:hover::before{width:100%}.home-content #learn-more .learn-items .item a:hover::after{transform:translateX(1.5rem);opacity:1}.home-content #learn-more .learn-items .item>*:last-child{margin-top:auto}.home-content #copyright{width:100%;padding:1rem 3rem;color:rgba(212,215,221,0.5)}.home-content #copyright p{margin:0;text-align:right;font-size:.9rem}@media (max-width: 900px){.home-content .product-group .products .product{max-width:50%;margin-bottom:2rem}}@media (max-width: 720px){.home-content .product-group .products{flex-direction:column}.home-content .product-group .products .product{margin-bottom:1rem;max-width:100%}.home-content .product-group .products .product ul{margin-bottom:0}.home-content .product-group .categories .category.two-thirds{width:100%}.home-content .product-group .categories .category.two-thirds .product{max-width:100%}.home-content .product-group .categories .category.one-third{width:100%}.home-content .product-group .categories .category.one-third .product{max-width:100%}.home-content #telegraf{flex-direction:column;align-items:flex-start}.home-content #telegraf ul.product-links{margin:1rem 0 0}}@media (max-width: 800px){.home-content #learn-more{margin-bottom:0}.home-content #learn-more h4{margin-top:0}.home-content #learn-more .learn-items{flex-wrap:wrap}.home-content #learn-more .learn-items .item{max-width:45%;flex:1 1 50%;margin-bottom:2rem}}@media (max-width: 600px){.home-content .section,.home-content .padding-wrapper{padding:0 1rem}.home-content h1{font-size:1.55rem;line-height:1.5rem;padding:0 1.75rem;margin-bottom:-.5rem}.home-content .product-group{padding:1.5rem}.home-content .product-group p,.home-content .product-group .product .product-info p{font-size:1.05rem}.home-content .product-group h2{font-size:2.1rem}.home-content .product-group h3{font-size:1.5rem}.home-content .product-group h4{font-size:1rem}.home-content #telegraf{padding:1.75rem}.home-content #telegraf h2{font-size:2rem}.home-content #learn-more h3{font-size:1.5rem}.home-content #learn-more .learn-items .item h4{font-size:1.2rem}.home-content #copyright p{text-align:center}}@media (max-width: 540px){.home-content #learn-more .learn-items{flex-direction:column}.home-content #learn-more .learn-items .item{max-width:100%;margin:0 0 2rem}}.sidebar{display:block;position:relative;flex-grow:1;padding:0 1em;width:25%}.sidebar--search{position:relative;flex-grow:1}.sidebar--search:after{content:"\e905";display:block;font-family:'icomoon-v2';position:absolute;top:.25rem;right:.25rem;color:#D4D7DD;font-size:1.8rem}.sidebar--search input{font-family:"Proxima Nova",sans-serif;font-weight:500;font-size:1.1rem;background:#1A1A2A;border-radius:2px;border:1px solid #1A1A2A;padding:.5em 2.15rem .5rem .5rem;width:100%;color:#fff;transition-property:border, box-shadow;transition-duration:.2s;box-shadow:2px 2px 6px rgba(15,14,21,0.5)}.sidebar--search input:focus{outline:none;border-color:#00A3FF;box-shadow:1px 1px 10px rgba(0,163,255,0.5);border-radius:2px}.sidebar--search input::-moz-placeholder{color:rgba(255,255,255,0.35);font-weight:normal}.sidebar--search input::placeholder{color:rgba(255,255,255,0.35);font-weight:normal}.sidebar .search-and-nav-toggle{display:flex;width:100%;margin-bottom:.7rem}.sidebar #contents-toggle-btn{display:block;margin:.35rem .05rem .25rem 1.2rem;width:20px;height:20px}.sidebar #contents-toggle-btn .toggle-hamburger{display:block;position:relative;margin-top:.65rem;background:rgba(255,255,255,0.5);width:20px;height:2px;transition:all .3s;transform:rotate(0deg)}.sidebar #contents-toggle-btn .toggle-hamburger:before,.sidebar #contents-toggle-btn .toggle-hamburger:after{content:"";display:block;position:absolute;width:20px;height:2px;border-radius:1px;background:rgba(255,255,255,0.5);transform:rotate(0deg);transition:all .3s}.sidebar #contents-toggle-btn .toggle-hamburger:before{top:-6px}.sidebar #contents-toggle-btn .toggle-hamburger:after{top:6px}.sidebar #contents-toggle-btn:hover .toggle-hamburger{background:#fff}.sidebar #contents-toggle-btn:hover .toggle-hamburger:before,.sidebar #contents-toggle-btn:hover .toggle-hamburger:after{background:#fff}.sidebar #contents-toggle-btn.open .toggle-hamburger{background:#07070E;transform:rotate(90deg)}.sidebar #contents-toggle-btn.open .toggle-hamburger:before{transform:rotate(-135deg);top:0}.sidebar #contents-toggle-btn.open .toggle-hamburger:after{transform:rotate(-45deg);top:0}.sidebar #nav-tree{list-style:none;padding-left:1.5rem;margin-bottom:1rem}.sidebar #nav-tree ul{list-style:none;padding-left:2.3rem;border-left:2px solid #333346}.sidebar #nav-tree li{margin-top:.5rem;position:relative}.sidebar #nav-tree li:before{content:"";width:4px;height:4px;top:.45em;left:-1em;display:block;position:absolute;background:#333346}.sidebar #nav-tree li ul{margin-left:-.96em}.sidebar #nav-tree li ul li:before{top:.4em}.sidebar #nav-tree li ul.open{margin-top:-.25em;padding-top:.25em}.sidebar #nav-tree li.active:before{background:#D6F622}.sidebar #nav-tree li.active>a{color:#D6F622}.sidebar #nav-tree li.active>a:hover{color:#D6F622}.sidebar #nav-tree li.active>.children-toggle{background:#D6F622}.sidebar #nav-tree li.active>.children-toggle:before,.sidebar #nav-tree li.active>.children-toggle:after{background:#07070E}.sidebar #nav-tree li.active>ul{border-left:2px solid #D6F622}.sidebar #nav-tree a{text-decoration:none;font-weight:500;display:inline-block}.sidebar #nav-tree .nav-category>a{color:#00A3FF;font-size:1.2rem}.sidebar #nav-tree .nav-category>a:hover{color:#fff}.sidebar #nav-tree .nav-item>a{color:#D4D7DD}.sidebar #nav-tree .nav-item>a:hover{color:#00A3FF}.sidebar #nav-tree .children{height:0;overflow:hidden}.sidebar #nav-tree .children.open{height:auto}.sidebar #nav-tree .children-toggle{width:1.12rem;height:1.12rem;position:absolute;top:.1rem;left:-1.6rem;display:block;background:#333346;border-radius:50%}.sidebar #nav-tree .children-toggle:before,.sidebar #nav-tree .children-toggle:after{content:"";position:absolute;display:block;background:#E7E8EB;transition:all .3s}.sidebar #nav-tree .children-toggle:before{top:4px;left:8px;height:10px;width:2px}.sidebar #nav-tree .children-toggle:after{top:8px;left:4px;height:2px;width:10px}.sidebar #nav-tree .children-toggle:hover{background:#00A3FF}.sidebar #nav-tree .children-toggle:hover:before,.sidebar #nav-tree .children-toggle:hover:after{background:#E7E8EB}.sidebar #nav-tree .children-toggle.open:before{transform:rotate(90deg)}.sidebar #nav-tree .children-toggle.open:after{transform:rotate(180deg)}.sidebar #nav-tree h4{margin:2rem 0 0 -1rem;color:rgba(255,255,255,0.5);font-weight:700;text-transform:uppercase;font-size:.95rem;letter-spacing:.08rem}.sidebar #nav-tree h4.platform:after,.sidebar #nav-tree h4.flux:after{content:"\e911";font-family:"icomoon-v2";font-style:normal;font-size:1rem;opacity:.4;margin-left:.25rem}.sidebar .feature-board-badge{position:relative;padding:1rem;margin:2rem 0 1.5rem -1.5rem;background:rgba(0,163,255,0.05);border:1px solid rgba(0,163,255,0.2);border-radius:8px;text-decoration:none;transition:background .2s, border-color .2s;overflow:hidden}.sidebar .feature-board-badge:before{content:"NEW";position:absolute;padding:.1rem 1.2rem;font-size:.65rem;letter-spacing:.03rem;font-weight:bold;top:6px;right:-17px;color:#fff;background:#d30971;transform:rotate(45deg)}.sidebar .feature-board-badge h5{margin:0 0 .25rem 0;color:#00A3FF;font-size:1.2rem}.sidebar .feature-board-badge p{margin:0;color:#D4D7DD;font-size:0.9rem;line-height:1.4rem;font-weight:normal;font-style:italic}.sidebar .feature-board-badge:hover{border-color:rgba(0,163,255,0.75)}@media (max-width: 800px){.sidebar{width:100%}.sidebar #nav-tree{height:0;overflow:hidden;margin:0}.sidebar #nav-tree.open{height:auto;overflow:auto;margin-bottom:2rem}}@media (min-width: 801px){.sidebar #contents-toggle-btn{display:none}}@media (min-width: 801px) and (max-width: 1200px){.sidebar{width:30%}}.sidebar-toggle{position:absolute;display:block;height:35px;top:3.25rem;z-index:100}.sidebar-toggle:hover{cursor:pointer}.sidebar-toggle:hover:before,.sidebar-toggle:hover:after{cursor:default}.sidebar-toggle:hover a{color:#d4d7dd}.sidebar-toggle:before,.sidebar-toggle:after{display:block;position:absolute;width:10px;height:10px}.sidebar-toggle:before{top:-14px}.sidebar-toggle:after{bottom:-14px;transform:rotateX(180deg)}.sidebar-toggle>a{font-family:"icomoon-v2";color:rgba(212,215,221,0.5);text-decoration:none}.sidebar-toggle{padding:0.4rem 0.6rem;width:35px}.sidebar-toggle>a{font-size:1rem}.content-wrapper .sidebar-toggle{display:none;left:0;background-color:#07070E;border-radius:0 2px 2px 0}.content-wrapper .sidebar-toggle:before,.content-wrapper .sidebar-toggle:after{content:url("data:image/svg+xml;charset=UTF-8,\a \a \a ");left:0}.content-wrapper .sidebar-toggle:before{transform:rotateY(180deg)}.content-wrapper .sidebar-toggle:after{transform:rotate(180deg)}.sidebar .sidebar-toggle{right:0;background-color:#14141F;border-radius:2px 0 0 2px}.sidebar .sidebar-toggle:before,.sidebar .sidebar-toggle:after{content:url("data:image/svg+xml;charset=UTF-8,\a \a \a ");right:0}@media (max-width: 800px){.sidebar-toggle{display:none}}.content-wrapper{flex-grow:1;width:75%;position:relative;border-radius:2px 0 0 2px;overflow:hidden;z-index:0}.content-wrapper .copyright{padding:.5rem 1rem .5rem .5rem;text-align:right;font-size:.9rem;color:rgba(212,215,221,0.5)}@media (max-width: 800px){.content-wrapper{width:100%}}@media (min-width: 801px) and (max-width: 1200px){.content-wrapper{width:70%}}.article{background:#14141F;border-radius:2px 0 0 2px;padding:2rem 4rem 3rem}.article--content{max-width:850px;font-size:1.1rem}.article--content h1,.article--content h2,.article--content h3,.article--content h4,.article--content h5,.article--content h6{color:#fff}.article--content h1 a,.article--content h2 a,.article--content h3 a,.article--content h4 a,.article--content h5 a,.article--content h6 a{color:inherit !important;font-weight:inherit !important;text-decoration:none}.article--content h1 a code:after,.article--content h2 a code:after,.article--content h3 a code:after,.article--content h4 a code:after,.article--content h5 a code:after,.article--content h6 a code:after{border:none}.article--content h2+.highlight pre,.article--content h3+.highlight pre,.article--content h4+.highlight pre,.article--content h5+.highlight pre,.article--content h6+.highlight pre{margin-top:.5rem}.article--content h2+pre,.article--content h3+pre,.article--content h4+pre,.article--content h5+pre,.article--content h6+pre{margin-top:.5rem}.article--content h2+.code-tabs-wrapper,.article--content h3+.code-tabs-wrapper,.article--content h4+.code-tabs-wrapper,.article--content h5+.code-tabs-wrapper,.article--content h6+.code-tabs-wrapper{margin-top:0}.article--content h2.monospace,.article--content h3.monospace,.article--content h4.monospace,.article--content h5.monospace,.article--content h6.monospace{font-family:"IBM Plex Mono",monospace}.article--content h2.green,.article--content h3.green,.article--content h4.green,.article--content h5.green,.article--content h6.green{color:#34BB55}.article--content h2.orange,.article--content h3.orange,.article--content h4.orange,.article--content h5.orange,.article--content h6.orange{color:#FF8564}.article--content h2.checkpoint::before,.article--content h3.checkpoint::before,.article--content h4.checkpoint::before,.article--content h5.checkpoint::before,.article--content h6.checkpoint::before{content:'\e93b';font-family:'icomoon-v4';font-size:2.25rem;color:#d30971;display:inline;margin:0 .5rem 0 0;vertical-align:top}.article--content h2[metadata]::after,.article--content h3[metadata]::after,.article--content h4[metadata]::after,.article--content h5[metadata]::after,.article--content h6[metadata]::after{content:attr(metadata);margin-left:.65rem;padding:.1em .5em;color:#fff;background:rgba(255,255,255,0.12);font-size:.75em;font-style:normal;font-weight:500;border-radius:1em;display:inline-block;vertical-align:middle}.article--content h2[date]::after,.article--content h2[note]::after,.article--content h3[date]::after,.article--content h3[note]::after,.article--content h4[date]::after,.article--content h4[note]::after,.article--content h5[date]::after,.article--content h5[note]::after,.article--content h6[date]::after,.article--content h6[note]::after{margin-left:.65rem;opacity:.4;font-size:.75em;font-weight:500;font-style:inherit}.article--content h2[date]::after,.article--content h3[date]::after,.article--content h4[date]::after,.article--content h5[date]::after,.article--content h6[date]::after{content:attr(date)}.article--content h2[note]::after,.article--content h3[note]::after,.article--content h4[note]::after,.article--content h5[note]::after,.article--content h6[note]::after{content:attr(note);font-size:.85em}.article--content h1{font-weight:bold;font-size:2.75rem;margin:.4em 0 .2em}.article--content h2{font-size:2.1rem;margin:-.25rem 0 .5rem;padding-top:1.75rem;font-weight:500;color:#FAFAFC}.article--content h3{font-size:1.75rem;font-weight:500;margin:-1rem 0 .5rem;padding-top:1.75rem}.article--content h4{font-size:1.35rem;font-style:italic;font-weight:500;margin:-1.25rem 0 .5rem;padding-top:1.75rem;color:#FAFAFC}.article--content h5{font-size:1.1rem;margin:-1.25rem 0 .25rem;padding-top:1.75rem}.article--content h6{font-size:1.1rem;font-style:italic;margin:-1.25rem 0 .25rem;padding-top:1.75rem}.article--content p,.article--content li{color:#D4D7DD;line-height:1.8rem}.article--content p{margin:0 0 1.5em}.article--content a{color:#00A3FF;font-weight:500;text-decoration:none}.article--content a:hover{color:#fff}.article--content a.help-link{display:inline-block;width:1rem;height:1rem;border-radius:50%;background:#14141F}.article--content strong{color:#FAFAFC}.article--content img{max-width:100%;margin-bottom:2rem;border-radius:3px;box-shadow:1px 3px 10px #07070E}.article--content ul+p>img{margin-top:1.5rem}.article--content hr{border-width:1px 0 0;border-color:#383846;border-style:solid;margin:1.85rem 0 1.75rem}.article--content .badge{font-size:.7rem;margin:0 .2rem;padding:.1rem .4rem;border-radius:.6rem;font-weight:bold;vertical-align:top}.article--content .badge.dvc{color:#2e7d2e;background-color:#e8f5e8}.article--content .badge.lvc{color:#1976d2;background-color:#e3f2fd}.article--content .badge.experimental{color:#fe9dbc;background-color:rgba(211,9,113,0.12)}.article--content blockquote,.article--content .block{padding:1.65rem 2rem .1rem 2rem;margin:1rem 0 2rem;border-width:0 0 0 4px;border-style:solid;border-radius:0 2px 2px 0;font-size:1.05rem}.article--content blockquote ul:last-child,.article--content blockquote ol:last-child,.article--content .block ul:last-child,.article--content .block ol:last-child{margin-bottom:1.85rem}.article--content blockquote>h2:first-child,.article--content blockquote>h3:first-child,.article--content blockquote>h4:first-child,.article--content blockquote>h5:first-child,.article--content blockquote>h6:first-child,.article--content .block>h2:first-child,.article--content .block>h3:first-child,.article--content .block>h4:first-child,.article--content .block>h5:first-child,.article--content .block>h6:first-child{margin-top:0;padding-top:0.25em}.article--content blockquote.note,.article--content blockquote.tip,.article--content blockquote.important,.article--content blockquote.warning,.article--content blockquote.warn,.article--content blockquote.caution,.article--content .block.note,.article--content .block.tip,.article--content .block.important,.article--content .block.warning,.article--content .block.warn,.article--content .block.caution{position:relative}.article--content blockquote.note:before,.article--content blockquote.tip:before,.article--content blockquote.important:before,.article--content blockquote.warning:before,.article--content blockquote.warn:before,.article--content blockquote.caution:before,.article--content .block.note:before,.article--content .block.tip:before,.article--content .block.important:before,.article--content .block.warning:before,.article--content .block.warn:before,.article--content .block.caution:before{position:absolute;font-family:"alert-icons";font-size:1em;line-height:1em;padding:.3rem;text-align:center;top:-.5rem;left:-.95rem;display:block;border-radius:50%;box-shadow:1px 3px 5px rgba(7,7,14,0.5)}.article--content h2+.note,.article--content h2+.tip,.article--content h2+.important,.article--content h2+.warning,.article--content h2+.caution,.article--content h3+.note,.article--content h3+.tip,.article--content h3+.important,.article--content h3+.warning,.article--content h3+.caution,.article--content h4+.note,.article--content h4+.tip,.article--content h4+.important,.article--content h4+.warning,.article--content h4+.caution,.article--content h5+.note,.article--content h5+.tip,.article--content h5+.important,.article--content h5+.warning,.article--content h5+.caution,.article--content h6+.note,.article--content h6+.tip,.article--content h6+.important,.article--content h6+.warning,.article--content h6+.caution{margin-top:1.25rem}.article--content blockquote{padding:1rem 1rem 1rem 1.25rem;border-color:rgba(212,215,221,0.25)}.article--content blockquote p,.article--content blockquote li{font-size:1.15rem;font-style:italic;color:rgba(212,215,221,0.5)}.article--content blockquote *:last-child{margin-bottom:0}.article--content blockquote .cite{display:block;margin-top:-1rem;font-style:italic;font-size:.85rem;opacity:.8}.article--content>p span.cite{vertical-align:super;line-height:0;font-size:.7rem;font-style:italic}@media (max-width: 600px){.article--content blockquote,.article--content .block{padding:1.35rem 1.25rem .1rem 1.25rem;margin:.5rem 0 1rem}}.article--content .note:before{content:"N";color:#fff;background:#00A3FF}.article--content .note{border-color:#00A3FF;background:rgba(0,163,255,0.1)}.article--content .note h1,.article--content .note h2,.article--content .note h3,.article--content .note h4,.article--content .note h5,.article--content .note h6{color:#fff}.article--content .note h1 a,.article--content .note h2 a,.article--content .note h3 a,.article--content .note h4 a,.article--content .note h5 a,.article--content .note h6 a{color:inherit !important}.article--content .note h1 a:hover,.article--content .note h2 a:hover,.article--content .note h3 a:hover,.article--content .note h4 a:hover,.article--content .note h5 a:hover,.article--content .note h6 a:hover{color:inherit !important}.article--content .note p,.article--content .note li{color:#BEF0FF}.article--content .note strong{color:#fff}.article--content .note a{color:#fff}.article--content .note a code:after{border-color:transparent rgba(0,201,255,0.35) transparent transparent}.article--content .note a:hover{color:#6BDFFF}.article--content .note a:hover code:after{border-color:transparent #6BDFFF transparent transparent}.article--content .note ol li:before{color:#BEF0FF}.article--content .note code,.article--content .note pre{color:#00C9FF;background:#0a071c}.article--content .note img{box-shadow:1px 3px 10px #0F0E15}.article--content .note table{color:#BEF0FF;box-shadow:1px 3px 10px #0F0E15}.article--content .note table thead{background:linear-gradient(45deg, #0B3A8D,#066FC5)}.article--content .note table tr:nth-child(even) td{background:#1b3a58}.article--content .note blockquote{border-color:rgba(190,240,255,0.25)}.article--content .note blockquote p{color:rgba(190,240,255,0.6)}.article--content .note .code-tabs-wrapper .code-tabs a{background:transparent;color:rgba(190,240,255,0.5)}.article--content .note .code-tabs-wrapper .code-tabs a:hover{color:#bef0ff}.article--content .note .code-tabs-wrapper .code-tabs a.is-active{color:#bef0ff;background:#0a071c}.article--content .note hr,.article--content .note .expand{border-color:rgba(0,163,255,0.4) !important}.article--content .note pre::-webkit-scrollbar{background-color:rgba(10,7,28,0);width:12px;height:12px}.article--content .note pre::-webkit-scrollbar-track{background-color:#0a071c;border-radius:0 0 2px 2px}.article--content .note pre::-webkit-scrollbar-thumb{background-color:#192a3a;border:3px solid #0a071c;border-radius:6px}.article--content .note table::-webkit-scrollbar{background-color:rgba(27,58,88,0);width:12px;height:12px}.article--content .note table::-webkit-scrollbar-track{background-color:#1b3a58;border-radius:0 0 2px 2px}.article--content .note table::-webkit-scrollbar-thumb{background-color:#192a3a;border:3px solid #1b3a58;border-radius:6px}.article--content .note .highlight{color:#00C9FF}.article--content .note .highlight .gh,.article--content .note .highlight .go,.article--content .note .highlight .na,.article--content .note .highlight .nt,.article--content .note .highlight .nv,.article--content .note .highlight .ow{color:#00C9FF}.article--content .note .highlight .c,.article--content .note .highlight .ch,.article--content .note .highlight .cm,.article--content .note .highlight .cpf,.article--content .note .highlight .c1,.article--content .note .highlight .cs,.article--content .note .highlight .w{color:#567375}.article--content .note .highlight .gi{background-color:#567375}.article--content .note .highlight .k,.article--content .note .highlight .kc,.article--content .note .highlight .kd,.article--content .note .highlight .kn,.article--content .note .highlight .kp,.article--content .note .highlight .kr,.article--content .note .highlight .nn{color:#00A3FF}.article--content .note .highlight .bp,.article--content .note .highlight .cp,.article--content .note .highlight .dl,.article--content .note .highlight .gt,.article--content .note .highlight .gu,.article--content .note .highlight .kt,.article--content .note .highlight .nb,.article--content .note .highlight .nc,.article--content .note .highlight .no,.article--content .note .highlight .sa,.article--content .note .highlight .sb,.article--content .note .highlight .sc,.article--content .note .highlight .sd,.article--content .note .highlight .se,.article--content .note .highlight .sh,.article--content .note .highlight .sx,.article--content .note .highlight .sr,.article--content .note .highlight .s1,.article--content .note .highlight .s2{color:#009F5F}.article--content .note .highlight .err,.article--content .note .highlight .fm,.article--content .note .highlight .gr,.article--content .note .highlight .gd,.article--content .note .highlight .nd,.article--content .note .highlight .ne,.article--content .note .highlight .nf,.article--content .note .highlight .nl,.article--content .note .highlight .si{color:#BF3D5E}.article--content .note .highlight .m,.article--content .note .highlight .ni,.article--content .note .highlight .mb,.article--content .note .highlight .mf,.article--content .note .highlight .mh,.article--content .note .highlight .mi,.article--content .note .highlight .mo,.article--content .note .highlight .vc,.article--content .note .highlight .vg,.article--content .note .highlight .vi,.article--content .note .highlight .vm,.article--content .note .highlight .il{color:#ff6db0}.article--content .note .highlight .gp,.article--content .note .highlight .o{color:#00A3FF}.article--content .note .highlight .ss{color:#e90}.article--content .note .highlight .language-js .mi+.nx,.article--content .note .highlight .language-js .mf+.nx{color:#ff6db0}.article--content .note .highlight .language-sql .mi+.n{color:#ff6db0}.article--content .tip{border-color:#009F5F;background:rgba(0,159,95,0.12)}.article--content .tip:before{content:"T";color:#fff;background:#009F5F}.article--content .tip h1,.article--content .tip h2,.article--content .tip h3,.article--content .tip h4,.article--content .tip h5,.article--content .tip h6{color:#fff}.article--content .tip h1 a,.article--content .tip h2 a,.article--content .tip h3 a,.article--content .tip h4 a,.article--content .tip h5 a,.article--content .tip h6 a{color:inherit !important}.article--content .tip h1 a:hover,.article--content .tip h2 a:hover,.article--content .tip h3 a:hover,.article--content .tip h4 a:hover,.article--content .tip h5 a:hover,.article--content .tip h6 a:hover{color:inherit !important}.article--content .tip p,.article--content .tip li{color:#67D74E}.article--content .tip strong{color:#fff}.article--content .tip a{color:#C6F98E}.article--content .tip a code:after{border-color:transparent rgba(147,148,255,0.35) transparent transparent}.article--content .tip a:hover{color:#fff}.article--content .tip a:hover code:after{border-color:transparent #fff transparent transparent}.article--content .tip ol li:before{color:#67D74E}.article--content .tip code,.article--content .tip pre{color:#9394FF;background:#040d0e}.article--content .tip img{box-shadow:1px 3px 10px #0F0E15}.article--content .tip table{color:#67D74E;box-shadow:1px 3px 10px #0F0E15}.article--content .tip table thead{background:linear-gradient(45deg, #006F49,#009F5F)}.article--content .tip table tr:nth-child(even) td{background:#1a3c34}.article--content .tip blockquote{border-color:rgba(103,215,78,0.25)}.article--content .tip blockquote p{color:rgba(103,215,78,0.6)}.article--content .tip .code-tabs-wrapper .code-tabs a{background:transparent;color:rgba(103,215,78,0.5)}.article--content .tip .code-tabs-wrapper .code-tabs a:hover{color:#67d74e}.article--content .tip .code-tabs-wrapper .code-tabs a.is-active{color:#67d74e;background:#040d0e}.article--content .tip.flex{font-style:italic;display:flex}.article--content .tip.flex div:first-child{position:relative;margin:.25rem 2rem 0 0}.article--content .tip hr,.article--content .tip .expand{border-color:rgba(0,159,95,0.4) !important}.article--content .tip pre::-webkit-scrollbar{background-color:rgba(4,13,14,0);width:12px;height:12px}.article--content .tip pre::-webkit-scrollbar-track{background-color:#040d0e;border-radius:0 0 2px 2px}.article--content .tip pre::-webkit-scrollbar-thumb{background-color:#162627;border:3px solid #040d0e;border-radius:6px}.article--content .tip table::-webkit-scrollbar{background-color:rgba(26,60,52,0);width:12px;height:12px}.article--content .tip table::-webkit-scrollbar-track{background-color:#1a3c34;border-radius:0 0 2px 2px}.article--content .tip table::-webkit-scrollbar-thumb{background-color:#162627;border:3px solid #1a3c34;border-radius:6px}.article--content .tip .highlight{color:#9394FF}.article--content .tip .highlight .gh,.article--content .tip .highlight .go,.article--content .tip .highlight .na,.article--content .tip .highlight .nt,.article--content .tip .highlight .nv,.article--content .tip .highlight .ow{color:#9394FF}.article--content .tip .highlight .c,.article--content .tip .highlight .ch,.article--content .tip .highlight .cm,.article--content .tip .highlight .cpf,.article--content .tip .highlight .c1,.article--content .tip .highlight .cs,.article--content .tip .highlight .w{color:#567375}.article--content .tip .highlight .gi{background-color:#567375}.article--content .tip .highlight .k,.article--content .tip .highlight .kc,.article--content .tip .highlight .kd,.article--content .tip .highlight .kn,.article--content .tip .highlight .kp,.article--content .tip .highlight .kr,.article--content .tip .highlight .nn{color:#00A3FF}.article--content .tip .highlight .bp,.article--content .tip .highlight .cp,.article--content .tip .highlight .dl,.article--content .tip .highlight .gt,.article--content .tip .highlight .gu,.article--content .tip .highlight .kt,.article--content .tip .highlight .nb,.article--content .tip .highlight .nc,.article--content .tip .highlight .no,.article--content .tip .highlight .sa,.article--content .tip .highlight .sb,.article--content .tip .highlight .sc,.article--content .tip .highlight .sd,.article--content .tip .highlight .se,.article--content .tip .highlight .sh,.article--content .tip .highlight .sx,.article--content .tip .highlight .sr,.article--content .tip .highlight .s1,.article--content .tip .highlight .s2{color:#009F5F}.article--content .tip .highlight .err,.article--content .tip .highlight .fm,.article--content .tip .highlight .gr,.article--content .tip .highlight .gd,.article--content .tip .highlight .nd,.article--content .tip .highlight .ne,.article--content .tip .highlight .nf,.article--content .tip .highlight .nl,.article--content .tip .highlight .si{color:#BF3D5E}.article--content .tip .highlight .m,.article--content .tip .highlight .ni,.article--content .tip .highlight .mb,.article--content .tip .highlight .mf,.article--content .tip .highlight .mh,.article--content .tip .highlight .mi,.article--content .tip .highlight .mo,.article--content .tip .highlight .vc,.article--content .tip .highlight .vg,.article--content .tip .highlight .vi,.article--content .tip .highlight .vm,.article--content .tip .highlight .il{color:#ff6db0}.article--content .tip .highlight .gp,.article--content .tip .highlight .o{color:#00A3FF}.article--content .tip .highlight .ss{color:#e90}.article--content .tip .highlight .language-js .mi+.nx,.article--content .tip .highlight .language-js .mf+.nx{color:#ff6db0}.article--content .tip .highlight .language-sql .mi+.n{color:#ff6db0}.article--content .important{border-color:#9394FF;background:rgba(147,148,255,0.15)}.article--content .important:before{content:"I";color:#fff;background:#9394FF}.article--content .important h1,.article--content .important h2,.article--content .important h3,.article--content .important h4,.article--content .important h5,.article--content .important h6{color:#fff}.article--content .important h1 a,.article--content .important h2 a,.article--content .important h3 a,.article--content .important h4 a,.article--content .important h5 a,.article--content .important h6 a{color:inherit !important}.article--content .important h1 a:hover,.article--content .important h2 a:hover,.article--content .important h3 a:hover,.article--content .important h4 a:hover,.article--content .important h5 a:hover,.article--content .important h6 a:hover{color:inherit !important}.article--content .important p,.article--content .important li{color:#B7B8FF}.article--content .important strong{color:#fff}.article--content .important a{color:#797aff}.article--content .important a code:after{border-color:transparent rgba(159,146,255,0.35) transparent transparent}.article--content .important a:hover{color:#fff}.article--content .important a:hover code:after{border-color:transparent #fff transparent transparent}.article--content .important ol li:before{color:#B7B8FF}.article--content .important code,.article--content .important pre{color:#9f92ff;background:#0a071c}.article--content .important img{box-shadow:1px 3px 10px #11111d}.article--content .important table{color:#B7B8FF;box-shadow:1px 3px 10px #11111d}.article--content .important table thead{background:linear-gradient(45deg, #513CC6,#9394FF)}.article--content .important table tr:nth-child(even) td{background:#1b1b33}.article--content .important blockquote{border-color:rgba(183,184,255,0.25)}.article--content .important blockquote p{color:rgba(183,184,255,0.6)}.article--content .important .code-tabs-wrapper .code-tabs a{background:transparent;color:rgba(183,184,255,0.5)}.article--content .important .code-tabs-wrapper .code-tabs a:hover{color:#b7b8ff}.article--content .important .code-tabs-wrapper .code-tabs a.is-active{color:#b7b8ff;background:#0a071c}.article--content .important hr,.article--content .important .expand{border-color:rgba(147,148,255,0.4) !important}.article--content .important pre::-webkit-scrollbar{background-color:rgba(10,7,28,0);width:12px;height:12px}.article--content .important pre::-webkit-scrollbar-track{background-color:#0a071c;border-radius:0 0 2px 2px}.article--content .important pre::-webkit-scrollbar-thumb{background-color:#56519e;border:3px solid #0a071c;border-radius:6px}.article--content .important table::-webkit-scrollbar{background-color:rgba(27,27,51,0);width:12px;height:12px}.article--content .important table::-webkit-scrollbar-track{background-color:#1b1b33;border-radius:0 0 2px 2px}.article--content .important table::-webkit-scrollbar-thumb{background-color:#56519e;border:3px solid #1b1b33;border-radius:6px}.article--content .important .highlight{color:#9f92ff}.article--content .important .highlight .gh,.article--content .important .highlight .go,.article--content .important .highlight .na,.article--content .important .highlight .nt,.article--content .important .highlight .nv,.article--content .important .highlight .ow{color:#9f92ff}.article--content .important .highlight .c,.article--content .important .highlight .ch,.article--content .important .highlight .cm,.article--content .important .highlight .cpf,.article--content .important .highlight .c1,.article--content .important .highlight .cs,.article--content .important .highlight .w{color:#5f51ac}.article--content .important .highlight .gi{background-color:#5f51ac}.article--content .important .highlight .k,.article--content .important .highlight .kc,.article--content .important .highlight .kd,.article--content .important .highlight .kn,.article--content .important .highlight .kp,.article--content .important .highlight .kr,.article--content .important .highlight .nn{color:#513CC6}.article--content .important .highlight .bp,.article--content .important .highlight .cp,.article--content .important .highlight .dl,.article--content .important .highlight .gt,.article--content .important .highlight .gu,.article--content .important .highlight .kt,.article--content .important .highlight .nb,.article--content .important .highlight .nc,.article--content .important .highlight .no,.article--content .important .highlight .sa,.article--content .important .highlight .sb,.article--content .important .highlight .sc,.article--content .important .highlight .sd,.article--content .important .highlight .se,.article--content .important .highlight .sh,.article--content .important .highlight .sx,.article--content .important .highlight .sr,.article--content .important .highlight .s1,.article--content .important .highlight .s2{color:#009a64}.article--content .important .highlight .err,.article--content .important .highlight .fm,.article--content .important .highlight .gr,.article--content .important .highlight .gd,.article--content .important .highlight .nd,.article--content .important .highlight .ne,.article--content .important .highlight .nf,.article--content .important .highlight .nl,.article--content .important .highlight .si{color:#BF3D5E}.article--content .important .highlight .m,.article--content .important .highlight .ni,.article--content .important .highlight .mb,.article--content .important .highlight .mf,.article--content .important .highlight .mh,.article--content .important .highlight .mi,.article--content .important .highlight .mo,.article--content .important .highlight .vc,.article--content .important .highlight .vg,.article--content .important .highlight .vi,.article--content .important .highlight .vm,.article--content .important .highlight .il{color:#e24bbb}.article--content .important .highlight .gp,.article--content .important .highlight .o{color:#00a5eb}.article--content .important .highlight .ss{color:#e90}.article--content .important .highlight .language-js .mi+.nx,.article--content .important .highlight .language-js .mf+.nx{color:#e24bbb}.article--content .important .highlight .language-sql .mi+.n{color:#e24bbb}.article--content .warn,.article--content .warning{border-color:#FF8564;background:rgba(255,97,133,0.101961)}.article--content .warn:before,.article--content .warning:before{content:"W";color:#fff;background:#FF8564}.article--content .warn h1,.article--content .warn h2,.article--content .warn h3,.article--content .warn h4,.article--content .warn h5,.article--content .warn h6,.article--content .warning h1,.article--content .warning h2,.article--content .warning h3,.article--content .warning h4,.article--content .warning h5,.article--content .warning h6{color:#fff}.article--content .warn h1 a,.article--content .warn h2 a,.article--content .warn h3 a,.article--content .warn h4 a,.article--content .warn h5 a,.article--content .warn h6 a,.article--content .warning h1 a,.article--content .warning h2 a,.article--content .warning h3 a,.article--content .warning h4 a,.article--content .warning h5 a,.article--content .warning h6 a{color:inherit !important}.article--content .warn h1 a:hover,.article--content .warn h2 a:hover,.article--content .warn h3 a:hover,.article--content .warn h4 a:hover,.article--content .warn h5 a:hover,.article--content .warn h6 a:hover,.article--content .warning h1 a:hover,.article--content .warning h2 a:hover,.article--content .warning h3 a:hover,.article--content .warning h4 a:hover,.article--content .warning h5 a:hover,.article--content .warning h6 a:hover{color:inherit !important}.article--content .warn p,.article--content .warn li,.article--content .warning p,.article--content .warning li{color:#FFB6A0}.article--content .warn strong,.article--content .warning strong{color:#fff}.article--content .warn a,.article--content .warning a{color:#FFDCCF !important}.article--content .warn a code:after,.article--content .warning a code:after{border-color:transparent rgba(236,110,110,0.35) transparent transparent}.article--content .warn a:hover,.article--content .warning a:hover{color:#fff !important}.article--content .warn a:hover code:after,.article--content .warning a:hover code:after{border-color:transparent #fff transparent transparent}.article--content .warn ol li:before,.article--content .warning ol li:before{color:#FFB6A0}.article--content .warn code,.article--content .warn pre,.article--content .warning code,.article--content .warning pre{color:#ec6e6e;background:#0d0610}.article--content .warn img,.article--content .warning img{box-shadow:1px 3px 10px #0d0610}.article--content .warn table,.article--content .warning table{color:#FFB6A0;box-shadow:1px 3px 10px #0d0610}.article--content .warn table thead,.article--content .warning table thead{background:linear-gradient(45deg, #F95F53,#FF8564)}.article--content .warn table tr:nth-child(even) td,.article--content .warning table tr:nth-child(even) td{background:#4a2a2a}.article--content .warn blockquote,.article--content .warning blockquote{border-color:rgba(255,182,160,0.25)}.article--content .warn blockquote p,.article--content .warning blockquote p{color:rgba(255,182,160,0.6)}.article--content .warn .code-tabs-wrapper .code-tabs a,.article--content .warning .code-tabs-wrapper .code-tabs a{background:transparent;color:rgba(255,182,160,0.5)}.article--content .warn .code-tabs-wrapper .code-tabs a:hover,.article--content .warning .code-tabs-wrapper .code-tabs a:hover{color:#ffb6a0}.article--content .warn .code-tabs-wrapper .code-tabs a.is-active,.article--content .warning .code-tabs-wrapper .code-tabs a.is-active{color:#ffb6a0;background:#0d0610}.article--content .warn hr,.article--content .warn .expand,.article--content .warning hr,.article--content .warning .expand{border-color:rgba(255,133,100,0.4) !important}.article--content .warn pre::-webkit-scrollbar,.article--content .warning pre::-webkit-scrollbar{background-color:rgba(13,6,16,0);width:12px;height:12px}.article--content .warn pre::-webkit-scrollbar-track,.article--content .warning pre::-webkit-scrollbar-track{background-color:#0d0610;border-radius:0 0 2px 2px}.article--content .warn pre::-webkit-scrollbar-thumb,.article--content .warning pre::-webkit-scrollbar-thumb{background-color:#2a2025;border:3px solid #0d0610;border-radius:6px}.article--content .warn table::-webkit-scrollbar,.article--content .warning table::-webkit-scrollbar{background-color:rgba(74,42,42,0);width:12px;height:12px}.article--content .warn table::-webkit-scrollbar-track,.article--content .warning table::-webkit-scrollbar-track{background-color:#4a2a2a;border-radius:0 0 2px 2px}.article--content .warn table::-webkit-scrollbar-thumb,.article--content .warning table::-webkit-scrollbar-thumb{background-color:#1f181b;border:3px solid #4a2a2a;border-radius:6px}.article--content .warn .highlight,.article--content .warning .highlight{color:#ec6e6e}.article--content .warn .highlight .gh,.article--content .warn .highlight .go,.article--content .warn .highlight .na,.article--content .warn .highlight .nt,.article--content .warn .highlight .nv,.article--content .warn .highlight .ow,.article--content .warning .highlight .gh,.article--content .warning .highlight .go,.article--content .warning .highlight .na,.article--content .warning .highlight .nt,.article--content .warning .highlight .nv,.article--content .warning .highlight .ow{color:#ec6e6e}.article--content .warn .highlight .c,.article--content .warn .highlight .ch,.article--content .warn .highlight .cm,.article--content .warn .highlight .cpf,.article--content .warn .highlight .c1,.article--content .warn .highlight .cs,.article--content .warn .highlight .w,.article--content .warning .highlight .c,.article--content .warning .highlight .ch,.article--content .warning .highlight .cm,.article--content .warning .highlight .cpf,.article--content .warning .highlight .c1,.article--content .warning .highlight .cs,.article--content .warning .highlight .w{color:#844c4c}.article--content .warn .highlight .gi,.article--content .warning .highlight .gi{background-color:#844c4c}.article--content .warn .highlight .k,.article--content .warn .highlight .kc,.article--content .warn .highlight .kd,.article--content .warn .highlight .kn,.article--content .warn .highlight .kp,.article--content .warn .highlight .kr,.article--content .warn .highlight .nn,.article--content .warning .highlight .k,.article--content .warning .highlight .kc,.article--content .warning .highlight .kd,.article--content .warning .highlight .kn,.article--content .warning .highlight .kp,.article--content .warning .highlight .kr,.article--content .warning .highlight .nn{color:#00A3FF}.article--content .warn .highlight .bp,.article--content .warn .highlight .cp,.article--content .warn .highlight .dl,.article--content .warn .highlight .gt,.article--content .warn .highlight .gu,.article--content .warn .highlight .kt,.article--content .warn .highlight .nb,.article--content .warn .highlight .nc,.article--content .warn .highlight .no,.article--content .warn .highlight .sa,.article--content .warn .highlight .sb,.article--content .warn .highlight .sc,.article--content .warn .highlight .sd,.article--content .warn .highlight .se,.article--content .warn .highlight .sh,.article--content .warn .highlight .sx,.article--content .warn .highlight .sr,.article--content .warn .highlight .s1,.article--content .warn .highlight .s2,.article--content .warning .highlight .bp,.article--content .warning .highlight .cp,.article--content .warning .highlight .dl,.article--content .warning .highlight .gt,.article--content .warning .highlight .gu,.article--content .warning .highlight .kt,.article--content .warning .highlight .nb,.article--content .warning .highlight .nc,.article--content .warning .highlight .no,.article--content .warning .highlight .sa,.article--content .warning .highlight .sb,.article--content .warning .highlight .sc,.article--content .warning .highlight .sd,.article--content .warning .highlight .se,.article--content .warning .highlight .sh,.article--content .warning .highlight .sx,.article--content .warning .highlight .sr,.article--content .warning .highlight .s1,.article--content .warning .highlight .s2{color:#009F5F}.article--content .warn .highlight .err,.article--content .warn .highlight .fm,.article--content .warn .highlight .gr,.article--content .warn .highlight .gd,.article--content .warn .highlight .nd,.article--content .warn .highlight .ne,.article--content .warn .highlight .nf,.article--content .warn .highlight .nl,.article--content .warn .highlight .si,.article--content .warning .highlight .err,.article--content .warning .highlight .fm,.article--content .warning .highlight .gr,.article--content .warning .highlight .gd,.article--content .warning .highlight .nd,.article--content .warning .highlight .ne,.article--content .warning .highlight .nf,.article--content .warning .highlight .nl,.article--content .warning .highlight .si{color:#BF3D5E}.article--content .warn .highlight .m,.article--content .warn .highlight .ni,.article--content .warn .highlight .mb,.article--content .warn .highlight .mf,.article--content .warn .highlight .mh,.article--content .warn .highlight .mi,.article--content .warn .highlight .mo,.article--content .warn .highlight .vc,.article--content .warn .highlight .vg,.article--content .warn .highlight .vi,.article--content .warn .highlight .vm,.article--content .warn .highlight .il,.article--content .warning .highlight .m,.article--content .warning .highlight .ni,.article--content .warning .highlight .mb,.article--content .warning .highlight .mf,.article--content .warning .highlight .mh,.article--content .warning .highlight .mi,.article--content .warning .highlight .mo,.article--content .warning .highlight .vc,.article--content .warning .highlight .vg,.article--content .warning .highlight .vi,.article--content .warning .highlight .vm,.article--content .warning .highlight .il{color:#ffb4fb}.article--content .warn .highlight .gp,.article--content .warn .highlight .o,.article--content .warning .highlight .gp,.article--content .warning .highlight .o{color:#00A3FF}.article--content .warn .highlight .ss,.article--content .warning .highlight .ss{color:#e90}.article--content .warn .highlight .language-js .mi+.nx,.article--content .warn .highlight .language-js .mf+.nx,.article--content .warning .highlight .language-js .mi+.nx,.article--content .warning .highlight .language-js .mf+.nx{color:#ffb4fb}.article--content .warn .highlight .language-sql .mi+.n,.article--content .warning .highlight .language-sql .mi+.n{color:#ffb4fb}.article--content .caution{border-color:#d30971;background:rgba(211,9,113,0.12)}.article--content .caution:before{content:"C";color:#fff;background:#d30971}.article--content .caution h1,.article--content .caution h2,.article--content .caution h3,.article--content .caution h4,.article--content .caution h5,.article--content .caution h6{color:#fff}.article--content .caution h1 a,.article--content .caution h2 a,.article--content .caution h3 a,.article--content .caution h4 a,.article--content .caution h5 a,.article--content .caution h6 a{color:inherit !important}.article--content .caution h1 a:hover,.article--content .caution h2 a:hover,.article--content .caution h3 a:hover,.article--content .caution h4 a:hover,.article--content .caution h5 a:hover,.article--content .caution h6 a:hover{color:inherit !important}.article--content .caution p,.article--content .caution li{color:#fe9dbc}.article--content .caution strong{color:#fff}.article--content .caution a{color:#f3d5e1 !important}.article--content .caution a code:after{border-color:transparent rgba(255,103,155,0.35) transparent transparent}.article--content .caution a:hover{color:#fff !important}.article--content .caution a:hover code:after{border-color:transparent #fff transparent transparent}.article--content .caution ol li:before{color:#fe9dbc}.article--content .caution code,.article--content .caution pre{color:#ff679b;background:#0d0610}.article--content .caution img{box-shadow:1px 3px 10px #0f050e}.article--content .caution table{color:#fe9dbc;box-shadow:1px 3px 10px #0f050e}.article--content .caution table thead{background:linear-gradient(45deg, #d30971,#ff598f)}.article--content .caution table tr:nth-child(even) td{background:#391b35}.article--content .caution blockquote{border-color:rgba(254,157,188,0.25)}.article--content .caution blockquote p{color:rgba(254,157,188,0.6)}.article--content .caution .code-tabs-wrapper .code-tabs a{background:transparent;color:rgba(254,157,188,0.5)}.article--content .caution .code-tabs-wrapper .code-tabs a:hover{color:#fe9dbc}.article--content .caution .code-tabs-wrapper .code-tabs a.is-active{color:#fe9dbc;background:#0d0610}.article--content .caution hr,.article--content .caution .expand{border-color:rgba(211,9,113,0.4) !important}.article--content .caution pre::-webkit-scrollbar{background-color:rgba(13,6,16,0);width:12px;height:12px}.article--content .caution pre::-webkit-scrollbar-track{background-color:#0d0610;border-radius:0 0 2px 2px}.article--content .caution pre::-webkit-scrollbar-thumb{background-color:#5c1b38;border:3px solid #0d0610;border-radius:6px}.article--content .caution table::-webkit-scrollbar{background-color:rgba(57,27,53,0);width:12px;height:12px}.article--content .caution table::-webkit-scrollbar-track{background-color:#391b35;border-radius:0 0 2px 2px}.article--content .caution table::-webkit-scrollbar-thumb{background-color:#912a58;border:3px solid #391b35;border-radius:6px}.article--content .caution .highlight{color:#ff679b}.article--content .caution .highlight .gh,.article--content .caution .highlight .go,.article--content .caution .highlight .na,.article--content .caution .highlight .nt,.article--content .caution .highlight .nv,.article--content .caution .highlight .ow{color:#ff679b}.article--content .caution .highlight .c,.article--content .caution .highlight .ch,.article--content .caution .highlight .cm,.article--content .caution .highlight .cpf,.article--content .caution .highlight .c1,.article--content .caution .highlight .cs,.article--content .caution .highlight .w{color:#8f3f5a}.article--content .caution .highlight .gi{background-color:#8f3f5a}.article--content .caution .highlight .k,.article--content .caution .highlight .kc,.article--content .caution .highlight .kd,.article--content .caution .highlight .kn,.article--content .caution .highlight .kp,.article--content .caution .highlight .kr,.article--content .caution .highlight .nn{color:#3d97e5}.article--content .caution .highlight .bp,.article--content .caution .highlight .cp,.article--content .caution .highlight .dl,.article--content .caution .highlight .gt,.article--content .caution .highlight .gu,.article--content .caution .highlight .kt,.article--content .caution .highlight .nb,.article--content .caution .highlight .nc,.article--content .caution .highlight .no,.article--content .caution .highlight .sa,.article--content .caution .highlight .sb,.article--content .caution .highlight .sc,.article--content .caution .highlight .sd,.article--content .caution .highlight .se,.article--content .caution .highlight .sh,.article--content .caution .highlight .sx,.article--content .caution .highlight .sr,.article--content .caution .highlight .s1,.article--content .caution .highlight .s2{color:#947eff}.article--content .caution .highlight .err,.article--content .caution .highlight .fm,.article--content .caution .highlight .gr,.article--content .caution .highlight .gd,.article--content .caution .highlight .nd,.article--content .caution .highlight .ne,.article--content .caution .highlight .nf,.article--content .caution .highlight .nl,.article--content .caution .highlight .si{color:#BF3D5E}.article--content .caution .highlight .m,.article--content .caution .highlight .ni,.article--content .caution .highlight .mb,.article--content .caution .highlight .mf,.article--content .caution .highlight .mh,.article--content .caution .highlight .mi,.article--content .caution .highlight .mo,.article--content .caution .highlight .vc,.article--content .caution .highlight .vg,.article--content .caution .highlight .vi,.article--content .caution .highlight .vm,.article--content .caution .highlight .il{color:#ffa0de}.article--content .caution .highlight .gp,.article--content .caution .highlight .o{color:#3d97e5}.article--content .caution .highlight .ss{color:#e90}.article--content .caution .highlight .language-js .mi+.nx,.article--content .caution .highlight .language-js .mf+.nx{color:#ffa0de}.article--content .caution .highlight .language-sql .mi+.n{color:#ffa0de}.article--content .block.special-state{background:linear-gradient(45deg, #d30971,#9b2aff);padding:4px;border:none;border-radius:25px !important}.article--content .block.special-state .state-content{background:#14141F;border-radius:21px;padding:calc(1.65rem - 4px) calc(2rem - 4px) calc(.1rem + 4px) calc(2rem - 4px)}.article--content .block.special-state .state-content h4{color:#fff}.article--content .block.special-state .state-content p{margin-bottom:1rem}.article--content .block.special-state .state-content .btn{border-radius:4px;background:linear-gradient(45deg, #d30971,#9b2aff)}.article--content .block.special-state .state-content .btn:after{background:linear-gradient(45deg, #a8085a, #7b14d6)}.article--content .block.special-state .state-content .expand-wrapper{border:none;margin:.5rem 0 1.5rem}.article--content .block.special-state .state-content .expand{border:none;padding:0}.article--content .block.special-state .state-content .expand .expand-content p{margin-left:2rem}.article--content .block.special-state .state-content .expand ul{margin-top:-1rem}.article--content .block.special-state .state-content .expand ul.feedback-channels{padding:0;margin:-1rem 0 1.5rem 2rem;list-style:none}.article--content .block.special-state .state-content .expand ul.feedback-channels a{color:#fff;font-weight:500;position:relative}.article--content .block.special-state .state-content .expand ul.feedback-channels a.discord:before{content:url("/svgs/discord.svg");display:inline-block;height:1.1rem;width:1.25rem;vertical-align:top;margin:2px .65rem 0 0}.article--content .block.special-state .state-content .expand ul.feedback-channels a.community:before{content:"\e900";color:#fff;margin:0 .65rem 0 0;font-size:1.2rem;font-family:'icomoon-v2';vertical-align:middle}.article--content .block.special-state .state-content .expand ul.feedback-channels a.slack:before{content:url("/svgs/slack.svg");display:inline-block;height:1.1rem;width:1.1rem;vertical-align:text-top;margin-right:.65rem}.article--content .block.special-state .state-content .expand ul.feedback-channels a.reddit:before{content:url("/svgs/reddit.svg");display:inline-block;height:1.1rem;width:1.2rem;vertical-align:top;margin:2px .65rem 0 0}.article--content .block.special-state .state-content .expand ul.feedback-channels a::after{content:"\e90a";font-family:'icomoon-v4';font-weight:bold;font-size:1.3rem;display:inline-block;position:absolute;background:linear-gradient(45deg, #d30971,#9b2aff);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;right:0;transform:translateX(0.25rem);opacity:0;transition:transform .2s, opacity .2s}.article--content .block.special-state .state-content .expand ul.feedback-channels a:hover::after{transform:translateX(1.5rem);opacity:1}.article--content a.btn{position:relative;display:inline-block;margin:.5rem .25rem .5rem 0;padding:0.85rem 1.5rem;color:#fff !important;border-radius:2px;font-size:1.05rem;z-index:1;background:linear-gradient(45deg, #066FC5,#00A3FF)}.article--content a.btn:after{content:"";position:absolute;display:block;top:0;right:0;width:100%;height:100%;border-radius:2px;background:linear-gradient(45deg, #00A3FF,#6BDFFF);opacity:0;transition:opacity .2s;z-index:-1}.article--content a.btn:hover{cursor:pointer}.article--content a.btn:hover:after{opacity:1}.article--content a.btn.download:before{content:"\e91d";font-family:"icomoon-v2";margin-right:.5rem;font-size:1.1rem}.article--content a.btn.github:before{content:"\eab0";font-family:"icomoon-v2";margin-right:.5rem;font-size:1.1rem}.article--content a.btn.arrow span.CaretOutlineRight{font-size:1.5rem;line-height:0;vertical-align:sub;display:inline-block;margin-right:-.65rem}.article--content a.btn.small{padding:.4rem 1rem}.article--content a.btn.small-plus{padding:.25em;line-height:.65rem}.article--content .select-url{margin:-2.5rem 0 1rem;text-align:right;display:none}.article--content .url-trigger{padding:.25rem .5rem;display:inline-block;font-size:.85rem;font-style:italic;color:rgba(255,255,255,0.5);background:#07070E;border-radius:0 0 2px 2px}.article--content .url-trigger:before{content:"\e924";display:inline-block;margin-right:.35rem;font-family:"icomoon-v2";font-style:normal;font-size:.8rem}.article--content .url-trigger:hover{color:#fff}.article--content li .url-trigger{padding:0rem .5rem}.article--content .code-tab-content .select-url{margin-top:-3.15rem}.article--content .caption{margin:-1.8rem 0 2rem;padding-left:.25rem;font-size:.95rem;font-style:italic}.article--content .caption p{line-height:1.25rem;color:rgba(212,215,221,0.8)}.article--content .caption code{font-size:.9rem}.article--content p+.caption,.article--content li+.caption,.article--content ol+.caption,.article--content ul+.caption{padding:0;margin:-.75rem 0 0;opacity:1}.article--content h2+.caption,.article--content h3+.caption,.article--content h4+.caption,.article--content h5+.caption,.article--content h6+.caption{padding:0;margin:0;opacity:1}.article--content #query-plan-diagram+.caption{margin-top:0}.article--content .children-links h2,.article--content .children-links h3,.article--content .children-links h4,.article--content .list-links h2,.article--content .list-links h3,.article--content .list-links h4{margin-top:-.5rem}.article--content .children-links h2 a a:after,.article--content .children-links h3 a a:after,.article--content .children-links h4 a a:after,.article--content .list-links h2 a a:after,.article--content .list-links h3 a a:after,.article--content .list-links h4 a a:after{content:"\e91a";font-family:"icomoon-v2";color:rgba(255,255,255,0.35);vertical-align:bottom;transition:color .2s;margin-left:.4rem}.article--content .children-links h2 a:hover:after,.article--content .children-links h3 a:hover:after,.article--content .children-links h4 a:hover:after,.article--content .list-links h2 a:hover:after,.article--content .list-links h3 a:hover:after,.article--content .list-links h4 a:hover:after{color:#00A3FF}.article--content .children-links>hr:last-child,.article--content .list-links>hr:last-child{display:none}.article--content ul.children-list+ul{margin-top:-1.25rem}.article--content code,.article--content pre{background:#07070E;font-family:"IBM Plex Mono",monospace;color:#B7B8FF}.article--content p code,.article--content li code,.article--content table code{padding:.1rem .4rem .2rem;border-radius:2px;color:#B7B8FF;white-space:nowrap;font-size:1rem;font-style:normal}.article--content h1 code,.article--content h2 code,.article--content h3 code,.article--content h4 code,.article--content h5 code,.article--content h6 code{padding:inherit !important;background:inherit !important;font-size:inherit !important;font-weight:inherit !important;font-family:"Proxima Nova",sans-serif;color:inherit !important}.article--content a code{font-weight:normal;transition:color .2s;position:relative;color:#00A3FF}.article--content a code:after{content:"";position:absolute;display:block;top:0;right:0;border-style:solid;border-width:0 .4rem .4rem 0;border-color:transparent rgba(0,163,255,0.35) transparent transparent;transition:border .2s}.article--content a:hover code{color:#fff}.article--content a:hover code:after{border-color:transparent #fff transparent transparent}.article--content pre{margin:2rem 0 2.25rem;padding:1.75rem 1.75rem 1.25rem;border-radius:2px;overflow-x:scroll;overflow-y:hidden;font-size:1rem}.article--content pre code{padding:0;line-height:1.7rem;white-space:pre}.article--content pre .api{margin-right:.35rem;padding:.15rem .5rem .25rem;border-radius:2px;color:#fff;font-family:"IBM Plex Mono",monospace;font-weight:bold;font-size:1rem}.article--content pre .api.get{background:#009F5F}.article--content pre .api.post{background:#066FC5}.article--content pre .api.patch{background:#E85B1C}.article--content pre .api.delete{background:#BF3D5E}.article--content pre .api.put{background:#513CC6}.article--content pre.api-endpoint a{position:relative;color:#00A3FF;text-decoration:none}.article--content pre.api-endpoint a:after{content:"\e90d";position:absolute;right:-1.45rem;top:0.65rem;font-family:"icomoon-v4";color:#fff;display:inline-block;font-size:1.1rem;line-height:0;opacity:0;transition:opacity .2s}.article--content pre.api-endpoint a:hover{color:#fff}.article--content pre.api-endpoint a:hover:after{opacity:.6}.article--content span.code-callout,.article--content .code-placeholder{font-weight:bold;margin:0 .15rem}.article--content span.code-callout.green,.article--content .code-placeholder.green{color:#009F5F}.article--content span.code-callout.magenta,.article--content .code-placeholder.magenta{color:#d30971}.article--content span.code-callout.orange,.article--content .code-placeholder.orange{color:#F95F53}.article--content span.code-callout.delete,.article--content span.code-callout.strike,.article--content .code-placeholder.delete,.article--content .code-placeholder.strike{text-decoration:line-through}.article--content .code-placeholder-wrapper{display:inline;position:relative}.article--content .code-placeholder-wrapper .code-placeholder{display:inline-block;margin:0 .15rem;padding:0;line-height:1.4em;color:#e659a2;font-weight:normal;font-style:normal;border-bottom:1px dotted;transition:color .2s;cursor:pointer}.article--content .code-placeholder-wrapper .code-placeholder .code-placeholder-edit-icon{font-style:normal}.article--content .code-placeholder-wrapper .code-placeholder .code-placeholder-edit-icon::before{margin-left:.2rem;font-size:.8em;transition:opacity .2s;opacity:.65;z-index:-1}.article--content .code-placeholder-wrapper .code-placeholder:hover{color:#5ee4e4}.article--content .code-placeholder-wrapper .code-placeholder:hover .code-placeholder-edit-icon::before{opacity:1}.article--content .code-placeholder-wrapper .code-input-wrapper{position:absolute;top:-3px;left:-4.5px;z-index:1;color:inherit}.article--content .code-placeholder-wrapper .code-input-wrapper input.placeholder-edit{width:100%;max-width:100%;border:1px solid #1A1A2A;border-radius:4px;background-color:#1A1A2A;padding:2px 20px 2px 6px;color:#5ee4e4;font-weight:normal}.article--content .code-placeholder-wrapper .code-input-wrapper input.placeholder-edit:focus{outline:none;border-color:rgba(94,228,228,0.75);box-shadow:1px 1px 8px rgba(94,228,228,0.5);border-radius:2px}.article--content .code-placeholder-wrapper .code-input-wrapper:hover{cursor:pointer}.article--content .code-placeholder-wrapper .code-input-wrapper:after{content:"\e937";color:#5ee4e4;font-family:'icomoon-v4';display:block;position:absolute;top:0;right:3px}.article--content .code-placeholder-key code{color:#e659a2 !important}.article--content pre span.tc-dynamic-value{border:1px solid;border-radius:6px;padding:0 .25rem;--param-color: #ff79c6;--param-bg: #ff79c633;--env-color: #0092b8;--env-bg: #0092b833;--secret-color: #9a09ff;--secret-bg: #9809ff33}.article--content pre span.tc-dynamic-value.param{color:var(--param-color);background:var(--param-bg);border-color:var(--param-color)}.article--content pre span.tc-dynamic-value.env{color:var(--env-color);background:var(--env-bg);border-color:var(--env-color)}.article--content pre span.tc-dynamic-value.secret{color:var(--secret-color);background:var(--secret-bg);border-color:var(--secret-color)}@media (max-width: 600px){.article--content pre{padding:1.2em 1.2em .75rem}}.article--content div.columns-wrapper{container-type:inline-size;container-name:columns}.article--content div.columns-2{-moz-columns:2;columns:2}.article--content div.columns-3{-moz-columns:3;columns:3}.article--content div.columns-4{-moz-columns:4;columns:4}.article--content div.columns-2,.article--content div.columns-3,.article--content div.columns-4{margin:1.5rem 0 2.5rem}.article--content div.columns-2>*:first-child,.article--content div.columns-3>*:first-child,.article--content div.columns-4>*:first-child{margin-top:0}@container columns (max-width: 780px){.article--content div.columns-4{-moz-columns:3;columns:3}}@container columns (max-width: 550px){.article--content div.columns-3,.article--content div.columns-4{-moz-columns:2;columns:2}}@container columns (max-width: 350px){.article--content div.columns-2,.article--content div.columns-3,.article--content div.columns-4{-moz-columns:1;columns:1}}.article--content .mermaid{opacity:0;color:#14141F;margin:3rem 0;transition:opacity .5s;font-family:"Proxima Nova",sans-serif}.article--content .mermaid .arrowheadPath,.article--content .mermaid .arrowMarkerPath{fill:#434453 !important}.article--content .mermaid .edgePath .path,.article--content .mermaid .flowchart-link{stroke:#434453 !important}.article--content .mermaid .label,.article--content .mermaid .nodeLabel{color:#D4D7DD !important}.article--content .mermaid .cluster-label .nodeLabel{color:#B7B8FF !important}.article--content .mermaid .edgeLabel{color:#D4D7DD !important;background:#07070E !important;font-size:.85em;font-weight:500}.article--content .mermaid .edgeLabel p{background:#14141F !important}.article--content .mermaid .node rect,.article--content .mermaid .node circle,.article--content .mermaid .node ellipse,.article--content .mermaid .node polygon,.article--content .mermaid .node path{fill:#14141F !important;stroke:#434453 !important;stroke-width:2px !important}.article--content .mermaid .node span.label{color:#D4D7DD !important}.article--content .mermaid .cluster rect,.article--content .mermaid .cluster circle,.article--content .mermaid .cluster ellipse,.article--content .mermaid .cluster polygon,.article--content .mermaid .cluster path{fill:#07070E !important;stroke:none !important}.article--content .mermaid[data-processed="true"]{opacity:1}.article--content .expand-wrapper{margin:2rem 0 2rem}.article--content h5+.expand-wrapper,.article--content h6+.expand-wrapper{margin-top:.75rem}.article--content .expand{position:relative;border-top:1px solid #383846;padding:.75rem 0}.article--content .expand:last-of-type,.article--content .expand:only-child{border-bottom:1px solid #383846}.article--content .expand-label{display:flex;align-items:center;font-weight:bold;margin-bottom:0;padding-right:2.5rem;cursor:pointer}.article--content .expand-label:hover .expand-toggle{background:#00C9FF}.article--content .expand-link{display:block;position:absolute;top:1rem;right:.75rem;min-height:20px;min-width:20px;font-size:1.25rem;color:#FAFAFC;opacity:.3;transition:opacity .2s}.article--content .expand-link:hover{color:#FAFAFC;opacity:1}.article--content .expand-toggle{position:relative;display:inline-block;min-height:20px;min-width:20px;background:#2AA3FF;border-radius:50%;margin-right:.75rem;transition:background-color .2s}.article--content .expand-toggle:before,.article--content .expand-toggle:after{content:"";display:block;width:10px;height:2px;position:absolute;background:#14141F;transition:all .4s;top:9px;left:5px}.article--content .expand-toggle:after{transform:rotate(90deg)}.article--content .expand-toggle.open:before,.article--content .expand-toggle.open:after{transform:rotate(180deg)}.article--content .expand-content{padding-top:1rem}.article--content .feedback{display:flex;justify-content:space-between;border:none;border-radius:2px;box-shadow:1px 2px 6px #07070E;background:rgba(212,215,221,0.03)}.article--content .feedback h4{color:#fff}.article--content .support{padding-right:2rem}.article--content .support ul{margin-bottom:1.25rem;padding:0;list-style:none}.article--content .support ul a{color:#fff;font-weight:500;position:relative}.article--content .support ul a::after{content:"\e90a";font-family:'icomoon-v4';font-weight:bold;font-size:1.3rem;display:inline-block;position:absolute;background:linear-gradient(45deg, #d30971,#9b2aff);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;right:0;transform:translateX(0.25rem);opacity:0;transition:transform .2s, opacity .2s}.article--content .support ul a:hover::after{transform:translateX(1.5rem);opacity:1}.article--content .support ul a.discord:before{content:url("/svgs/discord.svg");display:inline-block;height:1.1rem;width:1.25rem;vertical-align:top;margin:2px .65rem 0 0}.article--content .support ul a.community:before{content:"\e900";color:#fff;margin-right:.75rem;font-size:1.2rem;font-family:'icomoon-v2';vertical-align:middle}.article--content .support ul a.slack:before{content:url("/svgs/slack.svg");display:inline-block;height:1.1rem;width:1.1rem;vertical-align:text-top;margin-right:.8rem}.article--content .support ul a.reddit:before{content:url("/svgs/reddit.svg");display:inline-block;height:1.1rem;width:1.2rem;vertical-align:top;margin:2px .75rem 0 0}.article--content .actions{min-width:230px;padding-bottom:1.75rem}.article--content .actions a{display:block;padding-left:1rem;font-size:.95rem}.article--content .actions a.btn{color:#D4D7DD !important;background:#333346 !important}.article--content .actions a.btn:after{background:linear-gradient(45deg, #066FC5,#00A3FF)}.article--content .actions a.btn:hover{color:#fff !important}.article--content .actions a:before{display:inline-block;margin-right:.7rem;font-family:'icomoon-v2'}.article--content .actions a.edit:before{content:"\e92f";font-size:.85rem}.article--content .actions a.issue:before{content:"\e934";font-size:1rem}.article--content .helpful{position:relative;display:flex;flex-direction:row;justify-content:space-between}.article--content .helpful p{margin-bottom:0}.article--content .helpful label.radio-btns{position:relative;display:inline-block;min-width:4rem;padding:.5rem 1rem;font-size:.95rem;font-weight:500;text-align:center;color:#FAFAFC;border-radius:3px;background:rgba(212,215,221,0.1);cursor:pointer;z-index:1}.article--content .helpful label.radio-btns:after{content:"";display:block;position:absolute;margin:0;padding:0;top:0;left:0;width:100%;height:100%;border-radius:3px;min-width:4rem;z-index:-1;opacity:0;transition:opacity .2s, color .2s}.article--content .helpful label.radio-btns#helpful:after{background:linear-gradient(45deg, #009F5F,#34BB55)}.article--content .helpful label.radio-btns#not-helpful:after{background:linear-gradient(45deg, #F95F53,#FF8564)}.article--content .helpful label.radio-btns:hover{color:#fff}.article--content .helpful label.radio-btns:hover:after{opacity:1}.article--content .helpful input[type='radio']{display:none}.article--content .helpful .loader-wrapper,.article--content .helpful #thank-you{position:absolute;display:none;top:0;left:0;width:100%;height:100%;background-color:#14141F}.article--content .helpful .loader-wrapper{z-index:5}.article--content .helpful .loader-wrapper .loader{margin:0 auto}.article--content .helpful #thank-you{z-index:10}.article--content .helpful #thank-you p{text-align:center}@media (max-width: 800px){.article--content .feedback{flex-direction:column}}@media (max-width: 600px){.article--content .actions{padding-bottom:1rem}}.article--content .flex-wrapper{display:flex;flex-wrap:wrap;margin:1.5rem 0}.article--content .flex-container{margin-right:1.5rem}.article--content .flex-container.half{width:calc(50% - 1.5rem)}.article--content .flex-container.third{width:calc(33.33% - 1.5rem)}.article--content .flex-container.quarter{width:calc(25% - 1.5rem)}.article--content .flex-container.two-thirds{width:calc(66% - 2rem)}.article--content .flex-container.half table:not(:last-child),.article--content .flex-container.third table:not(:last-child),.article--content .flex-container.quarter table:not(:last-child){margin-right:1.5rem}.article--content .flex-container img{margin-bottom:0}.article--content .flex-container table{display:table}.article--content .flex-container p:last-child{margin-bottom:0.5rem}.article--content .flex-container.operator-example .highlight:first-child .codeblock pre{margin-top:0;margin-bottom:1.5rem}.article--content .flex-container.operator-example table:first-child{margin-top:0;margin-bottom:1.5rem}.article--content .flex-container.operator-example table:first-child th{font-size:1.05rem}.article--content .flex-container.operator-example table:first-child th,.article--content .flex-container.operator-example table:first-child td{padding:.65rem 1.15rem}@media (max-width: 600px){.article--content .flex-container.half,.article--content .flex-container.third,.article--content .flex-container.two-thirds{width:calc(100% - 1rem)}.article--content .flex-container.quarter{width:calc(50% - 1rem)}.article--content .flex-container p:last-child{margin-bottom:1.5rem}}.article--content h2:after,.article--content h3:after,.article--content h4:after{content:attr(data-type);display:inline-block;margin-left:.5rem;font-style:italic;font-size:.62em;font-weight:200;opacity:.5}.article--content .function-list a.experimental::after{content:'\e903';font-family:'icomoon-v4';margin-left:.45rem;color:rgba(212,215,221,0.35);font-style:normal;display:inline-block;vertical-align:middle}.article--content #flux-group-keys-demo table{margin-bottom:1.25rem}.article--content #flux-group-keys-demo table td:first-child,.article--content #flux-group-keys-demo table th:first-child{text-align:left}.article--content #flux-group-keys-demo table td:last-child,.article--content #flux-group-keys-demo table th:last-child{text-align:right}.article--content #flux-group-keys-demo table td.grouped-by,.article--content #flux-group-keys-demo table th.grouped-by{font-weight:bold}.article--content #flux-group-keys-demo table th.grouped-by{color:#D6F622}.article--content #flux-group-keys-demo table td.grouped-by{color:#D6F622}.article--content #flux-group-keys-demo #group-by-columns .column-list{padding:0;margin:.5rem 0 0;list-style:none}.article--content #flux-group-keys-demo #group-by-columns .column-list li{margin:0;line-height:1.35rem}.article--content #flux-group-keys-demo #group-by-columns label{display:inline-block;padding:.25rem 0;color:#D4D7DD;position:relative}.article--content #flux-group-keys-demo #group-by-columns label:after{content:attr(data-count);margin-left:0;font-size:.85rem;opacity:.5}.article--content #flux-group-keys-demo #group-by-columns .checkbox{display:inline-block;position:relative;height:1.15em;width:1.15em;background:rgba(212,215,221,0.05);margin-right:.3rem;vertical-align:text-top;border-radius:2px;cursor:pointer;border:1.5px solid rgba(212,215,221,0.2);-webkit-user-select:none;-moz-user-select:none;user-select:none}.article--content #flux-group-keys-demo #group-by-columns input[type='checkbox']{margin-right:-1.1rem;padding:0;vertical-align:top;opacity:0;cursor:pointer}.article--content #flux-group-keys-demo #group-by-columns input[type='checkbox']+.checkbox:after{content:"";display:block;position:absolute;height:.5rem;width:.5rem;border-radius:50%;background:#00A3FF;top:50%;left:50%;opacity:0;transform:scale(2) translate(-20%, -20%);transition:all .2s}.article--content #flux-group-keys-demo #group-by-columns input[type='checkbox']:checked+.checkbox:after{opacity:1;transform:scale(1) translate(-50%, -50%)}.article--content #flux-group-keys-demo pre#group-by-example{line-height:1.4rem;font-size:.95rem}.article--content #flux-group-keys-demo pre#group-by-example .nx{color:#00A3FF}.article--content #flux-group-keys-demo pre#group-by-example .s2{color:#009F5F}.article--content .flux-water-diagram{background:url("/img/flux/0-x-water-process-dark.svg");margin:2rem 0 .5rem;width:100%;height:0;padding-top:63.71%;background-repeat:no-repeat}.article--content #flux-data-model{max-width:500px;margin:3rem 0}.article--content #flux-data-model .stream-of-tables{position:relative;border:1px dashed #D4D7DD;padding:1rem;border-radius:4px}.article--content #flux-data-model .stream-of-tables:before{content:"Stream of tables";font-weight:500;color:#FAFAFC;background:#14141F;position:absolute;padding:0 1rem;top:-.65rem}.article--content #flux-data-model table{display:table;width:100%;overflow:visible;margin:0}.article--content #flux-data-model table th,.article--content #flux-data-model table td{border-right:1px dashed rgba(212,215,221,0.25)}.article--content #flux-data-model table th:last-child,.article--content #flux-data-model table td:last-child{border:none}.article--content #flux-data-model table th{border-color:rgba(255,255,255,0.25)}.article--content #flux-data-model .table-group{padding:1rem}.article--content #flux-data-model .table-group:first-child{border:1px dashed #D4D7DD;border-radius:2px;position:relative;margin-bottom:.25rem}.article--content #flux-data-model .table-group:first-child:before{content:"Table";font-weight:500;color:#FAFAFC;background:#14141F;position:absolute;padding:0 .75rem;top:-.65rem;right:1rem}.article--content #flux-data-model .table-group:nth-child(2) th:first-child{border:none}.article--content #flux-data-model .table-group:nth-child(2) th:nth-child(2){border-top:1px dashed #D4D7DD;border-left:1px dashed rgba(255,255,255,0.85);border-right:1px dashed rgba(255,255,255,0.85);position:relative}.article--content #flux-data-model .table-group:nth-child(2) th:nth-child(2):before{content:"Column";font-weight:500;color:#fff,0.85;position:absolute;top:.2rem;left:.5rem}.article--content #flux-data-model .table-group:nth-child(2) td:first-child{border:none}.article--content #flux-data-model .table-group:nth-child(2) td:nth-child(2){border-left:1px dashed #D4D7DD;border-right:1px dashed #D4D7DD}.article--content #flux-data-model .table-group:nth-child(2) tr:last-child td:nth-child(2){border-bottom:1px dashed #D4D7DD}.article--content #flux-data-model .table-group:nth-child(3) tr:nth-child(2){border-top:1px dashed #D4D7DD;border-bottom:1px dashed #D4D7DD}.article--content #flux-data-model .table-group:nth-child(3) tr:nth-child(2) td:first-child{border-left:1px dashed #D4D7DD;position:relative}.article--content #flux-data-model .table-group:nth-child(3) tr:nth-child(2) td:first-child:before{content:"Row";font-weight:500;color:#FAFAFC;position:absolute;top:.15rem;left:.5rem}.article--content #flux-data-model .table-group:nth-child(3) tr:nth-child(2) td:last-child{border-right:1px dashed #D4D7DD}.article--content #flux-table-ops{display:flex;justify-content:space-between;align-items:center;max-width:650px;margin-bottom:2rem}.article--content #flux-table-ops .stream-of-tables{flex-grow:1}.article--content #flux-table-ops .stream-of-tables:first-child{padding-left:0}.article--content #flux-table-ops .stream-of-tables:last-child{padding-right:0}.article--content #flux-table-ops .operation{display:flex;flex-grow:1;align-items:center}.article--content #flux-table-ops .operation .arrow{position:relative;background:#D4D7DD;flex-grow:1;height:1px;margin:0 .75rem;opacity:.35}.article--content #flux-table-ops .operation .arrow:after{content:"";position:absolute;width:0;height:0;border-style:solid;border-width:7px 0 7px 8px;border-color:transparent transparent transparent #D4D7DD;right:-1px;top:-7px}.article--content #flux-table-ops .operation p{margin:0;text-align:center}.article--content #flux-table-ops table{display:table;width:100%;overflow:visible;margin:1rem 0}.article--content #flux-table-ops table th,.article--content #flux-table-ops table td{border-right:1px dashed rgba(212,215,221,0.25)}.article--content #flux-table-ops table th:last-child,.article--content #flux-table-ops table td:last-child{border:none}.article--content #flux-table-ops table th{border-color:rgba(255,255,255,0.25)}@media (max-width: 600px){.article--content #flux-table-ops th:last-child,.article--content #flux-table-ops td:last-child{display:none}.article--content #flux-table-ops th:nth-child(2),.article--content #flux-table-ops td:nth-child(2){border:none}.article--content #flux-table-ops th:nth-child(2){border-radius:0 2px 0 0}.article--content #flux-table-ops tr:last-child td:nth-child(2){border-radius:0 0 2px 0}}.article--content .fs-diagram{display:inline-block;margin:1rem 0 2rem;padding:1.5rem 2.5rem 1.5rem 1.5rem;font-family:"IBM Plex Mono",monospace;border-radius:2px;box-shadow:1px 3px 10px #07070E}.article--content .fs-diagram>ul{padding:0;margin:0}.article--content .fs-diagram>ul li{line-height:2rem;color:#B7B8FF}.article--content .fs-diagram>ul ul{padding-left:2rem;margin:0}.article--content .fs-diagram>ul ul li{position:relative;margin:0 0 0 -1.45rem;padding-left:1.45rem;line-height:2.5rem;border-left:1px solid #B7B8FF}.article--content .fs-diagram>ul ul li:before{content:"";display:inline-block;width:1rem;height:.25rem;margin-right:.55rem;margin-left:-1.45rem;border-top:1px solid #B7B8FF}.article--content .fs-diagram>ul ul li:last-child{border:none}.article--content .fs-diagram>ul ul li:last-child:after{content:"";position:absolute;margin:0;padding:0;left:0;top:0;height:1.4rem;border-left:1px solid #B7B8FF}.article--content .fs-diagram ul{list-style:none}.article--content #shard-diagram,.article--content #data-retention{display:flex;flex-direction:column;max-width:550px;margin:2.5rem auto 3rem}.article--content #shard-diagram p,.article--content #data-retention p{margin-bottom:0;line-height:1.25em}.article--content #shard-diagram .periods,.article--content #data-retention .periods{display:flex;flex-direction:row;justify-content:space-between}.article--content #shard-diagram .timeline,.article--content #data-retention .timeline{display:flex;flex-direction:row;margin-top:.25rem;padding:0 .5rem}.article--content #shard-diagram .timeline .interval,.article--content #data-retention .timeline .interval{border-top:1px solid #D4D7DD;border-right:1px solid #D4D7DD;height:.75rem;flex-grow:1}.article--content #shard-diagram .timeline .interval:first-child,.article--content #data-retention .timeline .interval:first-child{border-left:1px solid #D4D7DD}.article--content #shard-diagram .timeline .one-quarter,.article--content #data-retention .timeline .one-quarter{width:25%;height:.75rem}.article--content #shard-diagram .timeline .three-quarters,.article--content #data-retention .timeline .three-quarters{width:75%;height:.75rem}.article--content #shard-diagram .timeline .border-left,.article--content #data-retention .timeline .border-left{border-left:1px solid #D4D7DD}.article--content #shard-diagram .timeline .retention-label,.article--content #data-retention .timeline .retention-label{position:relative}.article--content #shard-diagram .timeline .retention-label:before,.article--content #data-retention .timeline .retention-label:before{content:"";display:inline-block;width:.65rem;margin-right:.5rem;border-top:1px solid #D4D7DD;vertical-align:middle}.article--content #shard-diagram .timeline .deleted-label,.article--content #data-retention .timeline .deleted-label{color:#BF3D5E;text-align:center;font-size:.9rem}.article--content #shard-diagram .shard-groups,.article--content #data-retention .shard-groups{display:flex;flex-direction:row;justify-content:space-around;margin-top:.25rem;padding:.5rem;line-height:1rem}.article--content #shard-diagram .shard-groups .shard-group,.article--content #data-retention .shard-groups .shard-group{margin:0 .25rem;text-align:center;padding:.5rem;border-radius:.5rem;background:#262738;flex-grow:1;box-shadow:2px 2px 8px #07070E}.article--content #shard-diagram .shard-groups .shard-group p:first-child,.article--content #data-retention .shard-groups .shard-group p:first-child{margin-bottom:.75rem}.article--content #shard-diagram .shard-groups .shard-group .shard,.article--content #data-retention .shard-groups .shard-group .shard{display:block;margin-top:.5rem;padding:.65rem 1rem;color:#fff;border-radius:.25rem;background:linear-gradient(90deg, #8E1FC3,#066FC5);background-attachment:fixed}.article--content #shard-diagram .shard-groups .shard-group.deleted,.article--content #data-retention .shard-groups .shard-group.deleted{opacity:.3}.article--content #shard-diagram .shard-groups .shard-group.deleted .shard,.article--content #data-retention .shard-groups .shard-group.deleted .shard{background:linear-gradient(45deg, #BF3D5E,#DC4E58)}.article--content .series-diagram{display:flex;width:-moz-fit-content;width:fit-content;max-width:100%;margin:1rem 3.25rem 1.75rem 0;padding-right:1.5rem;border-right:2px solid #D6F622}.article--content .series-diagram table{margin:0}.article--content .series-diagram:after{content:"Series";top:4rem;right:-3.5rem}.article--content .series-diagram:last-child{margin-bottom:3rem}.article--content table tr.point{border:2px solid #D6F622}.article--content table tr.point:after{content:"Point";bottom:-.8rem;left:1rem}.article--content .series-diagram,.article--content table tr.point{position:relative}.article--content .series-diagram:after,.article--content table tr.point:after{color:#202028;background:#D6F622;border-radius:2px;position:absolute;font-size:.9rem;font-weight:500;padding:.2rem .5rem;line-height:.9rem}.article--content .sql table tr.points{position:relative}.article--content .sql table tr.points td:first-child:before,.article--content .sql table tr.points td:first-child:after{display:block;border-radius:2px;position:absolute;font-size:.9rem;font-weight:500;padding:.2rem .5rem;line-height:.9rem;z-index:1;top:-.25rem;opacity:0;transition:opacity .2s, top .2s}.article--content .sql table tr.points td:first-child:before{content:"Point 1";color:#fff;background:#d30971}.article--content .sql table tr.points td:first-child:after{content:"Point 2";color:#202028;background:#D6F622;left:5rem}.article--content .sql table tr.points:hover td:first-child:before,.article--content .sql table tr.points:hover td:first-child:after{opacity:1;top:-.65rem}.article--content .sql table span.point{position:relative;display:inline-block}.article--content .sql table span.point.one:before{content:"";display:block;position:absolute;width:100%;height:2px;border-top:2px solid #d30971;bottom:-2px}.article--content .sql table span.point.two:after{content:"";display:block;position:absolute;width:100%;height:2px;border-top:2px solid #D6F622;bottom:-8px}.article--content #line-protocol-anatomy{overflow:scroll;margin:3rem 0 2.5rem}.article--content #line-protocol-anatomy p{padding:3rem 0 2rem;white-space:nowrap;font-family:"IBM Plex Mono",monospace;overflow:visible;text-align:center}.article--content #line-protocol-anatomy p span{padding:.75rem 0 .75rem}.article--content #line-protocol-anatomy p span.el{position:relative;border-top:2px solid #D6F622}.article--content #line-protocol-anatomy p span.el:before{display:block;position:absolute;font-family:"Proxima Nova",sans-serif;font-size:.95rem;color:#D6F622;font-weight:500;top:-2.75rem;left:50%;transform:translateX(-50%)}.article--content #line-protocol-anatomy p span.el:after{content:"";display:block;position:absolute;height:1rem;width:2px;top:-1rem;left:50%;transform:translateX(-50%);background:#D6F622}.article--content #line-protocol-anatomy p span.el.measurement:before{content:"measurement"}.article--content #line-protocol-anatomy p span.el.tagset:before{content:"tag set"}.article--content #line-protocol-anatomy p span.el.fieldset:before{content:"field set"}.article--content #line-protocol-anatomy p span.el.timestamp:before{content:"timestamp"}.article--content #line-protocol-anatomy p span.whitespace,.article--content #line-protocol-anatomy p span.comma{position:relative;border-bottom:2px solid #D6F622}.article--content #line-protocol-anatomy p span.whitespace:before,.article--content #line-protocol-anatomy p span.comma:before{white-space:nowrap;display:block;position:absolute;font-family:"Proxima Nova",sans-serif;font-size:.95rem;color:#D6F622;font-weight:500;bottom:-2.75rem;left:50%;transform:translateX(-50%)}.article--content #line-protocol-anatomy p span.whitespace:after,.article--content #line-protocol-anatomy p span.comma:after{content:"";display:block;position:absolute;height:1rem;width:2px;bottom:-1rem;left:50%;transform:translateX(-50%);background:#D6F622}.article--content #line-protocol-anatomy p span.whitespace.whitespace:before,.article--content #line-protocol-anatomy p span.comma.whitespace:before{content:attr(data-whitespace) " whitespace"}.article--content #line-protocol-anatomy p span.whitespace.comma:before,.article--content #line-protocol-anatomy p span.comma.comma:before{content:attr(data-whitespace) "1st comma"}.article--content #line-protocol-anatomy.v3 p span.measurement::before{content:"table"}.article--content #line-protocol-anatomy.hide-elements p span.el{border:none}.article--content #line-protocol-anatomy.hide-elements p span.el:before,.article--content #line-protocol-anatomy.hide-elements p span.el:after{display:none}.article--content #line-protocol-anatomy.hide-commas p span.comma{border:none}.article--content #line-protocol-anatomy.hide-commas p span.comma:before,.article--content #line-protocol-anatomy.hide-commas p span.comma:after{display:none}.article--content #line-protocol-anatomy.hide-whitespace p span.whitespace{border:none}.article--content #line-protocol-anatomy.hide-whitespace p span.whitespace:before,.article--content #line-protocol-anatomy.hide-whitespace p span.whitespace:after{display:none}.article--content #influxql-window-diagram{min-width:520px;overflow:scroll;display:flex;flex-direction:row}.article--content #influxql-window-diagram #timerange-label{position:relative;width:.7rem;margin:10.5rem .5rem 6.5rem .5rem;border-width:1px 0 1px 1px;border-style:solid;border-color:rgba(212,215,221,0.3)}.article--content #influxql-window-diagram #timerange-label::before{content:"Queried time range";display:block;position:absolute;background:#14141F;padding:0 .75rem;font-weight:500;font-size:.9rem;color:rgba(212,215,221,0.5);transform:rotate(-90deg);white-space:nowrap;top:13.5rem;left:-4.7rem}.article--content #influxql-window-diagram td{font-weight:medium;color:#FAFAFC}.article--content #influxql-window-diagram td span.exclude{opacity:.35;font-weight:normal}.article--content #influxql-window-diagram .windows{display:flex;flex-direction:column;justify-content:space-between;padding:4rem 0 2.5rem .25rem}.article--content #influxql-window-diagram .window-hour{justify-content:space-between;height:100%;margin-bottom:.5rem;border-left:1px solid rgba(212,215,221,0.3);flex:1 1 0;position:relative}.article--content #influxql-window-diagram .window-hour::before,.article--content #influxql-window-diagram .window-hour::after{content:"";position:absolute;display:block;width:9px;height:1px;left:-10px;border-top:1px solid rgba(212,215,221,0.3)}.article--content #influxql-window-diagram .window-hour::before{top:0}.article--content #influxql-window-diagram .window-hour::after{bottom:-1px}.article--content #influxql-window-diagram .window-hour p{white-space:nowrap;margin-top:.55rem;position:relative}.article--content #influxql-window-diagram .window-hour p::before{content:"";display:inline-block;margin-right:.5rem;width:1rem;height:0;border-top:1px solid rgba(212,215,221,0.3);vertical-align:middle}.article--content #influxql-window-diagram .window-hour p::after{content:"Predefined window boundary";display:block;position:absolute;top:1.25rem;left:1.5rem;font-size:.9rem;font-weight:500;color:rgba(212,215,221,0.5)}.article--content .scaling-strategy{margin:2rem 0 3rem}.article--content .scaling-strategy .node{border:2px solid #D4D7DD;border-radius:6px;height:6rem;width:4rem}.article--content .scaling-strategy .dashed{border-style:dashed;border-color:rgba(212,215,221,0.5)}.article--content .scaling-strategy .outer{height:auto;width:-moz-fit-content;width:fit-content;position:relative}.article--content .scaling-strategy .inner{margin:2rem 1.25rem -2px}.article--content .scaling-strategy.horizontal{display:flex}.article--content .scaling-strategy.horizontal .node:not(:first-child){margin-left:1.25rem}.article--content #query-plan-diagram{display:flex;flex-direction:column;font-size:1rem;margin:3rem 0 3.5rem;max-width:800px}.article--content #query-plan-diagram .plan-column{padding:0 .5rem}.article--content #query-plan-diagram .plan-block{background:#07070E;color:#B7B8FF;text-align:center;padding:1rem 1.5rem;border-radius:4px}.article--content #query-plan-diagram .plan-arrow{margin:.5rem auto;height:1.5rem;width:1px;border-left:1px solid #B7B8FF;position:relative}.article--content #query-plan-diagram .plan-arrow:before{content:"\25B2";position:absolute;top:.25rem;left:-.32rem;color:#B7B8FF;line-height:0}.article--content #query-plan-diagram .plan-arrow.split{width:50%;margin-top:2rem;height:1rem;display:flex;justify-content:center;border-width:1px 1px 0 1px;border-style:solid;border-color:#B7B8FF}.article--content #query-plan-diagram .plan-arrow.split:before{position:relative;top:-1.25rem;left:-0.26rem;width:0;margin-left:.2rem}.article--content #query-plan-diagram .plan-arrow.split:after{content:"";display:block;height:1rem;width:0;border-left:1px solid #B7B8FF;margin:-1rem 0}.article--content #query-plan-diagram .plan-single-column{display:flex;justify-content:center}.article--content #query-plan-diagram .plan-double-column{display:flex;justify-content:space-around}.article--content #sso-auth-flow{max-width:650px;margin:2rem auto}.article--content #sso-auth-flow .row{display:flex}.article--content #sso-auth-flow .row.left{justify-content:start}.article--content #sso-auth-flow .row.center{justify-content:center}.article--content #sso-auth-flow .row.right{justify-content:end}.article--content #sso-auth-flow .auth-item{margin:1rem;color:#fff;display:flex;justify-content:center;align-items:center;flex-direction:column;padding:1.5rem 1.75rem;background:linear-gradient(-135deg, #8E1FC3,#066FC5);border-radius:4px;min-width:220px;min-height:90px;text-align:center;font-weight:500}.article--content #sso-auth-flow #auth0::after,.article--content #sso-auth-flow #idp::after{display:block;margin-top:.25rem;font-weight:normal;font-style:italic;font-size:1rem;opacity:.75}.article--content #sso-auth-flow #auth0::after{content:"Managed by InfluxData"}.article--content #sso-auth-flow #idp::after{content:"Managed by you"}.article--content #sso-auth-flow .arrow{display:block;width:65px;height:65px;position:relative;display:flex;justify-content:center;align-items:center;color:#D4D7DD;border-style:dashed;border-color:#D4D7DD}.article--content #sso-auth-flow .arrow.right:before,.article--content #sso-auth-flow .arrow.left:before{content:attr(step);background:#14141F;font-size:.9rem;width:1.5rem;height:1.5rem;border:1px solid #D4D7DD;text-align:center;line-height:1.5rem;border-radius:50%}.article--content #sso-auth-flow .arrow.right:after,.article--content #sso-auth-flow .arrow.left:after{position:absolute;line-height:0;font-size:1.35rem}.article--content #sso-auth-flow .arrow.right{border-radius:0 100% 0 0;border-width:2px 2px 0 0;align-self:flex-end}.article--content #sso-auth-flow .arrow.right:before{translate:45% -45%}.article--content #sso-auth-flow .arrow.right:after{content:"⏷";bottom:0;right:-.4rem}.article--content #sso-auth-flow .arrow.left{border-radius:0 0 0 100%;border-width:0 0 2px 2px;align-self:flex-start}.article--content #sso-auth-flow .arrow.left:before{translate:-45% 45%}.article--content #sso-auth-flow .arrow.left:after{content:"⏶";top:0;left:-.4rem}@media (max-width: 600px){.article--content #sso-auth-flow{max-width:350px;margin:6rem auto}.article--content #sso-auth-flow .row{flex-direction:column;margin:-50px 0}.article--content #sso-auth-flow .auth-item{margin:.5rem 0}.article--content #sso-auth-flow .arrow{width:2rem;height:55px}.article--content #sso-auth-flow .arrow.right,.article--content #sso-auth-flow .arrow.left{border-width:0 2px 0 0;border-radius:0}.article--content #sso-auth-flow .arrow.right{align-self:flex-start;margin-left:4rem}.article--content #sso-auth-flow .arrow.right:before{translate:60% -15%}.article--content #sso-auth-flow .arrow.left{align-self:flex-end;margin-right:6rem}.article--content #sso-auth-flow .arrow.left:before{translate:60% 10%}.article--content #sso-auth-flow .arrow.left:after{right:-.4rem;left:unset}}.article--content #quix-downsample-pipeline{margin:3rem auto}.article--content #quix-downsample-pipeline .logo-row{display:flex}.article--content #quix-downsample-pipeline .logo-row.top{justify-content:flex-start;margin-bottom:-2.6rem}.article--content #quix-downsample-pipeline .logo-row.top .quix-connector{margin-top:.5rem}.article--content #quix-downsample-pipeline .logo-row.bottom{justify-content:flex-end;margin-top:-2.6rem}.article--content #quix-downsample-pipeline .influxdb-connector{display:flex;flex-direction:column;align-items:center;width:29%}.article--content #quix-downsample-pipeline .influxdb-logo{background:url("/svgs/influxdb-logo-white.svg");width:175px;height:55px;background-repeat:no-repeat;background-size:contain;position:relative}.article--content #quix-downsample-pipeline .influxdb-logo:after{content:attr(data-precision) " data db";position:absolute;bottom:-2px;left:45px;width:100%;color:#D4D7DD;font-style:italic;font-size:1rem}.article--content #quix-downsample-pipeline .quix-connector{display:block;height:80px;width:20px;position:relative}.article--content #quix-downsample-pipeline .quix-connector:before{content:"";display:block;height:100%;width:100%;background-color:#D4D7DD;-webkit-mask-image:url("/svgs/quix-connector-plug.svg");mask-image:url("/svgs/quix-connector-plug.svg");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;background-size:contain}.article--content #quix-downsample-pipeline .quix-connector:after{content:"Connector";display:block;position:absolute;top:1.5rem;left:1.75rem;padding:.25rem .5rem;color:#D4D7DD;font-size:1rem;font-style:italic;background-color:#14141F;border-radius:6px;border:1.5px solid rgba(212,215,221,0.5);box-shadow:2px 2px 6px rgba(15,14,21,0.5)}.article--content #quix-downsample-pipeline .quix-stream-container{display:flex;flex-direction:row;border:2px dashed #D4D7DD;background:rgba(212,215,221,0.1);border-radius:8px;padding:2.5rem;justify-content:space-between;align-items:center}.article--content #quix-downsample-pipeline .quix-stream-component{padding:1rem;border-radius:4px;border-style:dashed;border-width:2px;position:relative}.article--content #quix-downsample-pipeline .quix-stream-component p{margin:0;line-height:1.2rem;font-size:1rem;text-align:center;color:#FAFAFC}.article--content #quix-downsample-pipeline .quix-stream-component:before{content:url("/svgs/quix-python-heart.svg");display:block;position:absolute;width:40px;height:40px;top:-15px;left:-15px;filter:drop-shadow(2px 0px 0px #14141F) drop-shadow(-2px 0px 0px #14141F) drop-shadow(0px 2px 0px #14141F) drop-shadow(0px -2px 0px #14141F)}.article--content #quix-downsample-pipeline .quix-stream-component#source-producer{background:rgba(42,163,255,0.2);border-color:#2AA3FF}.article--content #quix-downsample-pipeline .quix-stream-component#downsampling-process{background:rgba(191,47,229,0.2);border-color:#BF2FE5}.article--content #quix-downsample-pipeline .quix-stream-component#sink-consumer{background:rgba(244,141,56,0.2);border-color:#F48D38}.article--content #quix-downsample-pipeline .arrow{margin:.5rem .75rem .5rem .5rem;height:2px;width:auto;min-width:25px;background:#D4D7DD;position:relative}.article--content #quix-downsample-pipeline .arrow:after{content:"▶";position:absolute;right:-4px;top:-.48em;font-size:.75rem;color:#D4D7DD}.article--content #quix-downsample-pipeline .kafka-toggle{display:flex;justify-content:flex-end;width:60px;min-width:60px;height:40px;border-radius:20px;background:#07070E;position:relative}.article--content #quix-downsample-pipeline .kafka-toggle:after{content:"TOPIC:\a" attr(topic);position:absolute;width:215%;color:#D4D7DD;text-align:center;font-style:italic;bottom:-42px;font-size:.9rem;left:-60%;white-space:pre-wrap}.article--content #quix-downsample-pipeline .kafka-toggle .toggle-icon{display:block;height:34px;width:34px;margin:3px;border-radius:50%;background:url("/svgs/apache-kafka-icon.svg");background-color:#fff;background-size:86%;background-position:90%;background-repeat:no-repeat}.article--content #quix-downsample-pipeline #quix-brand-icons{height:50px;display:flex;align-items:flex-start;margin-top:-3rem}.article--content #quix-downsample-pipeline #quix-brand-icons>*{height:45px;display:inline-block;background-color:#0F0E15;border-radius:6px;margin-right:.25rem;box-shadow:0 1px 10px rgba(255,255,255,0.1)}.article--content #quix-downsample-pipeline #quix-brand-icons>* img{margin:0;box-shadow:none;border-radius:0;height:100%}.article--content #quix-downsample-pipeline #quix-brand-icons .quix-logo{padding:.75rem}.article--content #quix-downsample-pipeline #quix-brand-icons .quix-streams-logo{position:relative;padding:.6rem}.article--content #quix-downsample-pipeline #quix-brand-icons .quix-streams-logo::after{content:"Quix\A Streams";display:inline-block;white-space:pre-wrap;font-size:.92rem;font-weight:500;color:#fff;line-height:.9rem;margin-left:.15rem}.article--content table.window-frame-units.groups .group{position:relative;outline-style:solid;outline-width:3px;outline-offset:-5px;border-radius:10px}.article--content table.window-frame-units.groups .group::before{content:"Row Group";display:block;padding:.25rem .5rem;position:absolute;top:3px;left:3px;border-radius:4px;color:#fff;font-size:.8rem;font-weight:bold;text-transform:uppercase;letter-spacing:.02em;box-shadow:4px 4px 4px #14141F}.article--content table.window-frame-units.groups .group td:nth-child(2),.article--content table.window-frame-units.groups .group td:nth-child(3){font-weight:bold;text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:5px}.article--content table.window-frame-units.groups .group:nth-of-type(1){outline-color:#d30971}.article--content table.window-frame-units.groups .group:nth-of-type(1)::before{background:#d30971}.article--content table.window-frame-units.groups .group:nth-of-type(1) td:nth-child(2),.article--content table.window-frame-units.groups .group:nth-of-type(1) td:nth-child(3){text-decoration-color:#d30971}.article--content table.window-frame-units.groups .group:nth-of-type(2){outline-color:#9b2aff}.article--content table.window-frame-units.groups .group:nth-of-type(2)::before{background:#9b2aff}.article--content table.window-frame-units.groups .group:nth-of-type(2) td:nth-child(2),.article--content table.window-frame-units.groups .group:nth-of-type(2) td:nth-child(3){text-decoration-color:#9b2aff}.article--content table.window-frame-units.groups .group:nth-of-type(3){outline-color:#2AA3FF}.article--content table.window-frame-units.groups .group:nth-of-type(3)::before{background:#2AA3FF}.article--content table.window-frame-units.groups .group:nth-of-type(3) td:nth-child(2),.article--content table.window-frame-units.groups .group:nth-of-type(3) td:nth-child(3){text-decoration-color:#2AA3FF}.article--content table.window-frame-units.groups .group:nth-of-type(4){outline-color:#0B3A8D}.article--content table.window-frame-units.groups .group:nth-of-type(4)::before{background:#0B3A8D}.article--content table.window-frame-units.groups .group:nth-of-type(4) td:nth-child(2),.article--content table.window-frame-units.groups .group:nth-of-type(4) td:nth-child(3){text-decoration-color:#0B3A8D}.article--content table.window-frame-units.groups-with-frame .frame,.article--content table.window-frame-units.groups-with-frame tr.current-row{position:relative;outline-style:solid;outline-width:3px;outline-offset:-5px;border-radius:10px}.article--content table.window-frame-units.groups-with-frame .frame::after,.article--content table.window-frame-units.groups-with-frame tr.current-row::after{display:block;padding:.25rem .5rem;position:absolute;top:3px;left:3px;border-radius:4px;color:#fff;font-size:.8rem;font-weight:bold;text-transform:uppercase;letter-spacing:.02em;box-shadow:4px 4px 4px #14141F}.article--content table.window-frame-units.groups-with-frame .frame tr:nth-child(n + 1):nth-child(-n + 3) td,.article--content table.window-frame-units.groups-with-frame tr.current-row tr:nth-child(n + 1):nth-child(-n + 3) td{text-decoration-color:#d30971}.article--content table.window-frame-units.groups-with-frame .frame tr:nth-child(n + 4):nth-child(-n + 6) td,.article--content table.window-frame-units.groups-with-frame tr.current-row tr:nth-child(n + 4):nth-child(-n + 6) td{text-decoration-color:#BF2FE5}.article--content table.window-frame-units.groups-with-frame .frame tr:nth-child(n + 7):nth-child(-n + 8) td,.article--content table.window-frame-units.groups-with-frame tr.current-row tr:nth-child(n + 7):nth-child(-n + 8) td{text-decoration-color:#2AA3FF}.article--content table.window-frame-units.groups-with-frame .frame td:nth-child(n + 2):nth-child(-n + 3),.article--content table.window-frame-units.groups-with-frame tr.current-row td:nth-child(n + 2):nth-child(-n + 3){font-weight:bold;text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:5px}.article--content table.window-frame-units.groups-with-frame tr.current-row{outline-color:#d30971}.article--content table.window-frame-units.groups-with-frame tr.current-row::after{content:"Current Row";background:#d30971}.article--content table.window-frame-units.groups-with-frame tr.current-row td{text-decoration-color:#2AA3FF !important}.article--content table.window-frame-units.groups-with-frame .frame{outline-color:#9b2aff}.article--content table.window-frame-units.groups-with-frame .frame::after{content:"Frame";background:#9b2aff}.article--content table.window-frame-units.groups-with-frame .group{position:relative;outline-color:#0B3A8D}.article--content table.window-frame-units.groups-with-frame .group td:nth-child(2),.article--content table.window-frame-units.groups-with-frame .group td:nth-child(3){font-weight:bold;text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:5px;text-decoration-color:#0B3A8D}.article--content table.window-frame-units.range-interval .frame,.article--content table.window-frame-units.range-interval tr.current-row{position:relative;outline-style:solid;outline-width:3px;outline-offset:-5px;border-radius:10px}.article--content table.window-frame-units.range-interval .frame td:first-child,.article--content table.window-frame-units.range-interval tr.current-row td:first-child{font-weight:bold;text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:5px;text-decoration-color:#9b2aff}.article--content table.window-frame-units.range-interval .frame::after,.article--content table.window-frame-units.range-interval tr.current-row::after{display:block;padding:.25rem .5rem;position:absolute;top:3px;right:3px;border-radius:4px;color:#fff;font-size:.8rem;font-weight:bold;text-transform:uppercase;letter-spacing:.02em;box-shadow:-4px 4px 4px #14141F}.article--content table.window-frame-units.range-interval tr.current-row{outline-color:#d30971}.article--content table.window-frame-units.range-interval tr.current-row td:first-child{text-decoration-color:#d30971}.article--content table.window-frame-units.range-interval tr.current-row::after{content:"Current Row";background:#d30971;box-shadow:-4px 4px 4px #262738}.article--content table.window-frame-units.range-interval .frame{outline-color:#9b2aff}.article--content table.window-frame-units.range-interval .frame::after{content:"Frame";background:#9b2aff}.article--content table.window-frame-units.range-numeric .frame,.article--content table.window-frame-units.range-numeric tr.current-row,.article--content table.window-frame-units.rows .frame,.article--content table.window-frame-units.rows tr.current-row{position:relative;outline-style:solid;outline-width:3px;outline-offset:-5px;border-radius:10px}.article--content table.window-frame-units.range-numeric .frame::after,.article--content table.window-frame-units.range-numeric tr.current-row::after,.article--content table.window-frame-units.rows .frame::after,.article--content table.window-frame-units.rows tr.current-row::after{display:block;padding:.25rem .5rem;position:absolute;top:3px;left:3px;border-radius:4px;color:#fff;font-size:.8rem;font-weight:bold;text-transform:uppercase;letter-spacing:.02em;box-shadow:4px 4px 4px #14141F}.article--content table.window-frame-units.range-numeric tr.current-row,.article--content table.window-frame-units.rows tr.current-row{outline-color:#d30971}.article--content table.window-frame-units.range-numeric tr.current-row::after,.article--content table.window-frame-units.rows tr.current-row::after{content:"Current Row";background:#d30971}.article--content table.window-frame-units.range-numeric .frame,.article--content table.window-frame-units.rows .frame{outline-color:#9b2aff}.article--content table.window-frame-units.range-numeric .frame::after,.article--content table.window-frame-units.rows .frame::after{content:"Frame";background:#9b2aff}.article--content table.window-frame-units.range-numeric .frame td:nth-child(3){font-weight:bold;text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:5px;text-decoration-color:#9b2aff}.article--content table.window-frame-units.range-numeric .frame tr.current-row td:nth-child(3){text-decoration-color:#d30971}@media (max-width: 1280px){.article--content #quix-downsample-pipeline{max-width:325px}.article--content #quix-downsample-pipeline .logo-row .influxdb-connector{width:100%}.article--content #quix-downsample-pipeline .quix-stream-container{flex-direction:column}.article--content #quix-downsample-pipeline .arrow{margin:.5rem .5rem .75rem .5rem;width:2px;min-width:2px;height:auto;min-height:25px}.article--content #quix-downsample-pipeline .arrow:after{content:"▼";right:-4.25px;bottom:-.5em;top:unset;font-size:1rem}.article--content #quix-downsample-pipeline .kafka-toggle{margin-bottom:1.5rem}.article--content #quix-downsample-pipeline .kafka-toggle:after{content:"TOPIC: " attr(topic);width:400%;bottom:-25px;left:-150%}.article--content #quix-downsample-pipeline #quix-brand-icons{margin-top:1.5rem;align-items:center;justify-content:center}}@media (max-width: 600px){.article--content #shard-diagram{flex-direction:row}.article--content #shard-diagram .periods{flex-direction:column;margin-right:.5rem}.article--content #shard-diagram .timeline{flex-direction:column;padding:.5rem 0}.article--content #shard-diagram .timeline .interval{width:.75rem;border-top:none;border-right:none;border-left:1px solid #D4D7DD;border-bottom:1px solid #D4D7DD}.article--content #shard-diagram .timeline .interval:first-child{border-top:1px solid #D4D7DD}.article--content #shard-diagram .shard-groups{flex-direction:column}.article--content #shard-diagram .shard-groups .shard-group{margin:.25rem 0}.article--content .series-diagram{width:auto}.article--content #influxql-window-diagram{justify-content:flex-start;min-width:300px}.article--content #influxql-window-diagram .window-hour{width:60px}.article--content #influxql-window-diagram .window-hour p{transform:rotate(-90deg);position:relative;margin-top:8.75rem;font-size:.95rem}.article--content #influxql-window-diagram .window-hour p::before{transform:rotate(90deg);position:absolute;top:-.5rem;left:4.5rem}.article--content #influxql-window-diagram .window-hour p::after{left:0}}.article--content .influxdbu-banner{background-color:#020a47;margin:2.5rem 0 3rem;padding:2.5rem;border-radius:1.5rem;box-shadow:2px 2px 8px #07070E;background-image:url("/svgs/home-bg-circle-right.svg");background-size:cover;display:flex;justify-content:space-between;align-items:center}.article--content .influxdbu-banner .influxdbu-logo{max-width:170px;margin:0 0 1rem;box-shadow:none}.article--content .influxdbu-banner .banner-content{margin-right:1rem;max-width:65%}.article--content .influxdbu-banner .banner-content h4{margin-top:-1.75rem;font-size:1.5rem;font-style:normal;color:#fff}.article--content .influxdbu-banner .banner-content p{margin-bottom:0;color:#fff}.article--content .influxdbu-banner .banner-content p strong{color:#fff}.article--content .influxdbu-banner .banner-cta{position:relative}.article--content .influxdbu-banner .banner-cta a{display:block;position:relative;padding:1rem 1.5rem;color:#fff;text-align:center;border-radius:2px;background:linear-gradient(45deg, #d30971,#9b2aff);z-index:1}.article--content .influxdbu-banner .banner-cta a:after{content:"";position:absolute;padding:0;top:0;right:0;width:100%;height:100%;border-radius:2px;background:linear-gradient(270deg, #771cc7,#b2025b);transition:opacity .2s;z-index:-1;opacity:0}.article--content .influxdbu-banner .banner-cta a:hover:after{opacity:1}@media (max-width: 600px){.article--content .influxdbu-banner{flex-direction:column}.article--content .influxdbu-banner .banner-content{max-width:100%}.article--content .influxdbu-banner .banner-content h4{margin-top:-1.25rem}.article--content .influxdbu-banner .banner-cta{margin-top:1.75rem;width:100%}}.article--content .influxql-table-meta p{font-size:.9rem;line-height:1.25rem}.article--content .influxql-table-meta p:last-child{margin-bottom:0rem}.article--content table+.influxql-table-meta{margin-top:-1.5rem}.article--content .keybinding{font-family:"Proxima Nova",sans-serif}.article--content .keybinding code{font-family:"Proxima Nova",sans-serif}.article--content .keybinding.osx code{font-family:-apple-system,BlinkMacSystemFont,"Proxima Nova",sans-serif,"Helvetica Neue",Arial,sans-serif}.article--content .keybinding code.osx{font-family:-apple-system,BlinkMacSystemFont,"Proxima Nova",sans-serif,"Helvetica Neue",Arial,sans-serif}.article--content #list-filters{display:flex;flex-flow:row wrap;align-items:flex-start}.article--content #list-filters .filter-category{flex:1 1 200px;margin:0 1.25rem 1.25rem 0;max-width:33%}.article--content #list-filters .filter-category.two-columns{flex:1 2 400px;max-width:66%}.article--content #list-filters .filter-category.two-columns .filter-list{-moz-columns:2;columns:2}.article--content #list-filters h5{border-bottom:1px solid rgba(212,215,221,0.25);padding-bottom:.65rem}.article--content #list-filters .filter-list{padding:0;margin:.5rem 0 0;list-style:none}.article--content #list-filters .filter-list li{margin:0;line-height:1.35rem}.article--content #list-filters label{display:block;padding:.25rem 0;color:#D4D7DD;position:relative}.article--content #list-filters label:after{content:attr(data-count);margin-left:0;font-size:.85rem;opacity:.5}.article--content #list-filters .checkbox{display:inline-block;position:relative;height:1.15em;width:1.15em;background:rgba(212,215,221,0.05);margin-right:.3rem;vertical-align:text-top;border-radius:2px;cursor:pointer;border:1.5px solid rgba(212,215,221,0.2);-webkit-user-select:none;-moz-user-select:none;user-select:none}.article--content #list-filters input[type='checkbox']{margin-right:-1.1rem;padding:0;vertical-align:top;opacity:0;cursor:pointer}.article--content #list-filters input[type='checkbox']+.checkbox:after{content:"";display:block;position:absolute;height:.5rem;width:.5rem;border-radius:50%;background:#00A3FF;top:50%;left:50%;opacity:0;transform:scale(2) translate(-20%, -20%);transition:all .2s}.article--content #list-filters input[type='checkbox']:checked+.checkbox:after{opacity:1;transform:scale(1) translate(-50%, -50%)}@media (max-width: 1100px){.article--content #list-filters .filter-category{max-width:50%}.article--content #list-filters .filter-category.two-columns,.article--content #list-filters .filter-category.three-columns{max-width:100%}}@media (max-width: 600px){.article--content #list-filters .filter-category{max-width:100%}}.article--content ol,.article--content ul{padding-left:1.6rem;margin:1rem 0 1.5rem 0}.article--content ol ol,.article--content ol ul,.article--content ul ol,.article--content ul ul{margin:0}.article--content ul{list-style-type:disc}.article--content ul li:before{content:"" !important;display:none}.article--content ul ol{list-style:revert}.article--content ul ol li::marker{font-weight:bold;color:#FAFAFC}.article--content ol{list-style:none;counter-reset:item}.article--content ol li{position:relative;counter-increment:item}.article--content ol li:before{content:counter(item) ". ";position:absolute;left:-1.6em;color:#FAFAFC;font-weight:bold}.article--content ol li>ol li:before{content:counter(item, lower-latin) ". "}.article--content ol li>ol li ol li:before{content:counter(item) ". "}.article--content ol li>ol li ol li ol li:before{content:counter(item, lower-latin) ". "}.article--content ol li>ol li ol li ol li ol li:before{content:counter(item) ". "}.article--content ol li ul{counter-reset:item}.article--content ol li ul>ol{counter-reset:item}.article--content li{margin:.25rem 0}.article--content li:not(:last-child)>p:only-child{margin-bottom:0}.article--content li p+ul,.article--content li p+ol{margin:-.9rem 0 .5rem}.article--content li .list-note{font-size:.85rem}.article--content li h4,.article--content li h5,.article--content li h6{margin-top:1em;padding-top:0}.article--content em.op90,.article--content span.op90,.article--content strong.op90{opacity:.9}.article--content em.op85,.article--content span.op85,.article--content strong.op85{opacity:.85}.article--content em.op80,.article--content span.op80,.article--content strong.op80{opacity:.8}.article--content em.op75,.article--content span.op75,.article--content strong.op75{opacity:.75}.article--content em.op70,.article--content span.op70,.article--content strong.op70{opacity:.7}.article--content em.op65,.article--content span.op65,.article--content strong.op65{opacity:.65}.article--content em.op60,.article--content span.op60,.article--content strong.op60{opacity:.6}.article--content em.op55,.article--content span.op55,.article--content strong.op55{opacity:.55}.article--content em.op50,.article--content span.op50,.article--content strong.op50{opacity:.5}.article--content em.op45,.article--content span.op45,.article--content strong.op45{opacity:.45}.article--content em.op40,.article--content span.op40,.article--content strong.op40{opacity:.4}.article--content em.op35,.article--content span.op35,.article--content strong.op35{opacity:.35}.article--content em.op30,.article--content span.op30,.article--content strong.op30{opacity:.3}.article--content em.op25,.article--content span.op25,.article--content strong.op25{opacity:.25}.article--content em.op20,.article--content span.op20,.article--content strong.op20{opacity:.2}.article--content em.op15,.article--content span.op15,.article--content strong.op15{opacity:.15}.article--content em.op10,.article--content span.op10,.article--content strong.op10{opacity:.1}.article--content .page-nav-btns{display:flex;justify-content:space-between;margin:3rem 0 1rem}.article--content .page-nav-btns .btn{display:flex;max-width:49%;text-align:center;align-items:center}.article--content .page-nav-btns .btn.prev{margin:0 auto 0 0;padding:.75rem 1.25rem .75rem .75rem}.article--content .page-nav-btns .btn.prev:before{content:"\e90a";display:inline-block;font-family:"icomoon-v2";margin-right:.5rem;vertical-align:middle}.article--content .page-nav-btns .btn.next{margin:0 0 0 auto;padding:.75rem .75rem .75rem 1.25rem;flex-direction:row-reverse}.article--content .page-nav-btns .btn.next:before{content:"\e90c";display:inline-block;font-family:"icomoon-v2";margin-left:.5rem;vertical-align:middle}.article--content .page-nav-btns .btn:only-child{max-width:none}.article--content .related{border-top:1px solid #383846;padding-top:1.5rem}.article--content .related h4{font-size:1.15rem}.article--content .related ul{list-style:none;padding:0;margin-top:0}.article--content .related li{margin:.5rem 0;line-height:1.25rem}.article--content .expand-wrapper+.related{border-top:none;margin-top:-2rem}.article--content #release-toc{margin:2rem 0 3rem}.article--content #release-toc ul{list-style:none;overflow:hidden;padding-left:0;margin-bottom:.75rem;transition:height .2s}.article--content #release-toc ul li{line-height:1.2em;margin:.5rem 0}.article--content #release-toc ul li::after{content:attr(date);font-size:1rem;margin-left:.5rem;color:rgba(212,215,221,0.5)}.article--content #release-toc.clustered ul{padding-left:1.5rem}.article--content #release-toc.clustered ul .checkpoint{margin-left:-1.5rem}.article--content #release-toc.clustered ul .checkpoint::before{content:'\e93b' !important;font-family:'icomoon-v4';color:#d30971;display:inline-block;margin:0 .5rem 0 0;vertical-align:top}.article--content #release-toc .show-more{color:#00A3FF;transition:color .2s;font-weight:500;font-size:1rem}.article--content #release-toc .show-more::before{content:'\e935';font-family:'icomoon-v4';font-size:.9rem;color:#14141F;background:#00A3FF;border-radius:50%;margin-right:.5rem;transition:background .15s}.article--content #release-toc .show-more:hover{cursor:pointer;color:#fff}.article--content #release-toc .show-more:hover::before{background:#fff}.article--content pre::-webkit-scrollbar{background-color:rgba(7,7,14,0);width:12px;height:12px}.article--content pre::-webkit-scrollbar-track{background-color:#07070E;border-radius:0 0 2px 2px}.article--content pre::-webkit-scrollbar-thumb{background-color:#292933;border:3px solid #07070E;border-radius:6px}.article--content table::-webkit-scrollbar{background-color:rgba(38,39,56,0);width:12px;height:12px}.article--content table::-webkit-scrollbar-track{background-color:#262738;border-radius:0 0 2px 2px}.article--content table::-webkit-scrollbar-thumb{background-color:#0F0E15;border:3px solid #262738;border-radius:6px}.article--content svg[id^='geo-s2-cells-']{max-width:250px}.article--content svg[id^='geo-s2-cells-'] .geo-cell{fill:rgba(42,163,255,0.25);stroke:#2AA3FF;stroke-width:3;stroke-linejoin:round;stroke-miterlimit:10}.article--content svg[id^='geo-s2-cells-'] .geo-region{fill:rgba(206,88,235,0.35);stroke:#CE58EB;stroke-width:3;stroke-linejoin:round;stroke-miterlimit:10}.article--content svg[id^='geo-s2-cells-'] .geo-point{fill:#D6F622}.article--content svg#timed-moving-average{margin:1rem 0 3rem;max-width:425px}.article--content svg#timed-moving-average .st0{stroke:#D4D7DD}.article--content svg#timed-moving-average .st1{fill:#D4D7DD}.article--content svg#timed-moving-average .st2{font-family:"Proxima Nova",sans-serif;font-weight:500}.article--content svg#join-diagram{display:block;max-width:250px;margin:1rem 0 2rem}.article--content svg#join-diagram.center{margin:0 auto 2rem auto}.article--content svg#join-diagram.small{max-width:125px}.article--content svg#join-diagram.small path{stroke-width:3}.article--content svg#join-diagram path{stroke:#D4D7DD;stroke-width:2;stroke-miterlimit:10;fill:none}.article--content svg#join-diagram.inner path#center{fill:rgba(212,215,221,0.35)}.article--content svg#join-diagram.left path#left,.article--content svg#join-diagram.left path#center{fill:rgba(212,215,221,0.35)}.article--content svg#join-diagram.right path#center,.article--content svg#join-diagram.right path#right{fill:rgba(212,215,221,0.35)}.article--content svg#join-diagram.full path#left,.article--content svg#join-diagram.full path#center,.article--content svg#join-diagram.full path#right{fill:rgba(212,215,221,0.35)}.article--content svg#influxdb-v3-storage-architecture{margin:2rem 0 3rem;max-width:750px}.article--content svg#influxdb-v3-storage-architecture .shape{fill:none;stroke:#D4D7DD;stroke-width:1.5;stroke-miterlimit:10}.article--content svg#influxdb-v3-storage-architecture .shape.op70{opacity:0.7}.article--content svg#influxdb-v3-storage-architecture .shape.op50{opacity:0.5}.article--content svg#influxdb-v3-storage-architecture .shape.op25{opacity:0.25}.article--content svg#influxdb-v3-storage-architecture .shape.dashed{stroke-width:1;stroke-dasharray:4,3}.article--content svg#influxdb-v3-storage-architecture .title{fill:#9394FF;font-weight:500;font-size:20px}.article--content svg#influxdb-v3-storage-architecture .text{fill:#D4D7DD;font-size:18px}.article--content svg#influxdb-v3-storage-architecture .text.small{font-size:16px}.article--content svg#influxdb-v3-storage-architecture .text.bold{font-weight:500;color:#FAFAFC}.article--content svg#influxdb-v3-storage-architecture .text.italic{font-style:italic}.article--content svg#influxdb-v3-storage-architecture .diagram-line{fill:none;stroke:#D6F622;stroke-width:1.5;stroke-miterlimit:10}.article--content svg#influxdb-v3-storage-architecture .diagram-line.dashed{stroke-dasharray:2,4}.article--content svg#influxdb-v3-storage-architecture .arrow{fill:#D6F622}@media (max-width: 600px){.article--content svg#join-diagram{margin:1rem auto 2rem}}.article--content span.key-geo-cell{display:inline-block;vertical-align:middle;margin:0 .5rem .25rem 0;width:1.1em;height:1.1em;border:2px solid #2AA3FF;background:rgba(42,163,255,0.25);border-radius:2px}.article--content span.key-geo-region{display:inline-block;vertical-align:middle;margin:0 .5rem .25rem 0;width:1.1em;height:1.1em;border:2px solid #CE58EB;background:rgba(206,88,235,0.35);border-radius:2px}.article--content span.key-geo-point{display:inline-block;margin:0 .7rem 0 .25rem;width:.65rem;height:.65rem;border-radius:50%;background:#D6F622}.article--content .tabs-wrapper{margin:2.5rem 0 .5rem}.article--content .code-tabs-wrapper{margin:1.5rem 0 .5rem}.article--content .tabs p{display:flex;flex-wrap:wrap}.article--content .tabs a{flex-grow:1;margin:2px;position:relative;font-size:1rem;font-weight:500;padding:.65rem 1.25rem;display:inline-block;white-space:nowrap;text-align:center;color:#A4A8B6 !important;border-radius:2px;background-color:#07070E;transition:background-color .2s, color .2s;z-index:1}.article--content .tabs a:after{content:"";position:absolute;display:block;top:0;right:0;width:100%;height:100%;border-radius:2px;background:linear-gradient(45deg, #066FC5,#00A3FF);opacity:0;transition:opacity .2s;z-index:-1}.article--content .tabs a:hover{color:#fff !important}.article--content .tabs a:hover:after{opacity:1}.article--content .tabs a.is-active{color:#fff !important}.article--content .tabs a.is-active:after{opacity:1;background:linear-gradient(45deg, #066FC5,#00A3FF)}.article--content .tabs.small p{justify-content:flex-start}.article--content .tabs.small a{flex-grow:unset;padding:.35rem 1rem}.article--content .tabs.small .tab-view-output{padding:.5rem .5rem 0;font-size:.9rem;opacity:.65;font-style:italic;transition:opacity .2s}.article--content .tabs.small .tab-view-output:before{content:"\e97a";margin-right:0.25em;font-family:'icomoon-v3';font-style:normal}.article--content .tabs.small a.is-active+.tab-view-output{opacity:0}.article--content .tabs.medium p{justify-content:flex-start}.article--content .tabs.medium a{flex-grow:unset}.article--content .tabs.even-wrap a{flex-basis:25%}.article--content .code-tabs p{margin:0;text-align:right;display:block}.article--content .code-tabs a{padding:.1rem .75rem;margin:0;border-radius:2px 2px 0 0;display:inline-block;font-size:1rem;background:#14141F;color:rgba(255,255,255,0.5)}.article--content .code-tabs a:hover{color:#fff}.article--content .code-tabs a.is-active{background-color:#07070E;color:#fff}.article--content .code-tab-content{padding:0}.article--content .code-tab-content pre{margin:0 0 3rem;border-radius:2px 0 2px 2px}.article--content .tab-content,.article--content .code-tabs-content{margin:.75rem 0 3rem;width:100%}.article--content .tab-content>:not(table,.fs-diagram,img),.article--content .code-tabs-content>:not(table,.fs-diagram,img){width:100%;margin-left:0}.article--content .tab-content table:last-child,.article--content .code-tabs-content table:last-child{margin-bottom:0}.article--content .tab-content:not(:first-of-type){display:none}.article--content .code-tab-content:not(:first-of-type){display:none}.article--content table{display:inline-block;margin:1rem 1rem 3rem 0;border-spacing:0;color:#D4D7DD;max-width:100%;overflow-x:auto;overflow-y:hidden;box-shadow:1px 3px 10px #07070E;border-radius:2px}.article--content table th,.article--content table td{padding:.85rem 1.25rem}.article--content table thead{background:linear-gradient(90deg, #8E1FC3,#066FC5);background-attachment:fixed}.article--content table th{color:#fff}.article--content table th strong{color:#fff}.article--content table th:first-child{border-radius:2px 0 0 0}.article--content table th:last-child{border-radius:0 2px 0 0}.article--content table td{font-size:1.05rem;line-height:1.5em}.article--content table td code{font-size:.95rem}.article--content table tr:nth-child(even){background:#262738}.article--content table tr:last-child td:first-child{border-radius:0 0 0 2px}.article--content table tr:last-child td:last-child{border-radius:0 0 2px 0}.article--content table img{margin-bottom:0}.article--content table.cloud-urls a{white-space:nowrap}.article--content table.cloud-urls p{margin:0 0 .5rem 0}.article--content table.cloud-urls p:last-child{margin-bottom:0}.article--content table.cloud-urls .cluster-name{font-weight:500;color:#FAFAFC}.article--content table+table{margin-top:-1.5rem}.article--content #flags:not(.no-shorthand)+table td:nth-child(2) code,.article--content #options:not(.no-shorthand)+table td:nth-child(2) code,.article--content #global-flags+table td:nth-child(2) code,.article--content #global-options+table td:nth-child(2) code,.article--content .shorthand-flags+table td:nth-child(2) code{margin-left:-2rem}.article--content p.table-group-key{margin:1rem 0 -.75rem;font-weight:500;font-size:.95rem}.article--content table+.table-group-key{margin-top:-2rem}.article--content table.flux-influxdb-versions tbody{display:flex;flex-direction:column-reverse}.article--content table.flux-influxdb-versions tbody tr{display:flex;justify-content:space-between}.article--content .tags{border-top:1px solid #383846;padding-top:1.75rem;margin:2rem 0 1rem}.article--content .tags .tag{background:#07070E;margin:.12rem 0;padding:.4rem .65rem;font-style:italic;font-weight:500;color:rgba(212,215,221,0.75) !important;font-size:.9rem;border-radius:1rem}.article--content .tags .tag:after{border-radius:1rem;background:linear-gradient(45deg, #BF2FE5,#9394FF)}.article--content .tags .tag:hover{color:#fff !important}.article--content .related+.tags,.article--content .expand-wrapper+.tags{border:none;padding-top:0;margin:1.5rem 0 1rem}.article--content .plugin-card{position:relative;padding:1rem 1.5rem;margin-bottom:.5rem;justify-content:center;align-items:center;background:rgba(7,7,14,0.4);border-radius:2px}.article--content .plugin-card h3{padding:0;margin-top:.25rem}.article--content .plugin-card.new h3:after{content:"New";margin-left:.3rem;padding:.25rem .5rem;font-style:italic;color:#D6F622;font-size:1.2rem;opacity:1}.article--content .plugin-card p.meta{margin:.75rem 0;font-weight:500;line-height:1.75rem}.article--content .plugin-card p.meta .deprecated{margin-left:.5rem;font-style:italic;color:#e90}.article--content .plugin-card .info>p:last-child{margin-bottom:.5rem}.article--content .plugin-card .info>ul:last-child{margin-bottom:.5rem}.article--content .plugin-card .info>ol:last-child{margin-bottom:.5rem}.article--content .plugin-card .plugin-link{position:absolute;top:0;right:0.5rem;opacity:0.25;transition:opacity .2s, background .2s, color .2s;background:linear-gradient(45deg, #066FC5,#00A3FF)}.article--content .plugin-card:hover .plugin-link{opacity:1;background:linear-gradient(45deg, #066FC5,#00A3FF)}.article--content .plugin-card blockquote{border-color:#00A3FF;background:rgba(0,163,255,0.12)}.article--content .plugin-card blockquote h3,.article--content .plugin-card blockquote h4,.article--content .plugin-card blockquote h5,.article--content .plugin-card blockquote h6{color:#fff}.article--content .plugin-card blockquote p,.article--content .plugin-card blockquote li{color:#BEF0FF;font-size:1rem;font-style:normal}.article--content .plugin-card blockquote strong{color:inherit}.article--content .plugin-card blockquote a{color:#fff}.article--content .plugin-card blockquote a code:after{border-color:transparent rgba(0,201,255,0.35) transparent transparent}.article--content .plugin-card blockquote a:hover{color:#6BDFFF}.article--content .plugin-card blockquote a:hover code:after{border-color:transparent #6BDFFF transparent transparent}.article--content .plugin-card blockquote ol li:before{color:#BEF0FF}.article--content .plugin-card blockquote code,.article--content .plugin-card blockquote pre{color:#00C9FF;background:#0a071c}@media (max-width: 600px){.article--content .plugin-card .plugin-link{opacity:1;background:linear-gradient(45deg, #066FC5,#00A3FF);padding:.25rem .35rem .35rem;line-height:0}.article--content .plugin-card .plugin-link .icon-github{margin:0}.article--content .plugin-card .plugin-link .hide{display:none}}.article--content .title{margin-bottom:2.65rem}.article--content .title .metadata{padding:0;margin:0}.article--content .title .metadata li{margin-bottom:0;padding:.45em .75em;color:#fff;background:rgba(255,255,255,0.07);font-size:.95rem;font-weight:500;line-height:1.1rem;border-radius:1.1em;display:inline-block}.article--content .title .metadata li.updated-in,.article--content .title .metadata li.date,.article--content .title .metadata li.flux-influxdb{padding:0 0 0 .4em;background:none;font-weight:normal;font-style:italic;color:rgba(255,255,255,0.6)}.article--content .title .metadata .updated-in+.date::before{content:"•" !important;display:inline;margin-right:.5rem}.article--content .title .metadata .flux-influxdb a{cursor:pointer;opacity:.9;transition:color .2s, opacity .2s}.article--content .title .metadata .flux-influxdb a:hover{opacity:1}@media (max-width: 600px){.article--content .title{margin-bottom:2rem}.article--content .title h1{margin:.35em 0 .2em;font-size:2.4rem}}.article--content .truncate{position:relative;margin-bottom:3.5rem}.article--content .truncate .truncate-content{overflow:hidden;max-height:9999px;transition:max-height .4s}.article--content .truncate .truncate-content.closed{min-height:250px;max-height:25vh}.article--content .truncate .truncate-bottom{position:absolute;bottom:-30px;width:100%;z-index:100;height:auto}.article--content .truncate a.truncate-toggle{display:block;width:100px;margin:0 auto;color:#D4D7DD;background:#14141F;padding:.45rem;text-align:center;font-size:.75rem;text-transform:uppercase;border-radius:2px;transition:color .2s}.article--content .truncate a.truncate-toggle:before{content:"Show Less"}.article--content .truncate a.truncate-toggle:hover{color:#00A3FF}.article--content .truncate.closed .truncate-bottom{bottom:0;background-image:linear-gradient(to bottom, rgba(20,20,31,0), #14141f);height:100px}.article--content .truncate.closed a.truncate-toggle{margin-top:75px}.article--content .truncate.closed a.truncate-toggle:before{content:"Show More"}.article--content .videos-wrapper{display:flex;flex-wrap:wrap;margin-top:1.5rem}.article--content .video-card{max-width:240px;margin:0 1.75rem .75rem 0}.article--content .video-card a{display:block;position:relative}.article--content .video-card a:after{content:"\e914";position:absolute;display:flex;align-items:center;justify-content:center;font-family:"icomoon";top:.65rem;right:.65rem;height:1.5rem;width:1.5rem;color:#fff;padding:.35rem;border-radius:50%;background-color:rgba(255,255,255,0.25);opacity:0;transition:opacity .3s}.article--content .video-card a:hover:after{opacity:1}.article--content .video-card img{margin-bottom:0}.article--content .video-card .video-title{margin:.25rem 0 0;font-weight:500;font-size:.9rem;color:#FAFAFC;line-height:1.25rem}.article--content .video-card .video-date{font-size:.8rem;color:rgba(212,215,221,0.6);line-height:1rem}.article--content .video-content .video-date{color:rgba(212,215,221,0.6);margin-top:-1.75rem;font-weight:500;font-size:.9rem}.article--content .video-content .video{max-width:none;margin:0 0 2rem}.article--content .video{width:100%;max-width:620px;margin:2rem 0}@media (max-width: 600px){.article--content .video-card{max-width:100%;margin-right:0}}.article--content .required,.article--content .req{color:#FF8564;font-weight:500;font-style:italic;margin:0 .15rem 0 .1rem}.article--content .required.asterisk,.article--content .req.asterisk{margin:0 -.1rem 0 -.5rem}.article--content .required.key,.article--content .req.key{font-size:.9rem;font-weight:500}.article--content .required.normal,.article--content .req.normal{font-style:normal}.article--content .required.blue,.article--content .req.blue{color:#2AA3FF}.article--content .required.green,.article--content .req.green{color:#009F5F}.article--content .required.magenta,.article--content .req.magenta{color:#CE58EB}.article--content .required.pink,.article--content .req.pink{color:#d30971}.article--content h2+.keep-url,.article--content h3+.keep-url,.article--content h4+.keep-url,.article--content h5+.keep-url,.article--content h6+.keep-url{margin-top:-1.5rem;z-index:-100}.article--content a.q-link{font-size:.8rem;vertical-align:super;line-height:0;color:#fff;opacity:.5;transition:opacity .2s}.article--content a.q-link:hover{opacity:1}.article--content p.read-more{text-align:right;font-style:italic}.article--content .highlight+p.read-more,.article--content pre+p.read-more,.article--content code+p.read-more,.article--content .flex-wrapper+p.read-more{margin:-.75rem 0 .5rem}.article--content .nowrap{white-space:nowrap}.article--content .all-caps{text-transform:uppercase;font-size:1.05rem;letter-spacing:.1em;font-weight:500 !important}.article--content span.orange,.article--content strong.orange,.article--content em.orange{color:#FF8564}.article--content span.blue,.article--content strong.blue,.article--content em.blue{color:#2AA3FF}.article--content span.green,.article--content strong.green,.article--content em.green{color:#009F5F}.article--content span.magenta,.article--content strong.magenta,.article--content em.magenta{color:#CE58EB}.article--content span.pink,.article--content strong.pink,.article--content em.pink{color:#d30971}.article--content .get-started-btns{display:flex;flex-direction:column;justify-content:space-around;align-items:flex-start;margin-bottom:2rem}.article--content .get-started-btns a.btn{max-width:300px;width:100%;text-align:center;padding:1rem}@media (max-width: 600px){.article{padding:1.5rem 1.5rem 3rem}.article h2{font-size:1.9rem}.article h3{font-size:1.55rem}.article h4{font-size:1.3rem}}.article--content .inline{margin:0 .15rem}.article--content .inline.middle:before{vertical-align:middle}.article--content .inline.top:before{vertical-align:text-top}.article--content .inline.bottom:before{vertical-align:bottom}.article--content .inline.xsmall:before{font-size:.8rem}.article--content .inline.small:before{font-size:.9rem}.article--content .inline.large:before{font-size:1.1rem}.article--content .inline.add-btn-round{font-family:"icomoon-v2";color:#fff;background:linear-gradient(45deg, #5c10a0, #8e1fc3);border-radius:50%;margin:0 .25rem;display:inline-block;vertical-align:text-top;font-size:.7rem;width:20px;height:20px;padding-left:.29rem;line-height:1.25rem}.article--content .inline.add-btn-round.v3,.article--content .inline.add-btn-round.v4{position:relative;background:#383846;width:18px;height:18px;font-size:.65rem;line-height:0rem;padding:9px 0 0 4px}.article--content .inline.ui-toggle{display:inline-block;position:relative;width:28px;height:16px;border-radius:.7rem;vertical-align:text-top;margin-top:2px}.article--content .inline.ui-toggle .circle{display:inline-block;position:absolute;border-radius:50%;height:8px;width:8px;background:#fff;top:4px;right:4px}.article--content .inline.ui-toggle.blue{background:#00A3FF}.article--content .inline.ui-toggle.green{background:#009F5F}.article--content .inline.ui-toggle.off{background:#333346}.article--content .inline.ui-toggle.off .circle{left:4px}.article--content .inline.ui-toggle.v3,.article--content .inline.ui-toggle.v4{width:26px}.article--content .inline.ui-toggle.v3 .circle,.article--content .inline.ui-toggle.v4 .circle{height:12px;width:12px;top:2px;right:2px}.article--content .inline.ui-toggle.v3.off .circle,.article--content .inline.ui-toggle.v4.off .circle{left:2px}.article--content .inline.notebook-add-cell{display:inline-block;position:relative;border-radius:50%;height:1.3rem;width:1.3rem;background:linear-gradient(45deg, #5c10a0 0%, #8e1fc3 100%);vertical-align:text-bottom;text-align:center;color:#fff;font-size:.8rem}.article--content .inline.notebook-add-cell>span{display:block;margin:0.3rem 0}.article--content .nav-item{display:inline-block;position:relative;vertical-align:top;margin-bottom:1.25rem}.article--content .nav-item:after{content:"";position:absolute;top:0;left:0;width:2px;height:100%;background:#be2ee4;background:linear-gradient(180deg, #be2ee4 0, #00a3ff)}.article--content .nav-item:first-child{margin-right:1.25rem}.article--content .nav-item.account{padding:.25rem;position:relative;width:210px;height:56px}.article--content .nav-item.account:after{display:none}.article--content .nav-item.account .acct-inner{display:flex;position:relative;align-items:center;width:100%;height:100%;background:#292933;border-radius:6px;border:3px solid #676978}.article--content .nav-item.account .acct-inner:after{content:"";position:absolute;right:1rem;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:#E7E8EB transparent transparent transparent}.article--content .nav-item.account .acct-icon{margin:0 .9rem 0 .5rem;border-radius:50%;height:28px;width:28px;background:linear-gradient(45deg, #00a3ff, #67d74e);color:#fff;text-align:center;line-height:0;overflow:hidden}.article--content .nav-item.account .acct-icon .icon{margin-left:-.1rem;font-size:2rem}.article--content .nav-item.account .acct-label .username{color:#E7E8EB;font-weight:500;font-size:.85rem;line-height:1.2rem}.article--content .nav-item.account .acct-label .orgname{color:#999DAB;font-size:.75rem;line-height:.75rem}.article--content .nav-item.account.small{width:56px}.article--content .nav-item.account.small .acct-inner{justify-content:center;align-items:center}.article--content .nav-item.account.small .acct-inner:after{display:none}.article--content .nav-item.account.small .acct-icon{margin:0}.article--content .nav-icon{display:flex;justify-content:left;align-items:center;color:#fff;width:210px;height:56px;font-family:"Rubik",sans-serif;font-weight:500;padding:.9rem 1.1rem;font-size:1rem;position:relative;background:#383846}.article--content .nav-icon .icon{display:inline-block;font-size:1.35rem;margin-right:1rem}.article--content .nav-icon .nav-icon-label{display:inline-block;padding:0;font-size:1rem}.article--content .nav-icon:before,.article--content .nav-icon:after{content:"";position:absolute;left:0;height:2px;z-index:2;width:12px}.article--content .nav-icon:before{top:0;background:#be2ee4;background:linear-gradient(90deg, #be2ee4 0, rgba(190,46,228,0))}.article--content .nav-icon:after{bottom:0;background:#00a3ff;background:linear-gradient(90deg, #00a3ff 0, rgba(190,46,228,0))}.article--content .nav-icon.small{display:flex;justify-content:center;align-items:center;padding:0;width:56px;flex-direction:column}.article--content .nav-icon.small .icon{position:relative;margin:0}.article--content .nav-icon.small .nav-icon-label{padding:0;margin-top:.75rem;font-size:.67rem;line-height:0}.nav-items-v3 .nav-item-v3,.nav-items-v3 .nav-item-v4,.nav-items-v4 .nav-item-v3,.nav-items-v4 .nav-item-v4{display:inline-flex;align-items:center;margin:0 1rem 1.25rem 0;max-width:225px;background:linear-gradient(rgba(5,41,67,0.9), rgba(6,34,56,0.9));color:#fff;height:60px;border-radius:2px}.nav-items-v3 .nav-item-v3.account,.nav-items-v3 .nav-item-v4.account,.nav-items-v4 .nav-item-v3.account,.nav-items-v4 .nav-item-v4.account{padding:8px}.nav-items-v3 .nav-item-v3.account .acct-inner-v3,.nav-items-v3 .nav-item-v3.account .acct-inner-v4,.nav-items-v3 .nav-item-v4.account .acct-inner-v3,.nav-items-v3 .nav-item-v4.account .acct-inner-v4,.nav-items-v4 .nav-item-v3.account .acct-inner-v3,.nav-items-v4 .nav-item-v3.account .acct-inner-v4,.nav-items-v4 .nav-item-v4.account .acct-inner-v3,.nav-items-v4 .nav-item-v4.account .acct-inner-v4{display:flex;background-color:#f1f1f30d;border-radius:2px}.nav-items-v3 .nav-item-v3.account .acct-icon-v3,.nav-items-v3 .nav-item-v3.account .acct-icon-v4,.nav-items-v3 .nav-item-v4.account .acct-icon-v3,.nav-items-v3 .nav-item-v4.account .acct-icon-v4,.nav-items-v4 .nav-item-v3.account .acct-icon-v3,.nav-items-v4 .nav-item-v3.account .acct-icon-v4,.nav-items-v4 .nav-item-v4.account .acct-icon-v3,.nav-items-v4 .nav-item-v4.account .acct-icon-v4{display:flex;align-content:center;justify-content:center;font-weight:bold;width:44px;height:44px;background:linear-gradient(54deg, #BE2EE4,#00A3FF);border-radius:2px}.nav-items-v3 .nav-item-v3.account .acct-icon-v3 .initial,.nav-items-v3 .nav-item-v3.account .acct-icon-v4 .initial,.nav-items-v3 .nav-item-v4.account .acct-icon-v3 .initial,.nav-items-v3 .nav-item-v4.account .acct-icon-v4 .initial,.nav-items-v4 .nav-item-v3.account .acct-icon-v3 .initial,.nav-items-v4 .nav-item-v3.account .acct-icon-v4 .initial,.nav-items-v4 .nav-item-v4.account .acct-icon-v3 .initial,.nav-items-v4 .nav-item-v4.account .acct-icon-v4 .initial{align-self:center}.nav-items-v3 .nav-item-v3.account .acct-label-v3,.nav-items-v3 .nav-item-v3.account .acct-label-v4,.nav-items-v3 .nav-item-v4.account .acct-label-v3,.nav-items-v3 .nav-item-v4.account .acct-label-v4,.nav-items-v4 .nav-item-v3.account .acct-label-v3,.nav-items-v4 .nav-item-v3.account .acct-label-v4,.nav-items-v4 .nav-item-v4.account .acct-label-v3,.nav-items-v4 .nav-item-v4.account .acct-label-v4{display:inline-block;padding:8px 0px 0px 8px;width:165px}.nav-items-v3 .nav-item-v3.account .acct-label-v3 .username,.nav-items-v3 .nav-item-v3.account .acct-label-v4 .username,.nav-items-v3 .nav-item-v4.account .acct-label-v3 .username,.nav-items-v3 .nav-item-v4.account .acct-label-v4 .username,.nav-items-v4 .nav-item-v3.account .acct-label-v3 .username,.nav-items-v4 .nav-item-v3.account .acct-label-v4 .username,.nav-items-v4 .nav-item-v4.account .acct-label-v3 .username,.nav-items-v4 .nav-item-v4.account .acct-label-v4 .username{font-size:.75rem;line-height:.75rem;font-weight:500;color:#9e9ead}.nav-items-v3 .nav-item-v3.account .acct-label-v3 .orgname,.nav-items-v3 .nav-item-v3.account .acct-label-v4 .orgname,.nav-items-v3 .nav-item-v4.account .acct-label-v3 .orgname,.nav-items-v3 .nav-item-v4.account .acct-label-v4 .orgname,.nav-items-v4 .nav-item-v3.account .acct-label-v3 .orgname,.nav-items-v4 .nav-item-v3.account .acct-label-v4 .orgname,.nav-items-v4 .nav-item-v4.account .acct-label-v3 .orgname,.nav-items-v4 .nav-item-v4.account .acct-label-v4 .orgname{font-size:.85rem;line-height:1rem}.nav-items-v3 .nav-icon-v3,.nav-items-v3 .nav-icon-v4,.nav-items-v4 .nav-icon-v3,.nav-items-v4 .nav-icon-v4{display:flex;justify-content:center;align-items:center;height:100%;width:60px;flex-shrink:0}.nav-items-v3 p.nav-label-v3,.nav-items-v3 p.nav-label-v4,.nav-items-v4 p.nav-label-v3,.nav-items-v4 p.nav-label-v4{display:inline-block;margin:0;padding:0;font-family:"Rubik",sans-serif;font-weight:500;font-size:1.15rem;min-width:225px;color:#fff}.nav-items-v3 .cf-icon,.nav-items-v4 .cf-icon{display:inline-block;font-size:1.35rem}.nav-items-v3 .cf-icon.v3,.nav-items-v4 .cf-icon.v3{font-family:'icomoon-v3'}.nav-items-v3 .cf-icon.v4,.nav-items-v4 .cf-icon.v4{font-family:'icomoon-v4'}@media (max-width: 600px){.article--content.nav-item:nth-child(2){display:none}.article--content.nav-item-v3:nth-child(2){display:none}.article--content.nav-item-v4:nth-child(2){display:none}}pre{line-height:1.25rem}code[class*="language-"],pre[class*="language-"]{direction:ltr;text-align:left;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;hyphens:none}pre[class*="language-"]::-moz-selection,pre[class*="language-"] ::-moz-selection,code[class*="language-"]::-moz-selection,code[class*="language-"] ::-moz-selection{background:rgba(0,163,255,0.25)}pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection{background:rgba(0,163,255,0.25)}pre[class*="language-"]::selection,pre[class*="language-"] ::selection,code[class*="language-"]::selection,code[class*="language-"] ::selection{background:rgba(0,163,255,0.25)}@media print{code[class*="language-"],pre[class*="language-"]{text-shadow:none}}pre[class*="language-"]{overflow:auto}:not(pre)>code[class*="language-"]{white-space:normal}.highlight{color:#B7B8FF}.highlight .gh,.highlight .go,.highlight .na,.highlight .nt,.highlight .nv,.highlight .ow{color:#B7B8FF}.highlight .c,.highlight .ch,.highlight .cm,.highlight .cpf,.highlight .c1,.highlight .cs,.highlight .w{color:#545667}.highlight .gi{background-color:#545667}.highlight .k,.highlight .kc,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .nn{color:#00A3FF}.highlight .bp,.highlight .cp,.highlight .dl,.highlight .gt,.highlight .gu,.highlight .kt,.highlight .nb,.highlight .nc,.highlight .no,.highlight .sa,.highlight .sb,.highlight .sc,.highlight .sd,.highlight .se,.highlight .sh,.highlight .sx,.highlight .sr,.highlight .s1,.highlight .s2{color:#009F5F}.highlight .err,.highlight .fm,.highlight .gr,.highlight .gd,.highlight .nd,.highlight .ne,.highlight .nf,.highlight .nl,.highlight .si{color:#BF3D5E}.highlight .gd{text-decoration:line-through}.highlight .m,.highlight .ni,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo,.highlight .vc,.highlight .vg,.highlight .vi,.highlight .vm,.highlight .il{color:#ff6db0}.highlight .gp,.highlight .o{color:#00A3FF}.highlight .ss{color:#e90}.highlight .cs .gh,.highlight .gu,.highlight .gp,.highlight .gs,.highlight .k,.highlight .kc,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt,.highlight .nc,.highlight .ne,.highlight .ni,.highlight .nn .nt,.highlight .ow,.highlight .se{font-weight:bold}.highlight .c,.highlight .ch,.highlight .cm,.highlight .cpf,.highlight .c1,.highlight .cs,.highlight .ge,.highlight .sd,.highlight .w{font-style:italic}.highlight .language-js .mi+.nx,.highlight .language-js .mf+.nx{color:#ff6db0}.highlight .language-sql .mi+.n{color:#ff6db0}.algolia-autocomplete{width:100%}.algolia-autocomplete #algolia-search-input{background:#1A1A2A !important}.algolia-autocomplete .ds-dropdown-menu{width:74vw;max-width:800px;background:#1A1A2A;background-color:#1A1A2A;border:none;box-shadow:2px 2px 10px rgba(15,14,21,0.5);transition:background-color 0.2s}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{border:none;background:#1A1A2A;background-color:#1A1A2A}.algolia-autocomplete .ds-dropdown-menu:before{display:none}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{padding:.5rem 2rem 2rem}.algolia-autocomplete .algolia-docsearch-suggestion{background:#1A1A2A}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{color:#fff;border-color:#383846;text-decoration:none}.algolia-autocomplete .algolia-docsearch-suggestion--category-header-lvl0{font-size:1.5rem;font-weight:bold !important;padding-bottom:1rem}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{color:rgba(212,215,221,0.5) !important}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{background:#383846}.algolia-autocomplete .algolia-docsearch-suggestion--title{font-weight:bold;color:#fff}.algolia-autocomplete .algolia-docsearch-suggestion--text{font-size:0.8rem;color:#D4D7DD}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#00A3FF}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{background:#383846}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{text-decoration:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header{padding-bottom:.75rem;margin-bottom:.5rem}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:24vw !important;top:-.45rem !important}.ds-suggestion:not(:first-child) .algolia-docsearch-suggestion--category-header{margin-top:1.5rem}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--wrapper{padding:0}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:none}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{margin:2px 0;padding:.75rem;width:100%;float:none}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content:before{display:none}.algolia-docsearch-suggestion--content.algolia-docsearch-suggestion--no-results{text-align:center}.algolia-autocomplete .algolia-docsearch-suggestion .search-product-version{font-size:.8em;font-weight:500;opacity:.5;margin-left:.35rem}.algolia-autocomplete .algolia-docsearch-suggestion--title .search-product-version{display:none}.search-all-content{padding:0.5rem 0.75rem;font-size:0.8rem;text-align:right}.search-all-content a{color:#D4D7DD;opacity:.6;text-decoration:none;transition:opacity .2s}.search-all-content a:hover{opacity:1}.search-no-results{padding:2rem;text-align:center;font-size:1.1rem;color:rgba(212,215,221,0.75);font-style:italic}.search-no-results a{position:relative;display:inline-block;margin:.5rem .25rem .5rem 0;padding:0.85rem 1.5rem;color:#fff !important;border-radius:2px;font-size:1.1rem;font-weight:500;font-style:normal;text-decoration:none;z-index:1;background:linear-gradient(45deg, #066FC5,#00A3FF)}.search-no-results a:after{content:"";position:absolute;display:block;top:0;right:0;width:100%;height:100%;border-radius:2px;background:linear-gradient(45deg, #00A3FF,#6BDFFF);opacity:0;transition:opacity .2s;z-index:-1}.search-no-results a:hover{cursor:pointer}.search-no-results a:hover:after{opacity:1}@media (min-width: 801px) and (max-width: 1200px){.algolia-autocomplete .ds-dropdown-menu{max-width:70vw}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:28.5vw !important;top:-.45rem !important}}@media (max-width: 800px){.algolia-autocomplete .ds-dropdown-menu{max-width:100vw;width:100vw;min-width:0}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:-1rem !important;top:112% !important}}@media (max-width: 600px){.algolia-autocomplete .ds-dropdown-menu{width:100vw}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{padding:.5rem}}.cards{display:flex;flex-direction:row;position:relative;overflow:visible;border-radius:2px 0 0 2px;min-height:700px;background:linear-gradient(45deg, #13002D,#8E1FC3)}.cards a{text-decoration:none;color:inherit}.cards #landing-hive{position:absolute;top:0;left:0;z-index:0}.cards #landing-hive path,.cards #landing-hive ellipse{fill:rgba(147,148,255,0.25)}.cards .main{width:66%;padding:5rem 2vw 5rem 4.5vw;display:flex;justify-content:center;align-items:center;flex-direction:column;text-align:center;z-index:1}.cards .group{display:flex;flex-wrap:wrap;width:34%;justify-content:flex-end}.cards .card.sm{display:flex;flex-direction:column;justify-content:center;text-align:left;width:90%;position:relative;margin-bottom:1px;padding:0 3.5vw 0 3vw;min-height:140px;background:rgba(24,24,32,0.4);transition:background-color .4s, width .2s}.cards .card.sm:last-child{margin-bottom:0}.cards .card.sm:hover{background:#00A3FF;width:100%}.cards .card.sm:hover h3{font-weight:500;font-size:1.2rem}.cards .card.sm:hover p{opacity:1;max-height:3.75rem}.cards .card.sm h3{font-size:1.1rem;transition:all .2s;margin:0}.cards .card.sm p{margin:.5rem 0 0;max-height:0;width:80%;color:#fff;font-size:.95rem;line-height:1.25rem;opacity:0;transition:opacity .2s .1s, max-height .2s}.cards .card h1,.cards .card h2,.cards .card h3,.cards .card h4{font-weight:300;color:#fff}.cards .card h1{margin:0 0 1.25rem;font-size:2.5rem;z-index:1}.cards .card#get-started .avoid-wrap{display:inline-block}.cards .card#get-started .btn{position:relative;display:block;padding:1.25rem 4rem;color:#fff;font-size:1.2rem;font-weight:500;background:linear-gradient(45deg, #066FC5,#00A3FF);transition:background-color .2s, color .2s;border-radius:2px;z-index:1}.cards .card#get-started .btn:before{content:"";position:absolute;display:block;top:0;right:0;width:100%;height:100%;border-radius:2px;background:linear-gradient(45deg, #00A3FF,#6BDFFF);opacity:0;transition:opacity .2s;z-index:-1}.cards .card#get-started .btn:hover:before{opacity:1}.cards .card#get-started .beta:after{content:'beta';display:inline-block;vertical-align:middle;font-style:italic;font-size:.45em;margin:-8px 0 0 .5em;padding:.1rem .6rem .12rem;border-radius:1rem;border:0.15rem solid rgba(255,255,255,0.5);transition:border-color .2s}@media (max-width: 1280px){.cards .card.full{padding:3.5rem}.cards .card.quarter{width:48%}}@media (max-width: 1150px){.cards{flex-direction:column}.cards .main{width:100%}.cards .group{width:100%}.cards .group .card.sm{margin-right:1px;padding:2rem;flex-grow:2;width:49%;text-align:center}.cards .group .card.sm h3{margin:0 0 .5rem;font-size:1.1rem;font-weight:500}.cards .group .card.sm p{opacity:.6;position:relative;max-height:-moz-fit-content;max-height:fit-content;width:auto;margin:0}.cards .group .card.sm:hover{background:#00A3FF}.cards .group .card.sm:hover h3{transform:none}.cards .group .card.sm:hover p{opacity:1;max-height:-moz-fit-content;max-height:fit-content}}@media (max-width: 600px){.cards .group{flex-direction:column}.cards .group .card.sm{width:100%;max-width:100%;padding:1.25rem}.cards .card h1{font-size:2rem}.cards .card.main{padding:2.5rem}.cards .card.main#get-started .btn{font-size:1rem;margin:0 0 .35rem}}.current-timestamp,.current-date,.current-time,.enterprise-eol-date{color:#D4D7DD;display:inline-block;font-family:"Proxima Nova",sans-serif;white-space:nowrap}.nowrap{white-space:nowrap}.error-page{padding:1rem;display:flex;align-items:center;vertical-align:middle;justify-content:space-around}.error-page .error-content{margin-top:10vh;max-width:380px}.error-page .error-code{display:flex;align-items:center;justify-content:space-around;margin:0 auto;width:15rem;height:15rem;max-width:80vw;max-height:80vw;border-radius:50%;box-shadow:5px 5px 30px rgba(15,14,21,0.5)}.error-page .error-code .error-code-border{display:flex;align-items:center;justify-content:space-around;border:2px solid rgba(0,163,255,0.5);width:90%;height:90%;border-radius:50%}.error-page .error-code h1{color:#00A3FF;font-size:5rem;font-weight:300;text-align:center}.error-page a{color:#00A3FF;text-decoration:none;font-weight:bold}.error-page a:hover{color:#fff}.error-page .wayfinding{display:flex;justify-content:space-around;align-content:center;margin:2rem 0 1.5rem}.error-page .wayfinding .btn{display:flex;position:relative;flex-grow:1;margin-right:4px;padding:.75rem 1rem;border-radius:2px;text-align:center;justify-content:center;align-items:center;color:#fff;transition:background-color .2s;z-index:1;background:linear-gradient(45deg, #066FC5,#00A3FF)}.error-page .wayfinding .btn.back:before{content:"\e90a";font-family:"icomoon-v2";margin-right:.35rem;vertical-align:text-top}.error-page .wayfinding .btn:after{content:"";position:absolute;display:block;top:0;right:0;width:100%;height:100%;border-radius:2px;background:linear-gradient(45deg, #00A3FF,#6BDFFF);opacity:0;transition:opacity .2s;z-index:-1}.error-page .wayfinding .btn:hover{cursor:pointer}.error-page .wayfinding .btn:hover:after{opacity:1}.error-page p{color:#D4D7DD;line-height:1.5rem}.footer-widgets{position:fixed;bottom:1rem;right:1rem;width:auto;height:auto;display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-end;z-index:100}.footer-widgets .widget{height:50px;width:50px;border-radius:6px;position:relative;box-shadow:2px 2px 6px rgba(15,14,21,0.5);color:#fff}.footer-widgets .widget:not(:last-child){margin-bottom:5px}.footer-widgets .widget:before{content:attr(data-tooltip);padding:.25rem .5rem;display:flex;position:absolute;top:11px;right:60px;width:auto;white-space:nowrap;font-size:.9rem;font-weight:bold;border-radius:6px;background:linear-gradient(270deg, #d30971,#9b2aff);pointer-events:none;z-index:-1;opacity:0;transform:translateX(15px);transition:opacity .2s, transform .2s}.footer-widgets .widget:after{content:"";position:absolute;top:14px;right:56px;width:0px;height:0px;opacity:0;transform:translateX(15px);transition:opacity .2s, transform .2s}.footer-widgets .widget:hover{cursor:pointer}.footer-widgets .widget:hover:before,.footer-widgets .widget:hover:after{opacity:1;transform:translateX(0)}.footer-widgets .widget.magenta{background:linear-gradient(90deg, #d30971,#9b2aff)}.footer-widgets .widget.magenta:before{background:linear-gradient(270deg, #d30971,#9b2aff)}.footer-widgets .widget.magenta:after{border-style:solid;border-width:10px 0 10px 5px;border-color:transparent transparent transparent #d30971}.footer-widgets .widget.blue{color:rgba(2,10,71,0.7);background:linear-gradient(270deg, #00A3FF,#5ee4e4)}.footer-widgets .widget.blue:before{background:linear-gradient(90deg, #00A3FF,#5ee4e4)}.footer-widgets .widget.blue:after{border-style:solid;border-width:10px 0 10px 5px;border-color:transparent transparent transparent #5ee4e4}.custom-time-trigger a{display:flex;justify-content:center;align-items:center;width:100%;height:100%;font-size:1.2rem;color:rgba(2,10,71,0.8);text-decoration:none}.ask-ai-trigger .ask-ai-open{width:100%;height:100%;display:flex;justify-content:center;text-align:center;align-items:center;flex-direction:column;font-size:.8rem;font-weight:bold}.ask-ai-trigger .ask-ai-open .icon-influx-logo{margin-bottom:.15rem;font-size:1rem}.ask-ai-trigger .ask-ai-open:hover{cursor:pointer}@keyframes fadeInAnimation{0%{opacity:0}100%{opacity:1}}@media (max-width: 600px){.footer-widgets{bottom:.75rem;right:.75rem}}.modal{display:none;padding:1rem;position:fixed;top:0;width:100%;height:100%;z-index:101}.modal .modal-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(45deg, #BE2EE4,#00A3FF);opacity:.85}.modal .modal-wrapper{display:flex;justify-content:center;align-items:flex-start}.modal .modal-body{position:relative;display:flex;overflow-y:auto;overflow-x:hidden;max-width:650px;max-height:97.5vh;margin-top:10vh;padding:.75rem 2rem 1.5rem;border-radius:3px;background:#14141F;color:#D4D7DD;font-size:1rem;transition:margin .4s;scroll-behavior:smooth;-webkit-overflow-scrolling:touch}.modal .modal-body::-webkit-scrollbar{width:8px}.modal .modal-body::-webkit-scrollbar-track{background:rgba(56,56,70,0.2);border-radius:4px}.modal .modal-body::-webkit-scrollbar-thumb{background:rgba(212,215,221,0.3);border-radius:4px}.modal .modal-body::-webkit-scrollbar-thumb:hover{background:rgba(212,215,221,0.5)}.modal.open .modal-body{margin-top:0}.modal #modal-close{position:absolute;padding:.25rem;top:1rem;right:1rem;color:rgba(212,215,221,0.5);transition:color .2s;text-decoration:none}.modal #modal-close:hover{color:#D4D7DD}.modal .modal-content{display:none;overflow:visible;width:586px;max-width:100%;flex-shrink:0}.modal .modal-content h3{color:#fff;font-weight:500;font-size:1.4rem;margin-bottom:1rem}.modal .modal-content h4{color:#fff;font-weight:500;margin:1rem 0 0.5rem 2px}.modal .modal-content h5{margin:.5rem 0 0;color:#FAFAFC}.modal .modal-content p,.modal .modal-content li{margin:.25rem 0;line-height:1.5rem}.modal .modal-content p strong,.modal .modal-content li strong{font-weight:500;color:#FAFAFC}.modal .modal-content p.note,.modal .modal-content li.note{padding-top:1.25rem;margin-top:1.5rem;color:rgba(212,215,221,0.5);border-top:1px solid rgba(212,215,221,0.25);font-size:.9rem;font-style:italic}.modal .modal-content a{color:#00A3FF;font-weight:500;text-decoration:none;transition:color .2s}.modal .modal-content a:hover{color:#fff}.modal .products{display:flex;flex-direction:column;flex-wrap:wrap;flex-grow:1;justify-content:flex-start}.modal .product .providers{display:flex;flex-wrap:wrap;padding:.5rem 1rem;background:rgba(212,215,221,0.05);border-radius:2px}.modal .product .providers .provider{flex-grow:1}.modal .product .providers .provider:not(:last-child){margin-right:1rem}.modal .product .providers ul{margin:.5rem .5rem .5rem 0;padding:0;list-style:none}.modal .product .providers ul.clusters{padding-left:1.75rem}.modal .product .providers p.region .fake-radio{position:relative;display:inline-block;height:1.15em;width:1.15em;margin:0 0.3rem 0 0.1rem;border-radius:2px;border:1.5px solid transparent;background:rgba(212,215,221,0.05);border:1.5px solid rgba(212,215,221,0.2);vertical-align:text-top;cursor:pointer}.modal .product .providers p.region .fake-radio:after{content:"";position:absolute;display:block;height:.5rem;width:.5rem;top:.23rem;left:.23rem;border-radius:50%;background:rgba(212,215,221,0.3);opacity:0;transition:opacity .2s}.modal .product .providers p.region .fake-radio.checked:after{opacity:1}.modal li.custom{display:flex;align-items:center}.modal #custom-url{display:inline-block;width:100%;padding-left:.5rem;position:relative}.modal #custom-url:after{display:none;content:attr(data-message);position:absolute;top:-1.8rem;right:0;font-size:.85rem;font-weight:500;color:#DC4E58}.modal #custom-url.error:after{display:block}.modal #custom-url.error input#custom-url-field,.modal #custom-url.error input#dedicated-url-field,.modal #custom-url.error input#clustered-url-field{border-color:#DC4E58}.modal #custom-url.error input#custom-url-field:focus,.modal #custom-url.error input#dedicated-url-field:focus,.modal #custom-url.error input#clustered-url-field:focus{border-color:#DC4E58;box-shadow:1px 1px 10px rgba(220,78,88,0.5)}.modal #custom-url input#custom-url-field,.modal #custom-url input#dedicated-url-field,.modal #custom-url input#clustered-url-field{font-family:"Proxima Nova",sans-serif;font-weight:500;background:#181820;border-radius:2px;border:1px solid #1A1A2A;padding:.5em;width:100%;color:#fff;transition-property:border, box-shadow;transition-duration:.2s;box-shadow:2px 2px 6px rgba(15,14,21,0.5)}.modal #custom-url input#custom-url-field:focus,.modal #custom-url input#dedicated-url-field:focus,.modal #custom-url input#clustered-url-field:focus{outline:none;border-color:#00A3FF;box-shadow:1px 1px 10px rgba(0,163,255,0.5);border-radius:2px}.modal #custom-url input#custom-url-field::-moz-placeholder, .modal #custom-url input#dedicated-url-field::-moz-placeholder, .modal #custom-url input#clustered-url-field::-moz-placeholder{color:rgba(255,255,255,0.45);font-weight:normal;font-style:italic}.modal #custom-url input#custom-url-field::placeholder,.modal #custom-url input#dedicated-url-field::placeholder,.modal #custom-url input#clustered-url-field::placeholder{color:rgba(255,255,255,0.45);font-weight:normal;font-style:italic}.modal #dedicated-urls .providers,.modal #clustered-urls .providers{padding-bottom:1rem}.modal #dedicated-urls #custom-url,.modal #clustered-urls #custom-url{margin-top:.5rem;padding:0}.modal .radio{position:relative;display:inline-block;height:1.15em;width:1.15em;background:rgba(212,215,221,0.05);margin:0 .3rem 0 .1rem;vertical-align:text-top;border-radius:2px;cursor:pointer;border:1.5px solid rgba(212,215,221,0.2);-webkit-user-select:none;-moz-user-select:none;user-select:none}.modal input[type='radio']{margin-right:-1.1rem;padding:0;vertical-align:top;opacity:0;cursor:pointer}.modal input[type='radio']+.radio:after{content:"";display:block;position:absolute;height:.5rem;width:.5rem;border-radius:50%;background:#00A3FF;top:50%;left:50%;opacity:0;transform:scale(2) translate(-20%, -20%);transition:all .2s}.modal input[type='radio']:checked+.radio:after{opacity:1;transform:scale(1) translate(-50%, -50%)}.modal td:after,.modal label:after,.modal li:after{display:inline;vertical-align:middle;font-style:italic;font-weight:500;font-size:.75em;margin-left:.35rem;padding:.1rem .3rem .12rem .32rem;line-height:.75rem;border-radius:1rem}.modal td.beta:after,.modal label.beta:after,.modal li.beta:after{content:"beta";color:#fff;background:linear-gradient(45deg, #066FC5,#00A3FF)}.modal label:after{margin-left:.15rem}.modal #pref-tabs{padding:0;margin:0 0 -5px;list-style:none;display:flex;justify-content:space-between;align-items:center}.modal .pref-tab{padding:.75rem 1.25rem;margin-right:5px;text-align:center;font-weight:bold;width:49%;color:rgba(212,215,221,0.7);background:rgba(212,215,221,0.05);border-radius:2px;cursor:pointer;transition:color .2s}.modal .pref-tab:last-child{margin-right:0}.modal .pref-tab:hover{color:#00A3FF}.modal .pref-tab.active{color:#fff;background:linear-gradient(45deg, #066FC5,#00A3FF)}.modal .pref-tab span.ephemeral{display:inline}.modal .pref-tab span.abbr:after{display:none;content:"."}.modal .product.active{display:block}.modal .product.inactive{display:none}@media (max-width: 600px){.modal .pref-tab span.ephemeral{display:none}.modal .pref-tab span.abbr:after{display:inline}}.modal .form-buttons{display:flex;justify-content:end;margin-top:1rem}.modal textarea{resize:vertical;font-family:"Proxima Nova",sans-serif;font-weight:500;background:#1A1A2A;border-radius:2px;border:1px solid #1A1A2A;margin-top:1rem;padding:.5em;width:100%;height:8rem;color:#fff;transition-property:border, box-shadow;transition-duration:.2s;box-shadow:2px 2px 6px rgba(15,14,21,0.5)}.modal textarea:focus{outline:none;border-color:#00A3FF;box-shadow:1px 1px 10px rgba(0,163,255,0.5);border-radius:2px}.modal textarea::-moz-placeholder{color:rgba(255,255,255,0.45);font-weight:normal;font-style:italic}.modal textarea::placeholder{color:rgba(255,255,255,0.45);font-weight:normal;font-style:italic}.modal input[type='submit']{padding:0.65rem 1.1rem;background:linear-gradient(45deg, #066FC5,#00A3FF);border:none;border-radius:2px;color:#fff;font-weight:500;opacity:1;transition:opacity .2s;z-index:1}.modal input[type='submit']:hover{opacity:0}.modal .submit-wrapper{position:relative;background:linear-gradient(45deg, #00A3FF,#6BDFFF);border-radius:2px;color:#fff;font-weight:500}.modal .submit-wrapper:before{content:"Submit";position:absolute;pointer-events:none;top:0;left:0;padding:0.65rem 1.1rem;z-index:0}.modal #no-thanks{margin-right:.5rem;padding:0.65rem 1.1rem;background:rgba(212,215,221,0.1);color:rgba(250,250,252,0.65);border-radius:2px;cursor:pointer;transition:color .2s}.modal #no-thanks:hover{color:#FAFAFC}.modal .lifecycle-wrapper{position:relative}.modal .loader-wrapper,.modal #thank-you{position:absolute;display:none;justify-content:center;align-items:center;top:0;left:0;width:100%;height:100%;background-color:#14141F}.modal .loader-wrapper{z-index:5}.modal .loader-wrapper .loader{margin:0 auto}.modal #thank-you{z-index:10;font-size:1.2rem;font-style:italic;font-weight:500;color:rgba(212,215,221,0.65)}.modal #thank-you p{text-align:center}.modal #flux-influxdb-versions{max-width:375px}.modal #flux-influxdb-versions .flex-wrapper{display:flex;flex-direction:column;height:100%}.modal #flux-influxdb-versions .influxdb-versions{margin-top:1.5rem;overflow:scroll}.modal #flux-influxdb-versions .version-list{display:flex;flex-direction:column-reverse}.modal #flux-influxdb-versions .version-row{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:.15rem 0;border-bottom:1px solid #383846}.modal #flux-influxdb-versions .version-row:last-child{border-top:1px solid #383846}.modal #flux-influxdb-versions .version-row .version-col:last-child{padding-right:1rem;text-align:right}.modal #flux-influxdb-versions h4{margin-top:1.5rem}.modal #flux-influxdb-versions h4,.modal #flux-influxdb-versions span.medium{font-size:1.15rem}.modal #flux-influxdb-versions h3 code{background:#07070E;font-family:"IBM Plex Mono",monospace;color:#B7B8FF;padding:.1rem .4rem .2rem;border-radius:2px;white-space:nowrap;font-size:.85em;font-style:normal}.modal #flux-influxdb-versions span.medium{font-weight:500;color:#fff}.modal #flux-influxdb-versions span.flux-version{opacity:.5;font-size:.9rem}.modal #flux-influxdb-versions span.deprecated:before{content:'•';color:rgba(212,215,221,0.5);margin-right:.4rem}.modal #flux-influxdb-versions span.checkmark-new{font-size:1.1rem;font-weight:bold;color:#34BB55}.modal #flux-influxdb-versions span.checkmark-new.pending{color:#2AA3FF}.modal #flux-influxdb-versions .color-key{margin-top:1.5rem;padding:0;list-style:none}.modal #flux-influxdb-versions .color-key li{font-style:italic;color:rgba(212,215,221,0.65)}.modal #flux-influxdb-versions .color-key li#deprecated-key span{margin-left:.25rem}.modal #flux-influxdb-versions .more-info{margin-top:1.5rem}.modal #flux-influxdb-versions .no-support{margin:1rem 1rem 3rem;text-align:center;font-size:1.15rem;font-style:italic;color:rgba(212,215,221,0.65)}.modal #influxdb-gs-date-select{width:auto;max-width:260px}.modal #influxdb-gs-date-select p{margin-bottom:1.5rem}.modal #influxdb-gs-date-select a.btn{position:relative;display:inline-block;margin:1.25rem 0 .5rem;padding:0.85rem 1.5rem;color:#fff !important;border-radius:2px;text-transform:uppercase;letter-spacing:.06rem;font-size:1rem;float:right;z-index:1;background:linear-gradient(45deg, #066FC5,#00A3FF)}.modal #influxdb-gs-date-select a.btn:after{content:"";position:absolute;display:block;top:0;right:0;width:100%;height:100%;border-radius:2px;background:linear-gradient(45deg, #00A3FF,#6BDFFF);opacity:0;transition:opacity .2s;z-index:-1}.modal #influxdb-gs-date-select a.btn:hover{cursor:pointer}.modal #influxdb-gs-date-select a.btn:hover:after{opacity:1}@media (max-width: 600px){.modal{padding:.5rem;overflow:scroll}.modal .modal-body{padding:.5rem 1.5rem 1.5rem}}.loader,.loader:after{border-radius:50%;width:10em;height:10em}.loader{font-size:3px;position:relative;border-top:1.1em solid rgba(212,215,221,0.1);border-right:1.1em solid rgba(212,215,221,0.1);border-bottom:1.1em solid rgba(212,215,221,0.1);border-left:1.1em solid #2AA3FF;transform:translateZ(0);animation:load8 .6s infinite linear}@keyframes load8{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.feature-callout{padding:.5rem .5rem .5rem .75rem;background:linear-gradient(45deg, #F95F53,#BE2EE4);border-radius:2px;font-size:.95rem;font-style:italic;font-weight:500;color:#fff;box-shadow:2px 2px 6px rgba(32,32,40,0.35);z-index:100;transition:margin .3s ease-out;display:none}.feature-callout p{position:relative;margin:0}.feature-callout p:after{content:"";position:absolute;width:0;height:0;border-style:solid}.feature-callout p:hover{cursor:default}.feature-callout .new{display:inline-block;position:relative;margin-right:.25rem;font-size:.8rem;padding:.1rem .35rem;background:rgba(255,255,255,0.25);border-radius:1rem}.feature-callout .close{margin-left:.5rem;color:rgba(255,255,255,0.5);text-decoration:none}.feature-callout .close:hover{color:rgba(255,255,255,0.9)}.feature-callout #influxdb-url-selector{position:absolute;top:3rem;right:.75rem}.feature-callout #influxdb-url-selector p:after{top:-1rem;right:1.85rem;border-width:0 7px 8px 7px;border-color:transparent transparent #CB39C4 transparent}.feature-callout #influxdb-url-selector.start-position{margin-top:2.5rem}@media (max-width: 600px){.feature-callout#influxdb-url-selector{top:.55rem;right:5.15rem}.feature-callout#influxdb-url-selector p:after{top:.15rem;right:-16px;border-width:7px 0 7px 8px;border-color:transparent transparent transparent #C231D9}.feature-callout#influxdb-url-selector.start-position{margin-top:2.5rem}}body.v1 .article .article--content blockquote,body.platform .article .article--content blockquote{padding:1.65rem 2rem;margin:1rem 0 2rem;border-width:0 0 0 4px;border-style:solid;border-radius:0 2px 2px 0;border-color:#00A3FF;background:rgba(0,163,255,0.1)}body.v1 .article .article--content blockquote p,body.v1 .article .article--content blockquote li,body.platform .article .article--content blockquote p,body.platform .article .article--content blockquote li{font-size:.95rem;font-style:inherit}body.v1 .article .article--content blockquote ul:last-child,body.v1 .article .article--content blockquote ol:last-child,body.platform .article .article--content blockquote ul:last-child,body.platform .article .article--content blockquote ol:last-child{margin-bottom:1.85rem}body.v1 .article .article--content blockquote h1,body.v1 .article .article--content blockquote h2,body.v1 .article .article--content blockquote h3,body.v1 .article .article--content blockquote h4,body.v1 .article .article--content blockquote h5,body.v1 .article .article--content blockquote h6,body.platform .article .article--content blockquote h1,body.platform .article .article--content blockquote h2,body.platform .article .article--content blockquote h3,body.platform .article .article--content blockquote h4,body.platform .article .article--content blockquote h5,body.platform .article .article--content blockquote h6{color:#fff}body.v1 .article .article--content blockquote p,body.v1 .article .article--content blockquote li,body.platform .article .article--content blockquote p,body.platform .article .article--content blockquote li{color:#BEF0FF}body.v1 .article .article--content blockquote strong,body.platform .article .article--content blockquote strong{color:inherit}body.v1 .article .article--content blockquote a,body.platform .article .article--content blockquote a{color:#fff}body.v1 .article .article--content blockquote a code:after,body.platform .article .article--content blockquote a code:after{border-color:transparent rgba(0,201,255,0.35) transparent transparent}body.v1 .article .article--content blockquote a:hover,body.platform .article .article--content blockquote a:hover{color:#6BDFFF}body.v1 .article .article--content blockquote a:hover code:after,body.platform .article .article--content blockquote a:hover code:after{border-color:transparent #6BDFFF transparent transparent}body.v1 .article .article--content blockquote ol li:before,body.platform .article .article--content blockquote ol li:before{color:#BEF0FF}body.v1 .article .article--content blockquote code,body.v1 .article .article--content blockquote pre,body.platform .article .article--content blockquote code,body.platform .article .article--content blockquote pre{color:#00C9FF;background:#0a071c}body.v1 .article .article--content blockquote img,body.platform .article .article--content blockquote img{box-shadow:1px 3px 10px #0F0E15}body.v1 .article .article--content blockquote table,body.platform .article .article--content blockquote table{color:#BEF0FF;box-shadow:1px 3px 10px #0F0E15}body.v1 .article .article--content blockquote table thead,body.platform .article .article--content blockquote table thead{background:linear-gradient(45deg, #0B3A8D,#066FC5)}body.v1 .article .article--content blockquote table tr:nth-child(even) td,body.platform .article .article--content blockquote table tr:nth-child(even) td{background:#1b3a58}body.v1 .article .article--content blockquote blockquote,body.platform .article .article--content blockquote blockquote{border-color:rgba(190,240,255,0.25)}body.v1 .article .article--content blockquote blockquote p,body.platform .article .article--content blockquote blockquote p{color:rgba(190,240,255,0.6)}body.v1 .article .article--content blockquote .code-tabs-wrapper .code-tabs a,body.platform .article .article--content blockquote .code-tabs-wrapper .code-tabs a{background:transparent;color:rgba(190,240,255,0.5)}body.v1 .article .article--content blockquote .code-tabs-wrapper .code-tabs a:hover,body.platform .article .article--content blockquote .code-tabs-wrapper .code-tabs a:hover{color:#bef0ff}body.v1 .article .article--content blockquote .code-tabs-wrapper .code-tabs a.is-active,body.platform .article .article--content blockquote .code-tabs-wrapper .code-tabs a.is-active{color:#bef0ff;background:#0a071c}#docs-notifications{position:fixed;top:65px;right:10px;z-index:100;width:calc(100vw - 20px);max-width:450px;transition:all .4s ease, top 0s}#docs-notifications .notification{display:none;right:-50px;opacity:0;position:relative;padding:1.25rem 2.5rem 1.25rem 1.25rem;border-radius:2px;box-shadow:2px 2px 6px rgba(32,32,40,0.35);margin-bottom:10px;color:#fff}#docs-notifications .notification .notification-title h3{margin-bottom:1rem;transition:font-size .2s}#docs-notifications .notification .notification-content-wrapper{position:relative}#docs-notifications .notification code{font-size:.85rem}#docs-notifications .notification .notification-slug{font-size:.97rem;margin:-.5rem 0 1.5rem 0}#docs-notifications .notification .notification-slug+.notification-content{border-top:1px dotted rgba(255,255,255,0.5);padding-top:1.25rem}#docs-notifications .notification .notification-slug:last-child{margin-bottom:0}#docs-notifications .notification .notification-slug p:last-child{margin-bottom:0}#docs-notifications .notification .notification-content{font-size:1.05rem;opacity:1;max-height:500px;margin-bottom:1.5rem;transition:opacity .4s, max-height .2s ease-out, margin .2s ease-out, padding .2s}#docs-notifications .notification .notification-content h1,#docs-notifications .notification .notification-content h2,#docs-notifications .notification .notification-content h3,#docs-notifications .notification .notification-content h4,#docs-notifications .notification .notification-content h5,#docs-notifications .notification .notification-content h6{margin:1rem 0 .75rem}#docs-notifications .notification .notification-content h1:first-child,#docs-notifications .notification .notification-content h2:first-child,#docs-notifications .notification .notification-content h3:first-child,#docs-notifications .notification .notification-content h4:first-child,#docs-notifications .notification .notification-content h5:first-child,#docs-notifications .notification .notification-content h6:first-child{margin-top:0}#docs-notifications .notification .close-notification{position:absolute;top:8px;right:8px;font-size:1.7rem;cursor:pointer;transition:color .2s;font-weight:bold;color:rgba(255,255,255,0.5)}#docs-notifications .notification .close-notification:hover{color:#fff}#docs-notifications .notification .show{position:absolute;bottom:1rem;left:1.25rem;text-transform:uppercase;font-size:.8rem;font-weight:bold;opacity:.75;transition:opacity .2s}#docs-notifications .notification .show:hover{cursor:pointer;opacity:1}#docs-notifications .notification .show:before{content:"Show less"}#docs-notifications .notification.note{background:linear-gradient(45deg, #00A3FF,#34BB55)}#docs-notifications .notification.note a:hover{color:#003E34}#docs-notifications .notification.note code{color:#003E34;background:rgba(0,62,52,0.25)}#docs-notifications .notification.note pre{background:rgba(0,62,52,0.25)}#docs-notifications .notification.warn{background:linear-gradient(225deg, #F48D38,#DC4E58)}#docs-notifications .notification.warn a:hover{color:#2F1F29}#docs-notifications .notification.warn code{color:#ffbbdd;background:rgba(47,31,41,0.35)}#docs-notifications .notification.warn pre{background:rgba(47,31,41,0.35)}#docs-notifications .notification.ga-announcement{background-image:url("/svgs/influxdb3-ga-background.svg");background-size:cover}#docs-notifications .notification.ga-announcement a:hover{color:#020a47}#docs-notifications .notification.ga-announcement code{color:#003E34;background:rgba(0,62,52,0.25)}#docs-notifications .notification.ga-announcement pre{background:rgba(0,62,52,0.25)}#docs-notifications .notification.ga-announcement h3{font-size:1.4rem !important}#docs-notifications .notification.ga-announcement .notification-slug{font-size:1.15rem}#docs-notifications .notification.ga-announcement .notification-slug .btn{display:inline-block;background:#fff;color:#020a47;padding:.5rem 1rem;border-radius:4px;font-size:1rem}#docs-notifications .notification h1,#docs-notifications .notification h2,#docs-notifications .notification h3,#docs-notifications .notification h4,#docs-notifications .notification h5,#docs-notifications .notification h6{font-weight:500;margin:1rem 0 .75rem}#docs-notifications .notification h1:first-child,#docs-notifications .notification h2:first-child,#docs-notifications .notification h3:first-child,#docs-notifications .notification h4:first-child,#docs-notifications .notification h5:first-child,#docs-notifications .notification h6:first-child{margin-top:0}#docs-notifications .notification h1,#docs-notifications .notification h2{font-size:1.6rem}#docs-notifications .notification h3{font-size:1.35rem}#docs-notifications .notification h4{font-size:1.2rem}#docs-notifications .notification h5{font-size:1.1rem}#docs-notifications .notification h6{font-size:1.05rem;font-style:italic}#docs-notifications .notification p,#docs-notifications .notification li{line-height:1.5rem}#docs-notifications .notification p{margin:0 0 .75rem}#docs-notifications .notification a{font-weight:bold;text-decoration:none;color:#fff;transition:color .2s}#docs-notifications .notification ul,#docs-notifications .notification ol{padding-left:1.5rem}#docs-notifications .notification code{padding:.15rem .4rem;border-radius:2px;font-weight:bold}#docs-notifications .notification pre{padding:1rem;border-radius:2px;overflow:scroll}#docs-notifications .notification pre code{background:transparent !important}#docs-notifications .notification hr{border-width:1px 0 0 0;border-style:dotted;border-color:rgba(255,255,255,0.5)}#docs-notifications .notification.min .notification-title h3{font-size:1.15rem}#docs-notifications .notification.min .notification-content{max-height:0;margin:0;padding:0;opacity:0;pointer-events:none}#docs-notifications .notification.min .show::before{content:"Show more"}#docs-notifications .notification .title-tag{padding:.15rem .45rem;text-transform:uppercase;font-size:.85rem;border-radius:4px;font-family:"IBM Plex Mono",monospace;background:#020a47}#docs-notifications .notification .title-tag+h3{margin-top:.75rem}@media (max-width: 600px){#docs-notifications{top:50px}}.codeblock{position:relative}.code-controls{position:absolute;display:flex;flex-direction:column;align-items:flex-end;top:.5rem;right:.5rem}.code-controls .code-controls-toggle{padding:.05rem .15rem;display:inline-block;font-size:1.15rem;color:#B7B8FF;opacity:.5;transition:opacity .2s;border-radius:2px;border:none;background:none;line-height:0;cursor:pointer}.code-controls .code-controls-toggle:hover,.code-controls .code-controls-toggle:focus-visible{opacity:1;background-color:rgba(212,215,221,0.1);backdrop-filter:blur(15px)}.code-controls ul.code-control-options{list-style:none;padding:.5rem;margin:0;border-radius:2px;background-color:rgba(212,215,221,0.05);backdrop-filter:blur(15px);display:none}.code-controls ul.code-control-options button{display:block;width:100%;text-align:left;margin:0;padding:.4rem .5rem .6rem;border:none;background:none;border-radius:2px;color:#FAFAFC;font-size:.87rem;line-height:0;cursor:pointer}.code-controls ul.code-control-options button:hover,.code-controls ul.code-control-options button:focus-visible{background-color:rgba(212,215,221,0.07)}.code-controls ul.code-control-options button .cf-icon{margin-right:.35rem}.code-controls ul.code-control-options button.copy-code .message{text-shadow:0px 0px 8px rgba(212,215,221,0);font-weight:normal;transition:color .2s, text-shadow .2s}.code-controls ul.code-control-options button.copy-code.success>.message{text-shadow:0px 0px 8px rgba(212,215,221,0.5);font-weight:bold}.code-controls ul.code-control-options button.copy-code.failed>.message{color:#DC4E58;text-shadow:0px 0px 8px rgba(220,78,88,0.5);font-weight:bold}.code-controls ul.code-control-options li{margin:0}.code-controls.open .code-controls-toggle{display:none}.code-controls.open .code-control-options{display:block}.fullscreen-code{display:none;z-index:1000;position:fixed;top:0;left:0;height:100vh;width:100vw;padding:2rem;background:#07070E;overflow:scroll !important}.fullscreen-code .fullscreen-close{position:fixed;padding:.1rem;right:.75rem;top:.5rem;display:block;color:#B7B8FF;font-size:2rem;text-decoration:none;background:#07070E;border-radius:2px}.fullscreen-code .fullscreen-close span{opacity:0.5;transition:opacity 0.2s}.fullscreen-code .fullscreen-close:hover span{opacity:1}.fullscreen-code pre{display:block;line-height:1.75rem;font-family:"IBM Plex Mono",monospace}.fullscreen-code pre code,.fullscreen-code pre pre{background:#07070E;font-family:"IBM Plex Mono",monospace;color:#B7B8FF}.fullscreen-code pre p code,.fullscreen-code pre li code,.fullscreen-code pre table code{padding:.1rem .4rem .2rem;border-radius:2px;color:#B7B8FF;white-space:nowrap;font-size:1rem;font-style:normal}.fullscreen-code pre h1 code,.fullscreen-code pre h2 code,.fullscreen-code pre h3 code,.fullscreen-code pre h4 code,.fullscreen-code pre h5 code,.fullscreen-code pre h6 code{padding:inherit !important;background:inherit !important;font-size:inherit !important;font-weight:inherit !important;font-family:"Proxima Nova",sans-serif;color:inherit !important}.fullscreen-code pre a code{font-weight:normal;transition:color .2s;position:relative;color:#00A3FF}.fullscreen-code pre a code:after{content:"";position:absolute;display:block;top:0;right:0;border-style:solid;border-width:0 .4rem .4rem 0;border-color:transparent rgba(0,163,255,0.35) transparent transparent;transition:border .2s}.fullscreen-code pre a:hover code{color:#fff}.fullscreen-code pre a:hover code:after{border-color:transparent #fff transparent transparent}.fullscreen-code pre pre{margin:2rem 0 2.25rem;padding:1.75rem 1.75rem 1.25rem;border-radius:2px;overflow-x:scroll;overflow-y:hidden;font-size:1rem}.fullscreen-code pre pre code{padding:0;line-height:1.7rem;white-space:pre}.fullscreen-code pre pre .api{margin-right:.35rem;padding:.15rem .5rem .25rem;border-radius:2px;color:#fff;font-family:"IBM Plex Mono",monospace;font-weight:bold;font-size:1rem}.fullscreen-code pre pre .api.get{background:#009F5F}.fullscreen-code pre pre .api.post{background:#066FC5}.fullscreen-code pre pre .api.patch{background:#E85B1C}.fullscreen-code pre pre .api.delete{background:#BF3D5E}.fullscreen-code pre pre .api.put{background:#513CC6}.fullscreen-code pre pre.api-endpoint a{position:relative;color:#00A3FF;text-decoration:none}.fullscreen-code pre pre.api-endpoint a:after{content:"\e90d";position:absolute;right:-1.45rem;top:0.65rem;font-family:"icomoon-v4";color:#fff;display:inline-block;font-size:1.1rem;line-height:0;opacity:0;transition:opacity .2s}.fullscreen-code pre pre.api-endpoint a:hover{color:#fff}.fullscreen-code pre pre.api-endpoint a:hover:after{opacity:.6}.fullscreen-code pre span.code-callout,.fullscreen-code pre .code-placeholder{font-weight:bold;margin:0 .15rem}.fullscreen-code pre span.code-callout.green,.fullscreen-code pre .code-placeholder.green{color:#009F5F}.fullscreen-code pre span.code-callout.magenta,.fullscreen-code pre .code-placeholder.magenta{color:#d30971}.fullscreen-code pre span.code-callout.orange,.fullscreen-code pre .code-placeholder.orange{color:#F95F53}.fullscreen-code pre span.code-callout.delete,.fullscreen-code pre span.code-callout.strike,.fullscreen-code pre .code-placeholder.delete,.fullscreen-code pre .code-placeholder.strike{text-decoration:line-through}.fullscreen-code pre .code-placeholder-wrapper{display:inline;position:relative}.fullscreen-code pre .code-placeholder-wrapper .code-placeholder{display:inline-block;margin:0 .15rem;padding:0;line-height:1.4em;color:#e659a2;font-weight:normal;font-style:normal;border-bottom:1px dotted;transition:color .2s;cursor:pointer}.fullscreen-code pre .code-placeholder-wrapper .code-placeholder .code-placeholder-edit-icon{font-style:normal}.fullscreen-code pre .code-placeholder-wrapper .code-placeholder .code-placeholder-edit-icon::before{margin-left:.2rem;font-size:.8em;transition:opacity .2s;opacity:.65;z-index:-1}.fullscreen-code pre .code-placeholder-wrapper .code-placeholder:hover{color:#5ee4e4}.fullscreen-code pre .code-placeholder-wrapper .code-placeholder:hover .code-placeholder-edit-icon::before{opacity:1}.fullscreen-code pre .code-placeholder-wrapper .code-input-wrapper{position:absolute;top:-3px;left:-4.5px;z-index:1;color:inherit}.fullscreen-code pre .code-placeholder-wrapper .code-input-wrapper input.placeholder-edit{width:100%;max-width:100%;border:1px solid #1A1A2A;border-radius:4px;background-color:#1A1A2A;padding:2px 20px 2px 6px;color:#5ee4e4;font-weight:normal}.fullscreen-code pre .code-placeholder-wrapper .code-input-wrapper input.placeholder-edit:focus{outline:none;border-color:rgba(94,228,228,0.75);box-shadow:1px 1px 8px rgba(94,228,228,0.5);border-radius:2px}.fullscreen-code pre .code-placeholder-wrapper .code-input-wrapper:hover{cursor:pointer}.fullscreen-code pre .code-placeholder-wrapper .code-input-wrapper:after{content:"\e937";color:#5ee4e4;font-family:'icomoon-v4';display:block;position:absolute;top:0;right:3px}.fullscreen-code pre .code-placeholder-key code{color:#e659a2 !important}.fullscreen-code pre pre span.tc-dynamic-value{border:1px solid;border-radius:6px;padding:0 .25rem;--param-color: #ff79c6;--param-bg: #ff79c633;--env-color: #0092b8;--env-bg: #0092b833;--secret-color: #9a09ff;--secret-bg: #9809ff33}.fullscreen-code pre pre span.tc-dynamic-value.param{color:var(--param-color);background:var(--param-bg);border-color:var(--param-color)}.fullscreen-code pre pre span.tc-dynamic-value.env{color:var(--env-color);background:var(--env-bg);border-color:var(--env-color)}.fullscreen-code pre pre span.tc-dynamic-value.secret{color:var(--secret-color);background:var(--secret-bg);border-color:var(--secret-color)}@media (max-width: 600px){.fullscreen-code pre pre{padding:1.2em 1.2em .75rem}}#v3-wayfinding-modal{display:flex;width:100%;justify-content:center;align-items:center;position:fixed;top:-100vh;padding:2rem;z-index:200;backdrop-filter:blur(15px);transition:top .75s ease-in-out}#v3-wayfinding-modal.open{top:0}#v3-wayfinding-modal .wayfinding-wrapper{background:linear-gradient(45deg, #d30971,#9b2aff);position:relative;max-width:800px;pointer-events:all;border-radius:4px}#v3-wayfinding-modal .wayfinding-content{padding:1.5rem;color:#fff}#v3-wayfinding-modal .wayfinding-content h4{font-size:1.25rem;margin:0}#v3-wayfinding-modal .wayfinding-content-info{display:flex;flex-direction:row}#v3-wayfinding-modal .wayfinding-content-info p{color:rgba(255,255,255,0.85);line-height:1.65rem}#v3-wayfinding-modal .wayfinding-content-info p strong{color:#fff}#v3-wayfinding-modal .wayfinding-content-info a#find-out-toggle{position:relative;color:inherit;font-size:.95rem;text-decoration:none;white-space:nowrap}#v3-wayfinding-modal .wayfinding-content-info a#find-out-toggle:after{position:absolute;display:block;content:"";border-top:1px solid #fff;bottom:-.1rem;left:0;height:1px;width:0%;transition:width .2s}#v3-wayfinding-modal .wayfinding-content-info a#find-out-toggle:hover{color:#fff}#v3-wayfinding-modal .wayfinding-content-info a#find-out-toggle:hover:after{width:100%}#v3-wayfinding-modal .wayfinding-content-info #find-out-instructions{text-align:center;line-height:1rem;transition:height .2s ease-out, opacity .2s;opacity:0;height:0;overflow:hidden}#v3-wayfinding-modal .wayfinding-content-info #find-out-instructions p{margin-top:0;font-size:.95rem;font-style:italic;line-height:1.3rem}#v3-wayfinding-modal .wayfinding-content-info #find-out-instructions a{position:relative;color:#fff;text-decoration:none;font-weight:bold}#v3-wayfinding-modal .wayfinding-content-info #find-out-instructions a:after{position:absolute;display:block;content:"";border-top:1px solid #fff;bottom:-.2rem;left:0;height:1px;width:0%;transition:width .2s}#v3-wayfinding-modal .wayfinding-content-info #find-out-instructions a:hover:after{width:100%}#v3-wayfinding-modal .wayfinding-content-info .powered-by-example{padding:1rem 1.25rem;display:inline-block;border-radius:2px;background:#0F0E15;color:#2AA3FF;font-size:.95rem;font-weight:bold;text-align:center}#v3-wayfinding-modal .wayfinding-content-info .powered-by-example span.storage-description{display:block;color:#828294;font-weight:normal;line-height:1.1rem}#v3-wayfinding-modal .wayfinding-content-info .powered-by-example span.storage-description.git-head::after{content:"(xxxxxx)";font-family:"IBM Plex Mono",monospace;margin-left:.2rem}#v3-wayfinding-modal .wayfinding-actions{min-width:33%;margin-left:2rem;display:flex;flex-direction:column;justify-content:center;align-content:center}#v3-wayfinding-modal .v3-wayfinding-btn{display:block;padding:1rem;margin-bottom:.5rem;border-radius:2px;background-color:#fff;text-align:center;text-decoration:none;color:#9b2aff;box-shadow:0px 0px 10px rgba(255,255,255,0);transition:color .2s, box-shadow .2s}#v3-wayfinding-modal .v3-wayfinding-btn:hover{color:#5C10A0;box-shadow:0 0 10px rgba(255,255,255,0.9)}#v3-wayfinding-modal .v3-wayfinding-btn .small{font-size:1rem}#v3-wayfinding-modal #v3-wayfinding-close{position:absolute;top:.75rem;right:.75rem;color:#fff;font-size:2rem;opacity:.65;transition:opacity .2s}#v3-wayfinding-modal #v3-wayfinding-close:hover{opacity:1;cursor:pointer}#v3-wayfinding-modal label{margin-top:.5rem;display:block;text-align:center;font-size:.95rem;font-style:italic;position:relative;cursor:pointer;-moz-user-select:none;user-select:none;-webkit-user-select:none}#v3-wayfinding-modal label .checkbox{display:inline-block;width:15px;height:15px;border:1.5px solid rgba(255,255,255,0.85);vertical-align:middle;border-radius:2px;position:relative}#v3-wayfinding-modal label .checkbox:before{content:'';display:inline-block;width:3px;height:7px;border-right:2px solid rgba(255,255,255,0.85);border-bottom:2px solid rgba(255,255,255,0.85);position:absolute;left:50%;top:50%;transform:translate(-50%, -50%) rotate(45deg) scale(0);transition:all 0.2s}#v3-wayfinding-modal label input{position:absolute;opacity:0;visibility:hidden}#v3-wayfinding-modal label input:checked+.checkbox{border-color:rgba(255,255,255,0.85)}#v3-wayfinding-modal label input:checked+.checkbox:before{transform:translate(-50%, -60%) rotate(45deg) scale(1)}#v3-wayfinding-modal label .checkbox-text{margin-left:4px;display:inline-block;vertical-align:middle}@media (max-width: 600px){#v3-wayfinding-modal .wayfinding-content-info{flex-direction:column}#v3-wayfinding-modal #find-out-instructions{padding-bottom:1.5rem}#v3-wayfinding-modal .wayfinding-actions{margin-left:0}}.influxdb-version-detector{--transition-fast: 0.2s ease;--transition-normal: 0.3s ease;--spacing-sm: 0.625rem;--spacing-md: 1.25rem;margin:2rem auto}.influxdb-version-detector .detector-title{color:#fff;margin-bottom:0.625rem;font-size:1.8em;font-weight:600}.influxdb-version-detector .detector-subtitle{color:#D4D7DD;margin-bottom:1.875rem;font-size:0.95em;opacity:0.8}.influxdb-version-detector .progress{margin-bottom:1.5625rem;height:6px;background:#383846;border-radius:3px;overflow:hidden}.influxdb-version-detector .progress .progress-bar{height:100%;background:#00A3FF;transition:width var(--transition-normal)}.influxdb-version-detector .question-container{min-height:150px}.influxdb-version-detector .question-container .question{display:none;animation:fadeIn var(--transition-normal)}.influxdb-version-detector .question-container .question.active{display:block}.influxdb-version-detector .question-container .question .question-text{font-size:1.1em;color:#fff;margin-bottom:1.25rem;font-weight:500}.influxdb-version-detector .url-suggestions .suggestion-button,.influxdb-version-detector .back-button,.influxdb-version-detector .restart-button,.influxdb-version-detector .submit-button,.influxdb-version-detector .option-button{border:none;border-radius:var(--border-radius);cursor:pointer;transition:all var(--transition-fast);font-family:inherit}.influxdb-version-detector .url-suggestions .suggestion-button:focus,.influxdb-version-detector .back-button:focus,.influxdb-version-detector .restart-button:focus,.influxdb-version-detector .submit-button:focus,.influxdb-version-detector .option-button:focus{outline:2px solid #00A3FF;outline-offset:2px}.influxdb-version-detector .option-button{display:block;width:100%;text-align:left;margin-bottom:0.75rem;padding:0.875rem 1.125rem;background:#14141F;color:#D4D7DD;border:2px solid #383846;font-size:15px}.influxdb-version-detector .option-button:hover{border-color:#00A3FF;background:#14141F;transform:translateX(3px)}.influxdb-version-detector .option-button:active{transform:translateX(1px)}.influxdb-version-detector .submit-button{background:#00A3FF;color:#fff;padding:0.75rem 1.5rem;font-size:15px;font-weight:500}.influxdb-version-detector .submit-button:hover{background:#066FC5;color:#fff}.influxdb-version-detector .submit-button:disabled{background:#676978;cursor:not-allowed}.influxdb-version-detector .back-button,.influxdb-version-detector .restart-button{background:#676978;color:#fff;padding:var(--spacing-sm) var(--spacing-md);font-size:14px;margin-right:var(--spacing-sm)}.influxdb-version-detector .back-button:hover,.influxdb-version-detector .restart-button:hover{background:#757888}.influxdb-version-detector .restart-button{margin-top:var(--spacing-md);margin-right:0}.influxdb-version-detector textarea,.influxdb-version-detector .input-group input{width:100%;border:2px solid #383846;border-radius:var(--border-radius);transition:border-color var(--transition-fast);background:#14141F;color:#D4D7DD}.influxdb-version-detector textarea:focus,.influxdb-version-detector .input-group input:focus{outline:none;border-color:#00A3FF}.influxdb-version-detector .input-group{margin-bottom:var(--spacing-md)}.influxdb-version-detector .input-group label{display:block;margin-bottom:0.5rem;color:#D4D7DD;font-weight:500}.influxdb-version-detector .input-group input{padding:0.75rem;font-size:14px}.influxdb-version-detector textarea{padding:var(--spacing-sm);font-family:var(--font-mono, "Courier New", monospace);font-size:12px;resize:vertical;min-height:120px}.influxdb-version-detector textarea::-moz-placeholder{color:rgba(212,215,221,0.6);opacity:1}.influxdb-version-detector textarea::placeholder{color:rgba(212,215,221,0.6);opacity:1}.influxdb-version-detector textarea::-webkit-input-placeholder{color:rgba(212,215,221,0.6)}.influxdb-version-detector textarea::-moz-placeholder{color:rgba(212,215,221,0.6);opacity:1}.influxdb-version-detector textarea:-ms-input-placeholder{color:rgba(212,215,221,0.6)}.influxdb-version-detector .code-block{background:#07070E;color:#B7B8FF;padding:1.75rem 1.75rem 1.25rem;border-radius:2px;font-family:"IBM Plex Mono",monospace;font-size:1rem;margin:2rem 0 2.25rem;overflow-x:scroll;overflow-y:hidden;line-height:1.7rem;white-space:pre}.influxdb-version-detector .url-pattern-hint{margin-bottom:var(--spacing-sm);padding:var(--spacing-sm);background:#00A3FF;border:1px solid #00A3FF;border-radius:var(--border-radius);color:#BEF0FF;font-size:13px}.influxdb-version-detector .url-suggestions{margin-bottom:var(--spacing-md)}.influxdb-version-detector .url-suggestions .suggestions-header{color:#fff;margin-bottom:var(--spacing-sm);font-size:14px}.influxdb-version-detector .url-suggestions .suggestion-button{display:block;width:100%;text-align:left;margin-bottom:var(--spacing-sm);padding:var(--spacing-sm);background:#14141F;border:1px solid #383846}.influxdb-version-detector .url-suggestions .suggestion-button:hover{border-color:#00A3FF;background:#14141F}.influxdb-version-detector .url-suggestions .suggestion-button .suggestion-url{font-family:var(--font-mono, "Courier New", monospace);font-size:13px;color:#00A3FF;margin-bottom:2px}.influxdb-version-detector .url-suggestions .suggestion-button .suggestion-product{font-size:12px;color:#D4D7DD;opacity:0.8}.influxdb-version-detector .url-suggestions .suggestion-button .suggestion-pattern{font-size:11px;color:#00A3FF;font-style:italic;margin-top:2px}.influxdb-version-detector .result{display:none;margin-top:var(--spacing-sm);padding:var(--spacing-md);border-radius:var(--border-radius);animation:fadeIn var(--transition-normal)}.influxdb-version-detector .result.show{display:block}.influxdb-version-detector .result.success{background:#14141F;border-left:3px solid #00A3FF;color:#D4D7DD}.influxdb-version-detector .result.error{background:#FFF7F4;border-left:3px solid #d30971;color:#2F1F29}.influxdb-version-detector .result.info{background:#00A3FF;border-left:3px solid #00A3FF;color:#BEF0FF}.influxdb-version-detector .result.warning{background:rgba(255,97,133,0.101961);border-left:3px solid #FF8564;color:#FFB6A0}.influxdb-version-detector .detected-version{font-size:1.3em;font-weight:bold;color:#00A3FF;margin-bottom:var(--spacing-sm);padding:var(--spacing-sm);background:rgba(0,163,255,0.1);border-radius:4px;border-left:4px solid #00A3FF}.influxdb-version-detector .url-prefilled-indicator{font-size:0.85em;color:#BEF0FF;margin-bottom:8px;padding:4px 8px;background:rgba(0,163,255,0.1);border-left:3px solid #00A3FF}.influxdb-version-detector .loading{display:inline-block;margin-left:var(--spacing-sm)}.influxdb-version-detector .loading:after{content:'...';animation:dots 1.5s steps(4, end) infinite}@keyframes dots{0%,20%{content:'.'}40%{content:'..'}60%,100%{content:'...'}}@keyframes fadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@media (max-width: 768px){.influxdb-version-detector{padding:1.5rem}.influxdb-version-detector .detector-title{font-size:1.5em}.influxdb-version-detector .option-button{padding:0.75rem 1rem;font-size:14px}.influxdb-version-detector .submit-button,.influxdb-version-detector .back-button,.influxdb-version-detector .restart-button{padding:var(--spacing-sm) var(--spacing-md);font-size:14px}}@media (max-width: 480px){.influxdb-version-detector{padding:1rem}.influxdb-version-detector .detector-title{font-size:1.3em}.influxdb-version-detector .detector-subtitle{font-size:0.9em}.influxdb-version-detector .question-text{font-size:1em}}.influxdb-version-detector .product-ranking{margin-bottom:var(--spacing-sm);padding:0.75rem;border-radius:var(--border-radius);border-left:4px solid #383846;background:#14141F}.influxdb-version-detector .product-ranking.top-result{background:rgba(0,163,255,0.1);border-color:#00A3FF}.influxdb-version-detector .product-ranking .product-title{font-weight:600;margin-bottom:0.25rem}.influxdb-version-detector .product-ranking .most-likely-label{color:#00A3FF;font-size:0.9em;margin-left:var(--spacing-sm)}.influxdb-version-detector .product-ranking .product-details{color:#D4D7DD;font-size:0.9em;margin-top:0.25rem;opacity:0.8}.influxdb-version-detector .grafana-tips{margin-top:var(--spacing-md);padding:1rem;background:rgba(0,163,255,0.1);border-left:4px solid #00A3FF;border-radius:var(--border-radius)}.influxdb-version-detector .grafana-tips .tips-title{margin:0 0 var(--spacing-sm) 0;color:#00A3FF;font-size:1.1em}.influxdb-version-detector .grafana-tips .tips-description{margin:0 0 var(--spacing-sm) 0;font-size:0.9em}.influxdb-version-detector .grafana-tips .tips-list{margin:0;padding-left:1.25rem;font-size:0.85em}.influxdb-version-detector .grafana-tips .tips-list li{margin-bottom:0.25rem}.influxdb-version-detector .grafana-tips .tips-list code{background:rgba(0,163,255,0.15);padding:0.125rem 0.25rem;border-radius:3px;font-size:0.9em}.influxdb-version-detector .grafana-tips .tips-link{margin:var(--spacing-sm) 0 0 0;font-size:0.85em}.influxdb-version-detector .expected-results{margin:1rem 0}.influxdb-version-detector .expected-results .results-title{font-weight:600;margin-bottom:0.5rem}.influxdb-version-detector .expected-results .results-list{margin:0;padding-left:1rem;font-size:0.9em}.influxdb-version-detector .expected-results .results-list li{margin-bottom:0.25rem}.influxdb-version-detector .question-text-spaced{margin-top:1rem;font-weight:normal;font-size:0.95em}.influxdb-version-detector .question-options{margin-top:1rem}.influxdb-version-detector .command-help{margin-top:var(--spacing-md)}.influxdb-version-detector .doc-link,.influxdb-version-detector .ask-ai-open{color:#00A3FF;text-decoration:underline;display:inline-block}.influxdb-version-detector .doc-link:hover,.influxdb-version-detector .ask-ai-open:hover{color:#fff}.influxdb-version-detector .ask-ai-open{margin-left:0.5rem}.influxdb-version-detector .manual-output{margin:1rem 0;padding:var(--spacing-sm);background:#14141F;border-left:4px solid #00A3FF;border-radius:var(--border-radius)}.influxdb-version-detector .action-section{margin-top:var(--spacing-md)}.influxdb-version-detector .quick-reference{margin-top:2rem}.influxdb-version-detector .quick-reference details{border:1px solid #383846;border-radius:var(--border-radius);padding:0.5rem}.influxdb-version-detector .quick-reference .reference-summary{cursor:pointer;font-weight:600;padding:0.5rem 0;-webkit-user-select:none;-moz-user-select:none;user-select:none;color:#00A3FF}.influxdb-version-detector .quick-reference .reference-summary:hover{color:#fff}.influxdb-version-detector .expandable-summary{cursor:pointer;font-weight:600;padding:0.5rem 0;-webkit-user-select:none;-moz-user-select:none;user-select:none;color:#00A3FF;position:relative;padding-left:1.5rem}.influxdb-version-detector .expandable-summary:hover{color:#fff}.influxdb-version-detector .expandable-summary::marker,.influxdb-version-detector .expandable-summary::-webkit-details-marker{display:none}.influxdb-version-detector .expandable-summary::before{content:'+';position:absolute;left:0;top:50%;transform:translateY(-50%);width:1rem;height:1rem;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:bold;color:#00A3FF;border:1px solid #00A3FF;border-radius:3px;background:transparent}details[open] .influxdb-version-detector .expandable-summary::before{content:'−'}.influxdb-version-detector .expandable-summary:hover::before{color:#fff;border-color:#fff}.influxdb-version-detector .quick-reference{margin-top:2rem}.influxdb-version-detector .quick-reference details{border:1px solid #383846;border-radius:var(--border-radius);padding:0.5rem}.influxdb-version-detector .quick-reference .reference-table{margin-top:1rem;width:100%;border-collapse:collapse;font-size:0.9em}.influxdb-version-detector .quick-reference .reference-table th,.influxdb-version-detector .quick-reference .reference-table td{padding:0.5rem;text-align:left;border:1px solid #383846}.influxdb-version-detector .quick-reference .reference-table th{padding:0.75rem 0.5rem;background:rgba(0,163,255,0.1);font-weight:600}.influxdb-version-detector .quick-reference .reference-table tbody tr:nth-child(even){background:rgba(212,215,221,0.02)}.influxdb-version-detector .quick-reference .reference-table .product-name{font-weight:600}.format-selector{position:relative;display:inline-flex;align-items:center;margin-left:auto;margin-top:0.5rem}.title .format-selector{margin-left:auto}.format-selector__button{display:inline-flex;align-items:center;gap:0.5rem;padding:0.5rem 0.75rem;background:#1A1A2A;color:#D4D7DD;border:1px solid #333346;border-radius:2px;font-size:14px;font-weight:500;line-height:1;cursor:pointer;transition:all 0.2s ease;white-space:nowrap;box-shadow:2px 2px 6px rgba(15,14,21,0.5)}.format-selector__button:hover{border-color:#00A3FF;box-shadow:1px 1px 10px rgba(0,163,255,0.5)}.format-selector__button:focus{outline:2px solid #00A3FF;outline-offset:2px}.format-selector__button[aria-expanded='true']{border-color:#00A3FF}.format-selector__button[aria-expanded='true'] .format-selector__button-arrow svg{transform:rotate(180deg)}.format-selector__button-icon{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px}.format-selector__button-icon svg{width:100%;height:100%;color:#D4D7DD}.format-selector__button-text{font-size:14px;font-weight:500}.format-selector__button-arrow{display:inline-flex;align-items:center;justify-content:center;width:12px;height:12px;margin-left:0.25rem}.format-selector__button-arrow svg{width:100%;height:100%;transition:transform 0.2s ease}.format-selector__dropdown{position:fixed;min-width:280px;max-width:320px;background:#14141F;border:1px solid #333346;border-radius:8px;box-shadow:2px 2px 6px #07070E;padding:0.5rem;z-index:10000;opacity:0;visibility:hidden;transform:translateY(-8px);transition:all 0.2s ease;pointer-events:none}.format-selector__dropdown.is-open{opacity:1;visibility:visible;transform:translateY(0);pointer-events:auto}.format-selector__option{display:flex;align-items:flex-start;gap:0.75rem;width:100%;padding:0.75rem;background:transparent;color:#D4D7DD;border:none;border-radius:2px;text-align:left;text-decoration:none;cursor:pointer;transition:background 0.15s ease}.format-selector__option:hover{background:#1A1A2A;color:#00A3FF}.format-selector__option:focus{outline:2px solid #00A3FF;outline-offset:-2px}.format-selector__option:not(:last-child){margin-bottom:0.25rem}.format-selector__icon{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;flex-shrink:0;margin-top:2px}.format-selector__icon svg{width:100%;height:100%;stroke:#D4D7DD}.format-selector__icon svg [fill]:not([fill="none"]):not([fill="white"]){fill:#D4D7DD}.format-selector__label-group{display:flex;flex-direction:column;gap:0.25rem;flex:1;min-width:0}.format-selector__label{display:flex;align-items:center;gap:0.5rem;font-size:14px;font-weight:500;line-height:1.3;color:#D4D7DD}.format-selector__external{display:inline-flex;align-items:center;font-size:12px;color:#D4D7DD;margin-left:0.25rem;opacity:0.7}.format-selector__sublabel{font-size:12px;line-height:1.4;color:#D4D7DD}@media (max-width: 768px){.format-selector{margin-left:0;margin-top:1rem}.format-selector__dropdown{right:auto;left:0;min-width:100%;max-width:100%}}.format-selector__dropdown{isolation:isolate}@keyframes slideInUp{from{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}*{box-sizing:border-box} +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLEtBQUssY0FBYyxDQUFDLGtDQUFrQyxDQUFDLGlDQUFpQyxDQUFDLFdBQVcsMEJBQTBCLENBQUMsb0RBQW9ELENBQUMsZUFBZSxDQUFDLFdBQVcsMEJBQTBCLENBQUMsMkRBQTJELENBQUMsZUFBZSxDQUFDLFdBQVcsMEJBQTBCLENBQUMsNkRBQTZELENBQUMsbUJBQW1CLENBQUMsV0FBVywwQkFBMEIsQ0FBQyx5REFBeUQsQ0FBQyxlQUFlLENBQUMsV0FBVyx3QkFBd0IsQ0FBQyxzQ0FBc0MsQ0FBQyw2T0FBNk8sQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxtQ0FBbUMsbUNBQW1DLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxrQ0FBa0MsQ0FBQyxpQ0FBaUMsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsZUFBZSxlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxpQkFBaUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxXQUFXLHdCQUF3QixDQUFDLDJEQUEyRCxDQUFDLDhPQUE4TyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLGtDQUFrQyxDQUFDLGlDQUFpQyxDQUFDLDZCQUE2QixlQUFlLENBQUMsbUNBQW1DLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyxnQ0FBZ0MsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyxrQ0FBa0MsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyxnQ0FBZ0MsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLGlDQUFpQyxlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsaUNBQWlDLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxrQ0FBa0MsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLGtDQUFrQyxlQUFlLENBQUMsaUNBQWlDLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLGlDQUFpQyxlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQ0FBcUMsZUFBZSxDQUFDLFVBQVUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsV0FBVyx3QkFBd0IsQ0FBQywyREFBMkQsQ0FBQyw4T0FBOE8sQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxrQ0FBa0MsQ0FBQyxpQ0FBaUMsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsa0NBQWtDLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsb0NBQW9DLGVBQWUsQ0FBQyxxQ0FBcUMsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLFdBQVcseUJBQXlCLENBQUMsdUNBQXVDLENBQUMsOE9BQThPLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsK0NBQStDLG9DQUFvQyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsa0NBQWtDLENBQUMsaUNBQWlDLENBQUMsMkJBQTJCLGFBQWEsQ0FBQyw2QkFBNkIsYUFBYSxDQUFDLHdCQUF3QixhQUFhLENBQUMsdUJBQXVCLGFBQWEsQ0FBQywyQkFBMkIsYUFBYSxDQUFDLElBQUksd0JBQXdCLENBQUMsSUFBSSx3QkFBd0IsQ0FBQyxTQUFTLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsZUFBZSxXQUFXLENBQUMsa0NBQWtDLGtCQUFrQixDQUFDLDZCQUE2QixTQUFTLENBQUMsa0NBQWtDLENBQUMsNEJBQTRCLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsbUNBQW1DLENBQUMsd0JBQXdCLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyw2QkFBNkIsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsMEJBQTBCLENBQUMsNEJBQTRCLENBQUMsa0NBQWtDLENBQUMsbUNBQW1DLENBQUMsaUNBQWlDLENBQUMsa0NBQWtDLFFBQVEsQ0FBQyxtQ0FBbUMsQ0FBQyx3Q0FBd0MsUUFBUSxDQUFDLDBCQUEwQixDQUFDLHdDQUF3QyxrQ0FBa0MsQ0FBQyxtQ0FBbUMsUUFBUSxDQUFDLG1DQUFtQyxDQUFDLHlDQUF5QyxRQUFRLENBQUMsMEJBQTBCLENBQUMseUNBQXlDLGtDQUFrQyxDQUFDLHdDQUF3QyxrQkFBa0IsQ0FBQyxtQ0FBbUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLGtDQUFrQyxPQUFPLENBQUMseUJBQXlCLENBQUMsNkJBQTZCLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxtQ0FBbUMsT0FBTyxDQUFDLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxpQ0FBaUMsQ0FBQywrQkFBK0IsQ0FBQyxvQ0FBb0MsQ0FBQyxpQ0FBaUMsQ0FBQyxZQUFZLGFBQWEsQ0FBQyxxQ0FBcUMsa0JBQWtCLENBQUMsZ0NBQWdDLFNBQVMsQ0FBQyxrQ0FBa0MsQ0FBQywwQkFBMEIsK0JBQStCLENBQUMsZ0NBQWdDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxnQ0FBZ0MsQ0FBQyxrQ0FBa0MsQ0FBQywrQkFBK0IsQ0FBQyxpQ0FBaUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxtQkFBbUIsYUFBYSxDQUFDLG1CQUFtQix3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyx3QkFBd0IsMEJBQTBCLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFzQixnQkFBZ0IsQ0FBQyxpQkFBaUIsV0FBVyxDQUFDLHFCQUFxQixZQUFZLENBQUMsNkJBQTZCLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxvQ0FBb0MsWUFBWSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxnREFBZ0QsOENBQThDLENBQUMsbUNBQW1DLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyx1Q0FBdUMsa0JBQWtCLENBQUMsa0NBQWtDLFNBQVMsQ0FBQywrQkFBK0Isb0JBQW9CLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLCtCQUErQixvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsd0NBQXdDLGlCQUFpQixDQUFDLHdDQUF3QyxpQkFBaUIsQ0FBQyxpQkFBaUIsWUFBWSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLFlBQVksQ0FBQywrQkFBK0IsWUFBWSxDQUFDLHdDQUF3Qyx5QkFBeUIsQ0FBQyxzQkFBc0IseUJBQXlCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsY0FBYyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsa0RBQWtELGNBQWMsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxzQ0FBc0MsdUNBQXVDLENBQUMsY0FBYyxDQUFDLGtCQUFrQix3QkFBd0IsQ0FBQyw4Q0FBOEMsQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsd0NBQXdDLGlCQUFpQixDQUFDLGdEQUFnRCx3QkFBd0IsQ0FBQyxlQUFlLENBQUMsc0RBQXNELHVDQUF1QyxDQUFDLG1FQUFtRSwrQ0FBK0MsQ0FBQyx1REFBdUQsd0JBQXdCLENBQUMsMERBQTBELGVBQWUsQ0FBQyx3Q0FBd0Msd0JBQXdCLENBQUMsVUFBVSxDQUFDLDBCQUEwQix3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLGdDQUFnQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLDBCQUEwQixhQUFhLENBQUMscUNBQXFDLGFBQWEsQ0FBQyxxQ0FBcUMsYUFBYSxDQUFDLCtCQUErQixhQUFhLENBQUMsK0JBQStCLGFBQWEsQ0FBQyxvRUFBb0UsdUNBQXVDLENBQUMsZUFBZSxDQUFDLHlGQUF5RixxQkFBcUIsQ0FBQyw0RUFBNEUsd0JBQXdCLENBQUMsVUFBVSxDQUFDLHNDQUFzQyx3QkFBd0IsQ0FBQyxxREFBcUQsVUFBVSxDQUFDLDhDQUE4Qyx3QkFBd0IsQ0FBQywwQkFBMEIsb0JBQW9CLENBQUMsaUNBQWlDLGlEQUFpRCxDQUFDLGdDQUFnQyxpREFBaUQsQ0FBQyw0QkFBNEIsdUJBQXVCLGdCQUFnQixDQUFDLHVDQUF1QyxpQkFBaUIsQ0FBQyxDQUFDLHFFQUFxRSxDQUFDLEtBQUssc0JBQXNCLENBQUMseUJBQXlCLENBQUMsNkJBQTZCLENBQUMsS0FBSyxRQUFRLENBQUMsMkZBQTJGLGFBQWEsQ0FBQyw0QkFBNEIsb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsc0JBQXNCLFlBQVksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLFlBQVksQ0FBQyxFQUFFLDRCQUE0QixDQUFDLGlCQUFpQixTQUFTLENBQUMsWUFBWSx3QkFBd0IsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLElBQUksaUJBQWlCLENBQUMsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLEtBQUssZUFBZSxDQUFDLFVBQVUsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxRQUFRLGFBQWEsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxRQUFRLENBQUMsZUFBZSxlQUFlLENBQUMsT0FBTyxlQUFlLENBQUMsR0FBK0Isc0JBQXNCLENBQUMsUUFBUSxDQUFDLElBQUksYUFBYSxDQUFDLGtCQUFrQixnQ0FBZ0MsQ0FBQyxhQUFhLENBQUMsc0NBQXNDLGFBQWEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sZ0JBQWdCLENBQUMsY0FBYyxtQkFBbUIsQ0FBQywwRUFBMEUseUJBQXlCLENBQUMsY0FBYyxDQUFDLHNDQUFzQyxjQUFjLENBQUMsaURBQWlELFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxrQkFBa0IsQ0FBQywyQ0FBMkMscUJBQXFCLENBQUMsU0FBUyxDQUFDLGdHQUFnRyxXQUFXLENBQUMscUJBQXFCLDRCQUE0QixDQUE0RCxzQkFBc0IsQ0FBQyxtR0FBbUcsdUJBQXVCLENBQUMsU0FBUyx3QkFBd0IsQ0FBQyxZQUFZLENBQUMsNkJBQTZCLENBQUMsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsYUFBYSxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxLQUFLLGVBQWUsQ0FBQyxxQ0FBcUMsQ0FBQyxrQkFBa0IsQ0FBQyxzREFBc0QsWUFBWSxDQUFDLEVBQUUscUJBQXFCLENBQUMsRUFBRSwwQ0FBMEMsQ0FBQyxjQUFjLFlBQVksQ0FBQyxXQUFXLENBQUMsY0FBYyxZQUFZLENBQUMsMEJBQTBCLGNBQWMscUJBQXFCLENBQUMsQ0FBQyxRQUFRLFlBQVksQ0FBQyw0QkFBNEIsQ0FBQyw2QkFBNkIsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMscUJBQXFCLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQywyQkFBMkIsYUFBYSxDQUFDLDJDQUEyQyxpQkFBaUIsQ0FBQyxpQkFBaUIsV0FBVyxDQUFDLDJDQUEyQyxDQUFDLHNCQUFzQixDQUFDLG1CQUFtQixvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLHlCQUF5QixhQUFhLENBQUMscUJBQXFCLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsWUFBWSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsNEJBQTRCLFlBQVksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLGlCQUFpQixDQUFDLHdDQUF3QyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxtREFBbUQsQ0FBQywyQkFBMkIsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyw4Q0FBOEMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsa0RBQWtELDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxtREFBbUQsd0JBQXdCLENBQUMsc0NBQXNDLFNBQVMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsc0NBQXNDLENBQUMsMkNBQTJDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLDBEQUEwRCxjQUFjLENBQUMscURBQXFELG1EQUFtRCxDQUFDLDJCQUEyQixDQUFDLGlCQUFpQixDQUFDLCtCQUErQixDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLGdFQUFnRSxRQUFRLENBQUMsbURBQW1ELDBCQUEwQixDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMscURBQXFELFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQywrRkFBNEYsQ0FBNUYsNEZBQTRGLENBQUMsdUJBQXVCLENBQUMsbURBQW1ELFNBQVMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLGtGQUFrRiwyQkFBMkIsQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsd0NBQXdDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLGlDQUFpQyxDQUFDLDhCQUE4QixDQUFDLDhDQUE4QyxnQ0FBZ0MsQ0FBQywrQ0FBK0MsZ0NBQWdDLENBQUMsbURBQW1ELHlCQUF5QixDQUFDLGlCQUFpQixDQUFDLG1EQUFtRCxjQUFjLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixZQUFZLENBQUMsaUJBQWlCLENBQUMsK0RBQStELG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGlDQUFpQyxDQUFDLHVCQUFlLENBQWYsb0JBQWUsQ0FBZixlQUFlLENBQUMsZ0JBQWdCLENBQUMsaUZBQWlGLFlBQVksQ0FBQyxpRkFBaUYsVUFBVSxDQUFDLGNBQWMsQ0FBQyxxSEFBcUgsWUFBWSxDQUFDLGlCQUFpQixDQUFDLHdIQUF3SCxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLG9CQUFvQixPQUFPLENBQUMsU0FBUyxDQUFDLGdDQUFnQyxhQUFhLENBQUMsaUNBQWlDLENBQUMsb0NBQW9DLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyx1Q0FBdUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxzQ0FBc0Msb0JBQW9CLENBQUMsdUNBQXVDLENBQUMsMEJBQTBCLGlCQUFpQixZQUFZLENBQUMsd0JBQXdCLFdBQVcsQ0FBQyxDQUFDLDBCQUEwQixzQkFBc0IsWUFBWSxDQUFDLFFBQVEsa0JBQWtCLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxjQUFjLDZCQUE2QixDQUFDLG9CQUFvQixDQUFDLHlCQUF5QixDQUFDLFlBQVksWUFBWSxDQUFDLDRCQUE0QixVQUFVLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLDBDQUEwQywwQkFBMEIsQ0FBQyw0REFBNEQsVUFBVSxDQUFDLENBQUMsY0FBYyxhQUFhLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsVUFBVSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsdUNBQXVDLGdCQUFnQixDQUFDLDZDQUE2QyxpQ0FBaUMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsK0RBQTBELDRCQUE0QixDQUF0RiwwREFBMEQsNEJBQTRCLENBQUMsNkNBQTZDLGNBQWMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLDZEQUE2RCxpQkFBaUIsQ0FBQyxtRUFBbUUsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLHlDQUF5QyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLG1OQUFtTixtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQywrTkFBK04sVUFBVSxDQUFDLHlDQUF5QyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsK0JBQStCLGNBQWMsQ0FBQyxpQkFBaUIsaUJBQWlCLENBQUMsVUFBVSxDQUFDLDZCQUE2QixrQkFBa0IsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsdUNBQXVDLFlBQVksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxzQ0FBc0MsY0FBYyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsNkJBQTZCLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxzREFBc0QsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsMkJBQTJCLENBQUMscUVBQXFFLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxrREFBa0QsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsdURBQXVELGNBQWMsQ0FBQyxlQUFlLENBQUMsMkVBQTJFLG9CQUFvQixDQUFDLHlEQUF5RCxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLGlFQUFpRSxVQUFVLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsa0RBQWtELENBQUMsb0JBQW9CLENBQUMsZ0VBQWdFLGVBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxrREFBa0QsQ0FBQyw0QkFBb0IsQ0FBcEIsb0JBQW9CLENBQUMsbUNBQW1DLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFNBQVMsQ0FBQyxxQ0FBcUMsQ0FBQyx1RUFBdUUsVUFBVSxDQUFDLHNFQUFzRSw0QkFBNEIsQ0FBQyxTQUFTLENBQUMsZ0NBQWdDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsa0RBQWtELENBQUMsNEJBQW9CLENBQXBCLG9CQUFvQixDQUFDLG1DQUFtQyxDQUFDLGdDQUFnQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsa0NBQWtDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQywwQ0FBMEMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGtEQUFrRCxDQUFDLG9CQUFvQixDQUFDLGdEQUFnRCxVQUFVLENBQUMseUNBQXlDLGNBQWMsQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLHlDQUF5QyxZQUFZLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLDhEQUE4RCxVQUFVLENBQUMsOERBQThELFlBQVksQ0FBQyx1RUFBdUUsYUFBYSxDQUFDLDZEQUE2RCxZQUFZLENBQUMsc0VBQXNFLGNBQWMsQ0FBQyw0Q0FBNEMsa0JBQWtCLENBQUMsbURBQW1ELFVBQVUsQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQUMsbUJBQW1CLENBQUMsdUJBQXVCLENBQUMseUJBQXlCLGtCQUFrQixDQUFDLDhCQUE4QixpQkFBaUIsQ0FBQyx3QkFBd0IsbURBQW1ELENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsNkJBQTZCLENBQUMsb0NBQW9DLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQywrQ0FBK0MsQ0FBQywwQkFBMEIsQ0FBQywyQkFBMkIsZ0JBQWdCLENBQUMsbURBQW1ELENBQUMsNEJBQW9CLENBQXBCLG9CQUFvQixDQUFDLG1DQUFtQyxDQUFDLDZCQUE2QixpQkFBaUIsQ0FBQyx5Q0FBeUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyw2REFBNkQsb0JBQW9CLENBQUMsMkNBQTJDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsbURBQW1ELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxtREFBbUQsQ0FBQyxvQkFBb0IsQ0FBQyxrREFBa0QsZUFBZSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLG1EQUFtRCxDQUFDLDRCQUFvQixDQUFwQixvQkFBb0IsQ0FBQyxtQ0FBbUMsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLHFDQUFxQyxDQUFDLHlEQUF5RCxVQUFVLENBQUMsd0RBQXdELDRCQUE0QixDQUFDLFNBQVMsQ0FBQywwQkFBMEIsa0JBQWtCLENBQUMsNkJBQTZCLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLHVDQUF1QyxZQUFZLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLENBQUMsNkNBQTZDLGFBQWEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyx1REFBdUQsZUFBZSxDQUFDLGNBQWMsQ0FBQyx1REFBdUQsU0FBUyxDQUFDLHVEQUF1RCxZQUFZLENBQUMsNERBQTRELFlBQVksQ0FBQyxnREFBZ0QsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLCtDQUErQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQywwREFBMEQsZUFBZSxDQUFDLCtDQUErQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyx1REFBdUQsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLGtEQUFrRCxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxzREFBc0QsZUFBZSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLG1EQUFtRCxDQUFDLDRCQUFvQixDQUFwQixvQkFBb0IsQ0FBQyxtQ0FBbUMsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLHFDQUFxQyxDQUFDLDZEQUE2RCxVQUFVLENBQUMsNERBQTRELDRCQUE0QixDQUFDLFNBQVMsQ0FBQywwREFBMEQsZUFBZSxDQUFDLHlCQUF5QixVQUFVLENBQUMsaUJBQWlCLENBQUMsMkJBQTJCLENBQUMsMkJBQTJCLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsMEJBQTBCLGdEQUFnRCxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQywwQkFBMEIsdUNBQXVDLHFCQUFxQixDQUFDLGdEQUFnRCxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsbURBQW1ELGVBQWUsQ0FBQyw4REFBOEQsVUFBVSxDQUFDLHVFQUF1RSxjQUFjLENBQUMsNkRBQTZELFVBQVUsQ0FBQyxzRUFBc0UsY0FBYyxDQUFDLHdCQUF3QixxQkFBcUIsQ0FBQyxzQkFBc0IsQ0FBQyx5Q0FBeUMsZUFBZSxDQUFDLENBQUMsMEJBQTBCLDBCQUEwQixlQUFlLENBQUMsNkJBQTZCLFlBQVksQ0FBQyx1Q0FBdUMsY0FBYyxDQUFDLDZDQUE2QyxhQUFhLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsMEJBQTBCLHNEQUFzRCxjQUFjLENBQUMsaUJBQWlCLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLDZCQUE2QixjQUFjLENBQUMscUZBQXFGLGlCQUFpQixDQUFDLGdDQUFnQyxnQkFBZ0IsQ0FBQyxnQ0FBZ0MsZ0JBQWdCLENBQUMsZ0NBQWdDLGNBQWMsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDJCQUEyQixjQUFjLENBQUMsNkJBQTZCLGdCQUFnQixDQUFDLGdEQUFnRCxnQkFBZ0IsQ0FBQywyQkFBMkIsaUJBQWlCLENBQUMsQ0FBQywwQkFBMEIsdUNBQXVDLHFCQUFxQixDQUFDLDZDQUE2QyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsU0FBUyxhQUFhLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIscUNBQXFDLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsc0NBQXNDLENBQUMsdUJBQXVCLENBQUMseUNBQXlDLENBQUMsNkJBQTZCLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQywyQ0FBMkMsQ0FBQyxpQkFBaUIsQ0FBQyx5Q0FBb0MsNEJBQTRCLENBQUMsa0JBQWtCLENBQW5GLG9DQUFvQyw0QkFBNEIsQ0FBQyxrQkFBa0IsQ0FBQyxnQ0FBZ0MsWUFBWSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyw4QkFBOEIsYUFBYSxDQUFDLGtDQUFrQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsZ0RBQWdELGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLDZHQUE2RyxVQUFVLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsZ0NBQWdDLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsdURBQXVELFFBQVEsQ0FBQyxzREFBc0QsT0FBTyxDQUFDLHNEQUFzRCxlQUFlLENBQUMseUhBQXlILGVBQWUsQ0FBQyxxREFBcUQsa0JBQWtCLENBQUMsdUJBQXVCLENBQUMsNERBQTRELHlCQUF5QixDQUFDLEtBQUssQ0FBQywyREFBMkQsd0JBQXdCLENBQUMsS0FBSyxDQUFDLG1CQUFtQixlQUFlLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyw2QkFBNkIsQ0FBQyxzQkFBc0IsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsNkJBQTZCLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLHlCQUF5QixrQkFBa0IsQ0FBQyxtQ0FBbUMsUUFBUSxDQUFDLDhCQUE4QixpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxvQ0FBb0Msa0JBQWtCLENBQUMsK0JBQStCLGFBQWEsQ0FBQyxxQ0FBcUMsYUFBYSxDQUFDLDhDQUE4QyxrQkFBa0IsQ0FBQyx5R0FBeUcsa0JBQWtCLENBQUMsZ0NBQWdDLDZCQUE2QixDQUFDLHFCQUFxQixvQkFBb0IsQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsbUNBQW1DLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyx5Q0FBeUMsVUFBVSxDQUFDLCtCQUErQixhQUFhLENBQUMscUNBQXFDLGFBQWEsQ0FBQyw2QkFBNkIsUUFBUSxDQUFDLGVBQWUsQ0FBQyxrQ0FBa0MsV0FBVyxDQUFDLG9DQUFvQyxhQUFhLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLHFGQUFxRixVQUFVLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLDJDQUEyQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsMENBQTBDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBMEMsa0JBQWtCLENBQUMsaUdBQWlHLGtCQUFrQixDQUFDLGdEQUFnRCx1QkFBdUIsQ0FBQywrQ0FBK0Msd0JBQXdCLENBQUMsc0JBQXNCLHFCQUFxQixDQUFDLDJCQUEyQixDQUFDLGVBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxzRUFBc0UsZUFBZSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsOEJBQThCLGlCQUFpQixDQUFDLFlBQVksQ0FBQyw0QkFBNEIsQ0FBQywrQkFBK0IsQ0FBQyxvQ0FBb0MsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQywyQ0FBMkMsQ0FBQyxlQUFlLENBQUMscUNBQXFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsQ0FBQyxpQ0FBaUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGdDQUFnQyxRQUFRLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLG9DQUFvQyxpQ0FBaUMsQ0FBQywwQkFBMEIsU0FBUyxVQUFVLENBQUMsbUJBQW1CLFFBQVEsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLHdCQUF3QixXQUFXLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUMsMEJBQTBCLDhCQUE4QixZQUFZLENBQUMsQ0FBQyxrREFBa0QsU0FBUyxTQUFTLENBQUMsQ0FBQyxnQkFBZ0IsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLHNCQUFzQixjQUFjLENBQUMseURBQXlELGNBQWMsQ0FBQyx3QkFBd0IsYUFBYSxDQUFDLDZDQUE2QyxhQUFhLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsU0FBUyxDQUFDLHNCQUFzQixZQUFZLENBQUMseUJBQXlCLENBQUMsa0JBQWtCLHdCQUF3QixDQUFDLDJCQUEyQixDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixxQkFBcUIsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLGNBQWMsQ0FBQyxpQ0FBaUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyx5QkFBeUIsQ0FBQywrRUFBK0Usb1NBQW9TLENBQUMsTUFBTSxDQUFDLHdDQUF3Qyx5QkFBeUIsQ0FBQyx1Q0FBdUMsd0JBQXdCLENBQUMseUJBQXlCLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyx5QkFBeUIsQ0FBQywrREFBK0Qsc1NBQXNTLENBQUMsT0FBTyxDQUFDLDBCQUEwQixnQkFBZ0IsWUFBWSxDQUFDLENBQUMsaUJBQWlCLFdBQVcsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMseUJBQXlCLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsOEJBQThCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLDJCQUEyQixDQUFDLDBCQUEwQixpQkFBaUIsVUFBVSxDQUFDLENBQUMsa0RBQWtELGlCQUFpQixTQUFTLENBQUMsQ0FBQyxTQUFTLGtCQUFrQixDQUFDLHlCQUF5QixDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixlQUFlLENBQUMsZ0JBQWdCLENBQUMsOEhBQThILFVBQVUsQ0FBQywwSUFBMEksd0JBQXdCLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMsNE1BQTRNLFdBQVcsQ0FBQyxvTEFBb0wsZ0JBQWdCLENBQUMsNkhBQTZILGdCQUFnQixDQUFDLHdNQUF3TSxZQUFZLENBQUMsMkpBQTJKLHFDQUFxQyxDQUFDLHVJQUF1SSxhQUFhLENBQUMsNElBQTRJLGFBQWEsQ0FBQyx3TUFBd00sZUFBZSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsOExBQThMLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxpQ0FBaUMsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLG9WQUFvVixrQkFBa0IsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQywwS0FBMEssa0JBQWtCLENBQUMsMEtBQTBLLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMscUJBQXFCLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLG1CQUFtQixDQUFDLHlDQUF5QyxhQUFhLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLGdCQUFnQixDQUFDLG9CQUFvQixhQUFhLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLDBCQUEwQixVQUFVLENBQUMsOEJBQThCLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMseUJBQXlCLGFBQWEsQ0FBQyxzQkFBc0IsY0FBYyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLCtCQUErQixDQUFDLDJCQUEyQixpQkFBaUIsQ0FBQyxxQkFBcUIsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsNkJBQTZCLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyw2QkFBNkIsYUFBYSxDQUFDLHdCQUF3QixDQUFDLHNDQUFzQyxhQUFhLENBQUMscUNBQXFDLENBQUMsc0RBQXNELCtCQUErQixDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLHlCQUF5QixDQUFDLGlCQUFpQixDQUFDLG9LQUFvSyxxQkFBcUIsQ0FBQyxvYUFBb2EsWUFBWSxDQUFDLGtCQUFrQixDQUFDLG9aQUFvWixpQkFBaUIsQ0FBQyx3ZUFBd2UsaUJBQWlCLENBQUMseUJBQXlCLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsdUNBQXVDLENBQUMscXRCQUFxdEIsa0JBQWtCLENBQUMsNkJBQTZCLDhCQUE4QixDQUFDLG1DQUFtQyxDQUFDLCtEQUErRCxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQywwQ0FBMEMsZUFBZSxDQUFDLG1DQUFtQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLDhCQUE4QixvQkFBb0IsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLDBCQUEwQixzREFBc0QscUNBQXFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQywrQkFBK0IsV0FBVyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0Isb0JBQW9CLENBQUMsOEJBQThCLENBQUMsa0tBQWtLLFVBQVUsQ0FBQyw4S0FBOEssd0JBQXdCLENBQUMsa05BQWtOLHdCQUF3QixDQUFDLHFEQUFxRCxhQUFhLENBQUMsK0JBQStCLFVBQVUsQ0FBQywwQkFBMEIsVUFBVSxDQUFDLHFDQUFxQyxxRUFBcUUsQ0FBQyxnQ0FBZ0MsYUFBYSxDQUFDLDJDQUEyQyx3REFBd0QsQ0FBQyxxQ0FBcUMsYUFBYSxDQUFDLHlEQUF5RCxhQUFhLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLCtCQUErQixDQUFDLDhCQUE4QixhQUFhLENBQUMsK0JBQStCLENBQUMsb0NBQW9DLGtEQUFrRCxDQUFDLG9EQUFvRCxrQkFBa0IsQ0FBQyxtQ0FBbUMsbUNBQW1DLENBQUMscUNBQXFDLDJCQUEyQixDQUFDLHdEQUF3RCxzQkFBc0IsQ0FBQywyQkFBMkIsQ0FBQyw4REFBOEQsYUFBYSxDQUFDLGtFQUFrRSxhQUFhLENBQUMsa0JBQWtCLENBQUMsMkRBQTJELDJDQUEyQyxDQUFDLCtDQUErQyxnQ0FBZ0MsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLHFEQUFxRCx3QkFBd0IsQ0FBQyx5QkFBeUIsQ0FBQyxxREFBcUQsd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsaURBQWlELGlDQUFpQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsdURBQXVELHdCQUF3QixDQUFDLHlCQUF5QixDQUFDLHVEQUF1RCx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxtQ0FBbUMsYUFBYSxDQUFDLDBPQUEwTyxhQUFhLENBQUMsZ1JBQWdSLGFBQWEsQ0FBQyx1Q0FBdUMsd0JBQXdCLENBQUMsZ1JBQWdSLGFBQWEsQ0FBQyxxdUJBQXF1QixhQUFhLENBQUMsZ1dBQWdXLGFBQWEsQ0FBQyxtZEFBbWQsYUFBYSxDQUFDLDZFQUE2RSxhQUFhLENBQUMsdUNBQXVDLFVBQVUsQ0FBQyxnSEFBZ0gsYUFBYSxDQUFDLHdEQUF3RCxhQUFhLENBQUMsdUJBQXVCLG9CQUFvQixDQUFDLDhCQUE4QixDQUFDLDhCQUE4QixXQUFXLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLDRKQUE0SixVQUFVLENBQUMsd0tBQXdLLHdCQUF3QixDQUFDLDRNQUE0TSx3QkFBd0IsQ0FBQyxtREFBbUQsYUFBYSxDQUFDLDhCQUE4QixVQUFVLENBQUMseUJBQXlCLGFBQWEsQ0FBQyxvQ0FBb0MsdUVBQXVFLENBQUMsK0JBQStCLFVBQVUsQ0FBQywwQ0FBMEMscURBQXFELENBQUMsb0NBQW9DLGFBQWEsQ0FBQyx1REFBdUQsYUFBYSxDQUFDLGtCQUFrQixDQUFDLDJCQUEyQiwrQkFBK0IsQ0FBQyw2QkFBNkIsYUFBYSxDQUFDLCtCQUErQixDQUFDLG1DQUFtQyxrREFBa0QsQ0FBQyxtREFBbUQsa0JBQWtCLENBQUMsa0NBQWtDLGtDQUFrQyxDQUFDLG9DQUFvQywwQkFBMEIsQ0FBQyx1REFBdUQsc0JBQXNCLENBQUMsMEJBQTBCLENBQUMsNkRBQTZELGFBQWEsQ0FBQyxpRUFBaUUsYUFBYSxDQUFDLGtCQUFrQixDQUFDLDRCQUE0QixpQkFBaUIsQ0FBQyxZQUFZLENBQUMsNENBQTRDLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLHlEQUF5RCwwQ0FBMEMsQ0FBQyw4Q0FBOEMsZ0NBQWdDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxvREFBb0Qsd0JBQXdCLENBQUMseUJBQXlCLENBQUMsb0RBQW9ELHdCQUF3QixDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLGdEQUFnRCxpQ0FBaUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLHNEQUFzRCx3QkFBd0IsQ0FBQyx5QkFBeUIsQ0FBQyxzREFBc0Qsd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsa0NBQWtDLGFBQWEsQ0FBQyxvT0FBb08sYUFBYSxDQUFDLHlRQUF5USxhQUFhLENBQUMsc0NBQXNDLHdCQUF3QixDQUFDLHlRQUF5USxhQUFhLENBQUMsa3RCQUFrdEIsYUFBYSxDQUFDLHVWQUF1VixhQUFhLENBQUMsdWNBQXVjLGFBQWEsQ0FBQywyRUFBMkUsYUFBYSxDQUFDLHNDQUFzQyxVQUFVLENBQUMsOEdBQThHLGFBQWEsQ0FBQyx1REFBdUQsYUFBYSxDQUFDLDZCQUE2QixvQkFBb0IsQ0FBQyxpQ0FBaUMsQ0FBQyxvQ0FBb0MsV0FBVyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxnTUFBZ00sVUFBVSxDQUFDLDRNQUE0TSx3QkFBd0IsQ0FBQyxnUEFBZ1Asd0JBQXdCLENBQUMsK0RBQStELGFBQWEsQ0FBQyxvQ0FBb0MsVUFBVSxDQUFDLCtCQUErQixhQUFhLENBQUMsMENBQTBDLHVFQUF1RSxDQUFDLHFDQUFxQyxVQUFVLENBQUMsZ0RBQWdELHFEQUFxRCxDQUFDLDBDQUEwQyxhQUFhLENBQUMsbUVBQW1FLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxpQ0FBaUMsK0JBQStCLENBQUMsbUNBQW1DLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQyx5Q0FBeUMsa0RBQWtELENBQUMseURBQXlELGtCQUFrQixDQUFDLHdDQUF3QyxtQ0FBbUMsQ0FBQywwQ0FBMEMsMkJBQTJCLENBQUMsNkRBQTZELHNCQUFzQixDQUFDLDJCQUEyQixDQUFDLG1FQUFtRSxhQUFhLENBQUMsdUVBQXVFLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxxRUFBcUUsNkNBQTZDLENBQUMsb0RBQW9ELGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsMERBQTBELHdCQUF3QixDQUFDLHlCQUF5QixDQUFDLDBEQUEwRCx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxzREFBc0QsaUNBQWlDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyw0REFBNEQsd0JBQXdCLENBQUMseUJBQXlCLENBQUMsNERBQTRELHdCQUF3QixDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLHdDQUF3QyxhQUFhLENBQUMsd1FBQXdRLGFBQWEsQ0FBQyxtVEFBbVQsYUFBYSxDQUFDLDRDQUE0Qyx3QkFBd0IsQ0FBQyxtVEFBbVQsYUFBYSxDQUFDLG8wQkFBbzBCLGFBQWEsQ0FBQyw2WUFBNlksYUFBYSxDQUFDLCtnQkFBK2dCLGFBQWEsQ0FBQyx1RkFBdUYsYUFBYSxDQUFDLDRDQUE0QyxVQUFVLENBQUMsMEhBQTBILGFBQWEsQ0FBQyw2REFBNkQsYUFBYSxDQUFDLG1EQUFtRCxvQkFBb0IsQ0FBQyxvQ0FBb0MsQ0FBQyxpRUFBaUUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxzVkFBc1YsVUFBVSxDQUFDLDhXQUE4Vyx3QkFBd0IsQ0FBQyxzYkFBc2Isd0JBQXdCLENBQUMsZ0hBQWdILGFBQWEsQ0FBQyxpRUFBaUUsVUFBVSxDQUFDLHVEQUF1RCx3QkFBd0IsQ0FBQyw2RUFBNkUsdUVBQXVFLENBQUMsbUVBQW1FLHFCQUFxQixDQUFDLHlGQUF5RixxREFBcUQsQ0FBQyw2RUFBNkUsYUFBYSxDQUFDLHdIQUF3SCxhQUFhLENBQUMsa0JBQWtCLENBQUMsMkRBQTJELCtCQUErQixDQUFDLCtEQUErRCxhQUFhLENBQUMsK0JBQStCLENBQUMsMkVBQTJFLGtEQUFrRCxDQUFDLDJHQUEyRyxrQkFBa0IsQ0FBQyx5RUFBeUUsbUNBQW1DLENBQUMsNkVBQTZFLDJCQUEyQixDQUFDLG1IQUFtSCxzQkFBc0IsQ0FBQywyQkFBMkIsQ0FBQywrSEFBK0gsYUFBYSxDQUFDLHVJQUF1SSxhQUFhLENBQUMsa0JBQWtCLENBQUMsNEhBQTRILDZDQUE2QyxDQUFDLGlHQUFpRyxnQ0FBZ0MsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLDZHQUE2Ryx3QkFBd0IsQ0FBQyx5QkFBeUIsQ0FBQyw2R0FBNkcsd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMscUdBQXFHLGlDQUFpQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsaUhBQWlILHdCQUF3QixDQUFDLHlCQUF5QixDQUFDLGlIQUFpSCx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyx5RUFBeUUsYUFBYSxDQUFDLHNlQUFzZSxhQUFhLENBQUMscWpCQUFxakIsYUFBYSxDQUFDLGlGQUFpRix3QkFBd0IsQ0FBQyxxakJBQXFqQixhQUFhLENBQUMsbWdEQUFtZ0QsYUFBYSxDQUFDLDJ0QkFBMnRCLGFBQWEsQ0FBQywwOEJBQTA4QixhQUFhLENBQUMsZ0tBQWdLLGFBQWEsQ0FBQyxpRkFBaUYsVUFBVSxDQUFDLHNPQUFzTyxhQUFhLENBQUMsbUhBQW1ILGFBQWEsQ0FBQywyQkFBMkIsb0JBQW9CLENBQUMsK0JBQStCLENBQUMsa0NBQWtDLFdBQVcsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsb0xBQW9MLFVBQVUsQ0FBQyxnTUFBZ00sd0JBQXdCLENBQUMsb09BQW9PLHdCQUF3QixDQUFDLDJEQUEyRCxhQUFhLENBQUMsa0NBQWtDLFVBQVUsQ0FBQyw2QkFBNkIsd0JBQXdCLENBQUMsd0NBQXdDLHVFQUF1RSxDQUFDLG1DQUFtQyxxQkFBcUIsQ0FBQyw4Q0FBOEMscURBQXFELENBQUMsd0NBQXdDLGFBQWEsQ0FBQywrREFBK0QsYUFBYSxDQUFDLGtCQUFrQixDQUFDLCtCQUErQiwrQkFBK0IsQ0FBQyxpQ0FBaUMsYUFBYSxDQUFDLCtCQUErQixDQUFDLHVDQUF1QyxrREFBa0QsQ0FBQyx1REFBdUQsa0JBQWtCLENBQUMsc0NBQXNDLG1DQUFtQyxDQUFDLHdDQUF3QywyQkFBMkIsQ0FBQywyREFBMkQsc0JBQXNCLENBQUMsMkJBQTJCLENBQUMsaUVBQWlFLGFBQWEsQ0FBQyxxRUFBcUUsYUFBYSxDQUFDLGtCQUFrQixDQUFDLGlFQUFpRSwyQ0FBMkMsQ0FBQyxrREFBa0QsZ0NBQWdDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyx3REFBd0Qsd0JBQXdCLENBQUMseUJBQXlCLENBQUMsd0RBQXdELHdCQUF3QixDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLG9EQUFvRCxpQ0FBaUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLDBEQUEwRCx3QkFBd0IsQ0FBQyx5QkFBeUIsQ0FBQywwREFBMEQsd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsc0NBQXNDLGFBQWEsQ0FBQyw0UEFBNFAsYUFBYSxDQUFDLHFTQUFxUyxhQUFhLENBQUMsMENBQTBDLHdCQUF3QixDQUFDLHFTQUFxUyxhQUFhLENBQUMsOHhCQUE4eEIsYUFBYSxDQUFDLDJYQUEyWCxhQUFhLENBQUMsdWZBQXVmLGFBQWEsQ0FBQyxtRkFBbUYsYUFBYSxDQUFDLDBDQUEwQyxVQUFVLENBQUMsc0hBQXNILGFBQWEsQ0FBQywyREFBMkQsYUFBYSxDQUFDLHVDQUF1QyxrREFBa0QsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLDZCQUE2QixDQUFDLHNEQUFzRCxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQywrRUFBK0UsQ0FBQyx5REFBeUQsVUFBVSxDQUFDLHdEQUF3RCxrQkFBa0IsQ0FBQywyREFBMkQsaUJBQWlCLENBQUMsa0RBQWtELENBQUMsaUVBQWlFLG1EQUFtRCxDQUFDLHNFQUFzRSxXQUFXLENBQUMscUJBQXFCLENBQUMsOERBQThELFdBQVcsQ0FBQyxTQUFTLENBQUMsZ0ZBQWdGLGdCQUFnQixDQUFDLGlFQUFpRSxnQkFBZ0IsQ0FBQyxtRkFBbUYsU0FBUyxDQUFDLDBCQUEwQixDQUFDLGVBQWUsQ0FBQyxxRkFBcUYsVUFBVSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxvR0FBb0csZ0NBQWdDLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxzR0FBc0csZUFBZSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxrR0FBa0csOEJBQThCLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxtR0FBbUcsK0JBQStCLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyw0RkFBNEYsZUFBZSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLGtEQUFrRCxDQUFDLDRCQUFvQixDQUFwQixvQkFBb0IsQ0FBQyxtQ0FBbUMsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLHFDQUFxQyxDQUFDLGtHQUFrRyw0QkFBNEIsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLDJCQUEyQixDQUFDLHNCQUFzQixDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxrREFBa0QsQ0FBQyw4QkFBOEIsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsa0RBQWtELENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsY0FBYyxDQUFDLG9DQUFvQyxTQUFTLENBQUMsd0NBQXdDLGVBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxzQ0FBc0MsZUFBZSxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLHFEQUFxRCxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsOEJBQThCLGtCQUFrQixDQUFDLG1DQUFtQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsOEJBQThCLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQywrQkFBK0Isb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsMkJBQTJCLENBQUMsa0JBQWtCLENBQUMseUJBQXlCLENBQUMsc0NBQXNDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMscUNBQXFDLFVBQVUsQ0FBQyxrQ0FBa0Msa0JBQWtCLENBQUMsZ0RBQWdELG1CQUFtQixDQUFDLDJCQUEyQixxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyw2QkFBNkIsbUJBQW1CLENBQUMsMkJBQTJCLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyx1SEFBdUgsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxzSkFBc0osU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsK0NBQStDLFlBQVksQ0FBQyxrTkFBa04saUJBQWlCLENBQUMsOFFBQThRLGVBQWUsQ0FBQyx3QkFBd0IsQ0FBQyw0QkFBNEIsQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxzU0FBc1MsYUFBYSxDQUFDLDRGQUE0RixZQUFZLENBQUMsc0NBQXNDLG1CQUFtQixDQUFDLDZDQUE2QyxrQkFBa0IsQ0FBQyxxQ0FBcUMsQ0FBQyxhQUFhLENBQUMsZ0ZBQWdGLHlCQUF5QixDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsNEpBQTRKLDBCQUEwQixDQUFDLDZCQUE2QixDQUFDLDRCQUE0QixDQUFDLDhCQUE4QixDQUFDLHFDQUFxQyxDQUFDLHdCQUF3QixDQUFDLHlCQUF5QixrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsK0JBQStCLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyw0QkFBNEIsQ0FBQyxxRUFBcUUsQ0FBQyxxQkFBcUIsQ0FBQywrQkFBK0IsVUFBVSxDQUFDLHFDQUFxQyxxREFBcUQsQ0FBQyxzQkFBc0IscUJBQXFCLENBQUMsK0JBQStCLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLDJCQUEyQixTQUFTLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLDJCQUEyQixtQkFBbUIsQ0FBQywyQkFBMkIsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMscUNBQXFDLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLCtCQUErQixrQkFBa0IsQ0FBQyxnQ0FBZ0Msa0JBQWtCLENBQUMsaUNBQWlDLGtCQUFrQixDQUFDLGtDQUFrQyxrQkFBa0IsQ0FBQywrQkFBK0Isa0JBQWtCLENBQUMscUNBQXFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQywyQ0FBMkMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsMkNBQTJDLFVBQVUsQ0FBQyxpREFBaUQsVUFBVSxDQUFDLHdFQUF3RSxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsb0ZBQW9GLGFBQWEsQ0FBQyx3RkFBd0YsYUFBYSxDQUFDLHNGQUFzRixhQUFhLENBQUMsNEtBQTRLLDRCQUE0QixDQUFDLDRDQUE0QyxjQUFjLENBQUMsaUJBQWlCLENBQUMsOERBQThELG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQywwRkFBMEYsaUJBQWlCLENBQUMsa0dBQWtHLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLG9FQUFvRSxhQUFhLENBQUMsd0dBQXdHLFNBQVMsQ0FBQyxnRUFBZ0UsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHVGQUF1RixVQUFVLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyw2RkFBNkYsWUFBWSxDQUFDLGtDQUFrQyxDQUFDLDJDQUEyQyxDQUFDLGlCQUFpQixDQUFDLHNFQUFzRSxjQUFjLENBQUMsc0VBQXNFLGVBQWUsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsNkNBQTZDLHdCQUF3QixDQUFDLDRDQUE0QyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyx1QkFBdUIsQ0FBQyxzQkFBc0IsQ0FBQyxrREFBa0Qsd0JBQXdCLENBQUMsMEJBQTBCLENBQUMsK0JBQStCLENBQUMsZ0RBQWdELHNCQUFzQixDQUFDLHdCQUF3QixDQUFDLDZCQUE2QixDQUFDLG1EQUFtRCx5QkFBeUIsQ0FBQywyQkFBMkIsQ0FBQyxnQ0FBZ0MsQ0FBQywwQkFBMEIsc0JBQXNCLDBCQUEwQixDQUFDLENBQUMsc0NBQXNDLDBCQUEwQixDQUFDLHNCQUFzQixDQUFDLGdDQUFnQyxjQUFRLENBQVIsU0FBUyxDQUFDLGdDQUFnQyxjQUFRLENBQVIsU0FBUyxDQUFDLGdDQUFnQyxjQUFRLENBQVIsU0FBUyxDQUFDLGdHQUFnRyxzQkFBc0IsQ0FBQywwSUFBMEksWUFBWSxDQUFDLHNDQUFzQyxnQ0FBZ0MsY0FBUSxDQUFSLFNBQVMsQ0FBQyxDQUFDLHNDQUFzQyxnRUFBZ0UsY0FBUSxDQUFSLFNBQVMsQ0FBQyxDQUFDLHNDQUFzQyxnR0FBZ0csY0FBUSxDQUFSLFNBQVMsQ0FBQyxDQUFDLDJCQUEyQixTQUFTLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxxQ0FBcUMsQ0FBQyxzRkFBc0YsdUJBQXVCLENBQUMsc0ZBQXNGLHlCQUF5QixDQUFDLHdFQUF3RSx3QkFBd0IsQ0FBQyxxREFBcUQsd0JBQXdCLENBQUMsc0NBQXNDLHdCQUF3QixDQUFDLDZCQUE2QixDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsd0NBQXdDLDZCQUE2QixDQUFDLHNNQUFzTSx1QkFBdUIsQ0FBQyx5QkFBeUIsQ0FBQywyQkFBMkIsQ0FBQyw0Q0FBNEMsd0JBQXdCLENBQUMscU5BQXFOLHVCQUF1QixDQUFDLHNCQUFzQixDQUFDLGtEQUFrRCxTQUFTLENBQUMsa0NBQWtDLGtCQUFrQixDQUFDLDBFQUEwRSxpQkFBaUIsQ0FBQywwQkFBMEIsaUJBQWlCLENBQUMsNEJBQTRCLENBQUMsZ0JBQWdCLENBQUMsNEVBQTRFLCtCQUErQixDQUFDLGdDQUFnQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxxREFBcUQsa0JBQWtCLENBQUMsK0JBQStCLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxxQ0FBcUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxpQ0FBaUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQywrQkFBK0IsQ0FBQywrRUFBK0UsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsdUNBQXVDLHVCQUF1QixDQUFDLHlGQUF5Rix3QkFBd0IsQ0FBQyxrQ0FBa0MsZ0JBQWdCLENBQUMsNEJBQTRCLFlBQVksQ0FBQyw2QkFBNkIsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsOEJBQThCLENBQUMsaUNBQWlDLENBQUMsK0JBQStCLFVBQVUsQ0FBQywyQkFBMkIsa0JBQWtCLENBQUMsOEJBQThCLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsZ0NBQWdDLFVBQVUsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsdUNBQXVDLGVBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxrREFBa0QsQ0FBQyw0QkFBb0IsQ0FBcEIsb0JBQW9CLENBQUMsbUNBQW1DLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFNBQVMsQ0FBQyxxQ0FBcUMsQ0FBQyw2Q0FBNkMsNEJBQTRCLENBQUMsU0FBUyxDQUFDLCtDQUErQyxnQ0FBZ0MsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLGlEQUFpRCxlQUFlLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDLDZDQUE2Qyw4QkFBOEIsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLDhDQUE4QywrQkFBK0IsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLDJCQUEyQixlQUFlLENBQUMsc0JBQXNCLENBQUMsNkJBQTZCLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxpQ0FBaUMsd0JBQXdCLENBQUMsNkJBQTZCLENBQUMsdUNBQXVDLGtEQUFrRCxDQUFDLHVDQUF1QyxxQkFBcUIsQ0FBQyxvQ0FBb0Msb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMseUNBQXlDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQywwQ0FBMEMsZUFBZSxDQUFDLGNBQWMsQ0FBQywyQkFBMkIsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLDZCQUE2QixDQUFDLDZCQUE2QixlQUFlLENBQUMsNENBQTRDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLGdDQUFnQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsa0RBQWtELFVBQVUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsaUNBQWlDLENBQUMsMERBQTBELGtEQUFrRCxDQUFDLDhEQUE4RCxrREFBa0QsQ0FBQyxrREFBa0QsVUFBVSxDQUFDLHdEQUF3RCxTQUFTLENBQUMsK0NBQStDLFlBQVksQ0FBQyxpRkFBaUYsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQywyQ0FBMkMsU0FBUyxDQUFDLG1EQUFtRCxhQUFhLENBQUMsc0NBQXNDLFVBQVUsQ0FBQyx3Q0FBd0MsaUJBQWlCLENBQUMsMEJBQTBCLDRCQUE0QixxQkFBcUIsQ0FBQyxDQUFDLDBCQUEwQiwyQkFBMkIsbUJBQW1CLENBQUMsQ0FBQyxnQ0FBZ0MsWUFBWSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsa0NBQWtDLG1CQUFtQixDQUFDLHVDQUF1Qyx3QkFBd0IsQ0FBQyx3Q0FBd0MsMkJBQTJCLENBQUMsMENBQTBDLHdCQUF3QixDQUFDLDZDQUE2QyxzQkFBc0IsQ0FBQyw4TEFBOEwsbUJBQW1CLENBQUMsc0NBQXNDLGVBQWUsQ0FBQyx3Q0FBd0MsYUFBYSxDQUFDLCtDQUErQyxvQkFBb0IsQ0FBQyx5RkFBeUYsWUFBWSxDQUFDLG9CQUFvQixDQUFDLHFFQUFxRSxZQUFZLENBQUMsb0JBQW9CLENBQUMsd0VBQXdFLGlCQUFpQixDQUFDLGdKQUFnSixzQkFBc0IsQ0FBQywwQkFBMEIsNEhBQTRILHVCQUF1QixDQUFDLDBDQUEwQyxzQkFBc0IsQ0FBQywrQ0FBK0Msb0JBQW9CLENBQUMsQ0FBQyxpRkFBaUYsdUJBQXVCLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsdURBQXVELGVBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FBQyw0QkFBNEIsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyw4Q0FBOEMscUJBQXFCLENBQUMsMEhBQTBILGVBQWUsQ0FBQyx3SEFBd0gsZ0JBQWdCLENBQUMsd0hBQXdILGdCQUFnQixDQUFDLDREQUE0RCxhQUFhLENBQUMsNERBQTRELGFBQWEsQ0FBQyx1RUFBdUUsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQywwRUFBMEUsUUFBUSxDQUFDLG1CQUFtQixDQUFDLGdFQUFnRSxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsc0VBQXNFLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsb0VBQW9FLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsaUNBQWlDLENBQUMsa0JBQWtCLENBQUMsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLHdDQUF3QyxDQUFDLHdCQUFlLENBQWYscUJBQWUsQ0FBZixnQkFBZ0IsQ0FBQyxpRkFBaUYsb0JBQW9CLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsaUdBQWlHLFVBQVUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyx3Q0FBd0MsQ0FBQyxrQkFBa0IsQ0FBQyx5R0FBeUcsU0FBUyxDQUFDLHdDQUF3QyxDQUFDLDZEQUE2RCxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxpRUFBaUUsYUFBYSxDQUFDLGlFQUFpRSxhQUFhLENBQUMsc0NBQXNDLHNEQUFzRCxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsMkJBQTJCLENBQUMsbUNBQW1DLGVBQWUsQ0FBQyxhQUFhLENBQUMscURBQXFELGlCQUFpQixDQUFDLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyw0REFBNEQsMEJBQTBCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLHlDQUF5QyxhQUFhLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyx3RkFBd0YsOENBQThDLENBQUMsOEdBQThHLFdBQVcsQ0FBQyw0Q0FBNEMsbUNBQW1DLENBQUMsZ0RBQWdELFlBQVksQ0FBQyw0REFBNEQseUJBQXlCLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsbUVBQW1FLGVBQWUsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsNEVBQTRFLFdBQVcsQ0FBQyw2RUFBNkUsNkJBQTZCLENBQUMsNkNBQTZDLENBQUMsOENBQThDLENBQUMsaUJBQWlCLENBQUMsb0ZBQW9GLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyw0RUFBNEUsV0FBVyxDQUFDLDZFQUE2RSw4QkFBOEIsQ0FBQywrQkFBK0IsQ0FBQywyRkFBMkYsZ0NBQWdDLENBQUMsNkVBQTZFLDZCQUE2QixDQUFDLGdDQUFnQyxDQUFDLDRGQUE0Riw4QkFBOEIsQ0FBQyxpQkFBaUIsQ0FBQyxtR0FBbUcsYUFBYSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywyRkFBMkYsK0JBQStCLENBQUMsa0NBQWtDLFlBQVksQ0FBQyw2QkFBNkIsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsb0RBQW9ELFdBQVcsQ0FBQyxnRUFBZ0UsY0FBYyxDQUFDLCtEQUErRCxlQUFlLENBQUMsNkNBQTZDLFlBQVksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsb0RBQW9ELGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQywwREFBMEQsVUFBVSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLENBQUMsd0RBQXdELENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQywrQ0FBK0MsUUFBUSxDQUFDLGlCQUFpQixDQUFDLHdDQUF3QyxhQUFhLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxzRkFBc0YsOENBQThDLENBQUMsNEdBQTRHLFdBQVcsQ0FBQywyQ0FBMkMsbUNBQW1DLENBQUMsMEJBQTBCLGdHQUFnRyxZQUFZLENBQUMsb0dBQW9HLFdBQVcsQ0FBQyxrREFBa0QsdUJBQXVCLENBQUMsZ0VBQWdFLHVCQUF1QixDQUFDLENBQUMsOEJBQThCLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLG1DQUFtQyxDQUFDLHFDQUFxQyxDQUFDLGlCQUFpQixDQUFDLCtCQUErQixDQUFDLGlDQUFpQyxTQUFTLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsb0NBQW9DLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyx1Q0FBdUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsNkJBQTZCLENBQUMsOENBQThDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLDRCQUE0QixDQUFDLGtEQUFrRCxXQUFXLENBQUMsd0RBQXdELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLGlDQUFpQyxlQUFlLENBQUMsbUVBQW1FLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsdUVBQXVFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxxRkFBcUYsWUFBWSxDQUFDLGtCQUFrQixDQUFDLDZCQUE2QixDQUFDLHVGQUF1RixZQUFZLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLDJHQUEyRyw0QkFBNEIsQ0FBQyw4QkFBOEIsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLG1JQUFtSSw2QkFBNkIsQ0FBQyxpSEFBaUgsU0FBUyxDQUFDLGFBQWEsQ0FBQyx1SEFBdUgsU0FBUyxDQUFDLGFBQWEsQ0FBQyxpSEFBaUgsNkJBQTZCLENBQUMseUhBQXlILGlCQUFpQixDQUFDLHVJQUF1SSxVQUFVLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLDRCQUE0QixDQUFDLHFCQUFxQixDQUFDLHFIQUFxSCxhQUFhLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLCtGQUErRixZQUFZLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLHlIQUF5SCxlQUFlLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQyxxSkFBcUosb0JBQW9CLENBQUMsdUlBQXVJLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsa0RBQWtELENBQUMsMkJBQTJCLENBQUMseUlBQXlJLFVBQVUsQ0FBQyx1SkFBdUosa0RBQWtELENBQUMsa0NBQWtDLFlBQVksQ0FBQyxzQkFBaUIsQ0FBakIsaUJBQWlCLENBQUMsY0FBYyxDQUFDLDZCQUE2QixDQUFDLG9CQUFvQixDQUFDLDhCQUE4QixDQUFDLHdDQUF3QyxRQUFRLENBQUMsd0NBQXdDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsNkNBQTZDLGtCQUFrQixDQUFDLGlDQUFpQyx3QkFBd0IsQ0FBQyx1Q0FBdUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsbUVBQW1FLGlCQUFpQixDQUFDLCtFQUErRSxhQUFhLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyx1Q0FBdUMsaUJBQWlCLENBQUMseUhBQXlILGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLCtCQUErQixDQUFDLDZEQUE2RCxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsNERBQTRELGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMscUlBQXFJLFNBQVMsQ0FBQyxXQUFXLENBQUMsd0NBQXdDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLG1EQUFtRCxVQUFVLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsNEJBQTRCLENBQUMsV0FBVyxDQUFDLGtEQUFrRCxVQUFVLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsNEJBQTRCLENBQUMsV0FBVyxDQUFDLHlDQUF5QyxlQUFlLENBQUMsb0JBQW9CLENBQUMsMkNBQTJDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLHFDQUFxQyxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLGdEQUFnRCx1QkFBdUIsQ0FBQyxtREFBbUQsaUJBQWlCLENBQUMsNEJBQTRCLENBQUMsMERBQTBELGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxxQ0FBcUMsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMseURBQXlELFVBQVUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLGtCQUFrQixDQUFDLHNFQUFzRSxxQkFBcUIsQ0FBQyxpRUFBaUUsaUJBQWlCLENBQUMsbUVBQW1FLG1CQUFtQixDQUFDLG9FQUFvRSxtQkFBbUIsQ0FBQyxpSEFBaUgsaUJBQWlCLENBQUMsK0JBQStCLENBQUMsK0hBQStILGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxxQ0FBcUMsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsNkhBQTZILFVBQVUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLGtCQUFrQixDQUFDLHFKQUFxSiwyQ0FBMkMsQ0FBQywySUFBMkkseUNBQXlDLENBQUMsdUVBQXVFLGVBQWUsQ0FBQyxpRUFBaUUsV0FBVyxDQUFDLCtJQUErSSxZQUFZLENBQUMsa0VBQWtFLFdBQVcsQ0FBQyxpSkFBaUosWUFBWSxDQUFDLDJFQUEyRSxXQUFXLENBQUMsbUtBQW1LLFlBQVksQ0FBQywyQ0FBMkMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsNERBQTRELGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxpQ0FBaUMsQ0FBQywwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQyxrQ0FBa0MsQ0FBQyxvRUFBb0UsNEJBQTRCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsMkJBQTJCLENBQUMsd0JBQXdCLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyw4Q0FBOEMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLDJEQUEyRCxXQUFXLENBQUMsa0JBQWtCLENBQUMsb0RBQW9ELFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyw2QkFBNkIsQ0FBQyw0QkFBNEIsQ0FBQyx3REFBd0QsNkJBQTZCLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLDJDQUEyQyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQywrSEFBK0gsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBMEMsQ0FBQyxnRUFBZ0UsS0FBSyxDQUFDLCtEQUErRCxXQUFXLENBQUMsMERBQTBELGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLGtFQUFrRSxVQUFVLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQywwQ0FBMEMsQ0FBQyxxQkFBcUIsQ0FBQyxpRUFBaUUsb0NBQW9DLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsQ0FBQyxvQ0FBb0Msa0JBQWtCLENBQUMsMENBQTBDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsNENBQTRDLG1CQUFtQixDQUFDLGtDQUFrQyxDQUFDLDJDQUEyQyxXQUFXLENBQUMsc0JBQWlCLENBQWpCLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLDJDQUEyQyx3QkFBd0IsQ0FBQywrQ0FBK0MsWUFBWSxDQUFDLHVFQUF1RSxtQkFBbUIsQ0FBQyxzQ0FBc0MsWUFBWSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsbURBQW1ELGVBQWUsQ0FBQyxrREFBa0Qsa0JBQWtCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLGtEQUFrRCxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLDZCQUE2QixDQUFDLGlCQUFpQixDQUFDLHlEQUF5RCxlQUFlLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLHdEQUF3RCxTQUFTLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsMEJBQTBCLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsK0RBQStELGlCQUFpQixDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLDhEQUE4RCxVQUFVLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsY0FBYyxDQUFDLDBEQUEwRCxZQUFZLENBQUMsc0JBQXNCLENBQUMsMERBQTBELFlBQVksQ0FBQyw0QkFBNEIsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLHNDQUFzQyxZQUFZLENBQUMsMkNBQTJDLHFCQUFxQixDQUFDLDZDQUE2QyxzQkFBc0IsQ0FBQyw0Q0FBNEMsbUJBQW1CLENBQUMsNENBQTRDLFdBQVcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLHNCQUFzQixDQUFDLG9EQUFvRCxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLDRGQUE0RixhQUFhLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQywrQ0FBK0MsK0JBQStCLENBQUMsNkNBQTZDLHdCQUF3QixDQUFDLHdDQUF3QyxhQUFhLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLHlHQUF5RyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyx1R0FBdUcsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLDhDQUE4Qyx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxtQkFBbUIsQ0FBQyxxREFBcUQsa0JBQWtCLENBQUMsb0RBQW9ELFdBQVcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLDZDQUE2Qyx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxvREFBb0Qsa0JBQWtCLENBQUMsbURBQW1ELFdBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLDBCQUEwQixpQ0FBaUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLHNDQUFzQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsNENBQTRDLGNBQWMsQ0FBQyx3Q0FBd0MsVUFBVSxDQUFDLFdBQVcsQ0FBQywyRkFBMkYsc0JBQXNCLENBQUMsZUFBZSxDQUFDLDhDQUE4QyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxxREFBcUQsa0JBQWtCLENBQUMsNkNBQTZDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLG9EQUFvRCxpQkFBaUIsQ0FBQyxtREFBbUQsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLDRDQUE0QyxnQkFBZ0IsQ0FBQyxzREFBc0QsWUFBWSxDQUFDLDBEQUEwRCwwQkFBMEIsQ0FBQyxxQkFBcUIsQ0FBQywwRUFBMEUsZ0JBQWdCLENBQUMsNkRBQTZELHdCQUF3QixDQUFDLGtCQUFrQixDQUFDLGdFQUFnRSxZQUFZLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLDJEQUEyRCwrQ0FBK0MsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLDJCQUEyQixDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLGlFQUFpRSx1Q0FBdUMsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLDREQUE0RCxhQUFhLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxtRUFBbUUsVUFBVSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLHVEQUErQyxDQUEvQywrQ0FBK0MsQ0FBQyw2QkFBcUIsQ0FBckIscUJBQXFCLENBQUMsdUJBQXVCLENBQUMsa0VBQWtFLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsd0NBQXdDLENBQUMseUNBQXlDLENBQUMsbUVBQW1FLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyx5QkFBeUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsNkJBQTZCLENBQUMsa0JBQWtCLENBQUMsbUVBQW1FLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxxRUFBcUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsMEVBQTBFLDBDQUEwQyxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsNElBQTRJLENBQUMsbUZBQW1GLCtCQUErQixDQUFDLG9CQUFvQixDQUFDLHdGQUF3RiwrQkFBK0IsQ0FBQyxvQkFBb0IsQ0FBQyxpRkFBaUYsK0JBQStCLENBQUMsb0JBQW9CLENBQUMsbURBQW1ELCtCQUErQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLHlEQUF5RCxXQUFXLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsMERBQTBELFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxnRUFBZ0UsOEJBQThCLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyx1RUFBdUUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLDZDQUE2QyxDQUFDLHFCQUFxQixDQUFDLG1CQUFtQixDQUFDLHVCQUF1QixDQUFDLDJCQUEyQixDQUFDLDhEQUE4RCxXQUFXLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLGdFQUFnRSxXQUFXLENBQUMsb0JBQW9CLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsMkNBQTJDLENBQUMsb0VBQW9FLFFBQVEsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyx5RUFBeUUsY0FBYyxDQUFDLGlGQUFpRixpQkFBaUIsQ0FBQyxhQUFhLENBQUMsd0ZBQXdGLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMseURBQXlELGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLGlFQUFpRSxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLDhCQUE4QixDQUFDLGtKQUFrSixnQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQyw2QkFBNkIsQ0FBQyx5QkFBeUIsQ0FBQyx3RUFBd0UscUJBQXFCLENBQUMsZ0ZBQWdGLGtCQUFrQixDQUFDLGdMQUFnTCw2QkFBNkIsQ0FBQyx3RUFBd0UscUJBQXFCLENBQUMsZ0ZBQWdGLGtCQUFrQixDQUFDLGdMQUFnTCw2QkFBNkIsQ0FBQyx3RUFBd0UscUJBQXFCLENBQUMsZ0ZBQWdGLGtCQUFrQixDQUFDLGdMQUFnTCw2QkFBNkIsQ0FBQyx3RUFBd0UscUJBQXFCLENBQUMsZ0ZBQWdGLGtCQUFrQixDQUFDLGdMQUFnTCw2QkFBNkIsQ0FBQyxnSkFBZ0osaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsOEpBQThKLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMsOEJBQThCLENBQUMsa09BQWtPLDZCQUE2QixDQUFDLGtPQUFrTyw2QkFBNkIsQ0FBQyxrT0FBa08sNkJBQTZCLENBQUMsNE5BQTROLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLDZCQUE2QixDQUFDLHlCQUF5QixDQUFDLDRFQUE0RSxxQkFBcUIsQ0FBQyxtRkFBbUYscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsK0VBQStFLHdDQUF3QyxDQUFDLG9FQUFvRSxxQkFBcUIsQ0FBQywyRUFBMkUsZUFBZSxDQUFDLGtCQUFrQixDQUFDLG9FQUFvRSxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyx3S0FBd0ssZ0JBQWdCLENBQUMseUJBQXlCLENBQUMsNkJBQTZCLENBQUMseUJBQXlCLENBQUMsNkJBQTZCLENBQUMsMElBQTBJLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLHdLQUF3SyxnQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQyw2QkFBNkIsQ0FBQyx5QkFBeUIsQ0FBQyw2QkFBNkIsQ0FBQyx3SkFBd0osYUFBYSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQywrQkFBK0IsQ0FBQyx5RUFBeUUscUJBQXFCLENBQUMsd0ZBQXdGLDZCQUE2QixDQUFDLGdGQUFnRixxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQywrQkFBK0IsQ0FBQyxpRUFBaUUscUJBQXFCLENBQUMsd0VBQXdFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyw4UEFBOFAsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsMFJBQTBSLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMsOEJBQThCLENBQUMsdUlBQXVJLHFCQUFxQixDQUFDLHFKQUFxSixxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyx1SEFBdUgscUJBQXFCLENBQUMscUlBQXFJLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxnRkFBZ0YsZ0JBQWdCLENBQUMseUJBQXlCLENBQUMsNkJBQTZCLENBQUMseUJBQXlCLENBQUMsNkJBQTZCLENBQUMsK0ZBQStGLDZCQUE2QixDQUFDLDJCQUEyQiw0Q0FBNEMsZUFBZSxDQUFDLDBFQUEwRSxVQUFVLENBQUMsbUVBQW1FLHFCQUFxQixDQUFDLG1EQUFtRCwrQkFBK0IsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMseURBQXlELFdBQVcsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsMERBQTBELG9CQUFvQixDQUFDLGdFQUFnRSw2QkFBNkIsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyw4REFBOEQsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLENBQUMsQ0FBQywwQkFBMEIsaUNBQWlDLGtCQUFrQixDQUFDLDBDQUEwQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQywyQ0FBMkMscUJBQXFCLENBQUMsZUFBZSxDQUFDLHFEQUFxRCxZQUFZLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLDZCQUE2QixDQUFDLCtCQUErQixDQUFDLGlFQUFpRSw0QkFBNEIsQ0FBQywrQ0FBK0MscUJBQXFCLENBQUMsNERBQTRELGVBQWUsQ0FBQyxrQ0FBa0MsVUFBVSxDQUFDLDJDQUEyQywwQkFBMEIsQ0FBQyxlQUFlLENBQUMsd0RBQXdELFVBQVUsQ0FBQywwREFBMEQsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsa0VBQWtFLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsaUVBQWlFLE1BQU0sQ0FBQyxDQUFDLG9DQUFvQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsOEJBQThCLENBQUMsc0RBQXNELENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLDZCQUE2QixDQUFDLGtCQUFrQixDQUFDLG9EQUFvRCxlQUFlLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxvREFBb0QsaUJBQWlCLENBQUMsYUFBYSxDQUFDLHVEQUF1RCxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsc0RBQXNELGVBQWUsQ0FBQyxVQUFVLENBQUMsNkRBQTZELFVBQVUsQ0FBQyxnREFBZ0QsaUJBQWlCLENBQUMsa0RBQWtELGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsa0RBQWtELENBQUMsU0FBUyxDQUFDLHdEQUF3RCxVQUFVLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxtREFBbUQsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLDhEQUE4RCxTQUFTLENBQUMsMEJBQTBCLG9DQUFvQyxxQkFBcUIsQ0FBQyxvREFBb0QsY0FBYyxDQUFDLHVEQUF1RCxtQkFBbUIsQ0FBQyxnREFBZ0Qsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMseUNBQXlDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxvREFBb0Qsa0JBQWtCLENBQUMsNkNBQTZDLGtCQUFrQixDQUFDLDhCQUE4QixxQ0FBcUMsQ0FBQyxtQ0FBbUMscUNBQXFDLENBQUMsdUNBQXVDLHdHQUF3RyxDQUFDLHVDQUF1Qyx3R0FBd0csQ0FBQyxnQ0FBZ0MsWUFBWSxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLGlEQUFpRCxjQUFjLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLDZEQUE2RCxjQUFjLENBQUMsYUFBYSxDQUFDLDBFQUEwRSxjQUFRLENBQVIsU0FBUyxDQUFDLG1DQUFtQyw4Q0FBOEMsQ0FBQyxxQkFBcUIsQ0FBQyw2Q0FBNkMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxnREFBZ0QsUUFBUSxDQUFDLG1CQUFtQixDQUFDLHNDQUFzQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLDRDQUE0Qyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLDBDQUEwQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGlDQUFpQyxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyx3Q0FBd0MsQ0FBQyx3QkFBZSxDQUFmLHFCQUFlLENBQWYsZ0JBQWdCLENBQUMsdURBQXVELG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLHVFQUF1RSxVQUFVLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsd0NBQXdDLENBQUMsa0JBQWtCLENBQUMsK0VBQStFLFNBQVMsQ0FBQyx3Q0FBd0MsQ0FBQywyQkFBMkIsaURBQWlELGFBQWEsQ0FBQyw0SEFBNEgsY0FBYyxDQUFDLENBQUMsMEJBQTBCLGlEQUFpRCxjQUFjLENBQUMsQ0FBQywwQ0FBMEMsbUJBQW1CLENBQUMsc0JBQXNCLENBQUMsZ0dBQWdHLFFBQVEsQ0FBQyxxQkFBcUIsb0JBQW9CLENBQUMsK0JBQStCLHFCQUFxQixDQUFDLFlBQVksQ0FBQyx3QkFBd0IsaUJBQWlCLENBQUMsbUNBQW1DLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQywrQkFBK0IsMEJBQTBCLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxxQ0FBcUMsdUNBQXVDLENBQUMsMkNBQTJDLDBCQUEwQixDQUFDLGlEQUFpRCx1Q0FBdUMsQ0FBQyx1REFBdUQsMEJBQTBCLENBQUMsMkJBQTJCLGtCQUFrQixDQUFDLDhCQUE4QixrQkFBa0IsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLG1EQUFtRCxlQUFlLENBQUMsb0RBQW9ELHFCQUFxQixDQUFDLGdDQUFnQyxnQkFBZ0IsQ0FBQyx3RUFBd0UsY0FBYyxDQUFDLGFBQWEsQ0FBQyxvRkFBb0YsVUFBVSxDQUFDLG9GQUFvRixXQUFXLENBQUMsb0ZBQW9GLFVBQVUsQ0FBQyxvRkFBb0YsV0FBVyxDQUFDLG9GQUFvRixVQUFVLENBQUMsb0ZBQW9GLFdBQVcsQ0FBQyxvRkFBb0YsVUFBVSxDQUFDLG9GQUFvRixXQUFXLENBQUMsb0ZBQW9GLFVBQVUsQ0FBQyxvRkFBb0YsV0FBVyxDQUFDLG9GQUFvRixVQUFVLENBQUMsb0ZBQW9GLFdBQVcsQ0FBQyxvRkFBb0YsVUFBVSxDQUFDLG9GQUFvRixXQUFXLENBQUMsb0ZBQW9GLFVBQVUsQ0FBQyxvRkFBb0YsV0FBVyxDQUFDLG9GQUFvRixVQUFVLENBQUMsaUNBQWlDLFlBQVksQ0FBQyw2QkFBNkIsQ0FBQyxrQkFBa0IsQ0FBQyxzQ0FBc0MsWUFBWSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQywyQ0FBMkMsaUJBQWlCLENBQUMsb0NBQW9DLENBQUMsa0RBQWtELGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyx3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQywyQ0FBMkMsaUJBQWlCLENBQUMsb0NBQW9DLENBQUMsMEJBQTBCLENBQUMsa0RBQWtELGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxpREFBaUQsY0FBYyxDQUFDLDJCQUEyQiw0QkFBNEIsQ0FBQyxrQkFBa0IsQ0FBQyw4QkFBOEIsaUJBQWlCLENBQUMsOEJBQThCLGVBQWUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLDhCQUE4QixjQUFjLENBQUMsbUJBQW1CLENBQUMsMkNBQTJDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQywrQkFBK0Isa0JBQWtCLENBQUMsa0NBQWtDLGVBQWUsQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLHFDQUFxQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsNENBQTRDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyw0Q0FBNEMsbUJBQW1CLENBQUMsd0RBQXdELG1CQUFtQixDQUFDLGdFQUFnRSwwQkFBMEIsQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsMENBQTBDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLGtEQUFrRCxlQUFlLENBQUMsd0JBQXdCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQywwQkFBMEIsQ0FBQyxnREFBZ0QsY0FBYyxDQUFDLFVBQVUsQ0FBQyx3REFBd0QsZUFBZSxDQUFDLHlDQUF5QywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLCtDQUErQyx3QkFBd0IsQ0FBQyx5QkFBeUIsQ0FBQywrQ0FBK0Msd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsMkNBQTJDLGlDQUFpQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsaURBQWlELHdCQUF3QixDQUFDLHlCQUF5QixDQUFDLGlEQUFpRCx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQywyQ0FBMkMsZUFBZSxDQUFDLHFEQUFxRCwwQkFBMEIsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLHVEQUF1RCwwQkFBMEIsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLHNEQUFzRCxZQUFZLENBQUMsMkNBQTJDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxnREFBZ0QsY0FBYyxDQUFDLGdEQUFnRCxZQUFZLENBQUMsZ0RBQWdELHFDQUFxQyxDQUFDLGVBQWUsQ0FBQyxtQ0FBbUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQywwQ0FBMEMsdUJBQXVCLENBQUMseUNBQXlDLGVBQWUsQ0FBQyw4Q0FBOEMsY0FBYyxDQUFDLHdDQUF3QyxjQUFjLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxxREFBcUQsMkJBQTJCLENBQUMsc0dBQXNHLDJCQUEyQixDQUFDLHlHQUF5RywyQkFBMkIsQ0FBQyx5SkFBeUosMkJBQTJCLENBQUMsdURBQXVELGtCQUFrQixDQUFDLGVBQWUsQ0FBQyw4REFBOEQsU0FBUyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxtRUFBbUUsV0FBVyxDQUFDLG1FQUFtRSxXQUFXLENBQUMsbUVBQW1FLFlBQVksQ0FBQyxxRUFBcUUsY0FBYyxDQUFDLG9CQUFvQixDQUFDLDhEQUE4RCxZQUFZLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyw2REFBNkQsWUFBWSxDQUFDLGNBQWMsQ0FBQyxtRUFBbUUsY0FBYyxDQUFDLGtFQUFrRSxlQUFlLENBQUMsYUFBYSxDQUFDLG9FQUFvRSxpQkFBaUIsQ0FBQyxxRUFBcUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyw0RUFBNEUsb0JBQW9CLENBQUMsOERBQThELFlBQVksQ0FBQywwQkFBMEIsbUNBQW1DLHFCQUFxQixDQUFDLENBQUMsb0NBQW9DLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsZ0NBQWdDLENBQUMsaUJBQWlCLENBQUMsc0NBQXNDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsZ0NBQWdDLENBQUMsaUJBQWlCLENBQUMscUNBQXFDLG9CQUFvQixDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsZ0NBQWdDLHFCQUFxQixDQUFDLHFDQUFxQyxxQkFBcUIsQ0FBQywwQkFBMEIsWUFBWSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsV0FBVyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLDBDQUEwQyxDQUFDLFNBQVMsQ0FBQyxnQ0FBZ0MsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsa0RBQWtELENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxnQ0FBZ0MscUJBQXFCLENBQUMsc0NBQXNDLFNBQVMsQ0FBQyxvQ0FBb0MscUJBQXFCLENBQUMsMENBQTBDLFNBQVMsQ0FBQyxrREFBa0QsQ0FBQyxnQ0FBZ0MsMEJBQTBCLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQywrQ0FBK0MscUJBQXFCLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxzREFBc0QsZUFBZSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLDJEQUEyRCxTQUFTLENBQUMsaUNBQWlDLDBCQUEwQixDQUFDLGlDQUFpQyxlQUFlLENBQUMsb0NBQW9DLGNBQWMsQ0FBQywrQkFBK0IsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQywrQkFBK0Isb0JBQW9CLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQywyQkFBMkIsQ0FBQyxxQ0FBcUMsVUFBVSxDQUFDLHlDQUF5Qyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsb0NBQW9DLFNBQVMsQ0FBQyx3Q0FBd0MsZUFBZSxDQUFDLDJCQUEyQixDQUFDLG9FQUFvRSxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsNEhBQTRILFVBQVUsQ0FBQyxhQUFhLENBQUMsc0dBQXNHLGVBQWUsQ0FBQyxtREFBbUQsWUFBWSxDQUFDLHdEQUF3RCxZQUFZLENBQUMsd0JBQXdCLG9CQUFvQixDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLCtCQUErQixDQUFDLGlCQUFpQixDQUFDLHNEQUFzRCxzQkFBc0IsQ0FBQyw4QkFBOEIsa0RBQWtELENBQUMsMkJBQTJCLENBQUMsMkJBQTJCLFVBQVUsQ0FBQyxrQ0FBa0MsVUFBVSxDQUFDLHVDQUF1Qyx1QkFBdUIsQ0FBQyxzQ0FBc0MsdUJBQXVCLENBQUMsMkJBQTJCLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLGdDQUFnQyxnQkFBZ0IsQ0FBQywyQ0FBMkMsa0JBQWtCLENBQUMscURBQXFELHVCQUF1QixDQUFDLG9EQUFvRCx1QkFBdUIsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLHFDQUFxQyxrQkFBa0IsQ0FBQyxxQ0FBcUMsa0JBQWtCLENBQUMsZ0RBQWdELGVBQWUsQ0FBQyxpREFBaUQsZUFBZSxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsa0JBQWtCLENBQUMsc1VBQXNVLGlCQUFpQixDQUFDLG9DQUFvQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMseUNBQXlDLGdCQUFnQixDQUFDLHFEQUFxRCxZQUFZLENBQUMsNkJBQTZCLENBQUMsd0RBQXdELFlBQVksQ0FBQyw2QkFBNkIsQ0FBQyx3QkFBd0IsNEJBQTRCLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsNkJBQTZCLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsdUNBQXVDLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLG1DQUFtQyxrQkFBa0IsQ0FBQyxrREFBa0QsQ0FBQyxtQ0FBbUMscUJBQXFCLENBQUMseUVBQXlFLFdBQVcsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsK0JBQStCLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLDJCQUEyQixDQUFDLGlCQUFpQixDQUFDLGtDQUFrQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsNENBQTRDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLHNDQUFzQyxlQUFlLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLGtEQUFrRCxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsa0RBQWtELG1CQUFtQixDQUFDLG1EQUFtRCxtQkFBbUIsQ0FBQyxtREFBbUQsbUJBQW1CLENBQUMsNENBQTRDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLGlEQUFpRCxDQUFDLGtEQUFrRCxDQUFDLGtEQUFrRCxTQUFTLENBQUMsa0RBQWtELENBQUMsMENBQTBDLG9CQUFvQixDQUFDLCtCQUErQixDQUFDLG9MQUFvTCxVQUFVLENBQUMseUZBQXlGLGFBQWEsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsaURBQWlELGFBQWEsQ0FBQyw0Q0FBNEMsVUFBVSxDQUFDLHVEQUF1RCxxRUFBcUUsQ0FBQyxrREFBa0QsYUFBYSxDQUFDLDZEQUE2RCx3REFBd0QsQ0FBQyx1REFBdUQsYUFBYSxDQUFDLDZGQUE2RixhQUFhLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLDRDQUE0QyxTQUFTLENBQUMsa0RBQWtELENBQUMsNEJBQTRCLENBQUMsYUFBYSxDQUFDLHlEQUF5RCxRQUFRLENBQUMsa0RBQWtELFlBQVksQ0FBQyxDQUFDLHlCQUF5QixxQkFBcUIsQ0FBQyxtQ0FBbUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxzQ0FBc0MsZUFBZSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxpQ0FBaUMsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsZ0pBQWdKLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyw2REFBNkQsc0JBQXNCLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLG9EQUFvRCxjQUFjLENBQUMsVUFBVSxDQUFDLGlDQUFpQyxDQUFDLDBEQUEwRCxTQUFTLENBQUMsMEJBQTBCLHlCQUF5QixrQkFBa0IsQ0FBQyw0QkFBNEIsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyw0QkFBNEIsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsOENBQThDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyx5QkFBeUIsQ0FBQyxxREFBcUQsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLDZDQUE2QyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsOENBQThDLGFBQWEsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMscURBQXFELG1CQUFtQixDQUFDLG9EQUFvRCxhQUFhLENBQUMsb0RBQW9ELFFBQVEsQ0FBQyxzRUFBc0UsQ0FBQyxZQUFZLENBQUMscURBQXFELGVBQWUsQ0FBQyw0REFBNEQsbUJBQW1CLENBQUMsa0NBQWtDLFlBQVksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsOEJBQThCLGVBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxnQ0FBZ0MsYUFBYSxDQUFDLGlCQUFpQixDQUFDLHNDQUFzQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLHVDQUF1QyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyw0Q0FBNEMsU0FBUyxDQUFDLGtDQUFrQyxlQUFlLENBQUMsMkNBQTJDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLDBDQUEwQyxlQUFlLENBQUMsMkJBQTJCLENBQUMsZ0JBQWdCLENBQUMsNkNBQTZDLDJCQUEyQixDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsd0NBQXdDLGNBQWMsQ0FBQyxlQUFlLENBQUMseUJBQXlCLFVBQVUsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLDBCQUEwQiw4QkFBOEIsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLG1EQUFtRCxhQUFhLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLHFFQUFxRSx3QkFBd0IsQ0FBQywyREFBMkQsZUFBZSxDQUFDLGVBQWUsQ0FBQyxpRUFBaUUsaUJBQWlCLENBQUMsNkRBQTZELGFBQWEsQ0FBQywrREFBK0QsYUFBYSxDQUFDLG1FQUFtRSxhQUFhLENBQUMsNkRBQTZELGFBQWEsQ0FBQywySkFBMkosa0JBQWtCLENBQUMsWUFBWSxDQUFDLDJCQUEyQixlQUFlLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsaUNBQWlDLFNBQVMsQ0FBQyw4QkFBOEIsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsMEpBQTBKLHNCQUFzQixDQUFDLDBCQUEwQixrQkFBa0IsQ0FBQyw0QkFBNEIsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsMEZBQTBGLGFBQWEsQ0FBQyxvRkFBb0YsYUFBYSxDQUFDLHVGQUF1RixhQUFhLENBQUMsNkZBQTZGLGFBQWEsQ0FBQyxvRkFBb0YsYUFBYSxDQUFDLG9DQUFvQyxZQUFZLENBQUMscUJBQXFCLENBQUMsNEJBQTRCLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsMENBQTBDLGVBQWUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLDBCQUEwQixTQUFTLDBCQUEwQixDQUFDLFlBQVksZ0JBQWdCLENBQUMsWUFBWSxpQkFBaUIsQ0FBQyxZQUFZLGdCQUFnQixDQUFDLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyx3Q0FBd0MscUJBQXFCLENBQUMscUNBQXFDLHVCQUF1QixDQUFDLHdDQUF3QyxxQkFBcUIsQ0FBQyx3Q0FBd0MsZUFBZSxDQUFDLHVDQUF1QyxlQUFlLENBQUMsdUNBQXVDLGdCQUFnQixDQUFDLHdDQUF3Qyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsbURBQW1ELENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLHNGQUFzRixpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLG9DQUFvQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyw0Q0FBNEMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyx5Q0FBeUMsa0JBQWtCLENBQUMsMENBQTBDLGtCQUFrQixDQUFDLHdDQUF3QyxrQkFBa0IsQ0FBQyxnREFBZ0QsUUFBUSxDQUFDLDhFQUE4RSxVQUFVLENBQUMsOEZBQThGLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxzR0FBc0csUUFBUSxDQUFDLDRDQUE0QyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLDJEQUEyRCxDQUFDLDBCQUEwQixDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsaURBQWlELGFBQWEsQ0FBQyxlQUFlLENBQUMsNEJBQTRCLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLGtDQUFrQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLHNEQUFzRCxDQUFDLHdDQUF3QyxvQkFBb0IsQ0FBQyxvQ0FBb0MsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsMENBQTBDLFlBQVksQ0FBQyxnREFBZ0QsWUFBWSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsc0RBQXNELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQywwQkFBMEIsQ0FBQyx3REFBd0QsQ0FBQywrQ0FBK0Msc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxtREFBbUQsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxxREFBcUQsa0JBQWtCLENBQUMsY0FBYyxDQUFDLDBEQUEwRCxhQUFhLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLHlEQUF5RCxhQUFhLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsMENBQTBDLFVBQVUsQ0FBQyxzREFBc0Qsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsNERBQTRELFlBQVksQ0FBQyxxREFBcUQsUUFBUSxDQUFDLDRCQUE0QixZQUFZLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsOEJBQThCLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxrQ0FBa0Msb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsNENBQTRDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMscUVBQXFFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsbUNBQW1DLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxnRUFBZ0UsQ0FBQyxrQ0FBa0MsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGdFQUFnRSxDQUFDLGtDQUFrQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyx3Q0FBd0MsaUJBQWlCLENBQUMsUUFBUSxDQUFDLGtEQUFrRCxTQUFTLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLDRHQUE0RyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsZ0VBQWdFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyw0SUFBNEksV0FBVyxDQUFDLGdaQUFnWixZQUFZLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLENBQUMsd1lBQXdZLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGtEQUFrRCxDQUFDLGlCQUFpQixDQUFDLGdkQUFnZCxpQkFBaUIsQ0FBQyxnWkFBZ1osb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLGdlQUFnZSxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLHdkQUF3ZCxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyw0R0FBNEcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLG9IQUFvSCxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLDhCQUE4QixDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLDhDQUE4QyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxvREFBb0Qsd0JBQXdCLENBQUMsb0RBQW9ELHdCQUF3QixDQUFDLDBCQUEwQix3Q0FBd0MsWUFBWSxDQUFDLDJDQUEyQyxZQUFZLENBQUMsMkNBQTJDLFlBQVksQ0FBQyxDQUFDLElBQUksbUJBQW1CLENBQUMsaURBQWlELGFBQWEsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQXlELFlBQVksQ0FBQyxvS0FBb0ssK0JBQStCLENBQUMsdUtBQWdKLCtCQUErQixDQUEvSyxnSkFBZ0osK0JBQStCLENBQUMsYUFBYSxpREFBaUQsZ0JBQWdCLENBQUMsQ0FBQyx3QkFBd0IsYUFBYSxDQUFDLG1DQUFtQyxrQkFBa0IsQ0FBQyxXQUFXLGFBQWEsQ0FBQywwRkFBMEYsYUFBYSxDQUFDLHdHQUF3RyxhQUFhLENBQUMsZUFBZSx3QkFBd0IsQ0FBQyx3R0FBd0csYUFBYSxDQUFDLDZSQUE2UixhQUFhLENBQUMsd0lBQXdJLGFBQWEsQ0FBQyxlQUFlLDRCQUE0QixDQUFDLG1MQUFtTCxhQUFhLENBQUMsNkJBQTZCLGFBQWEsQ0FBQyxlQUFlLFVBQVUsQ0FBQyxzUUFBc1EsZ0JBQWdCLENBQUMsc0lBQXNJLGlCQUFpQixDQUFDLGdFQUFnRSxhQUFhLENBQUMsZ0NBQWdDLGFBQWEsQ0FBQyxzQkFBc0IsVUFBVSxDQUFDLDRDQUE0Qyw2QkFBNkIsQ0FBQyx3Q0FBd0MsVUFBVSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsMENBQTBDLENBQUMsZ0NBQWdDLENBQUMsNkRBQTZELFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQywrQ0FBK0MsWUFBWSxDQUFDLHdEQUF3RCx1QkFBdUIsQ0FBQyxvREFBb0Qsa0JBQWtCLENBQUMscUVBQXFFLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQywwRUFBMEUsZ0JBQWdCLENBQUMsMkJBQTJCLENBQUMsbUJBQW1CLENBQUMsd0VBQXdFLHNDQUFzQyxDQUFDLCtFQUErRSxrQkFBa0IsQ0FBQywyREFBMkQsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLDBEQUEwRCxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsK0RBQStELGFBQWEsQ0FBQyxvRUFBb0Usa0JBQWtCLENBQUMsa09BQWtPLG9CQUFvQixDQUFDLHNJQUFzSSxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxrRUFBa0Usb0JBQW9CLENBQUMsc0JBQXNCLENBQUMsZ0ZBQWdGLGlCQUFpQixDQUFDLDJGQUEyRixTQUFTLENBQUMsc0dBQXNHLFlBQVksQ0FBQywyRkFBMkYsWUFBWSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGtHQUFrRyxZQUFZLENBQUMsZ0ZBQWdGLGlCQUFpQixDQUFDLDRFQUE0RSxjQUFjLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxtRkFBbUYsWUFBWSxDQUFDLG9CQUFvQixzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsYUFBYSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyw0QkFBNEIsU0FBUyxDQUFDLG1CQUFtQixZQUFZLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsNEJBQTRCLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLDJCQUEyQixDQUFDLHNCQUFzQixDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsa0RBQWtELENBQUMsMkJBQTJCLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGtEQUFrRCxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsMkJBQTJCLGNBQWMsQ0FBQyxpQ0FBaUMsU0FBUyxDQUFDLGtEQUFrRCx3Q0FBd0MsY0FBYyxDQUFDLGtFQUFrRSxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLDBCQUEwQix3Q0FBd0MsZUFBZSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsa0VBQWtFLHFCQUFxQixDQUFDLG1CQUFtQixDQUFDLENBQUMsMEJBQTBCLHdDQUF3QyxXQUFXLENBQUMsd0RBQXdELGFBQWEsQ0FBQyxDQUFDLE9BQU8sWUFBWSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLGdCQUFnQixDQUFDLGtEQUFrRCxDQUFDLFNBQVMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLHFCQUFxQixpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyx1REFBdUQsMkJBQTJCLENBQUMsYUFBYSxTQUFTLENBQUMsMkJBQTJCLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxjQUFjLFlBQVksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixZQUFZLENBQUMscUJBQXFCLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQywwQ0FBMEMsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLHNCQUFzQixrQkFBa0IsQ0FBQyxVQUFVLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsU0FBUyxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQywwQ0FBMEMsQ0FBQyxnRUFBZ0UsZUFBZSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0Isa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLHFDQUFxQyxvQkFBb0IsQ0FBQyw4QkFBOEIsaUJBQWlCLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsa0RBQWtELENBQUMsMENBQTBDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLHFDQUFxQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxrREFBa0QsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLDJDQUEyQyxTQUFTLENBQUMscUNBQXFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsa0JBQWtCLENBQUMsMENBQTBDLENBQUMsMkJBQTJCLENBQUMsMkJBQTJCLGtCQUFrQixjQUFjLENBQUMscUJBQXFCLFNBQVMsQ0FBQyxDQUFDLDJCQUEyQixPQUFPLHFCQUFxQixDQUFDLGFBQWEsVUFBVSxDQUFDLGNBQWMsVUFBVSxDQUFDLHVCQUF1QixnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLHlCQUF5QixVQUFVLENBQUMsaUJBQWlCLENBQUMsMkJBQXNCLENBQXRCLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsNkJBQTZCLGtCQUFrQixDQUFDLGdDQUFnQyxjQUFjLENBQUMsK0JBQStCLFNBQVMsQ0FBQywyQkFBcUIsQ0FBckIsc0JBQXNCLENBQUMsQ0FBQywwQkFBMEIsY0FBYyxxQkFBcUIsQ0FBQyx1QkFBdUIsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLGNBQWMsQ0FBQyxrQkFBa0IsY0FBYyxDQUFDLG1DQUFtQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxvRUFBb0UsYUFBYSxDQUFDLG9CQUFvQixDQUFDLHFDQUFxQyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsa0JBQWtCLENBQUMsWUFBWSxZQUFZLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLDRCQUE0QixDQUFDLDJCQUEyQixlQUFlLENBQUMsZUFBZSxDQUFDLHdCQUF3QixZQUFZLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQywwQ0FBMEMsQ0FBQywyQ0FBMkMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLDRCQUE0QixDQUFDLG9DQUFvQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsMkJBQTJCLGFBQWEsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixVQUFVLENBQUMsd0JBQXdCLFlBQVksQ0FBQyw0QkFBNEIsQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyw2QkFBNkIsWUFBWSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsK0JBQStCLENBQUMsU0FBUyxDQUFDLGtEQUFrRCxDQUFDLHlDQUF5QyxlQUFlLENBQUMsd0JBQXdCLENBQUMsbUJBQW1CLENBQUMsdUJBQXVCLENBQUMsbUNBQW1DLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGtEQUFrRCxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsbUNBQW1DLGNBQWMsQ0FBQyx5Q0FBeUMsU0FBUyxDQUFDLGNBQWMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixjQUFjLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsd0JBQXdCLFdBQVcsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMseUNBQXlDLENBQUMsVUFBVSxDQUFDLHlDQUF5QyxpQkFBaUIsQ0FBQywrQkFBK0IsMEJBQTBCLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxtREFBbUQsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLDBCQUEwQixDQUFDLHFDQUFxQyxDQUFDLDhCQUE4QixVQUFVLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxxQ0FBcUMsQ0FBQyw4QkFBOEIsY0FBYyxDQUFDLHlFQUF5RSxTQUFTLENBQUMsdUJBQXVCLENBQUMsZ0NBQWdDLGtEQUFrRCxDQUFDLHVDQUF1QyxtREFBbUQsQ0FBQyxzQ0FBc0Msa0JBQWtCLENBQUMsNEJBQTRCLENBQUMsd0RBQXdELENBQUMsNkJBQTZCLHVCQUF1QixDQUFDLG1EQUFtRCxDQUFDLG9DQUFvQyxrREFBa0QsQ0FBQyxtQ0FBbUMsa0JBQWtCLENBQUMsNEJBQTRCLENBQUMsd0RBQXdELENBQUMsdUJBQXVCLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixDQUFDLG9CQUFvQixDQUFDLDZCQUE2QixVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsK0NBQStDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxtQ0FBbUMsY0FBYyxDQUFDLDJCQUEyQixHQUFHLFNBQVMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLDBCQUEwQixnQkFBZ0IsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sWUFBWSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLHNCQUFzQixpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsa0RBQWtELENBQUMsV0FBVyxDQUFDLHNCQUFzQixZQUFZLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQywwQkFBMEIsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLHNCQUFzQixDQUFDLGdDQUFnQyxDQUFDLHNDQUFzQyxTQUFTLENBQUMsNENBQTRDLDZCQUE2QixDQUFDLGlCQUFpQixDQUFDLDRDQUE0QyxnQ0FBZ0MsQ0FBQyxpQkFBaUIsQ0FBQyxrREFBa0QsZ0NBQWdDLENBQUMsd0JBQXdCLFlBQVksQ0FBQyxvQkFBb0IsaUJBQWlCLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsMkJBQTJCLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLGFBQWEsQ0FBQyxzQkFBc0IsWUFBWSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLHlCQUF5QixVQUFVLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLHlCQUF5QixVQUFVLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLHlCQUF5QixnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsaURBQWlELGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQywrREFBK0QsZUFBZSxDQUFDLGFBQWEsQ0FBQywyREFBMkQsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsMkJBQTJCLENBQUMsMkNBQTJDLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixhQUFhLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLDhCQUE4QixVQUFVLENBQUMsaUJBQWlCLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLDBCQUEwQixDQUFDLDJCQUEyQixZQUFZLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLGlDQUFpQyxDQUFDLGlCQUFpQixDQUFDLHFDQUFxQyxXQUFXLENBQUMsc0RBQXNELGlCQUFpQixDQUFDLDhCQUE4QiwwQkFBMEIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLHVDQUF1QyxvQkFBb0IsQ0FBQyxnREFBZ0QsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyw4QkFBOEIsQ0FBQyxpQ0FBaUMsQ0FBQyx3Q0FBd0MsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsc0RBQXNELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGdDQUFnQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyw4REFBOEQsU0FBUyxDQUFDLGlCQUFpQixZQUFZLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyx5QkFBeUIsWUFBWSxDQUFDLDBCQUEwQixDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsYUFBYSxDQUFDLHNKQUFzSixvQkFBb0IsQ0FBQyx3S0FBd0ssb0JBQW9CLENBQUMsMkNBQTJDLENBQUMsb0lBQW9JLHFDQUFxQyxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxzQ0FBc0MsQ0FBQyx1QkFBdUIsQ0FBQyx5Q0FBeUMsQ0FBQyxzSkFBc0osWUFBWSxDQUFDLG9CQUFvQixDQUFDLDJDQUEyQyxDQUFDLGlCQUFpQixDQUFDLDRMQUEySyw0QkFBNEIsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBNU8sMktBQTJLLDRCQUE0QixDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLG9FQUFvRSxtQkFBbUIsQ0FBQyxzRUFBc0UsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGNBQWMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxpQ0FBaUMsQ0FBQyxzQkFBc0IsQ0FBQyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsd0NBQXdDLENBQUMsd0JBQWUsQ0FBZixxQkFBZSxDQUFmLGdCQUFnQixDQUFDLDJCQUEyQixvQkFBb0IsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyx3Q0FBd0MsVUFBVSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLHdDQUF3QyxDQUFDLGtCQUFrQixDQUFDLGdEQUFnRCxTQUFTLENBQUMsd0NBQXdDLENBQUMsbURBQW1ELGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLGlDQUFpQyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLGtFQUFrRSxjQUFjLENBQUMsVUFBVSxDQUFDLGtEQUFrRCxDQUFDLG1CQUFtQixrQkFBa0IsQ0FBQyxrQkFBa0IsU0FBUyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLDZCQUE2QixDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsMkJBQTJCLENBQUMsaUNBQWlDLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLDRCQUE0QixjQUFjLENBQUMsdUJBQXVCLGFBQWEsQ0FBQyx3QkFBd0IsVUFBVSxDQUFDLGtEQUFrRCxDQUFDLGdDQUFnQyxjQUFjLENBQUMsaUNBQWlDLFlBQVksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLGFBQWEsQ0FBQyx5QkFBeUIsWUFBWSxDQUFDLDBCQUEwQixnQ0FBZ0MsWUFBWSxDQUFDLGlDQUFpQyxjQUFjLENBQUMsQ0FBQyxxQkFBcUIsWUFBWSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsZUFBZSxDQUFDLHFDQUFxQyxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLHNDQUFzQyxDQUFDLHVCQUF1QixDQUFDLHlDQUF5QyxDQUFDLHNCQUFzQixZQUFZLENBQUMsb0JBQW9CLENBQUMsMkNBQTJDLENBQUMsaUJBQWlCLENBQUMsa0NBQTZCLDRCQUE0QixDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUE5Riw2QkFBNkIsNEJBQTRCLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsNEJBQTRCLHNCQUFzQixDQUFDLGtEQUFrRCxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsa0NBQWtDLFNBQVMsQ0FBQyx1QkFBdUIsaUJBQWlCLENBQUMsa0RBQWtELENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyw4QkFBOEIsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLGdDQUFnQyxDQUFDLDRCQUE0QixDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyx3QkFBd0IsYUFBYSxDQUFDLDBCQUEwQixpQkFBaUIsQ0FBQyx5Q0FBeUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsU0FBUyxDQUFDLCtCQUErQixhQUFhLENBQUMsa0JBQWtCLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsNEJBQTRCLENBQUMsb0JBQW9CLGlCQUFpQixDQUFDLCtCQUErQixlQUFlLENBQUMsNkNBQTZDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsa0RBQWtELGlCQUFpQixDQUFDLGVBQWUsQ0FBQyw2Q0FBNkMsWUFBWSxDQUFDLDZCQUE2QixDQUFDLDRDQUE0QyxZQUFZLENBQUMsa0JBQWtCLENBQUMsNkJBQTZCLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsK0JBQStCLENBQUMsdURBQXVELDRCQUE0QixDQUFDLG9FQUFvRSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxrQ0FBa0MsaUJBQWlCLENBQUMsNkVBQTZFLGlCQUFpQixDQUFDLHVDQUF1QyxrQkFBa0IsQ0FBQyxxQ0FBcUMsQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLDJDQUEyQyxlQUFlLENBQUMsVUFBVSxDQUFDLGlEQUFpRCxVQUFVLENBQUMsZUFBZSxDQUFDLHNEQUFzRCxXQUFXLENBQUMsMkJBQTJCLENBQUMsa0JBQWtCLENBQUMsa0RBQWtELGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQywwREFBMEQsYUFBYSxDQUFDLDBDQUEwQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLDZDQUE2QyxpQkFBaUIsQ0FBQyw0QkFBNEIsQ0FBQyxpRUFBaUUsa0JBQWtCLENBQUMsMENBQTBDLGlCQUFpQixDQUFDLDJDQUEyQyxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyw0QkFBNEIsQ0FBQyxnQ0FBZ0MsVUFBVSxDQUFDLGVBQWUsQ0FBQyxrQ0FBa0Msb0JBQW9CLENBQUMsc0NBQXNDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLHNCQUFzQixDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLGtEQUFrRCxDQUFDLDRDQUE0QyxVQUFVLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxrREFBa0QsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLDRDQUE0QyxjQUFjLENBQUMsa0RBQWtELFNBQVMsQ0FBQywwQkFBMEIsT0FBTyxhQUFhLENBQUMsZUFBZSxDQUFDLG1CQUFtQiwyQkFBMkIsQ0FBQyxDQUFDLHNCQUFzQixpQkFBaUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFFBQVEsYUFBYSxDQUFDLGlCQUFpQixDQUFDLDRDQUE0QyxDQUFDLDhDQUE4QyxDQUFDLCtDQUErQyxDQUFDLCtCQUErQixDQUFDLHVCQUF1QixDQUFDLG1DQUFtQyxDQUFDLGlCQUFpQixHQUFrQyxzQkFBc0IsQ0FBQyxLQUFzQyx3QkFBd0IsQ0FBQyxDQUFDLGlCQUFpQixnQ0FBZ0MsQ0FBQyxrREFBa0QsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLDBDQUEwQyxDQUFDLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQyxZQUFZLENBQUMsbUJBQW1CLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsVUFBVSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMseUJBQXlCLGNBQWMsQ0FBQyxzQkFBc0Isb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLGlDQUFpQyxDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixpQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyxvQkFBb0IsQ0FBQyw4QkFBOEIsMkJBQTJCLENBQUMsd0NBQXdDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsZ0RBQWdELFNBQVMsQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsd0RBQXdELENBQUMsdURBQXVELGlCQUFpQixDQUFDLDBCQUEwQix1Q0FBdUMsVUFBVSxDQUFDLGFBQWEsQ0FBQywrQ0FBK0MsVUFBVSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQyx3REFBd0QsQ0FBQyxzREFBc0QsaUJBQWlCLENBQUMsQ0FBQyxrR0FBa0csb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMseUJBQXlCLENBQUMsb0JBQW9CLENBQUMsOEJBQThCLENBQUMsOE1BQThNLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLDRQQUE0UCxxQkFBcUIsQ0FBQyxnbkJBQWduQixVQUFVLENBQUMsOE1BQThNLGFBQWEsQ0FBQyxnSEFBZ0gsYUFBYSxDQUFDLHNHQUFzRyxVQUFVLENBQUMsNEhBQTRILHFFQUFxRSxDQUFDLGtIQUFrSCxhQUFhLENBQUMsd0lBQXdJLHdEQUF3RCxDQUFDLDRIQUE0SCxhQUFhLENBQUMsc05BQXNOLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQywwR0FBMEcsK0JBQStCLENBQUMsOEdBQThHLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQywwSEFBMEgsa0RBQWtELENBQUMsMEpBQTBKLGtCQUFrQixDQUFDLHdIQUF3SCxtQ0FBbUMsQ0FBQyw0SEFBNEgsMkJBQTJCLENBQUMsa0tBQWtLLHNCQUFzQixDQUFDLDJCQUEyQixDQUFDLDhLQUE4SyxhQUFhLENBQUMsc0xBQXNMLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUFDLGVBQWUsQ0FBQywrQkFBK0IsQ0FBQyxrQ0FBa0MsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsc0NBQXNDLENBQUMsaUJBQWlCLENBQUMsMENBQTBDLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLHlEQUF5RCxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxnRUFBZ0UsaUJBQWlCLENBQUMsdUNBQXVDLGdCQUFnQixDQUFDLHFEQUFxRCxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQywyRUFBMkUsMkNBQTJDLENBQUMsbUJBQW1CLENBQUMsZ0VBQWdFLGVBQWUsQ0FBQyxrRUFBa0UsZUFBZSxDQUFDLHdEQUF3RCxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsaUZBQWlGLENBQUMsa1dBQWtXLG9CQUFvQixDQUFDLDBhQUEwYSxZQUFZLENBQUMsc0RBQXNELGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDLDREQUE0RCxVQUFVLENBQUMsd0NBQXdDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyw4Q0FBOEMsY0FBYyxDQUFDLFNBQVMsQ0FBQywrQ0FBK0MsbUJBQW1CLENBQUMsdUNBQXVDLGtEQUFrRCxDQUFDLCtDQUErQyxhQUFhLENBQUMsNENBQTRDLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQywyQ0FBMkMsNkJBQTZCLENBQUMsdUNBQXVDLG1EQUFtRCxDQUFDLCtDQUErQyxhQUFhLENBQUMsNENBQTRDLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQywyQ0FBMkMsOEJBQThCLENBQUMsa0RBQWtELHlEQUF5RCxDQUFDLHFCQUFxQixDQUFDLDBEQUEwRCxhQUFhLENBQUMsdURBQXVELGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxzREFBc0QsNkJBQTZCLENBQUMscURBQXFELDJCQUEyQixDQUFDLHFFQUFxRSxpQkFBaUIsQ0FBQywwRUFBMEUsb0JBQW9CLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsOE5BQThOLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxzU0FBc1MsWUFBWSxDQUFDLDBFQUEwRSxnQkFBZ0IsQ0FBQyxxQ0FBcUMsaUJBQWlCLENBQUMscUNBQXFDLGdCQUFnQixDQUFDLHFDQUFxQyxnQkFBZ0IsQ0FBQyxxQ0FBcUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMseUVBQXlFLGtCQUFrQixDQUFDLG9DQUFvQyxpQkFBaUIsQ0FBQyxvQ0FBb0MsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLDBFQUEwRSxtQkFBbUIsQ0FBQyx1Q0FBdUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsc0NBQXNDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsMkNBQTJDLGlDQUFpQyxDQUFDLHFDQUFxQyxzQkFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxrQ0FBa0MsQ0FBQyw2REFBNkQsaUJBQWlCLENBQUMsNERBQTRELFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxvREFBb0QsbUJBQW1CLENBQUMsNkNBQTZDLHFCQUFxQixDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLHFDQUFxQyxDQUFDLGtCQUFrQixDQUFDLGdEQUFnRCxpQkFBaUIsQ0FBQywwQkFBMEIsb0JBQW9CLFFBQVEsQ0FBQyxDQUFDLFdBQVcsaUJBQWlCLENBQUMsZUFBZSxpQkFBaUIsQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxxQ0FBcUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsOEZBQThGLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQywwQkFBMEIsQ0FBQyx1Q0FBdUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsdUNBQXVDLENBQUMsMEJBQTBCLENBQUMsWUFBWSxDQUFDLDhDQUE4QyxhQUFhLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxnSEFBZ0gsdUNBQXVDLENBQUMsdURBQXVELG1CQUFtQixDQUFDLGlFQUFpRSwyQ0FBMkMsQ0FBQyxrQkFBa0IsQ0FBQyxxQ0FBcUMsQ0FBQyx5RUFBeUUsNkNBQTZDLENBQUMsZ0JBQWdCLENBQUMsd0VBQXdFLGFBQWEsQ0FBQywyQ0FBMkMsQ0FBQyxnQkFBZ0IsQ0FBQywwQ0FBMEMsUUFBUSxDQUFDLDBDQUEwQyxZQUFZLENBQUMsMENBQTBDLGFBQWEsQ0FBQyxpQkFBaUIsWUFBWSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQywwQkFBMEIsQ0FBQyxtQ0FBbUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLHdDQUF3QyxXQUFXLENBQUMsdUJBQXVCLENBQUMsOENBQThDLFNBQVMsQ0FBQyxxQkFBcUIsYUFBYSxDQUFDLG1CQUFtQixDQUFDLHFDQUFxQyxDQUFDLG1EQUFtRCxrQkFBa0IsQ0FBQyxxQ0FBcUMsQ0FBQyxhQUFhLENBQUMseUZBQXlGLHlCQUF5QixDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsOEtBQThLLDBCQUEwQixDQUFDLDZCQUE2QixDQUFDLDRCQUE0QixDQUFDLDhCQUE4QixDQUFDLHFDQUFxQyxDQUFDLHdCQUF3QixDQUFDLDRCQUE0QixrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsa0NBQWtDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyw0QkFBNEIsQ0FBQyxxRUFBcUUsQ0FBQyxxQkFBcUIsQ0FBQyxrQ0FBa0MsVUFBVSxDQUFDLHdDQUF3QyxxREFBcUQsQ0FBQyx5QkFBeUIscUJBQXFCLENBQUMsK0JBQStCLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLDhCQUE4QixTQUFTLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLDhCQUE4QixtQkFBbUIsQ0FBQywyQkFBMkIsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMscUNBQXFDLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGtDQUFrQyxrQkFBa0IsQ0FBQyxtQ0FBbUMsa0JBQWtCLENBQUMsb0NBQW9DLGtCQUFrQixDQUFDLHFDQUFxQyxrQkFBa0IsQ0FBQyxrQ0FBa0Msa0JBQWtCLENBQUMsd0NBQXdDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyw4Q0FBOEMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsOENBQThDLFVBQVUsQ0FBQyxvREFBb0QsVUFBVSxDQUFDLDhFQUE4RSxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsMEZBQTBGLGFBQWEsQ0FBQyw4RkFBOEYsYUFBYSxDQUFDLDRGQUE0RixhQUFhLENBQUMsd0xBQXdMLDRCQUE0QixDQUFDLCtDQUErQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsaUVBQWlFLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyw2RkFBNkYsaUJBQWlCLENBQUMscUdBQXFHLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLHVFQUF1RSxhQUFhLENBQUMsMkdBQTJHLFNBQVMsQ0FBQyxtRUFBbUUsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLDBGQUEwRixVQUFVLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxnR0FBZ0csWUFBWSxDQUFDLGtDQUFrQyxDQUFDLDJDQUEyQyxDQUFDLGlCQUFpQixDQUFDLHlFQUF5RSxjQUFjLENBQUMseUVBQXlFLGVBQWUsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsZ0RBQWdELHdCQUF3QixDQUFDLCtDQUErQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyx1QkFBdUIsQ0FBQyxzQkFBc0IsQ0FBQyxxREFBcUQsd0JBQXdCLENBQUMsMEJBQTBCLENBQUMsK0JBQStCLENBQUMsbURBQW1ELHNCQUFzQixDQUFDLHdCQUF3QixDQUFDLDZCQUE2QixDQUFDLHNEQUFzRCx5QkFBeUIsQ0FBQywyQkFBMkIsQ0FBQyxnQ0FBZ0MsQ0FBQywwQkFBMEIseUJBQXlCLDBCQUEwQixDQUFDLENBQUMscUJBQXFCLFlBQVksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLDBCQUEwQixDQUFDLCtCQUErQixDQUFDLDBCQUEwQixLQUFLLENBQUMseUNBQXlDLGtEQUFrRCxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyx5Q0FBeUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyw0Q0FBNEMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLDhDQUE4QyxZQUFZLENBQUMsa0JBQWtCLENBQUMsZ0RBQWdELDRCQUE0QixDQUFDLG1CQUFtQixDQUFDLHVEQUF1RCxVQUFVLENBQUMsZ0VBQWdFLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxzRUFBc0UsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsc0VBQXNFLFVBQVUsQ0FBQyw0RUFBNEUsVUFBVSxDQUFDLHFFQUFxRSxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQywyQ0FBMkMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyx1RUFBdUUsWUFBWSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLHVFQUF1RSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsNkVBQTZFLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLG1GQUFtRixVQUFVLENBQUMsa0VBQWtFLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQywyRkFBMkYsYUFBYSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQywyR0FBMkcsa0JBQWtCLENBQUMscUNBQXFDLENBQUMsaUJBQWlCLENBQUMseUNBQXlDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsc0JBQXNCLENBQUMsb0JBQW9CLENBQUMsd0NBQXdDLGFBQWEsQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLDJDQUEyQyxDQUFDLG9DQUFvQyxDQUFDLDhDQUE4QyxhQUFhLENBQUMseUNBQXlDLENBQUMsK0NBQStDLGNBQWMsQ0FBQywwQ0FBMEMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxnREFBZ0QsU0FBUyxDQUFDLGNBQWMsQ0FBQywyQkFBMkIsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxxQkFBZ0IsQ0FBaEIsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMscUNBQXFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMseUNBQXlDLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsNENBQTRDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLDZDQUE2QyxDQUFDLDhDQUE4QyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsc0RBQXNELENBQUMsbUJBQW1CLENBQUMsaUNBQWlDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxtREFBbUQsbUNBQW1DLENBQUMsMERBQTBELHNEQUFzRCxDQUFDLDBDQUEwQyxlQUFlLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsMEJBQTBCLDhDQUE4QyxxQkFBcUIsQ0FBQyw0Q0FBNEMscUJBQXFCLENBQUMseUNBQXlDLGFBQWEsQ0FBQyxDQUFDLDJCQUEyQiw0QkFBNEIsQ0FBQyw4QkFBOEIsQ0FBQyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQywyQ0FBMkMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsOENBQThDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMscUNBQXFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsbURBQW1ELFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyx5Q0FBeUMsQ0FBQywrQ0FBK0MsZ0JBQWdCLENBQUMseURBQXlELFlBQVksQ0FBQyx5Q0FBeUMsQ0FBQyxnRUFBZ0UsYUFBYSxDQUFDLHdFQUF3RSxlQUFlLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxzT0FBc08sV0FBVyxDQUFDLGtDQUFrQyxDQUFDLGNBQWMsQ0FBQyxxQ0FBcUMsQ0FBQyxtQkFBbUIsQ0FBQyxvUUFBb1EseUJBQXlCLENBQUMsa0JBQWtCLENBQUMsMENBQTBDLGFBQWEsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLHlCQUF5QixDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsZ0RBQWdELG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLHlCQUF5QixDQUFDLGlEQUFpRCx5QkFBeUIsQ0FBQywwQ0FBMEMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsZ0RBQWdELGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxtREFBbUQsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsbUZBQW1GLGtCQUFrQixDQUFDLFVBQVUsQ0FBQywyQ0FBMkMsQ0FBQyxjQUFjLENBQUMsOEJBQThCLENBQUMsK0ZBQStGLGtCQUFrQixDQUFDLDJDQUEyQyw0QkFBNEIsQ0FBQyxjQUFjLENBQUMsa0ZBQWtGLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxrQ0FBa0MsQ0FBQyw4Q0FBOEMsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsOEZBQThGLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyx3Q0FBd0MsK0JBQStCLENBQUMsOENBQThDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLDhDQUE4QyxlQUFlLENBQUMsY0FBYyxDQUFDLG9DQUFvQyx5QkFBeUIsQ0FBQyxzREFBc0QsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLHNEQUFpRCwyQkFBMkIsQ0FBQyxTQUFTLENBQXRGLGlEQUFpRCwyQkFBMkIsQ0FBQyxTQUFTLENBQUMsK0RBQStELDJCQUEyQixDQUFDLHNEQUFzRCwyQkFBMkIsQ0FBQyxTQUFTLENBQUMsMERBQTBELDJCQUEyQixDQUFDLHVDQUF1QyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsK0JBQStCLENBQUMsaUJBQWlCLENBQUMscUNBQXFDLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyw2Q0FBNkMsK0JBQStCLENBQUMseUJBQXlCLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsa0NBQWtDLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyw0Q0FBNEMsK0JBQStCLENBQUMsZ0VBQWdFLFVBQVUsQ0FBQywrQkFBK0IsQ0FBQyxjQUFjLENBQUMsK0RBQStELGFBQWEsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLCtCQUErQixDQUFDLHlCQUF5QixDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDLHFFQUFxRSxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQywrRUFBK0Usc0RBQXNELENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxtRkFBbUYsY0FBYyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsbUZBQW1GLGNBQWMsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLG1DQUFtQyxZQUFZLENBQUMsNEJBQTRCLENBQUMseUJBQXlCLENBQUMsa0NBQWtDLENBQUMseUNBQXlDLENBQUMsd0NBQXdDLGFBQWEsQ0FBQywyQ0FBMkMsa0JBQWtCLENBQUMsNkJBQTZCLENBQUMsYUFBYSxDQUFDLHlDQUF5QyxrQkFBa0IsQ0FBQyw2QkFBNkIsQ0FBQyxhQUFhLENBQUMsd0NBQXdDLGtCQUFrQixDQUFDLDZCQUE2QixDQUFDLGFBQWEsQ0FBQywyQ0FBMkMsb0NBQW9DLENBQUMsNkJBQTZCLENBQUMsYUFBYSxDQUFDLDZDQUE2QyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLCtCQUErQixDQUFDLHlCQUF5QixDQUFDLDhCQUE4QixDQUFDLGlCQUFpQixDQUFDLDZCQUE2QixDQUFDLG9EQUFvRCxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLDhCQUE4QixDQUFDLDZCQUE2QixDQUFDLG9DQUFvQyxvQkFBb0IsQ0FBQyw2QkFBNkIsQ0FBQywwQ0FBMEMsYUFBYSxDQUFDLDBDQUEwQyxDQUFDLGdCQUFnQixPQUFPLFdBQVcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLGtCQUFrQixLQUFLLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLDBCQUEwQiwyQkFBMkIsY0FBYyxDQUFDLDJDQUEyQyxlQUFlLENBQUMsMENBQTBDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyw2SEFBNkgsMkNBQTJDLENBQUMsY0FBYyxDQUFDLENBQUMsMEJBQTBCLDJCQUEyQixZQUFZLENBQUMsMkNBQTJDLGVBQWUsQ0FBQyw4Q0FBOEMsZUFBZSxDQUFDLDBDQUEwQyxhQUFhLENBQUMsQ0FBQyw0Q0FBNEMsK0JBQStCLENBQUMsZUFBZSxDQUFDLGtDQUFrQyxDQUFDLDZCQUE2QixDQUFDLGtCQUFrQixDQUFDLHVEQUF1RCw4QkFBOEIsQ0FBQyxvQkFBb0IsQ0FBQywyREFBMkQsZUFBZSxDQUFDLHFCQUFxQixDQUFDLCtEQUErRCxhQUFhLENBQUMsZUFBZSxDQUFDLDZCQUE2QixDQUFDLDZEQUE2RCxhQUFhLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyx5Q0FBeUMsNEJBQTRCLENBQUMsWUFBWSxDQUFDLDhCQUE4QixDQUFDLDZCQUE2QixDQUFDLGtDQUFrQyxDQUFDLHFEQUFxRCw4QkFBOEIsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLDJEQUEyRCw4QkFBOEIsQ0FBQyxlQUFlLENBQUMsb0RBQW9ELFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyx1REFBdUQscUJBQXFCLENBQUMseURBQXlELCtCQUErQixDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxvREFBb0QsOEJBQThCLENBQUMsZ0JBQWdCLENBQUMsNkNBQTZDLGFBQWEsQ0FBQyw0REFBNEQsZUFBZSxDQUFDLG9CQUFvQixDQUFDLDJEQUEyRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLDhEQUE4RCxxQkFBcUIsQ0FBQyxpREFBaUQsZUFBZSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLDZDQUE2QyxlQUFlLENBQUMseUNBQXlDLDRCQUE0QixDQUFDLDZFQUE2RSxhQUFhLENBQUMseUJBQXlCLENBQUMsb0JBQW9CLENBQUMseUZBQXlGLFVBQVUsQ0FBQyx3Q0FBd0Msa0JBQWtCLENBQUMsMENBQTBDLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxrQkFBa0IsQ0FBQyw2QkFBNkIsQ0FBQyxrQ0FBa0MsQ0FBQywyQ0FBMkMsNEJBQTRCLENBQUMsNENBQTRDLGVBQWUsQ0FBQyxvREFBb0Qsd0JBQXdCLENBQUMsa0NBQWtDLENBQUMsY0FBYyxDQUFDLCtEQUErRCxjQUFjLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLHdCQUFnQixDQUFoQixxQkFBZ0IsQ0FBaEIsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLHFFQUFxRSxVQUFVLENBQUMsK0NBQStDLGNBQWMsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsd0JBQWdCLENBQWhCLHFCQUFnQixDQUFoQixnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMscURBQXFELFVBQVUsQ0FBQyw4SEFBOEgsWUFBWSxDQUFDLHVEQUF1RCxXQUFXLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLHFFQUFxRSxXQUFXLENBQUMsNkRBQTZELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyw0Q0FBNEMsZUFBZSxDQUFDLG9EQUFvRCx3QkFBd0IsQ0FBQyxrQ0FBa0MsQ0FBQyxjQUFjLENBQUMsNkRBQTZELGVBQWUsQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsZUFBZSxDQUFDLGdJQUFnSSxjQUFjLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLGdFQUFnRSxzQkFBc0IsQ0FBQyw4QkFBOEIsQ0FBQyxlQUFlLENBQUMsc0ZBQXNGLGlDQUFpQyxDQUFDLDJFQUEyRSxlQUFlLENBQUMsaUJBQWlCLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixnQkFBZ0IsQ0FBQyx5QkFBeUIsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsd0JBQXdCLENBQUMsa0JBQWtCLENBQUMseUNBQXlDLENBQUMsK0JBQStCLG9CQUFvQixDQUFDLDJDQUEyQyxDQUFDLCtCQUErQix5QkFBeUIsQ0FBQyxrQkFBa0IsQ0FBQywrQ0FBK0Msb0JBQW9CLENBQUMsa0ZBQWtGLHdCQUF3QixDQUFDLDhCQUE4QixtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGtDQUFrQyxVQUFVLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsY0FBYyxDQUFDLGVBQWUsQ0FBQywrQkFBK0IsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxtQ0FBbUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQywyQkFBMkIsY0FBYyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsOEJBQThCLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsMEJBQTBCLENBQUMsd0JBQXdCLENBQUMsbUJBQW1CLENBQUMsbUNBQW1DLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsWUFBWSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxnQ0FBZ0MsQ0FBQywrQkFBK0Isa0JBQWtCLENBQUMsYUFBYSxDQUFDLCtCQUErQix5QkFBeUIsQ0FBQyxtQkFBbUIsQ0FBQywwQ0FBMEMscUJBQXFCLENBQUMsdUJBQXVCLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQywyQkFBMkIsVUFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMseUVBQXlFLFlBQVksQ0FBQyw4QkFBOEIsWUFBWSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLHdCQUF3QixZQUFZLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsMkJBQTJCLGNBQWMsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLDBCQUEwQixpQkFBaUIsYUFBYSxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsVUFBVSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUMsMkJBQTJCLGlCQUFpQixDQUFDLHFCQUFxQixLQUFLLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxHQUFHLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUscUJBQXFCIiwiZmlsZSI6InN0ZGluIiwic291cmNlc0NvbnRlbnQiOlsiYm9keXtmb250LXNpemU6MThweDstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZX1AZm9udC1mYWNle2ZvbnQtZmFtaWx5OlwiUHJveGltYSBOb3ZhXCI7c3JjOnVybChcImZvbnRzL3Byb3hpbWEtbm92YS5vdGZcIikgZm9ybWF0KFwib3BlbnR5cGVcIik7Zm9udC13ZWlnaHQ6MzAwfUBmb250LWZhY2V7Zm9udC1mYW1pbHk6J1Byb3hpbWEgTm92YSc7c3JjOnVybChcImZvbnRzL3Byb3hpbWEtbm92YS1tZWRpdW0ub3RmXCIpIGZvcm1hdChcIm9wZW50eXBlXCIpO2ZvbnQtd2VpZ2h0OjQwMH1AZm9udC1mYWNle2ZvbnQtZmFtaWx5OidQcm94aW1hIE5vdmEnO3NyYzp1cmwoXCJmb250cy9wcm94aW1hLW5vdmEtc2VtaWJvbGQub3RmXCIpIGZvcm1hdChcIm9wZW50eXBlXCIpO2ZvbnQtd2VpZ2h0OjUwMCA2MDB9QGZvbnQtZmFjZXtmb250LWZhbWlseTonUHJveGltYSBOb3ZhJztzcmM6dXJsKFwiZm9udHMvcHJveGltYS1ub3ZhLWJvbGQub3RmXCIpIGZvcm1hdChcIm9wZW50eXBlXCIpO2ZvbnQtd2VpZ2h0OjcwMH1AZm9udC1mYWNle2ZvbnQtZmFtaWx5OidpY29tb29uLXYyJztzcmM6dXJsKFwiZm9udHMvaWNvbW9vbi12Mi5lb3Q/aXRuMnBoXCIpO3NyYzp1cmwoXCJmb250cy9pY29tb29uLXYyLmVvdD9pdG4ycGgjaWVmaXhcIikgZm9ybWF0KFwiZW1iZWRkZWQtb3BlbnR5cGVcIiksdXJsKFwiZm9udHMvaWNvbW9vbi12Mi50dGY/aXRuMnBoXCIpIGZvcm1hdChcInRydWV0eXBlXCIpLHVybChcImZvbnRzL2ljb21vb24tdjIud29mZj9pdG4ycGhcIikgZm9ybWF0KFwid29mZlwiKSx1cmwoXCJmb250cy9pY29tb29uLXYyLnN2Zz9pdG4ycGgjaWNvbW9vbi12MlwiKSBmb3JtYXQoXCJzdmdcIik7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTpibG9ja31bY2xhc3NePVwiaWNvbi1cIl0sW2NsYXNzKj1cIiBpY29uLVwiXXtmb250LWZhbWlseTonaWNvbW9vbi12MicgIWltcG9ydGFudDtzcGVhazpuZXZlcjtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDt0ZXh0LXRyYW5zZm9ybTpub25lO2xpbmUtaGVpZ2h0OjE7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGV9Lmljb24tYmFyLWNoYXJ0OmJlZm9yZXtjb250ZW50OlwiXFxlOTEzXCJ9Lmljb24taW5mbHV4LWxvZ286YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MDBcIn0uaWNvbi1pbmZsdXgtbG9nb3R5cGU6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MDFcIn0uaWNvbi1hbGVydC10cmlhbmdsZTpiZWZvcmV7Y29udGVudDpcIlxcZTkwMlwifS5pY29uLWFycm93LWRvd246YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MDNcIn0uaWNvbi1tb29uMTpiZWZvcmV7Y29udGVudDpcIlxcZTkwNFwifS5pY29uLXNlYXJjaDpiZWZvcmV7Y29udGVudDpcIlxcZTkwNVwifS5pY29uLXN1bjE6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MDZcIn0uaWNvbi1hcnJvdy1kb3duLWNpcmNsZTpiZWZvcmV7Y29udGVudDpcIlxcZTkwN1wifS5pY29uLWFycm93LWRvd24tbGVmdDpiZWZvcmV7Y29udGVudDpcIlxcZTkwOFwifS5pY29uLWFycm93LWRvd24tcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MDlcIn0uaWNvbi1hcnJvdy1sZWZ0OmJlZm9yZXtjb250ZW50OlwiXFxlOTBhXCJ9Lmljb24tYXJyb3ctbGVmdC1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MGJcIn0uaWNvbi1hcnJvdy1yaWdodDpiZWZvcmV7Y29udGVudDpcIlxcZTkwY1wifS5pY29uLWFycm93LXJpZ2h0LWNpcmNsZTpiZWZvcmV7Y29udGVudDpcIlxcZTkwZFwifS5pY29uLWFycm93LXVwOmJlZm9yZXtjb250ZW50OlwiXFxlOTBlXCJ9Lmljb24tYXJyb3ctdXAtY2lyY2xlOmJlZm9yZXtjb250ZW50OlwiXFxlOTBmXCJ9Lmljb24tYXJyb3ctdXAtbGVmdDpiZWZvcmV7Y29udGVudDpcIlxcZTkxMFwifS5pY29uLWFycm93LXVwLXJpZ2h0OmJlZm9yZXtjb250ZW50OlwiXFxlOTExXCJ9Lmljb24tY2hlY2s6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MTJcIn0uaWNvbi1oZWFydDE6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MTRcIn0uaWNvbi1zZXR0aW5nczpiZWZvcmV7Y29udGVudDpcIlxcZTkxNVwifS5pY29uLXpvb20taW46YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MTZcIn0uaWNvbi16b29tLW91dDpiZWZvcmV7Y29udGVudDpcIlxcZTkxN1wifS5pY29uLWNoZXZyb24tZG93bjpiZWZvcmV7Y29udGVudDpcIlxcZTkxOFwifS5pY29uLWNoZXZyb24tbGVmdDpiZWZvcmV7Y29udGVudDpcIlxcZTkxOVwifS5pY29uLWNoZXZyb24tcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MWFcIn0uaWNvbi1jaGV2cm9uLXVwOmJlZm9yZXtjb250ZW50OlwiXFxlOTFiXCJ9Lmljb24tbWVudTpiZWZvcmV7Y29udGVudDpcIlxcZTkxY1wifS5pY29uLWRvd25sb2FkOmJlZm9yZXtjb250ZW50OlwiXFxlOTFkXCJ9Lmljb24tbWludXM6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MWVcIn0uaWNvbi1wbHVzOmJlZm9yZXtjb250ZW50OlwiXFxlOTFmXCJ9Lmljb24tYWRkLWNlbGw6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MjBcIn0uaWNvbi1hbGVydDpiZWZvcmV7Y29udGVudDpcIlxcZTkyMVwifS5pY29uLWNhbGVuZGFyOmJlZm9yZXtjb250ZW50OlwiXFxlOTIyXCJ9Lmljb24tY2hlY2ttYXJrOmJlZm9yZXtjb250ZW50OlwiXFxlOTIzXCJ9Lmljb24tY29nLXRoaWNrOmJlZm9yZXtjb250ZW50OlwiXFxlOTI0XCJ9Lmljb24tZGFzaGJvYXJkczpiZWZvcmV7Y29udGVudDpcIlxcZTkyNVwifS5pY29uLWRhdGEtZXhwbG9yZXI6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MjZcIn0uaWNvbi11aS1kb3dubG9hZDpiZWZvcmV7Y29udGVudDpcIlxcZTkyN1wifS5pY29uLWR1cGxpY2F0ZTpiZWZvcmV7Y29udGVudDpcIlxcZTkyOFwifS5pY29uLWV4cG9ydDpiZWZvcmV7Y29udGVudDpcIlxcZTkyOVwifS5pY29uLWZ1bGxzY3JlZW46YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MmFcIn0uaWNvbi1pbmZsdXgtaWNvbjpiZWZvcmV7Y29udGVudDpcIlxcZTkyYlwifS5pY29uLW5vdGU6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MmNcIn0uaWNvbi1vcmdhbml6YXRpb25zOmJlZm9yZXtjb250ZW50OlwiXFxlOTJkXCJ9Lmljb24tcGF1c2U6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MmVcIn0uaWNvbi1wZW5jaWw6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MmZcIn0uaWNvbi1wbGF5OmJlZm9yZXtjb250ZW50OlwiXFxlOTMwXCJ9Lmljb24tdWktcGx1czpiZWZvcmV7Y29udGVudDpcIlxcZTkzMVwifS5pY29uLXJlZnJlc2g6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MzJcIn0uaWNvbi1yZW1vdmU6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MzNcIn0uaWNvbi1hbGVydC1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MzRcIn0uaWNvbi1jcm93bjpiZWZvcmV7Y29udGVudDpcIlxcZTkzNVwifS5pY29uLXRyYXNoOmJlZm9yZXtjb250ZW50OlwiXFxlOTM2XCJ9Lmljb24tdHJpYW5nbGU6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MzdcIn0uaWNvbi14OmJlZm9yZXtjb250ZW50OlwiXFxlOTM4XCJ9Lmljb24td3JlbmNoLTI6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MzlcIn0uaWNvbi1jaGF0OmJlZm9yZXtjb250ZW50OlwiXFxlOTNhXCJ9Lmljb24tYmVsbDpiZWZvcmV7Y29udGVudDpcIlxcZTkzYlwifS5pY29uLWRpc2tzLW5hdjpiZWZvcmV7Y29udGVudDpcIlxcZTkzY1wifS5pY29uLXdyZW5jaC1uYXY6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5M2RcIn0uaWNvbi11c2VyOmJlZm9yZXtjb250ZW50OlwiXFxlOTNlXCJ9Lmljb24tY2xvdWQ6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5M2ZcIn0uaWNvbi11c2Vycy10cmlvOmJlZm9yZXtjb250ZW50OlwiXFxlOTQwXCJ9Lmljb24tbmF2LWNoYXQ6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5NDFcIn0uaWNvbi1tYXAyOmJlZm9yZXtjb250ZW50OlwiXFxlOTRjXCJ9Lmljb24tZXllLWNsb3NlZDpiZWZvcmV7Y29udGVudDpcIlxcZTk1NlwifS5pY29uLWV5ZS1vcGVuOmJlZm9yZXtjb250ZW50OlwiXFxlOTU3XCJ9Lmljb24tYm9vay1wZW5jaWw6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5NjVcIn0uaWNvbi1oZWFydDpiZWZvcmV7Y29udGVudDpcIlxcZTlkYVwifS5pY29uLWxvb3AyOmJlZm9yZXtjb250ZW50OlwiXFxlYTJlXCJ9Lmljb24tZ2l0aHViOmJlZm9yZXtjb250ZW50OlwiXFxlYWIwXCJ9Lmljb24tdHV4OmJlZm9yZXtjb250ZW50OlwiXFxlYWJkXCJ9Lmljb24tYXBwbGVpbmM6YmVmb3Jle2NvbnRlbnQ6XCJcXGVhYmVcIn0uaWNvbi13aW5kb3dzODpiZWZvcmV7Y29udGVudDpcIlxcZWFjMlwifUBmb250LWZhY2V7Zm9udC1mYW1pbHk6J2ljb21vb24tdjMnO3NyYzp1cmwoXCJmb250cy9pY29tb29uLXYzLmVvdFwiKSBmb3JtYXQoXCJlbWJlZGRlZC1vcGVudHlwZVwiKTtzcmM6dXJsKFwiZm9udHMvaWNvbW9vbi12My5lb3RcIikgZm9ybWF0KFwiZW1iZWRkZWQtb3BlbnR5cGVcIiksdXJsKFwiZm9udHMvaWNvbW9vbi12My53b2ZmMlwiKSBmb3JtYXQoXCJ3b2ZmMlwiKSx1cmwoXCJmb250cy9pY29tb29uLXYzLnR0ZlwiKSBmb3JtYXQoXCJ0cnVldHlwZVwiKSx1cmwoXCJmb250cy9pY29tb29uLXYzLndvZmZcIikgZm9ybWF0KFwid29mZlwiKSx1cmwoXCJmb250cy9pY29tb29uLXYzLnN2Z1wiKSBmb3JtYXQoXCJzdmdcIik7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsfS5jZi1pY29ue2ZvbnQtZmFtaWx5OidpY29tb29uLXYzJztmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDt0ZXh0LXRyYW5zZm9ybTpub25lO2xpbmUtaGVpZ2h0OjE7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGV9LmNmLWljb24uYWRkLWNlbGwtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5NzYnfS5jZi1pY29uLmFsZXJ0LXRyaWFuZ2xlLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTc3J30uY2YtaWNvbi5hbm5vdGF0ZS1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk3OCd9LmNmLWljb24uYXJyb3ctZG93bi1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk3OSd9LmNmLWljb24uYXJyb3ctbGVmdC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk3YSd9LmNmLWljb24uYXJyb3ctcmlnaHQtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5N2InfS5jZi1pY29uLmFycm93LXVwLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTdjJ30uY2YtaWNvbi5iYXItY2hhcnQtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5N2QnfS5jZi1pY29uLmJ1aWxkLW91dGxpbmUtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5N2UnfS5jZi1pY29uLmNhcmV0LWRvd24tbmV3OmJlZm9yZXtjb250ZW50OidcXGU5N2YnfS5jZi1pY29uLmNhcmV0LWxlZnQtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5ODAnfS5jZi1pY29uLmNhcmV0LXJpZ2h0LW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTgxJ30uY2YtaWNvbi5jYXJldC11cC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk4Mid9LmNmLWljb24uY2hlY2ttYXJrLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTgzJ30uY2YtaWNvbi5jbGlwYm9hcmQtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5ODQnfS5jZi1pY29uLmNsb2NrLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTg1J30uY2YtaWNvbi5jb2ctb3V0bGluZS1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk4Nid9LmNmLWljb24uY29nLXNvbGlkLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTg3J30uY2YtaWNvbi5jcm93bi1zb2xpZC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk4OCd9LmNmLWljb24uZGFyay1tb2RlLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTg5J30uY2YtaWNvbi5kb3dubG9hZC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk4YSd9LmNmLWljb24uZHVwbGljYXRlLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOThiJ30uY2YtaWNvbi5leHBhbmQtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OGMnfS5jZi1pY29uLmV4cG9ydC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk4ZCd9LmNmLWljb24uZXllLW9wZW4tbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OGUnfS5jZi1pY29uLmdyYXBoLWxpbmUtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OGYnfS5jZi1pY29uLmhhbmRsZS1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk5MCd9LmNmLWljb24uaG9tZS1vdXRsaW5lLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTkxJ30uY2YtaWNvbi5pbmZvLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTkyJ30uY2YtaWNvbi5pbmdlc3QtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OTMnfS5jZi1pY29uLmxpZ2h0LW1vZGUtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OTQnfS5jZi1pY29uLmxvY2stb3V0bGluZS1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk5NSd9LmNmLWljb24ubG9nLW91dC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk5Nid9LmNmLWljb24ucGluLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTk3J30uY2YtaWNvbi5wbHVzLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTk4J30uY2YtaWNvbi5xdWVzdGlvbi1tYXJrLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTk5J30uY2YtaWNvbi5yZWZyZXNoLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTlhJ30uY2YtaWNvbi5yZW1vdmUtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5OWInfS5jZi1pY29uLnNlYXJjaC1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk5Yyd9LmNmLWljb24uc2lkZWJhci1jbG9zZS1uZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk5ZCd9LmNmLWljb24uc2lkZWJhci1vcGVuLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTllJ30uY2YtaWNvbi5zdG9wLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOTlmJ30uY2YtaWNvbi5zd2l0Y2gtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5YTAnfS5jZi1pY29uLnRleHQtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5YTEnfS5jZi1pY29uLnRyYXNoLW5ldzpiZWZvcmV7Y29udGVudDonXFxlOWEyJ30uY2YtaWNvbi51c2VyLW91dGxpbmUtbmV3OmJlZm9yZXtjb250ZW50OidcXGU5YTMnfS5jZi1pY29uLm1vcmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTk3NCd9LmNmLWljb24uZHJhZy10by1leHBhbmQtd2hpdGU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwMSc7Y29sb3I6I2ZmZn0uY2YtaWNvbi5kcmFnLXRvLWV4cGFuZDpiZWZvcmV7Y29udGVudDonXFxlOTAyJ30uY2YtaWNvbi5zaGllbGQtc29saWQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwMyd9LmNmLWljb24ubG9jazpiZWZvcmV7Y29udGVudDonXFxlOTAwJ30uY2YtaWNvbi5oZWFydC1zb2xpZDpiZWZvcmV7Y29udGVudDonXFxlOTZmJ30uY2YtaWNvbi5idWNrZXQtb3V0bGluZTpiZWZvcmV7Y29udGVudDonXFxlOTYxJ30uY2YtaWNvbi5jaGF0OmJlZm9yZXtjb250ZW50OidcXGU5MzMnfS5jZi1pY29uLmN1cnJlbmN5LWV1cjpiZWZvcmV7Y29udGVudDonXFxlOTY4J30uY2YtaWNvbi5jdXJyZW5jeS1nYnA6YmVmb3Jle2NvbnRlbnQ6J1xcZTk2OSd9LmNmLWljb24uY3VycmVuY3ktdXNkOmJlZm9yZXtjb250ZW50OidcXGU5NmEnfS5jZi1pY29uLm1vb246YmVmb3Jle2NvbnRlbnQ6J1xcZTk1Yyd9LmNmLWljb24uc2hhcmUtc29saWQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTk2ZSd9LmNmLWljb24uc2hpZWxkOmJlZm9yZXtjb250ZW50OidcXGU5NmInfS5jZi1pY29uLnN1bjpiZWZvcmV7Y29udGVudDonXFxlOTVkJ30uY2YtaWNvbi51cGdyYWRlOmJlZm9yZXtjb250ZW50OidcXGU5NWYnfS5jZi1pY29uLm1lcmdlOmJlZm9yZXtjb250ZW50OidcXGU5NzUnfS5jZi1pY29uLmFkZC1jZWxsOmJlZm9yZXtjb250ZW50OidcXGU5MjUnfS5jZi1pY29uLmFsZXJ0LXRyaWFuZ2xlOmJlZm9yZXtjb250ZW50OidcXGU5MjYnfS5jZi1pY29uLmFsZXJ0czpiZWZvcmV7Y29udGVudDonXFxlOTIxJ30uY2YtaWNvbi5hbm5vdGF0ZTpiZWZvcmV7Y29udGVudDonXFxlOTUzJ30uY2YtaWNvbi5hbm5vdGF0ZS1wbHVzOmJlZm9yZXtjb250ZW50OidcXGU5NTInfS5jZi1pY29uLmF1dGh6ZXJvOmJlZm9yZXtjb250ZW50OidcXGU5NTEnfS5jZi1pY29uLmJhci1jaGFydDpiZWZvcmV7Y29udGVudDonXFxlOTEzJ30uY2YtaWNvbi5iZWxsOmJlZm9yZXtjb250ZW50OidcXGU5MzQnfS5jZi1pY29uLmJlbGwtc29saWQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzNyd9LmNmLWljb24uYnJ1c2g6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzZCd9LmNmLWljb24uY2FwYWNpdG9yMjpiZWZvcmV7Y29udGVudDonXFxlOTIzJ30uY2YtaWNvbi5jYXJldC1kb3duOmJlZm9yZXtjb250ZW50OidcXGU5MDQnfS5jZi1pY29uLmNhcmV0LWxlZnQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwNSd9LmNmLWljb24uY2FyZXQtcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwNid9LmNmLWljb24uY2FyZXQtdXA6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwNyd9LmNmLWljb24uY2hlY2ttYXJrOmJlZm9yZXtjb250ZW50OidcXGU5MTgnfS5jZi1pY29uLmNpcmNsZTpiZWZvcmV7Y29udGVudDonXFxlOTQwJ30uY2YtaWNvbi5jaXJjbGUtdGhpY2s6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwZSd9LmNmLWljb24uY2xvY2s6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyMCd9LmNmLWljb24uY29nLW91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxYyd9LmNmLWljb24uY29nLXRoaWNrOmJlZm9yZXtjb250ZW50OidcXGU5MGMnfS5jZi1pY29uLmNvbGxhcHNlOmJlZm9yZXtjb250ZW50OidcXGU5MWInfS5jZi1pY29uLmNyb3duLW91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwOCd9LmNmLWljb24uY3Jvd24yOmJlZm9yZXtjb250ZW50OidcXGU5NGInfS5jZi1pY29uLmN1YmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwYid9LmNmLWljb24uY3VibzpiZWZvcmV7Y29udGVudDonXFxlOTVlJ30uY2YtaWNvbi5jdWJvLXVuaWZvcm06YmVmb3Jle2NvbnRlbnQ6J1xcZTkzYyd9LmNmLWljb24uZGFzaC1mOmJlZm9yZXtjb250ZW50OidcXGU5MjcnfS5jZi1pY29uLmRhc2gtaDpiZWZvcmV7Y29udGVudDonXFxlOTI5J30uY2YtaWNvbi5kYXNoLWo6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyYid9LmNmLWljb24uZGlza3M6YmVmb3Jle2NvbnRlbnQ6J1xcZTk1MCd9LmNmLWljb24uZG93bmxvYWQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxZCd9LmNmLWljb24uZHVwbGljYXRlOmJlZm9yZXtjb250ZW50OidcXGU5MTcnfS5jZi1pY29uLmVybGVubWV5ZXI6YmVmb3Jle2NvbnRlbnQ6J1xcZTk1OCd9LmNmLWljb24uZXhwYW5kLWE6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0NCd9LmNmLWljb24uZXhwYW5kLWI6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0Mid9LmNmLWljb24uZXhwb3J0OmJlZm9yZXtjb250ZW50OidcXGU5MGYnfS5jZi1pY29uLmV5ZTpiZWZvcmV7Y29udGVudDonXFxlOTFmJ30uY2YtaWNvbi5leWUtY2xvc2VkOmJlZm9yZXtjb250ZW50OidcXGU5NTYnfS5jZi1pY29uLmV5ZS1vcGVuOmJlZm9yZXtjb250ZW50OidcXGU5NTcnfS5jZi1pY29uLmZuOmJlZm9yZXtjb250ZW50OidcXGU5NjAnfS5jZi1pY29uLmdpdGh1YjpiZWZvcmV7Y29udGVudDonXFxlOTI4J30uY2YtaWNvbi5nb29nbGU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyYSd9LmNmLWljb24uZ3JvdXA6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwOSd9LmNmLWljb24uaGVyb2t1OmJlZm9yZXtjb250ZW50OidcXGU5NDcnfS5jZi1pY29uLmhlcm9rdS1zaW1wbGU6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0OCd9LmNmLWljb24uaW1wb3J0OmJlZm9yZXtjb250ZW50OidcXGU5MTAnfS5jZi1pY29uLmxpbms6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyZSd9LmNmLWljb24ubWF4aW1pemU6YmVmb3Jle2NvbnRlbnQ6J1xcZTk1NSd9LmNmLWljb24ubWluaW1pemU6YmVmb3Jle2NvbnRlbnQ6J1xcZTk1NCd9LmNmLWljb24ubmF2LWNoYXQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0MSd9LmNmLWljb24ub2F1dGg6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0Zid9LmNmLWljb24ub2N0YWdvbjpiZWZvcmV7Y29udGVudDonXFxlOTJkJ30uY2YtaWNvbi5va3RhOmJlZm9yZXtjb250ZW50OidcXGU5MTInfS5jZi1pY29uLnBhdXNlOmJlZm9yZXtjb250ZW50OidcXGU5NGEnfS5jZi1pY29uLnBlbmNpbDpiZWZvcmV7Y29udGVudDonXFxlOTJmJ30uY2YtaWNvbi5wbGF5OmJlZm9yZXtjb250ZW50OidcXGU5MTQnfS5jZi1pY29uLnBsdXM6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwYSd9LmNmLWljb24ucGx1cy1za2lubnk6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyMid9LmNmLWljb24ucG9sYXJvaWQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTk1Yid9LmNmLWljb24ucHVsc2UtYzpiZWZvcmV7Y29udGVudDonXFxlOTM2J30uY2YtaWNvbi5yZWRvOmJlZm9yZXtjb250ZW50OidcXGU5NTknfS5jZi1pY29uLnJlZnJlc2g6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0OSd9LmNmLWljb24ucmVtb3ZlOmJlZm9yZXtjb250ZW50OidcXGU5MGQnfS5jZi1pY29uLnNlYXJjaDpiZWZvcmV7Y29udGVudDonXFxlOTE2J30uY2YtaWNvbi5zZXJ2ZXIyOmJlZm9yZXtjb250ZW50OidcXGU5NGMnfS5jZi1pY29uLnNodWZmbGU6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0ZSd9LmNmLWljb24uc3F1YXJlOmJlZm9yZXtjb250ZW50OidcXGU5M2UnfS5jZi1pY29uLnNxdWFyZS1jaGVjazpiZWZvcmV7Y29udGVudDonXFxlOTQzJ30uY2YtaWNvbi5zdGFyOmJlZm9yZXtjb250ZW50OidcXGU5MzAnfS5jZi1pY29uLnN0b3A6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzMSd9LmNmLWljb24udGV4dC1ibG9jazpiZWZvcmV7Y29udGVudDonXFxlOTExJ30uY2YtaWNvbi50cmFzaDpiZWZvcmV7Y29udGVudDonXFxlOTE1J30uY2YtaWNvbi50cmlhbmdsZTpiZWZvcmV7Y29udGVudDonXFxlOTJjJ30uY2YtaWNvbi51bmRvOmJlZm9yZXtjb250ZW50OidcXGU5NWEnfS5jZi1pY29uLnVzZXI6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxOSd9LmNmLWljb24udXNlci1hZGQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxZSd9LmNmLWljb24udXNlci1vdXRsaW5lOmJlZm9yZXtjb250ZW50OidcXGU5MzInfS5jZi1pY29uLnVzZXItcmVtb3ZlOmJlZm9yZXtjb250ZW50OidcXGU5MzknfS5jZi1pY29uLnVzZXJzLXRyaW86YmVmb3Jle2NvbnRlbnQ6J1xcZTk0NSd9LmNmLWljb24ud2FuZDpiZWZvcmV7Y29udGVudDonXFxlOTRkJ30uY2YtaWNvbi53b29kOmJlZm9yZXtjb250ZW50OidcXGU5NzAnfS5jZi1pY29uLndyZW5jaDpiZWZvcmV7Y29udGVudDonXFxlOTcxJ30uY2YtaWNvbi56YXA6YmVmb3Jle2NvbnRlbnQ6J1xcZTk3Myd9LmNmLWljb24uYmVsbC1yaW5naW5nOmJlZm9yZXtjb250ZW50OidcXGU5MzUnfS5jZi1pY29uLmNhbGVuZGFyOmJlZm9yZXtjb250ZW50OidcXGU5MzgnfS5jZi1pY29uLmNsb3VkOmJlZm9yZXtjb250ZW50OidcXGU5M2YnfS5jZi1pY29uLmN1Ym8tbmF2OmJlZm9yZXtjb250ZW50OidcXGU5MWEnfS5jZi1pY29uLmRhc2hib2FyZHM6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzYSd9LmNmLWljb24uZGlza3MtbmF2OmJlZm9yZXtjb250ZW50OidcXGU5NDYnfS5jZi1pY29uLmdyYXBobGluZS0yOmJlZm9yZXtjb250ZW50OidcXGU5MjQnfS5jZi1pY29uLnVzZXJzLWR1bzpiZWZvcmV7Y29udGVudDonXFxlOTNiJ30uY2YtaWNvbi53cmVuY2gtbmF2OmJlZm9yZXtjb250ZW50OidcXGU5NzInfS5jZi1pY29uLmJvb2s6YmVmb3Jle2NvbnRlbnQ6J1xcZTk2Nid9LmNmLWljb24uYm9vay1jb2RlOmJlZm9yZXtjb250ZW50OidcXGU5NjcnfS5jZi1pY29uLmJvb2stcGVuY2lsOmJlZm9yZXtjb250ZW50OidcXGU5NjUnfS5jZi1pY29uLmJ1Y2tldC1zb2xpZDpiZWZvcmV7Y29udGVudDonXFxlOTYyJ30uY2YtaWNvbi5mdW5uZWwtb3V0bGluZTpiZWZvcmV7Y29udGVudDonXFxlOTYzJ30uY2YtaWNvbi5mdW5uZWwtc29saWQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTk2NCd9LmNmLWljb24ubGF5ZXJzOmJlZm9yZXtjb250ZW50OidcXGU5NmMnfS5jZi1pY29uLnNoYXJlOmJlZm9yZXtjb250ZW50OidcXGU5NmQnfUBmb250LWZhY2V7Zm9udC1mYW1pbHk6J2ljb21vb24tdjQnO3NyYzp1cmwoXCJmb250cy9pY29tb29uLXY0LmVvdFwiKSBmb3JtYXQoXCJlbWJlZGRlZC1vcGVudHlwZVwiKTtzcmM6dXJsKFwiZm9udHMvaWNvbW9vbi12NC5lb3RcIikgZm9ybWF0KFwiZW1iZWRkZWQtb3BlbnR5cGVcIiksdXJsKFwiZm9udHMvaWNvbW9vbi12NC53b2ZmMlwiKSBmb3JtYXQoXCJ3b2ZmMlwiKSx1cmwoXCJmb250cy9pY29tb29uLXY0LnR0ZlwiKSBmb3JtYXQoXCJ0cnVldHlwZVwiKSx1cmwoXCJmb250cy9pY29tb29uLXY0LndvZmZcIikgZm9ybWF0KFwid29mZlwiKSx1cmwoXCJmb250cy9pY29tb29uLXY0LnN2Z1wiKSBmb3JtYXQoXCJzdmdcIik7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsfS5jZi1pY29ue2ZvbnQtZmFtaWx5OidpY29tb29uLXY0Jztmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDt0ZXh0LXRyYW5zZm9ybTpub25lO2xpbmUtaGVpZ2h0OjE7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGV9LmNmLWljb24uRm9sZGVyT3BlbjpiZWZvcmV7Y29udGVudDonXFxlOTU2J30uY2YtaWNvbi5CaWxsOmJlZm9yZXtjb250ZW50OidcXGU5NTQnfS5jZi1pY29uLkxvZ291dDpiZWZvcmV7Y29udGVudDonXFxlOTUwJ30uY2YtaWNvbi5QaWVDaGFydDpiZWZvcmV7Y29udGVudDonXFxlOTU3J30uY2YtaWNvbi5DdXJyZW5jeURvbGxhcjpiZWZvcmV7Y29udGVudDonXFxlOTUyJ30uY2YtaWNvbi5TeW5jOmJlZm9yZXtjb250ZW50OidcXGU5NTUnfS5jZi1pY29uLlN1YnRyYWN0OmJlZm9yZXtjb250ZW50OidcXGU5NTMnfS5jZi1pY29uLlRpbWVyOmJlZm9yZXtjb250ZW50OidcXGU5NGYnfS5jZi1pY29uLkNhcmV0T3V0bGluZVJpZ2h0OmJlZm9yZXtjb250ZW50OidcXGU5NGInfS5jZi1pY29uLkNvbGxhcHNlTGVmdDpiZWZvcmV7Y29udGVudDonXFxlOTRjJ30uY2YtaWNvbi5Db2xsYXBzZVJpZ2h0OmJlZm9yZXtjb250ZW50OidcXGU5NGQnfS5jZi1pY29uLkRvdWJsZUNhcmV0VmVydGljYWw6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0ZSd9LmNmLWljb24uUXVlc3Rpb25NYXJrX091dGxpbmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0YSd9LmNmLWljb24uSW5mb19OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0OSd9LmNmLWljb24uU2lkZWJhckNsb3NlOmJlZm9yZXtjb250ZW50OidcXGU5NDcnfS5jZi1pY29uLlNpZGViYXJPcGVuOmJlZm9yZXtjb250ZW50OidcXGU5NDgnfS5jZi1pY29uLkNhcmV0RG93bl9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxMid9LmNmLWljb24uQ2FyZXRMZWZ0X05ldzpiZWZvcmV7Y29udGVudDonXFxlOTEzJ30uY2YtaWNvbi5DYXJldFJpZ2h0X05ldzpiZWZvcmV7Y29udGVudDonXFxlOTE0J30uY2YtaWNvbi5DYXJldFVwX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTE1J30uY2YtaWNvbi5QbGF5OmJlZm9yZXtjb250ZW50OidcXGU5MDAnfS5jZi1pY29uLlBhdXNlOmJlZm9yZXtjb250ZW50OidcXGU5MDEnfS5jZi1pY29uLkV5ZU9wZW46YmVmb3Jle2NvbnRlbnQ6J1xcZTkwMid9LmNmLWljb24uRmxhc2s6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwMyd9LmNmLWljb24uQWRkQ2VsbF9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwNCd9LmNmLWljb24uUXVlc3Rpb25NYXJrOmJlZm9yZXtjb250ZW50OidcXGU5MDUnfS5jZi1pY29uLkFsZXJ0VHJpYW5nbGU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwNid9LmNmLWljb24uQW5ub3RhdGVfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MDcnfS5jZi1pY29uLkFycm93RG93bl9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwOCd9LmNmLWljb24uQXJyb3dMZWZ0X05ldzpiZWZvcmV7Y29udGVudDonXFxlOTA5J30uY2YtaWNvbi5BcnJvd1JpZ2h0X05ldzpiZWZvcmV7Y29udGVudDonXFxlOTBhJ30uY2YtaWNvbi5CYXJDaGFydF9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwYid9LmNmLWljb24uQmVsbDpiZWZvcmV7Y29udGVudDonXFxlOTBjJ30uY2YtaWNvbi5Cb29rQ29kZTpiZWZvcmV7Y29udGVudDonXFxlOTBkJ30uY2YtaWNvbi5Cb29rT3V0bGluZTpiZWZvcmV7Y29udGVudDonXFxlOTBlJ30uY2YtaWNvbi5CcmFjZXM6YmVmb3Jle2NvbnRlbnQ6J1xcZTkwZid9LmNmLWljb24uQnVja2V0U29saWQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxMCd9LmNmLWljb24uQ2FsZW5kYXI6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxMSd9LmNmLWljb24uQ2hhdDpiZWZvcmV7Y29udGVudDonXFxlOTE2J30uY2YtaWNvbi5DaGVja21hcmtfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MTcnfS5jZi1pY29uLkNpcmNsZVRoaWNrOmJlZm9yZXtjb250ZW50OidcXGU5MTgnfS5jZi1pY29uLkNsaXBib2FyZF9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkxOSd9LmNmLWljb24uQ2xvY2tfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MWEnfS5jZi1pY29uLkNsb3VkOmJlZm9yZXtjb250ZW50OidcXGU5MWInfS5jZi1pY29uLkNvZ091dGxpbmVfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MWMnfS5jZi1pY29uLkNvZ1NvbGlkX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTFkJ30uY2YtaWNvbi5Db3BwZXJjb2luOmJlZm9yZXtjb250ZW50OidcXGU5MWUnfS5jZi1pY29uLkNyb3duU29saWRfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MWYnfS5jZi1pY29uLkN1YmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyMCd9LmNmLWljb24uQ3Vib1NvbGlkOmJlZm9yZXtjb250ZW50OidcXGU5MjEnfS5jZi1pY29uLkN1Ym91bmlmb3JtOmJlZm9yZXtjb250ZW50OidcXGU5MjInfS5jZi1pY29uLkRhcmttb2RlX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTIzJ30uY2YtaWNvbi5EYXNoSDpiZWZvcmV7Y29udGVudDonXFxlOTI0J30uY2YtaWNvbi5Eb3dubG9hZF9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyNSd9LmNmLWljb24uRXhwYW5kQjpiZWZvcmV7Y29udGVudDonXFxlOTI2J30uY2YtaWNvbi5FeHBvcnRfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MjcnfS5jZi1pY29uLkV5ZUNsb3NlZDpiZWZvcmV7Y29udGVudDonXFxlOTI4J30uY2YtaWNvbi5GdW5uZWxTb2xpZDpiZWZvcmV7Y29udGVudDonXFxlOTI5J30uY2YtaWNvbi5HcmFwaExpbmVfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MmEnfS5jZi1pY29uLkdyb3VwOmJlZm9yZXtjb250ZW50OidcXGU5MmInfS5jZi1pY29uLkhpc3Rvcnk6YmVmb3Jle2NvbnRlbnQ6J1xcZTkyYyd9LmNmLWljb24uRHVwbGljYXRlX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTJkJ30uY2YtaWNvbi5JbnN0YWxsOmJlZm9yZXtjb250ZW50OidcXGU5MmUnfS5jZi1pY29uLkxheWVyczpiZWZvcmV7Y29udGVudDonXFxlOTJmJ30uY2YtaWNvbi5MaWdodG1vZGVfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MzAnfS5jZi1pY29uLkxpbms6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzMSd9LmNmLWljb24uTG9jazpiZWZvcmV7Y29udGVudDonXFxlOTMyJ30uY2YtaWNvbi5Nb3JlOmJlZm9yZXtjb250ZW50OidcXGU5MzMnfS5jZi1pY29uLlBlbmNpbDpiZWZvcmV7Y29udGVudDonXFxlOTM0J30uY2YtaWNvbi5QbHVzX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTM1J30uY2YtaWNvbi5SZWZyZXNoX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTM2J30uY2YtaWNvbi5SZW1vdmVfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5MzcnfS5jZi1pY29uLlNhdmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzOCd9LmNmLWljb24uU2F2ZU91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6J1xcZTk1MSd9LmNmLWljb24uU2VhcmNoX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTM5J30uY2YtaWNvbi5TaGFyZTpiZWZvcmV7Y29udGVudDonXFxlOTNhJ30uY2YtaWNvbi5TaGllbGQ6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzYid9LmNmLWljb24uU3RhcjpiZWZvcmV7Y29udGVudDonXFxlOTNjJ30uY2YtaWNvbi5TdGFyU21pbGU6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzZCd9LmNmLWljb24uU3Vic2NyaWJlOmJlZm9yZXtjb250ZW50OidcXGU5M2UnfS5jZi1pY29uLlN3aXRjaF9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzZid9LmNmLWljb24uVGV4dF9OZXc6YmVmb3Jle2NvbnRlbnQ6J1xcZTk0MCd9LmNmLWljb24uVHJhc2hfTmV3OmJlZm9yZXtjb250ZW50OidcXGU5NDEnfS5jZi1pY29uLlVuZG86YmVmb3Jle2NvbnRlbnQ6J1xcZTk0Mid9LmNmLWljb24uVXBsb2FkX05ldzpiZWZvcmV7Y29udGVudDonXFxlOTQzJ30uY2YtaWNvbi5VcGxvYWRfT3V0bGluZTpiZWZvcmV7Y29udGVudDonXFxlOTQ0J30uY2YtaWNvbi5Vc2VyOmJlZm9yZXtjb250ZW50OidcXGU5NDUnfS5jZi1pY29uLlphcDpiZWZvcmV7Y29udGVudDonXFxlOTQ2J31AZm9udC1mYWNle2ZvbnQtZmFtaWx5OidhbGVydC1pY29ucyc7c3JjOnVybChcImZvbnRzL2FsZXJ0LWljb25zLmVvdD9kMGR6bmhcIik7c3JjOnVybChcImZvbnRzL2FsZXJ0LWljb25zLmVvdD9kMGR6bmgjaWVmaXhcIikgZm9ybWF0KFwiZW1iZWRkZWQtb3BlbnR5cGVcIiksdXJsKFwiZm9udHMvYWxlcnQtaWNvbnMudHRmP2QwZHpuaFwiKSBmb3JtYXQoXCJ0cnVldHlwZVwiKSx1cmwoXCJmb250cy9hbGVydC1pY29ucy53b2ZmP2QwZHpuaFwiKSBmb3JtYXQoXCJ3b2ZmXCIpLHVybChcImZvbnRzL2FsZXJ0LWljb25zLnN2Zz9kMGR6bmgjaWNvbW9vblwiKSBmb3JtYXQoXCJzdmdcIik7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTpibG9ja31bY2xhc3NePVwiYWxlcnQtaWNvbi1cIl0sW2NsYXNzKj1cIiBhbGVydC1pY29uLVwiXXtmb250LWZhbWlseTonYWxlcnQtaWNvbnMnICFpbXBvcnRhbnQ7c3BlYWs6bmV2ZXI7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7dGV4dC10cmFuc2Zvcm06bm9uZTtsaW5lLWhlaWdodDoxOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlfS5hbGVydC1pY29uLWNhdXRpb246YmVmb3Jle2NvbnRlbnQ6XCJcXDQzXCJ9LmFsZXJ0LWljb24taW1wb3J0YW50OmJlZm9yZXtjb250ZW50OlwiXFw0OVwifS5hbGVydC1pY29uLW5vdGU6YmVmb3Jle2NvbnRlbnQ6XCJcXDRlXCJ9LmFsZXJ0LWljb24tdGlwOmJlZm9yZXtjb250ZW50OlwiXFw1NFwifS5hbGVydC1pY29uLXdhcm5pbmc6YmVmb3Jle2NvbnRlbnQ6XCJcXDU3XCJ9LnYze2ZvbnQtZmFtaWx5OidpY29tb29uLXYzJ30udjR7Zm9udC1mYW1pbHk6J2ljb21vb24tdjQnfS50b29sdGlwe3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtd2VpZ2h0OjUwMDtjb2xvcjojRDZGNjIyfS50b29sdGlwOmhvdmVye2N1cnNvcjpoZWxwfS50b29sdGlwOmhvdmVyIC50b29sdGlwLWNvbnRhaW5lcnt2aXNpYmlsaXR5OnZpc2libGV9LnRvb2x0aXA6aG92ZXIgLnRvb2x0aXAtdGV4dHtvcGFjaXR5OjE7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLCAtMi41cmVtKX0udG9vbHRpcCAudG9vbHRpcC1jb250YWluZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSk7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OmhpZGRlbn0udG9vbHRpcCAudG9vbHRpcC10ZXh0e2ZvbnQtd2VpZ2h0OjUwMDtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjJweDtwYWRkaW5nOi4xNXJlbSAuNzVyZW07Zm9udC1zaXplOjAuOXJlbTtsaW5lLWhlaWdodDoxLjc1cmVtO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgLTEuNzVyZW0pO3RyYW5zaXRpb246YWxsIDAuMnMgZWFzZTt3aGl0ZS1zcGFjZTpub3dyYXA7b3BhY2l0eTowO2NvbG9yOiMyMDIwMjg7YmFja2dyb3VuZC1jb2xvcjojRDZGNjIyfS50b29sdGlwIC50b29sdGlwLXRleHQ6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjUwJTtib3R0b206LTE0cHg7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSk7Ym9yZGVyLXRvcDo4cHggc29saWQgI0Q2RjYyMjtib3JkZXItcmlnaHQ6OHB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206OHB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1sZWZ0OjhweCBzb2xpZCB0cmFuc3BhcmVudH0udG9vbHRpcC5zaGlmdC1sZWZ0IC50b29sdGlwLXRleHR7bGVmdDo3NSU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNzUlLCAtMS43NXJlbSl9LnRvb2x0aXAuc2hpZnQtbGVmdCAudG9vbHRpcC10ZXh0OmFmdGVye2xlZnQ6NzUlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC03NSUpfS50b29sdGlwLnNoaWZ0LWxlZnQ6aG92ZXIgLnRvb2x0aXAtdGV4dHt0cmFuc2Zvcm06dHJhbnNsYXRlKC03NSUsIC0yLjVyZW0pfS50b29sdGlwLnNoaWZ0LXJpZ2h0IC50b29sdGlwLXRleHR7bGVmdDoyNSU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtMjUlLCAtMS43NXJlbSl9LnRvb2x0aXAuc2hpZnQtcmlnaHQgLnRvb2x0aXAtdGV4dDphZnRlcntsZWZ0OjI1JTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMjUlKX0udG9vbHRpcC5zaGlmdC1yaWdodDpob3ZlciAudG9vbHRpcC10ZXh0e3RyYW5zZm9ybTp0cmFuc2xhdGUoLTI1JSwgLTIuNXJlbSl9LnRvb2x0aXAucmlnaHQ6aG92ZXIgLnRvb2x0aXAtY29udGFpbmVye3Zpc2liaWxpdHk6dmlzaWJsZX0udG9vbHRpcC5yaWdodDpob3ZlciAudG9vbHRpcC10ZXh0e29wYWNpdHk6MTt0cmFuc2Zvcm06dHJhbnNsYXRlKDcwJSl9LnRvb2x0aXAucmlnaHQgLnRvb2x0aXAtY29udGFpbmVye2xlZnQ6MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoNjAlKX0udG9vbHRpcC5yaWdodCAudG9vbHRpcC10ZXh0e2xlZnQ6NjAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjAlKTt0cmFuc2l0aW9uOmFsbCAwLjJzIGVhc2V9LnRvb2x0aXAucmlnaHQgLnRvb2x0aXAtdGV4dDphZnRlcnt0b3A6NTAlO2xlZnQ6LTE0cHg7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSk7Ym9yZGVyLXRvcDoxNnB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDoxNnB4IHNvbGlkICNENkY2MjI7Ym9yZGVyLWJvdHRvbToxNnB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1sZWZ0OjhweCBzb2xpZCB0cmFuc3BhcmVudH10aCAudG9vbHRpcHtjb2xvcjojRDZGNjIyfXRoIC50b29sdGlwOmhvdmVyIC50b29sdGlwLWNvbnRhaW5lcnt2aXNpYmlsaXR5OnZpc2libGV9dGggLnRvb2x0aXA6aG92ZXIgLnRvb2x0aXAtdGV4dHtvcGFjaXR5OjE7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLCAxLjc1cmVtKX10aCAudG9vbHRpcCAudG9vbHRpcC10ZXh0e3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgMXJlbSl9dGggLnRvb2x0aXAgLnRvb2x0aXAtdGV4dDphZnRlcntjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDowO2xlZnQ6NTAlO3RvcDotMTRweDt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtib3JkZXItdG9wOjhweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6OHB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206OHB4IHNvbGlkICNENkY2MjI7Ym9yZGVyLWxlZnQ6OHB4IHNvbGlkIHRyYW5zcGFyZW50fS5kYXRlcGlja2Vye2Rpc3BsYXk6bm9uZX0uZGF0ZXBpY2tlci5hY3RpdmV7ZGlzcGxheTpibG9ja30uZGF0ZXBpY2tlci1waWNrZXJ7YmFja2dyb3VuZC1jb2xvcjojMTQxNDFGO2JvcmRlci1yYWRpdXM6MnB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5kYXRlcGlja2VyLXBpY2tlciBzcGFuey13ZWJraXQtdG91Y2gtY2FsbG91dDpub25lO2JvcmRlcjowO2JvcmRlci1yYWRpdXM6MnB4O2N1cnNvcjpkZWZhdWx0O2Rpc3BsYXk6YmxvY2s7ZmxleDoxO3RleHQtYWxpZ246Y2VudGVyOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0uZGF0ZXBpY2tlci1tYWlue3BhZGRpbmc6MnB4fS5kYXRlcGlja2VyLWNvbnRyb2xze2Rpc3BsYXk6ZmxleH0uZGF0ZXBpY2tlci1jb250cm9scyAuYnV0dG9ue2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMxNDE0MUY7Ym9yZGVyOjFweCBzb2xpZCAjZGJkYmRiO2JvcmRlci1yYWRpdXM6MnB4O2JveC1zaGFkb3c6bm9uZTtjb2xvcjojRkFGQUZDO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWZsZXg7Zm9udC1zaXplOjFyZW07aGVpZ2h0OjIuMjVlbTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2xpbmUtaGVpZ2h0OjEuNTttYXJnaW46MDtwYWRkaW5nOmNhbGMoLjM3NWVtIC0gMXB4KSAwLjc1ZW07cG9zaXRpb246cmVsYXRpdmU7dGV4dC1hbGlnbjpjZW50ZXI7dmVydGljYWwtYWxpZ246dG9wO3doaXRlLXNwYWNlOm5vd3JhcDt0cmFuc2l0aW9uOmFsbCAuMnN9LmRhdGVwaWNrZXItY29udHJvbHMgLmJ1dHRvbjphY3RpdmV7b3V0bGluZTpub25lO2JvcmRlci1jb2xvcjojNGE0YTRhO2NvbG9yOiNENEQ3RER9LmRhdGVwaWNrZXItY29udHJvbHMgLmJ1dHRvbjpmb2N1c3tvdXRsaW5lOm5vbmU7Ym9yZGVyLWNvbG9yOiMzMjczZGM7Y29sb3I6I0Q0RDdERH0uZGF0ZXBpY2tlci1jb250cm9scyAuYnV0dG9uOmZvY3VzOm5vdCg6YWN0aXZlKXtib3gtc2hhZG93OjAgMCAwIDAuMTI1ZW0gcmdiYSg1MCwxMTUsMjIwLDAuMjUpfS5kYXRlcGlja2VyLWNvbnRyb2xzIC5idXR0b246aG92ZXJ7Ym9yZGVyLWNvbG9yOiNiNWI1YjU7Y29sb3I6I0ZBRkFGQ30uZGF0ZXBpY2tlci1jb250cm9scyAuYnV0dG9uW2Rpc2FibGVkXXtjdXJzb3I6bm90LWFsbG93ZWR9LmRhdGVwaWNrZXItY29udHJvbHMgLnZpZXctc3dpdGNoe2ZsZXg6YXV0b30uZGF0ZXBpY2tlci1jb250cm9scyAubmV4dC1idG57cGFkZGluZy1sZWZ0Oi4zNzVyZW07cGFkZGluZy1yaWdodDouMzc1cmVtO3dpZHRoOjIuMjVyZW19LmRhdGVwaWNrZXItY29udHJvbHMgLnByZXYtYnRue3BhZGRpbmctbGVmdDouMzc1cmVtO3BhZGRpbmctcmlnaHQ6LjM3NXJlbTt3aWR0aDoyLjI1cmVtfS5kYXRlcGlja2VyLWNvbnRyb2xzIC5uZXh0LWJ0bi5kaXNhYmxlZHt2aXNpYmlsaXR5OmhpZGRlbn0uZGF0ZXBpY2tlci1jb250cm9scyAucHJldi1idG4uZGlzYWJsZWR7dmlzaWJpbGl0eTpoaWRkZW59LmRhdGVwaWNrZXItZ3JpZHtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7d2lkdGg6MTUuNzVyZW19LmRhdGVwaWNrZXItdmlld3tkaXNwbGF5OmZsZXh9LmRhdGVwaWNrZXItdmlldyAuZGF5cy1vZi13ZWVre2Rpc3BsYXk6ZmxleH0uZGF0ZXBpY2tlci12aWV3IC5kYXlzIC5kYXRlcGlja2VyLWNlbGx7ZmxleC1iYXNpczoxNC4yODU3MTQyODU3JX0uZGF0ZXBpY2tlci12aWV3IC5kb3d7ZmxleC1iYXNpczoxNC4yODU3MTQyODU3JTtmb250LXNpemU6Ljg3NXJlbTtmb250LXdlaWdodDo3MDA7aGVpZ2h0OjEuNXJlbTtsaW5lLWhlaWdodDoxLjVyZW19LmRhdGVwaWNrZXItdmlldyAud2Vla3toZWlnaHQ6Mi4yNXJlbTtsaW5lLWhlaWdodDoyLjI1cmVtO2NvbG9yOiNiNWI1YjU7Zm9udC1zaXplOi43NXJlbTt3aWR0aDoyLjI1cmVtfS5kYXRlcGlja2VyLXZpZXcuZGF0ZXBpY2tlci1ncmlkIC5kYXRlcGlja2VyLWNlbGx7ZmxleC1iYXNpczoyNSU7aGVpZ2h0OjQuNXJlbTtsaW5lLWhlaWdodDo0LjVyZW19LmRhdGVwaWNrZXItY2VsbHtoZWlnaHQ6Mi4yNXJlbTtsaW5lLWhlaWdodDoyLjI1cmVtfS5kYXRlcGlja2VyLWNlbGw6bm90KC5kaXNhYmxlZCk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIxMiwyMTUsMjIxLDAuMTUpO2N1cnNvcjpwb2ludGVyfS5kYXRlcGlja2VyLXRpdGxle2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3gtc2hhZG93Omluc2V0IDAgLTFweCAxcHggcmdiYSgxMCwxMCwxMCwwLjEpO2ZvbnQtd2VpZ2h0OjcwMDtwYWRkaW5nOi4zNzVyZW0gLjc1cmVtO3RleHQtYWxpZ246Y2VudGVyfS5kYXRlcGlja2VyLWhlYWRlciAuZGF0ZXBpY2tlci1jb250cm9sc3twYWRkaW5nOjJweCAycHggMH0uZGF0ZXBpY2tlci1oZWFkZXIgLmRhdGVwaWNrZXItY29udHJvbHMgLmJ1dHRvbntib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Zm9udC13ZWlnaHQ6NzAwfS5kYXRlcGlja2VyLWhlYWRlciAuZGF0ZXBpY2tlci1jb250cm9scyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjE1KX0uZGF0ZXBpY2tlci1oZWFkZXIgLmRhdGVwaWNrZXItY29udHJvbHMgLmJ1dHRvbjpmb2N1czpub3QoOmFjdGl2ZSl7Ym94LXNoYWRvdzowIDAgMCAwLjEyNWVtIHJnYmEoMjU1LDI1NSwyNTUsMC4yNSl9LmRhdGVwaWNrZXItaGVhZGVyIC5kYXRlcGlja2VyLWNvbnRyb2xzIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzAwQTNGRn0uZGF0ZXBpY2tlci1oZWFkZXIgLmRhdGVwaWNrZXItY29udHJvbHMgLmJ1dHRvbltkaXNhYmxlZF17Ym94LXNoYWRvdzpub25lfS5kYXRlcGlja2VyLWNlbGwuZm9jdXNlZDpub3QoLnNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOiMwMEEzRkY7Y29sb3I6I2ZmZn0uZGF0ZXBpY2tlci1jZWxsLnNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6IzAwQTNGRjtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjYwMH0uZGF0ZXBpY2tlci1jZWxsLnNlbGVjdGVkOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzAwQTNGRjtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjYwMH0uZGF0ZXBpY2tlci1jZWxsLmRpc2FibGVke2NvbG9yOiNkYmRiZGJ9LmRhdGVwaWNrZXItY2VsbC5uZXh0Om5vdCguZGlzYWJsZWQpe2NvbG9yOiM3YTdhN2F9LmRhdGVwaWNrZXItY2VsbC5wcmV2Om5vdCguZGlzYWJsZWQpe2NvbG9yOiM3YTdhN2F9LmRhdGVwaWNrZXItY2VsbC5uZXh0LnNlbGVjdGVke2NvbG9yOiNlNmU2ZTZ9LmRhdGVwaWNrZXItY2VsbC5wcmV2LnNlbGVjdGVke2NvbG9yOiNlNmU2ZTZ9LmRhdGVwaWNrZXItY2VsbC5oaWdobGlnaHRlZDpub3QoLnNlbGVjdGVkKTpub3QoLnJhbmdlKTpub3QoLnRvZGF5KXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjEyLDIxNSwyMjEsMC4yNSk7Ym9yZGVyLXJhZGl1czowfS5kYXRlcGlja2VyLWNlbGwuaGlnaGxpZ2h0ZWQ6bm90KC5zZWxlY3RlZCk6bm90KC5yYW5nZSk6bm90KC50b2RheSk6bm90KC5kaXNhYmxlZCk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5kYXRlcGlja2VyLWNlbGwuaGlnaGxpZ2h0ZWQ6bm90KC5zZWxlY3RlZCk6bm90KC5yYW5nZSk6bm90KC50b2RheSkuZm9jdXNlZHtiYWNrZ3JvdW5kLWNvbG9yOiMwMEEzRkY7Y29sb3I6I2ZmZn0uZGF0ZXBpY2tlci1jZWxsLnRvZGF5Om5vdCguc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6IzAwZDFiMn0uZGF0ZXBpY2tlci1jZWxsLnRvZGF5Om5vdCguc2VsZWN0ZWQpOm5vdCguZGlzYWJsZWQpe2NvbG9yOiNmZmZ9LmRhdGVwaWNrZXItY2VsbC50b2RheS5mb2N1c2VkOm5vdCguc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6IzAwYzRhN30uZGF0ZXBpY2tlci1pbnB1dC5pbi1lZGl0e2JvcmRlci1jb2xvcjojMjM2NmQxfS5kYXRlcGlja2VyLWlucHV0LmluLWVkaXQ6YWN0aXZle2JveC1zaGFkb3c6MCAwIDAuMjVlbSAwLjI1ZW0gcmdiYSgzNSwxMDIsMjA5LDAuMil9LmRhdGVwaWNrZXItaW5wdXQuaW4tZWRpdDpmb2N1c3tib3gtc2hhZG93OjAgMCAwLjI1ZW0gMC4yNWVtIHJnYmEoMzUsMTAyLDIwOSwwLjIpfUBtZWRpYSAobWF4LXdpZHRoOiAyMi41cmVtKXsuZGF0ZXBpY2tlci12aWV3IC53ZWVre3dpZHRoOjEuOTY4NzVyZW19LmNhbGVuZGFyLXdlZWtzKy5kYXlzIC5kYXRlcGlja2VyLWdyaWR7d2lkdGg6MTMuNzgxMjVyZW19fS8qISBub3JtYWxpemUuc2NzcyB2MC4xLjAgfCBNSVQgTGljZW5zZSB8IGJhc2VkIG9uIGdpdC5pby9ub3JtYWxpemUgKi9odG1se2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LW1zLXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJX1ib2R5e21hcmdpbjowfWFydGljbGUsYXNpZGUsZGV0YWlscyxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsaGVhZGVyLGhncm91cCxtYWluLG1lbnUsbmF2LHNlY3Rpb24sc3VtbWFyeXtkaXNwbGF5OmJsb2NrfWF1ZGlvLGNhbnZhcyxwcm9ncmVzcyx2aWRlb3tkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX1hdWRpbzpub3QoW2NvbnRyb2xzXSl7ZGlzcGxheTpub25lO2hlaWdodDowfVtoaWRkZW5dLHRlbXBsYXRle2Rpc3BsYXk6bm9uZX1he2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9YTphY3RpdmUsYTpob3ZlcntvdXRsaW5lOjB9YWJiclt0aXRsZV17Ym9yZGVyLWJvdHRvbToxcHggZG90dGVkfWIsc3Ryb25ne2ZvbnQtd2VpZ2h0OmJvbGR9ZGZue2ZvbnQtc3R5bGU6aXRhbGljfWgxe2ZvbnQtc2l6ZToyZW07bWFyZ2luOjAuNjdlbSAwfW1hcmt7YmFja2dyb3VuZDojZmYwO2NvbG9yOiMwMDB9c21hbGx7Zm9udC1zaXplOjgwJX1zdWIsc3Vwe2ZvbnQtc2l6ZTo3NSU7bGluZS1oZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX1zdXB7dG9wOi0wLjVlbX1zdWJ7Ym90dG9tOi0wLjI1ZW19aW1ne2JvcmRlcjowfXN2Zzpub3QoOnJvb3Qpe292ZXJmbG93OmhpZGRlbn1maWd1cmV7bWFyZ2luOjFlbSA0MHB4fWhyey1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2hlaWdodDowfXByZXtvdmVyZmxvdzphdXRvfWNvZGUsa2JkLHByZSxzYW1we2ZvbnQtZmFtaWx5Om1vbm9zcGFjZSwgbW9ub3NwYWNlO2ZvbnQtc2l6ZToxZW19YnV0dG9uLGlucHV0LG9wdGdyb3VwLHNlbGVjdCx0ZXh0YXJlYXtjb2xvcjppbmhlcml0O2ZvbnQ6aW5oZXJpdDttYXJnaW46MH1idXR0b257b3ZlcmZsb3c6dmlzaWJsZX1idXR0b24sc2VsZWN0e3RleHQtdHJhbnNmb3JtOm5vbmV9YnV0dG9uLGh0bWwgaW5wdXRbdHlwZT1cImJ1dHRvblwiXSxpbnB1dFt0eXBlPVwicmVzZXRcIl0saW5wdXRbdHlwZT1cInN1Ym1pdFwiXXstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2N1cnNvcjpwb2ludGVyfWJ1dHRvbltkaXNhYmxlZF0saHRtbCBpbnB1dFtkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9YnV0dG9uOjotbW96LWZvY3VzLWlubmVyLGlucHV0OjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowO3BhZGRpbmc6MH1pbnB1dHtsaW5lLWhlaWdodDpub3JtYWx9aW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLGlucHV0W3R5cGU9XCJyYWRpb1wiXXtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzowfWlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24saW5wdXRbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b31pbnB1dFt0eXBlPVwic2VhcmNoXCJdey13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGQ7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94fWlucHV0W3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24saW5wdXRbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX1maWVsZHNldHtib3JkZXI6MXB4IHNvbGlkICNjMGMwYzA7bWFyZ2luOjAgMnB4O3BhZGRpbmc6MC4zNWVtIDAuNjI1ZW0gMC43NWVtfWxlZ2VuZHtib3JkZXI6MDtwYWRkaW5nOjB9dGV4dGFyZWF7b3ZlcmZsb3c6YXV0b31vcHRncm91cHtmb250LXdlaWdodDpib2xkfXRhYmxle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXItc3BhY2luZzowfXRkLHRoe3BhZGRpbmc6MH1odG1se2hlaWdodDoxMDAlfWJvZHl7bWluLWhlaWdodDoxMDAlO2ZvbnQtZmFtaWx5OlwiUHJveGltYSBOb3ZhXCIsc2Fucy1zZXJpZjtiYWNrZ3JvdW5kOiMwNzA3MEV9Ym9keT5pbWdbcmVmZXJyZXJwb2xpY3k9XCJuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZVwiXXtkaXNwbGF5Om5vbmV9Kntib3gtc2l6aW5nOmJvcmRlci1ib3h9YXt0cmFuc2l0aW9uOmNvbG9yIC4ycywgYmFja2dyb3VuZC1jb2xvciAuMnN9LnBhZ2Utd3JhcHBlcntkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjF9LmJvd2xvZnN3ZWV0c3tkaXNwbGF5Om5vbmV9QG1lZGlhIChtYXgtd2lkdGg6IDgwMHB4KXsucGFnZS13cmFwcGVye2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn19LnRvcG5hdntkaXNwbGF5OmZsZXg7cGFkZGluZzouNzVyZW0gLjc1cmVtIC42NXJlbTtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbjtwb3NpdGlvbjpyZWxhdGl2ZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDo5OX0udG9wbmF2IC5pbmZsdXgtaG9tZXtmb250LWZhbWlseTonaWNvbW9vbi12Mic7Zm9udC1zaXplOjEuNHJlbTtjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udG9wbmF2IC5pbmZsdXgtaG9tZTpob3Zlcntjb2xvcjojMDBBM0ZGfS50b3BuYXYgLmluZmx1eC1ob21lIC5pY29uLWluZmx1eC1sb2dvdHlwZXttYXJnaW4tbGVmdDouNnJlbX0udG9wbmF2IC5kaXZpZGVye2hlaWdodDoxMDAlO2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuNSk7bWFyZ2luOjAgMXJlbSAwIC42NXJlbX0udG9wbmF2IC5kb2NzLWhvbWV7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246dGV4dC10b3A7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc2l6ZToxLjFyZW07Y29sb3I6I2ZmZjt0ZXh0LWRlY29yYXRpb246bm9uZX0udG9wbmF2IC5kb2NzLWhvbWU6aG92ZXJ7Y29sb3I6IzAwQTNGRn0udG9wbmF2IC50b3BuYXYtbGVmdHttYXJnaW4tcmlnaHQ6LjE1cmVtO3BhZGRpbmc6LjI1cmVtIC4xNXJlbTt6LWluZGV4OjF9LnRvcG5hdiAudG9wbmF2LXJpZ2h0e2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDouNzVyZW07dG9wOi43NXJlbX0udG9wbmF2IC5zZWxlY3Rvci1kcm9wZG93bnN7ZGlzcGxheTpmbGV4O3otaW5kZXg6MTAwO3BhZGRpbmctcmlnaHQ6LjI1cmVtfS50b3BuYXYgLnByb2R1Y3QtbGlzdHtwb3NpdGlvbjpyZWxhdGl2ZX0udG9wbmF2IC5wcm9kdWN0LWxpc3QgI3Byb2R1Y3QtZHJvcGRvd257ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJTtjb2xvcjojZmZmO2hlaWdodDoycmVtO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDIyNWRlZywgI2QzMDk3MSwjOWIyYWZmKTtiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6Zml4ZWQ7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc2l6ZToxLjA1cmVtO2JvcmRlci1yYWRpdXM6NnB4O292ZXJmbG93OmhpZGRlbjtjdXJzb3I6cG9pbnRlcn0udG9wbmF2IC5wcm9kdWN0LWxpc3QgI3Byb2R1Y3QtZHJvcGRvd246YWZ0ZXJ7Y29udGVudDpcIlxcZTkxOFwiO2ZvbnQtZmFtaWx5OidpY29tb29uLXYyJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LjQ1cmVtO3JpZ2h0Oi40cmVtO3RyYW5zaXRpb246YWxsIC4zc30udG9wbmF2IC5wcm9kdWN0LWxpc3QgI3Byb2R1Y3QtZHJvcGRvd24gLnNlbGVjdGVke3BhZGRpbmc6MCAxLjc1cmVtIDAgLjc1cmVtO2xpbmUtaGVpZ2h0OjB9LnRvcG5hdiAucHJvZHVjdC1saXN0ICNwcm9kdWN0LWRyb3Bkb3duLm9wZW46YWZ0ZXJ7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfS50b3BuYXYgLnByb2R1Y3QtbGlzdCAjZHJvcGRvd24taXRlbXN7b3BhY2l0eTowO2hlaWdodDowO3BvaW50ZXItZXZlbnRzOm5vbmU7bWFyZ2luLXRvcDotMTBweDt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzLCBtYXJnaW4tdG9wIC41c30udG9wbmF2IC5wcm9kdWN0LWxpc3QgI2Ryb3Bkb3duLWl0ZW1zLm9wZW57b3BhY2l0eToxO3BvaW50ZXItZXZlbnRzOmF1dG87bWFyZ2luLXRvcDowO2hlaWdodDphdXRvfS50b3BuYXYgLnByb2R1Y3QtbGlzdCAjZHJvcGRvd24taXRlbXMub3BlbiAucHJvZHVjdC1ncm91cHttYXJnaW46MCAwIDVweH0udG9wbmF2IC5wcm9kdWN0LWxpc3QgI2Ryb3Bkb3duLWl0ZW1zIC5wcm9kdWN0LWdyb3Vwe2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDIyNWRlZywgI2QzMDk3MSwjOWIyYWZmKTtiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6Zml4ZWQ7Ym9yZGVyLXJhZGl1czo2cHg7Ym94LXNoYWRvdzoxcHggM3B4IDEwcHggIzA3MDcwRTttYXJnaW46MCAwIC0xMHB4O3RyYW5zaXRpb246bWFyZ2luIC41c30udG9wbmF2IC5wcm9kdWN0LWxpc3QgI2Ryb3Bkb3duLWl0ZW1zIC5wcm9kdWN0LWdyb3VwOmxhc3QtY2hpbGR7bWFyZ2luOjB9LnRvcG5hdiAucHJvZHVjdC1saXN0ICNkcm9wZG93bi1pdGVtcyAuZ3JvdXAtdGl0bGV7cGFkZGluZzouNXJlbSAuNzVyZW0gLjJyZW07Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojMTgxODIwO2ZvbnQtc2l6ZToxcmVtfS50b3BuYXYgLnByb2R1Y3QtbGlzdCAjZHJvcGRvd24taXRlbXMgLmdyb3VwLXRpdGxlIHB7bWFyZ2luOjA7cGFkZGluZzouMXJlbSAuMXJlbSAuM3JlbTtib3JkZXItaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI1NSwyNTUsMjU1LDAuNSkgMCUsIHJnYmEoMjU1LDI1NSwyNTUsMCkgMTAwJSkgMTtib3JkZXItYm90dG9tOjJweCBzb2xpZH0udG9wbmF2IC5wcm9kdWN0LWxpc3QgI2Ryb3Bkb3duLWl0ZW1zIHVsLml0ZW0tbGlzdHtwYWRkaW5nOjA7bWFyZ2luOjA7bGlzdC1zdHlsZTpub25lfS50b3BuYXYgLnByb2R1Y3QtbGlzdCAjZHJvcGRvd24taXRlbXMgdWwuaXRlbS1saXN0LnByb2R1Y3RzW2RhdGEtY2F0ZWdvcnldOmJlZm9yZXtjb250ZW50OmF0dHIoZGF0YS1jYXRlZ29yeSk7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOi41cmVtIC43NXJlbSAuMTVyZW07Zm9udC1zaXplOi44NXJlbTtjb2xvcjojMTgxODIwLDAuODt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Zm9udC13ZWlnaHQ6Ym9sZDtsZXR0ZXItc3BhY2luZzouMDRyZW07b3BhY2l0eTouNzU7bWl4LWJsZW5kLW1vZGU6bXVsdGlwbHl9LnRvcG5hdiAucHJvZHVjdC1saXN0ICNkcm9wZG93bi1pdGVtcyBhe2Rpc3BsYXk6YmxvY2s7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Zm9udC1zaXplOjEuMDVyZW07Zm9udC13ZWlnaHQ6NTAwO3doaXRlLXNwYWNlOm5vd3JhcDtjb2xvcjojZmZmO3BhZGRpbmc6LjNyZW0gMS41cmVtIC4zcmVtIC43NXJlbTtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMCl9LnRvcG5hdiAucHJvZHVjdC1saXN0ICNkcm9wZG93bi1pdGVtcyBhOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjMpfS50b3BuYXYgLnByb2R1Y3QtbGlzdCAjZHJvcGRvd24taXRlbXMgYS5hY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LDAuMyl9LnRvcG5hdiAucHJvZHVjdC1saXN0ICNkcm9wZG93bi1pdGVtcyBhOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgMnB4IDJweDtwb3NpdGlvbjpyZWxhdGl2ZX0udG9wbmF2IC5wcm9kdWN0LWxpc3QgI2Ryb3Bkb3duLWl0ZW1zIGEgc3Bhbi5zdGF0ZXtmb250LXNpemU6LjllbTtvcGFjaXR5Oi42NTtmb250LXN0eWxlOml0YWxpY30udG9wbmF2IC5idXR0b25ze2Rpc3BsYXk6ZmxleDttYXJnaW4tbGVmdDouNXJlbX0udG9wbmF2IC50aGVtZS1zd2l0Y2gsLnRvcG5hdiAjc2VhcmNoLWJ0biwudG9wbmF2IC51cmwtdHJpZ2dlcntkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjA7bGluZS1oZWlnaHQ6MDtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuNSk7YmFja2dyb3VuZDpub25lO2hlaWdodDozMHB4O3dpZHRoOjMwcHg7Ym9yZGVyOm5vbmU7dHJhbnNpdGlvbjpjb2xvciAuMnMsIG9wYWNpdHkgLjJzO2FwcGVhcmFuY2U6bm9uZTtvdmVyZmxvdzp2aXNpYmxlfS50b3BuYXYgLnRoZW1lLXN3aXRjaDpmb2N1cywudG9wbmF2ICNzZWFyY2gtYnRuOmZvY3VzLC50b3BuYXYgLnVybC10cmlnZ2VyOmZvY3Vze291dGxpbmU6bm9uZX0udG9wbmF2IC50aGVtZS1zd2l0Y2g6aG92ZXIsLnRvcG5hdiAjc2VhcmNoLWJ0bjpob3ZlciwudG9wbmF2IC51cmwtdHJpZ2dlcjpob3Zlcntjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyfS50b3BuYXYgLnRoZW1lLXN3aXRjaC50aGVtZS1zd2l0Y2gtZGFyaywudG9wbmF2ICNzZWFyY2gtYnRuLnRoZW1lLXN3aXRjaC1kYXJrLC50b3BuYXYgLnVybC10cmlnZ2VyLnRoZW1lLXN3aXRjaC1kYXJre2Rpc3BsYXk6bm9uZTtmb250LXNpemU6MS4xNXJlbX0udG9wbmF2IC50aGVtZS1zd2l0Y2gudGhlbWUtc3dpdGNoLWxpZ2h0LC50b3BuYXYgI3NlYXJjaC1idG4udGhlbWUtc3dpdGNoLWxpZ2h0LC50b3BuYXYgLnVybC10cmlnZ2VyLnRoZW1lLXN3aXRjaC1saWdodHtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MS4zcmVtfS50b3BuYXYgLnVybC10cmlnZ2Vye2ZvbnQtc2l6ZToxLjFyZW07dmVydGljYWwtYWxpZ246dG9wO3otaW5kZXg6MX0udG9wbmF2IC5zZWFyY2gtYnRue3dpZHRoOjA7b3BhY2l0eTowfS50b3BuYXYuZmVhdHVyZS1ib2FyZCAuYmFjay1idG57Y29sb3I6I0ZBRkFGQztiYWNrZ3JvdW5kOnJnYmEoMjEyLDIxNSwyMjEsMC4xNSk7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDIxMiwyMTUsMjIxLDApO2ZvbnQtd2VpZ2h0OjUwMDt0ZXh0LWRlY29yYXRpb246bm9uZTtwYWRkaW5nOi4zNXJlbSAxcmVtO2JvcmRlci1yYWRpdXM6MnB4O2ZvbnQtc2l6ZTouOXJlbTt0cmFuc2l0aW9uOmJvcmRlciAuMnN9LnRvcG5hdi5mZWF0dXJlLWJvYXJkIC5iYWNrLWJ0bjpiZWZvcmV7Y29udGVudDonXFxlOTA5Jztmb250LWZhbWlseTonaWNvbW9vbi12NCc7Zm9udC13ZWlnaHQ6Ym9sZDtsaW5lLWhlaWdodDowO21hcmdpbjowIC41cmVtIDAgLS4yNXJlbTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnRvcG5hdi5mZWF0dXJlLWJvYXJkIC5iYWNrLWJ0bjpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZTtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMjEyLDIxNSwyMjEsMC4yNSl9QG1lZGlhIChtYXgtd2lkdGg6IDgwMHB4KXsuZG9jcy1ob21lIC5sb25ne2Rpc3BsYXk6bm9uZX0uZG9jcy1ob21lIC5zaG9ydDphZnRlcntjb250ZW50Olwic1wifX1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpey5pY29uLWluZmx1eC1sb2dvdHlwZXtkaXNwbGF5Om5vbmV9LnRvcG5hdnttaW4taGVpZ2h0OjUuNzVyZW19LnRvcG5hdi5mZWF0dXJlLWJvYXJke21pbi1oZWlnaHQ6YXV0b30udG9wbmF2LXJpZ2h0e2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlO2FsaWduLWl0ZW1zOmZsZXgtZW5kO3dpZHRoOmNhbGMoMTAwJSAtIDEuNXJlbSl9LnNlYXJjaC1idG57ZGlzcGxheTpub25lfS50b3BuYXYgLnNlbGVjdG9yLWRyb3Bkb3duc3t3aWR0aDoxMDAlO21hcmdpbi10b3A6LjZyZW07cGFkZGluZy1yaWdodDowfS50b3BuYXYgLnNlbGVjdG9yLWRyb3Bkb3ducyAucHJvZHVjdC1saXN0e3dpZHRoOmNhbGMoMTAwdncgLSAxLjZyZW0pfS50b3BuYXYgLnNlbGVjdG9yLWRyb3Bkb3ducyAucHJvZHVjdC1saXN0IC5wcm9kdWN0LWRyb3Bkb3due3dpZHRoOjEwMCV9fS5ob21lLWNvbnRlbnR7Y29sb3I6I0ZBRkFGQzt3aWR0aDoxMDAlO21heC13aWR0aDoxMzAwcHg7bWFyZ2luOjAgYXV0b30uaG9tZS1jb250ZW50IC5zZWN0aW9ue3dpZHRoOjEwMCU7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjJyZW0gMnJlbSAwO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmV9LmhvbWUtY29udGVudCAuc2VhcmNoIC5zaWRlYmFyLS1zZWFyY2h7Zm9udC1zaXplOjEuMXJlbX0uaG9tZS1jb250ZW50IC5zZWFyY2ggLnNpZGViYXItLXNlYXJjaCBpbnB1dHtwYWRkaW5nOi43NWVtIDIuMzVyZW0gLjc1cmVtIDFyZW07Ym9yZGVyLXJhZGl1czo2cHg7cG9zaXRpb246cmVsYXRpdmU7Ym94LXNoYWRvdzpub25lfS5ob21lLWNvbnRlbnQgLnNlYXJjaCAuc2lkZWJhci0tc2VhcmNoIGlucHV0OjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuNjUpfS5ob21lLWNvbnRlbnQgLnNlYXJjaCAuc2lkZWJhci0tc2VhcmNoOmFmdGVye2ZvbnQtc2l6ZToycmVtO3RvcDouNDVyZW07cmlnaHQ6LjQ1cmVtfS5ob21lLWNvbnRlbnQgLnNlYXJjaCAuc2lkZWJhci0tc2VhcmNoIC5hbGdvbGlhLWF1dG9jb21wbGV0ZXtwb3NpdGlvbjpyZWxhdGl2ZX0uaG9tZS1jb250ZW50IC5zZWFyY2ggLnNpZGViYXItLXNlYXJjaCAuYWxnb2xpYS1hdXRvY29tcGxldGU6YWZ0ZXJ7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6YmxvY2s7Ym9yZGVyLXJhZGl1czo2cHg7dG9wOjA7bGVmdDowO2JveC1zaGFkb3c6MnB4IDJweCA2cHggcmdiYSgxNSwxNCwyMSwwLjUpO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7bWl4LWJsZW5kLW1vZGU6bXVsdGlwbHk7ei1pbmRleDotMX0uaG9tZS1jb250ZW50IC5zZWFyY2ggLnNpZGViYXItLXNlYXJjaCAuYWxnb2xpYS1hdXRvY29tcGxldGUuYWxnb2xpYS1hdXRvY29tcGxldGUtbGVmdCAuZHMtZHJvcGRvd24tbWVudSwuaG9tZS1jb250ZW50IC5zZWFyY2ggLnNpZGViYXItLXNlYXJjaCAuYWxnb2xpYS1hdXRvY29tcGxldGUuYWxnb2xpYS1hdXRvY29tcGxldGUtcmlnaHQgLmRzLWRyb3Bkb3duLW1lbnV7dG9wOmF1dG8gIWltcG9ydGFudDtsZWZ0OjAgIWltcG9ydGFudDttYXJnaW4tYm90dG9tOjEuNXJlbX0uaG9tZS1jb250ZW50IC5zZWFyY2ggLnNpZGViYXItLXNlYXJjaCAuYWxnb2xpYS1hdXRvY29tcGxldGUuYWxnb2xpYS1hdXRvY29tcGxldGUtbGVmdCAuZHMtZHJvcGRvd24tbWVudTphZnRlciwuaG9tZS1jb250ZW50IC5zZWFyY2ggLnNpZGViYXItLXNlYXJjaCAuYWxnb2xpYS1hdXRvY29tcGxldGUuYWxnb2xpYS1hdXRvY29tcGxldGUtcmlnaHQgLmRzLWRyb3Bkb3duLW1lbnU6YWZ0ZXJ7Y29udGVudDpcIlwiO2JveC1zaGFkb3c6MnB4IDJweCA2cHggcmdiYSgxNSwxNCwyMSwwLjUpO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7bWl4LWJsZW5kLW1vZGU6bXVsdGlwbHl9LmhvbWUtY29udGVudCAucGFkZGluZy13cmFwcGVye3BhZGRpbmc6MCAycmVtfS5ob21lLWNvbnRlbnQgaDF7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6I2ZmZn0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3Vwe2JhY2tncm91bmQ6IzE0MTQxRjtwYWRkaW5nOjNyZW07bWFyZ2luLWJvdHRvbToycmVtO2JvcmRlci1yYWRpdXM6MzBweH0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIC5wcm9kdWN0c3tkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7d2lkdGg6MTAwJTttYXJnaW46MCAtMXJlbX0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIC5wcm9kdWN0e3BhZGRpbmc6MCAxcmVtO2Rpc3BsYXk6ZmxleDtmbGV4OjEgMSAzMyU7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21heC13aWR0aDozMyU7bWluLXdpZHRoOjIwMHB4fS5ob21lLWNvbnRlbnQgLnByb2R1Y3QtZ3JvdXAgLnByb2R1Y3QgLnByb2R1Y3QtaW5mbyBwe21hcmdpbi1ib3R0b206LjVyZW07Zm9udC1zaXplOjEuMXJlbTtsaW5lLWhlaWdodDoxLjVyZW07Y29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjcpfS5ob21lLWNvbnRlbnQgLnByb2R1Y3QtZ3JvdXAgLnByb2R1Y3QgLnByb2R1Y3QtaW5mbyBoM1tzdGF0ZV06OmFmdGVye2NvbnRlbnQ6YXR0cihzdGF0ZSk7bWFyZ2luLWxlZnQ6LjVyZW07Zm9udC1zaXplOjFyZW07cGFkZGluZzouMjVlbSAuNWVtIC4yNWVtIC40ZW07YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICNkMzA5NzEsIzliMmFmZik7Y29sb3I6I2ZmZjtib3JkZXItcmFkaXVzOjRweDtmb250LXN0eWxlOml0YWxpYzt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmhvbWUtY29udGVudCAucHJvZHVjdC1ncm91cCAucHJvZHVjdCB1bC5wcm9kdWN0LWxpbmtze3BhZGRpbmctbGVmdDowO2xpc3Qtc3R5bGU6bm9uZX0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIC5wcm9kdWN0IHVsLnByb2R1Y3QtbGlua3MgbGk6bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tYm90dG9tOi4zNXJlbX0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIC5wcm9kdWN0IHVsLnByb2R1Y3QtbGlua3MgYXt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjUwMDtwb3NpdGlvbjpyZWxhdGl2ZX0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIC5wcm9kdWN0IHVsLnByb2R1Y3QtbGlua3MgYTo6YmVmb3Jle2NvbnRlbnQ6XCJcIjtwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206LTJweDtoZWlnaHQ6MnB4O3dpZHRoOjAlO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjZDMwOTcxLCM5YjJhZmYpO3RyYW5zaXRpb246d2lkdGggLjJzfS5ob21lLWNvbnRlbnQgLnByb2R1Y3QtZ3JvdXAgLnByb2R1Y3QgdWwucHJvZHVjdC1saW5rcyBhOjphZnRlcntjb250ZW50OlwiXFxlOTBhXCI7Zm9udC1mYW1pbHk6J2ljb21vb24tdjQnO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zaXplOjEuM3JlbTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg0NWRlZywgI2QzMDk3MSwjOWIyYWZmKTtiYWNrZ3JvdW5kLWNsaXA6dGV4dDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDtyaWdodDowO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDAuMjVyZW0pO29wYWNpdHk6MDt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMnMsIG9wYWNpdHkgLjJzfS5ob21lLWNvbnRlbnQgLnByb2R1Y3QtZ3JvdXAgLnByb2R1Y3QgdWwucHJvZHVjdC1saW5rcyBhOmhvdmVyOjpiZWZvcmV7d2lkdGg6MTAwJX0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIC5wcm9kdWN0IHVsLnByb2R1Y3QtbGlua3MgYTpob3Zlcjo6YWZ0ZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMS41cmVtKTtvcGFjaXR5OjF9LmhvbWUtY29udGVudCAucHJvZHVjdC1ncm91cCBoMntkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6Mi43NXJlbTttYXJnaW46MDtjb2xvcjojMTQxNDFGO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjZDMwOTcxLCM5YjJhZmYpO2JhY2tncm91bmQtY2xpcDp0ZXh0Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50fS5ob21lLWNvbnRlbnQgLnByb2R1Y3QtZ3JvdXAgaDN7Zm9udC1zaXplOjEuNnJlbTttYXJnaW46MXJlbSAwIDB9LmhvbWUtY29udGVudCAucHJvZHVjdC1ncm91cCBoMyBhe3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiNmZmY7cG9zaXRpb246cmVsYXRpdmV9LmhvbWUtY29udGVudCAucHJvZHVjdC1ncm91cCBoMyBhOjpiZWZvcmV7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTotMnB4O2hlaWdodDoycHg7d2lkdGg6MCU7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICNkMzA5NzEsIzliMmFmZik7dHJhbnNpdGlvbjp3aWR0aCAuMnN9LmhvbWUtY29udGVudCAucHJvZHVjdC1ncm91cCBoMyBhOmhvdmVyOjpiZWZvcmV7d2lkdGg6MTAwJX0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIGgzIC52ZXJzaW9ue2ZvbnQtc2l6ZTouOWVtO29wYWNpdHk6LjV9LmhvbWUtY29udGVudCAucHJvZHVjdC1ncm91cCBoNHtmb250LXNpemU6MS4xcmVtO21hcmdpbjoxLjVyZW0gMCAuNXJlbTtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nLXJpZ2h0OjFyZW07Y29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjcpO2JhY2tncm91bmQ6IzE0MTQxRn0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIC5jYXRlZ29yaWVze2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC13cmFwOndyYXA7d2lkdGg6Y2FsYygxMDAlICsgMnJlbSl9LmhvbWUtY29udGVudCAucHJvZHVjdC1ncm91cCAuY2F0ZWdvcmllcyAuY2F0ZWdvcnkuZnVsbC13aWR0aHt3aWR0aDoxMDAlfS5ob21lLWNvbnRlbnQgLnByb2R1Y3QtZ3JvdXAgLmNhdGVnb3JpZXMgLmNhdGVnb3J5LnR3by10aGlyZHN7d2lkdGg6NjYuNjYlfS5ob21lLWNvbnRlbnQgLnByb2R1Y3QtZ3JvdXAgLmNhdGVnb3JpZXMgLmNhdGVnb3J5LnR3by10aGlyZHMgLnByb2R1Y3R7bWF4LXdpZHRoOjUwJX0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIC5jYXRlZ29yaWVzIC5jYXRlZ29yeS5vbmUtdGhpcmR7d2lkdGg6MzMuMzMlfS5ob21lLWNvbnRlbnQgLnByb2R1Y3QtZ3JvdXAgLmNhdGVnb3JpZXMgLmNhdGVnb3J5Lm9uZS10aGlyZCAucHJvZHVjdHttYXgtd2lkdGg6MTAwJX0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIC5jYXRlZ29yeS1oZWFke21hcmdpbjoxcmVtIDAgMnJlbX0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIC5jYXRlZ29yeS1oZWFkOjphZnRlcntjb250ZW50OlwiXCI7ZGlzcGxheTpibG9jaztib3JkZXItdG9wOjFweCBzb2xpZCAjMzgzODQ2O21hcmdpbi10b3A6LTEuMTVyZW07d2lkdGg6Y2FsYygxMDAlIC0gMnJlbSl9LmhvbWUtY29udGVudCAjaW5mbHV4ZGIze21hcmdpbi10b3A6MS43NXJlbX0uaG9tZS1jb250ZW50ICNpbmZsdXhkYjMgaDIrcHttYXJnaW4tdG9wOi43NXJlbX0uaG9tZS1jb250ZW50ICN0ZWxlZ3JhZntiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg2NWRlZywgIzAyMGQ2NiwgIzAyMGE0Nyk7Y29sb3I6I2ZmZjtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59LmhvbWUtY29udGVudCAjdGVsZWdyYWYgLmJnLW92ZXJsYXl7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZC1pbWFnZTp1cmwoXCIvaW1nL2JnLXRleHR1cmUtbmV3LnBuZ1wiKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOmJvdHRvbX0uaG9tZS1jb250ZW50ICN0ZWxlZ3JhZiBoMntmb250LXNpemU6Mi41cmVtO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDI3MGRlZywgIzAwQTNGRiwjNWVlNGU0KTtiYWNrZ3JvdW5kLWNsaXA6dGV4dDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudH0uaG9tZS1jb250ZW50ICN0ZWxlZ3JhZiBoMitwe21hcmdpbi10b3A6LjY1cmVtfS5ob21lLWNvbnRlbnQgI3RlbGVncmFmIHVsLnByb2R1Y3QtbGlua3N7cGFkZGluZy1sZWZ0OjA7bWFyZ2luOjAgM3JlbSAwIDJyZW07bGlzdC1zdHlsZTpub25lfS5ob21lLWNvbnRlbnQgI3RlbGVncmFmIHVsLnByb2R1Y3QtbGlua3MgbGk6bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tYm90dG9tOi4zNXJlbX0uaG9tZS1jb250ZW50ICN0ZWxlZ3JhZiB1bC5wcm9kdWN0LWxpbmtzIGF7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo1MDA7cG9zaXRpb246cmVsYXRpdmV9LmhvbWUtY29udGVudCAjdGVsZWdyYWYgdWwucHJvZHVjdC1saW5rcyBhOjpiZWZvcmV7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTotMnB4O2hlaWdodDoycHg7d2lkdGg6MCU7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMjcwZGVnLCAjMDBBM0ZGLCM1ZWU0ZTQpO3RyYW5zaXRpb246d2lkdGggLjJzfS5ob21lLWNvbnRlbnQgI3RlbGVncmFmIHVsLnByb2R1Y3QtbGlua3MgYTo6YWZ0ZXJ7Y29udGVudDpcIlxcZTkwYVwiO2ZvbnQtZmFtaWx5OidpY29tb29uLXY0Jztmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToxLjNyZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMjcwZGVnLCAjMDBBM0ZGLCM1ZWU0ZTQpO2JhY2tncm91bmQtY2xpcDp0ZXh0Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50O3JpZ2h0OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMC4yNXJlbSk7b3BhY2l0eTowO3RyYW5zaXRpb246dHJhbnNmb3JtIC4ycywgb3BhY2l0eSAuMnN9LmhvbWUtY29udGVudCAjdGVsZWdyYWYgdWwucHJvZHVjdC1saW5rcyBhOmhvdmVyOjpiZWZvcmV7d2lkdGg6MTAwJX0uaG9tZS1jb250ZW50ICN0ZWxlZ3JhZiB1bC5wcm9kdWN0LWxpbmtzIGE6aG92ZXI6OmFmdGVye3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEuNXJlbSk7b3BhY2l0eToxfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmV7bWFyZ2luLWJvdHRvbToycmVtfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgaDN7Zm9udC1zaXplOjEuOHJlbTttYXJnaW46MXJlbSAwIDJyZW19LmhvbWUtY29udGVudCAjbGVhcm4tbW9yZSAubGVhcm4taXRlbXN7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uaG9tZS1jb250ZW50ICNsZWFybi1tb3JlIC5sZWFybi1pdGVtcyAuaXRlbXttYXgtd2lkdGg6MjUlO2ZsZXg6MSAxIDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttYXJnaW46MCAuNzVyZW19LmhvbWUtY29udGVudCAjbGVhcm4tbW9yZSAubGVhcm4taXRlbXMgLml0ZW0gLmljb24gc3Zne21heC1oZWlnaHQ6NjBweDttYXgtd2lkdGg6NjBweH0uaG9tZS1jb250ZW50ICNsZWFybi1tb3JlIC5sZWFybi1pdGVtcyAuaXRlbSAuaWNvbiAuYzF7ZmlsbDojZmZmfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgLmxlYXJuLWl0ZW1zIC5pdGVtIC5pY29uIC5jMntmaWxsOiMwNzA3MEV9LmhvbWUtY29udGVudCAjbGVhcm4tbW9yZSAubGVhcm4taXRlbXMgLml0ZW0gLmljb24gLm1hZ2VudGF7ZmlsbDojZDMwOTcxfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgLmxlYXJuLWl0ZW1zIC5pdGVtIGg0e2ZvbnQtc2l6ZToxLjRyZW07bWFyZ2luOjFyZW0gMCAwfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgLmxlYXJuLWl0ZW1zIC5pdGVtIHB7bWFyZ2luOi41cmVtIDAgMS41cmVtO2xpbmUtaGVpZ2h0OjEuN3JlbX0uaG9tZS1jb250ZW50ICNsZWFybi1tb3JlIC5sZWFybi1pdGVtcyAuaXRlbSBwOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgLmxlYXJuLWl0ZW1zIC5pdGVtIGF7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmU7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo1MDA7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LmhvbWUtY29udGVudCAjbGVhcm4tbW9yZSAubGVhcm4taXRlbXMgLml0ZW0gYTo6YmVmb3Jle2NvbnRlbnQ6XCJcIjtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7Ym90dG9tOi00cHg7bWFyZ2luLXRvcDouMjVyZW07aGVpZ2h0OjJweDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg0NWRlZywgI2QzMDk3MSwjOWIyYWZmKTt3aWR0aDowO3RyYW5zaXRpb246d2lkdGggLjJzfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgLmxlYXJuLWl0ZW1zIC5pdGVtIGE6OmFmdGVye2NvbnRlbnQ6XCJcXGU5MGFcIjtmb250LWZhbWlseTonaWNvbW9vbi12NCc7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXNpemU6MS4zcmVtO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDI3MGRlZywgI2QzMDk3MSwjOWIyYWZmKTtiYWNrZ3JvdW5kLWNsaXA6dGV4dDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDtyaWdodDowO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDAuMjVyZW0pO29wYWNpdHk6MDt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMnMsIG9wYWNpdHkgLjJzfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgLmxlYXJuLWl0ZW1zIC5pdGVtIGE6aG92ZXI6OmJlZm9yZXt3aWR0aDoxMDAlfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgLmxlYXJuLWl0ZW1zIC5pdGVtIGE6aG92ZXI6OmFmdGVye3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEuNXJlbSk7b3BhY2l0eToxfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgLmxlYXJuLWl0ZW1zIC5pdGVtPio6bGFzdC1jaGlsZHttYXJnaW4tdG9wOmF1dG99LmhvbWUtY29udGVudCAjY29weXJpZ2h0e3dpZHRoOjEwMCU7cGFkZGluZzoxcmVtIDNyZW07Y29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjUpfS5ob21lLWNvbnRlbnQgI2NvcHlyaWdodCBwe21hcmdpbjowO3RleHQtYWxpZ246cmlnaHQ7Zm9udC1zaXplOi45cmVtfUBtZWRpYSAobWF4LXdpZHRoOiA5MDBweCl7LmhvbWUtY29udGVudCAucHJvZHVjdC1ncm91cCAucHJvZHVjdHMgLnByb2R1Y3R7bWF4LXdpZHRoOjUwJTttYXJnaW4tYm90dG9tOjJyZW19fUBtZWRpYSAobWF4LXdpZHRoOiA3MjBweCl7LmhvbWUtY29udGVudCAucHJvZHVjdC1ncm91cCAucHJvZHVjdHN7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5ob21lLWNvbnRlbnQgLnByb2R1Y3QtZ3JvdXAgLnByb2R1Y3RzIC5wcm9kdWN0e21hcmdpbi1ib3R0b206MXJlbTttYXgtd2lkdGg6MTAwJX0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIC5wcm9kdWN0cyAucHJvZHVjdCB1bHttYXJnaW4tYm90dG9tOjB9LmhvbWUtY29udGVudCAucHJvZHVjdC1ncm91cCAuY2F0ZWdvcmllcyAuY2F0ZWdvcnkudHdvLXRoaXJkc3t3aWR0aDoxMDAlfS5ob21lLWNvbnRlbnQgLnByb2R1Y3QtZ3JvdXAgLmNhdGVnb3JpZXMgLmNhdGVnb3J5LnR3by10aGlyZHMgLnByb2R1Y3R7bWF4LXdpZHRoOjEwMCV9LmhvbWUtY29udGVudCAucHJvZHVjdC1ncm91cCAuY2F0ZWdvcmllcyAuY2F0ZWdvcnkub25lLXRoaXJke3dpZHRoOjEwMCV9LmhvbWUtY29udGVudCAucHJvZHVjdC1ncm91cCAuY2F0ZWdvcmllcyAuY2F0ZWdvcnkub25lLXRoaXJkIC5wcm9kdWN0e21heC13aWR0aDoxMDAlfS5ob21lLWNvbnRlbnQgI3RlbGVncmFme2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5ob21lLWNvbnRlbnQgI3RlbGVncmFmIHVsLnByb2R1Y3QtbGlua3N7bWFyZ2luOjFyZW0gMCAwfX1AbWVkaWEgKG1heC13aWR0aDogODAwcHgpey5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmV7bWFyZ2luLWJvdHRvbTowfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgaDR7bWFyZ2luLXRvcDowfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgLmxlYXJuLWl0ZW1ze2ZsZXgtd3JhcDp3cmFwfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgLmxlYXJuLWl0ZW1zIC5pdGVte21heC13aWR0aDo0NSU7ZmxleDoxIDEgNTAlO21hcmdpbi1ib3R0b206MnJlbX19QG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KXsuaG9tZS1jb250ZW50IC5zZWN0aW9uLC5ob21lLWNvbnRlbnQgLnBhZGRpbmctd3JhcHBlcntwYWRkaW5nOjAgMXJlbX0uaG9tZS1jb250ZW50IGgxe2ZvbnQtc2l6ZToxLjU1cmVtO2xpbmUtaGVpZ2h0OjEuNXJlbTtwYWRkaW5nOjAgMS43NXJlbTttYXJnaW4tYm90dG9tOi0uNXJlbX0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3Vwe3BhZGRpbmc6MS41cmVtfS5ob21lLWNvbnRlbnQgLnByb2R1Y3QtZ3JvdXAgcCwuaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIC5wcm9kdWN0IC5wcm9kdWN0LWluZm8gcHtmb250LXNpemU6MS4wNXJlbX0uaG9tZS1jb250ZW50IC5wcm9kdWN0LWdyb3VwIGgye2ZvbnQtc2l6ZToyLjFyZW19LmhvbWUtY29udGVudCAucHJvZHVjdC1ncm91cCBoM3tmb250LXNpemU6MS41cmVtfS5ob21lLWNvbnRlbnQgLnByb2R1Y3QtZ3JvdXAgaDR7Zm9udC1zaXplOjFyZW19LmhvbWUtY29udGVudCAjdGVsZWdyYWZ7cGFkZGluZzoxLjc1cmVtfS5ob21lLWNvbnRlbnQgI3RlbGVncmFmIGgye2ZvbnQtc2l6ZToycmVtfS5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgaDN7Zm9udC1zaXplOjEuNXJlbX0uaG9tZS1jb250ZW50ICNsZWFybi1tb3JlIC5sZWFybi1pdGVtcyAuaXRlbSBoNHtmb250LXNpemU6MS4ycmVtfS5ob21lLWNvbnRlbnQgI2NvcHlyaWdodCBwe3RleHQtYWxpZ246Y2VudGVyfX1AbWVkaWEgKG1heC13aWR0aDogNTQwcHgpey5ob21lLWNvbnRlbnQgI2xlYXJuLW1vcmUgLmxlYXJuLWl0ZW1ze2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0uaG9tZS1jb250ZW50ICNsZWFybi1tb3JlIC5sZWFybi1pdGVtcyAuaXRlbXttYXgtd2lkdGg6MTAwJTttYXJnaW46MCAwIDJyZW19fS5zaWRlYmFye2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmU7ZmxleC1ncm93OjE7cGFkZGluZzowIDFlbTt3aWR0aDoyNSV9LnNpZGViYXItLXNlYXJjaHtwb3NpdGlvbjpyZWxhdGl2ZTtmbGV4LWdyb3c6MX0uc2lkZWJhci0tc2VhcmNoOmFmdGVye2NvbnRlbnQ6XCJcXGU5MDVcIjtkaXNwbGF5OmJsb2NrO2ZvbnQtZmFtaWx5OidpY29tb29uLXYyJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LjI1cmVtO3JpZ2h0Oi4yNXJlbTtjb2xvcjojRDREN0REO2ZvbnQtc2l6ZToxLjhyZW19LnNpZGViYXItLXNlYXJjaCBpbnB1dHtmb250LWZhbWlseTpcIlByb3hpbWEgTm92YVwiLHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc2l6ZToxLjFyZW07YmFja2dyb3VuZDojMUExQTJBO2JvcmRlci1yYWRpdXM6MnB4O2JvcmRlcjoxcHggc29saWQgIzFBMUEyQTtwYWRkaW5nOi41ZW0gMi4xNXJlbSAuNXJlbSAuNXJlbTt3aWR0aDoxMDAlO2NvbG9yOiNmZmY7dHJhbnNpdGlvbi1wcm9wZXJ0eTpib3JkZXIsIGJveC1zaGFkb3c7dHJhbnNpdGlvbi1kdXJhdGlvbjouMnM7Ym94LXNoYWRvdzoycHggMnB4IDZweCByZ2JhKDE1LDE0LDIxLDAuNSl9LnNpZGViYXItLXNlYXJjaCBpbnB1dDpmb2N1c3tvdXRsaW5lOm5vbmU7Ym9yZGVyLWNvbG9yOiMwMEEzRkY7Ym94LXNoYWRvdzoxcHggMXB4IDEwcHggcmdiYSgwLDE2MywyNTUsMC41KTtib3JkZXItcmFkaXVzOjJweH0uc2lkZWJhci0tc2VhcmNoIGlucHV0OjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuMzUpO2ZvbnQtd2VpZ2h0Om5vcm1hbH0uc2lkZWJhciAuc2VhcmNoLWFuZC1uYXYtdG9nZ2xle2Rpc3BsYXk6ZmxleDt3aWR0aDoxMDAlO21hcmdpbi1ib3R0b206LjdyZW19LnNpZGViYXIgI2NvbnRlbnRzLXRvZ2dsZS1idG57ZGlzcGxheTpibG9jazttYXJnaW46LjM1cmVtIC4wNXJlbSAuMjVyZW0gMS4ycmVtO3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHh9LnNpZGViYXIgI2NvbnRlbnRzLXRvZ2dsZS1idG4gLnRvZ2dsZS1oYW1idXJnZXJ7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW4tdG9wOi42NXJlbTtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC41KTt3aWR0aDoyMHB4O2hlaWdodDoycHg7dHJhbnNpdGlvbjphbGwgLjNzO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9LnNpZGViYXIgI2NvbnRlbnRzLXRvZ2dsZS1idG4gLnRvZ2dsZS1oYW1idXJnZXI6YmVmb3JlLC5zaWRlYmFyICNjb250ZW50cy10b2dnbGUtYnRuIC50b2dnbGUtaGFtYnVyZ2VyOmFmdGVye2NvbnRlbnQ6XCJcIjtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjIwcHg7aGVpZ2h0OjJweDtib3JkZXItcmFkaXVzOjFweDtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC41KTt0cmFuc2Zvcm06cm90YXRlKDBkZWcpO3RyYW5zaXRpb246YWxsIC4zc30uc2lkZWJhciAjY29udGVudHMtdG9nZ2xlLWJ0biAudG9nZ2xlLWhhbWJ1cmdlcjpiZWZvcmV7dG9wOi02cHh9LnNpZGViYXIgI2NvbnRlbnRzLXRvZ2dsZS1idG4gLnRvZ2dsZS1oYW1idXJnZXI6YWZ0ZXJ7dG9wOjZweH0uc2lkZWJhciAjY29udGVudHMtdG9nZ2xlLWJ0bjpob3ZlciAudG9nZ2xlLWhhbWJ1cmdlcntiYWNrZ3JvdW5kOiNmZmZ9LnNpZGViYXIgI2NvbnRlbnRzLXRvZ2dsZS1idG46aG92ZXIgLnRvZ2dsZS1oYW1idXJnZXI6YmVmb3JlLC5zaWRlYmFyICNjb250ZW50cy10b2dnbGUtYnRuOmhvdmVyIC50b2dnbGUtaGFtYnVyZ2VyOmFmdGVye2JhY2tncm91bmQ6I2ZmZn0uc2lkZWJhciAjY29udGVudHMtdG9nZ2xlLWJ0bi5vcGVuIC50b2dnbGUtaGFtYnVyZ2Vye2JhY2tncm91bmQ6IzA3MDcwRTt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKX0uc2lkZWJhciAjY29udGVudHMtdG9nZ2xlLWJ0bi5vcGVuIC50b2dnbGUtaGFtYnVyZ2VyOmJlZm9yZXt0cmFuc2Zvcm06cm90YXRlKC0xMzVkZWcpO3RvcDowfS5zaWRlYmFyICNjb250ZW50cy10b2dnbGUtYnRuLm9wZW4gLnRvZ2dsZS1oYW1idXJnZXI6YWZ0ZXJ7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RvcDowfS5zaWRlYmFyICNuYXYtdHJlZXtsaXN0LXN0eWxlOm5vbmU7cGFkZGluZy1sZWZ0OjEuNXJlbTttYXJnaW4tYm90dG9tOjFyZW19LnNpZGViYXIgI25hdi10cmVlIHVse2xpc3Qtc3R5bGU6bm9uZTtwYWRkaW5nLWxlZnQ6Mi4zcmVtO2JvcmRlci1sZWZ0OjJweCBzb2xpZCAjMzMzMzQ2fS5zaWRlYmFyICNuYXYtdHJlZSBsaXttYXJnaW4tdG9wOi41cmVtO3Bvc2l0aW9uOnJlbGF0aXZlfS5zaWRlYmFyICNuYXYtdHJlZSBsaTpiZWZvcmV7Y29udGVudDpcIlwiO3dpZHRoOjRweDtoZWlnaHQ6NHB4O3RvcDouNDVlbTtsZWZ0Oi0xZW07ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kOiMzMzMzNDZ9LnNpZGViYXIgI25hdi10cmVlIGxpIHVse21hcmdpbi1sZWZ0Oi0uOTZlbX0uc2lkZWJhciAjbmF2LXRyZWUgbGkgdWwgbGk6YmVmb3Jle3RvcDouNGVtfS5zaWRlYmFyICNuYXYtdHJlZSBsaSB1bC5vcGVue21hcmdpbi10b3A6LS4yNWVtO3BhZGRpbmctdG9wOi4yNWVtfS5zaWRlYmFyICNuYXYtdHJlZSBsaS5hY3RpdmU6YmVmb3Jle2JhY2tncm91bmQ6I0Q2RjYyMn0uc2lkZWJhciAjbmF2LXRyZWUgbGkuYWN0aXZlPmF7Y29sb3I6I0Q2RjYyMn0uc2lkZWJhciAjbmF2LXRyZWUgbGkuYWN0aXZlPmE6aG92ZXJ7Y29sb3I6I0Q2RjYyMn0uc2lkZWJhciAjbmF2LXRyZWUgbGkuYWN0aXZlPi5jaGlsZHJlbi10b2dnbGV7YmFja2dyb3VuZDojRDZGNjIyfS5zaWRlYmFyICNuYXYtdHJlZSBsaS5hY3RpdmU+LmNoaWxkcmVuLXRvZ2dsZTpiZWZvcmUsLnNpZGViYXIgI25hdi10cmVlIGxpLmFjdGl2ZT4uY2hpbGRyZW4tdG9nZ2xlOmFmdGVye2JhY2tncm91bmQ6IzA3MDcwRX0uc2lkZWJhciAjbmF2LXRyZWUgbGkuYWN0aXZlPnVse2JvcmRlci1sZWZ0OjJweCBzb2xpZCAjRDZGNjIyfS5zaWRlYmFyICNuYXYtdHJlZSBhe3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OjUwMDtkaXNwbGF5OmlubGluZS1ibG9ja30uc2lkZWJhciAjbmF2LXRyZWUgLm5hdi1jYXRlZ29yeT5he2NvbG9yOiMwMEEzRkY7Zm9udC1zaXplOjEuMnJlbX0uc2lkZWJhciAjbmF2LXRyZWUgLm5hdi1jYXRlZ29yeT5hOmhvdmVye2NvbG9yOiNmZmZ9LnNpZGViYXIgI25hdi10cmVlIC5uYXYtaXRlbT5he2NvbG9yOiNENEQ3RER9LnNpZGViYXIgI25hdi10cmVlIC5uYXYtaXRlbT5hOmhvdmVye2NvbG9yOiMwMEEzRkZ9LnNpZGViYXIgI25hdi10cmVlIC5jaGlsZHJlbntoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnNpZGViYXIgI25hdi10cmVlIC5jaGlsZHJlbi5vcGVue2hlaWdodDphdXRvfS5zaWRlYmFyICNuYXYtdHJlZSAuY2hpbGRyZW4tdG9nZ2xle3dpZHRoOjEuMTJyZW07aGVpZ2h0OjEuMTJyZW07cG9zaXRpb246YWJzb2x1dGU7dG9wOi4xcmVtO2xlZnQ6LTEuNnJlbTtkaXNwbGF5OmJsb2NrO2JhY2tncm91bmQ6IzMzMzM0Njtib3JkZXItcmFkaXVzOjUwJX0uc2lkZWJhciAjbmF2LXRyZWUgLmNoaWxkcmVuLXRvZ2dsZTpiZWZvcmUsLnNpZGViYXIgI25hdi10cmVlIC5jaGlsZHJlbi10b2dnbGU6YWZ0ZXJ7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6YmxvY2s7YmFja2dyb3VuZDojRTdFOEVCO3RyYW5zaXRpb246YWxsIC4zc30uc2lkZWJhciAjbmF2LXRyZWUgLmNoaWxkcmVuLXRvZ2dsZTpiZWZvcmV7dG9wOjRweDtsZWZ0OjhweDtoZWlnaHQ6MTBweDt3aWR0aDoycHh9LnNpZGViYXIgI25hdi10cmVlIC5jaGlsZHJlbi10b2dnbGU6YWZ0ZXJ7dG9wOjhweDtsZWZ0OjRweDtoZWlnaHQ6MnB4O3dpZHRoOjEwcHh9LnNpZGViYXIgI25hdi10cmVlIC5jaGlsZHJlbi10b2dnbGU6aG92ZXJ7YmFja2dyb3VuZDojMDBBM0ZGfS5zaWRlYmFyICNuYXYtdHJlZSAuY2hpbGRyZW4tdG9nZ2xlOmhvdmVyOmJlZm9yZSwuc2lkZWJhciAjbmF2LXRyZWUgLmNoaWxkcmVuLXRvZ2dsZTpob3ZlcjphZnRlcntiYWNrZ3JvdW5kOiNFN0U4RUJ9LnNpZGViYXIgI25hdi10cmVlIC5jaGlsZHJlbi10b2dnbGUub3BlbjpiZWZvcmV7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9LnNpZGViYXIgI25hdi10cmVlIC5jaGlsZHJlbi10b2dnbGUub3BlbjphZnRlcnt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9LnNpZGViYXIgI25hdi10cmVlIGg0e21hcmdpbjoycmVtIDAgMCAtMXJlbTtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuNSk7Zm9udC13ZWlnaHQ6NzAwO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtmb250LXNpemU6Ljk1cmVtO2xldHRlci1zcGFjaW5nOi4wOHJlbX0uc2lkZWJhciAjbmF2LXRyZWUgaDQucGxhdGZvcm06YWZ0ZXIsLnNpZGViYXIgI25hdi10cmVlIGg0LmZsdXg6YWZ0ZXJ7Y29udGVudDpcIlxcZTkxMVwiO2ZvbnQtZmFtaWx5OlwiaWNvbW9vbi12MlwiO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtc2l6ZToxcmVtO29wYWNpdHk6LjQ7bWFyZ2luLWxlZnQ6LjI1cmVtfS5zaWRlYmFyIC5mZWF0dXJlLWJvYXJkLWJhZGdle3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6MXJlbTttYXJnaW46MnJlbSAwIDEuNXJlbSAtMS41cmVtO2JhY2tncm91bmQ6cmdiYSgwLDE2MywyNTUsMC4wNSk7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMTYzLDI1NSwwLjIpO2JvcmRlci1yYWRpdXM6OHB4O3RleHQtZGVjb3JhdGlvbjpub25lO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMnMsIGJvcmRlci1jb2xvciAuMnM7b3ZlcmZsb3c6aGlkZGVufS5zaWRlYmFyIC5mZWF0dXJlLWJvYXJkLWJhZGdlOmJlZm9yZXtjb250ZW50OlwiTkVXXCI7cG9zaXRpb246YWJzb2x1dGU7cGFkZGluZzouMXJlbSAxLjJyZW07Zm9udC1zaXplOi42NXJlbTtsZXR0ZXItc3BhY2luZzouMDNyZW07Zm9udC13ZWlnaHQ6Ym9sZDt0b3A6NnB4O3JpZ2h0Oi0xN3B4O2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZDMwOTcxO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5zaWRlYmFyIC5mZWF0dXJlLWJvYXJkLWJhZGdlIGg1e21hcmdpbjowIDAgLjI1cmVtIDA7Y29sb3I6IzAwQTNGRjtmb250LXNpemU6MS4ycmVtfS5zaWRlYmFyIC5mZWF0dXJlLWJvYXJkLWJhZGdlIHB7bWFyZ2luOjA7Y29sb3I6I0Q0RDdERDtmb250LXNpemU6MC45cmVtO2xpbmUtaGVpZ2h0OjEuNHJlbTtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTppdGFsaWN9LnNpZGViYXIgLmZlYXR1cmUtYm9hcmQtYmFkZ2U6aG92ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwxNjMsMjU1LDAuNzUpfUBtZWRpYSAobWF4LXdpZHRoOiA4MDBweCl7LnNpZGViYXJ7d2lkdGg6MTAwJX0uc2lkZWJhciAjbmF2LXRyZWV7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVuO21hcmdpbjowfS5zaWRlYmFyICNuYXYtdHJlZS5vcGVue2hlaWdodDphdXRvO292ZXJmbG93OmF1dG87bWFyZ2luLWJvdHRvbToycmVtfX1AbWVkaWEgKG1pbi13aWR0aDogODAxcHgpey5zaWRlYmFyICNjb250ZW50cy10b2dnbGUtYnRue2Rpc3BsYXk6bm9uZX19QG1lZGlhIChtaW4td2lkdGg6IDgwMXB4KSBhbmQgKG1heC13aWR0aDogMTIwMHB4KXsuc2lkZWJhcnt3aWR0aDozMCV9fS5zaWRlYmFyLXRvZ2dsZXtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO2hlaWdodDozNXB4O3RvcDozLjI1cmVtO3otaW5kZXg6MTAwfS5zaWRlYmFyLXRvZ2dsZTpob3ZlcntjdXJzb3I6cG9pbnRlcn0uc2lkZWJhci10b2dnbGU6aG92ZXI6YmVmb3JlLC5zaWRlYmFyLXRvZ2dsZTpob3ZlcjphZnRlcntjdXJzb3I6ZGVmYXVsdH0uc2lkZWJhci10b2dnbGU6aG92ZXIgYXtjb2xvcjojZDRkN2RkfS5zaWRlYmFyLXRvZ2dsZTpiZWZvcmUsLnNpZGViYXItdG9nZ2xlOmFmdGVye2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTBweDtoZWlnaHQ6MTBweH0uc2lkZWJhci10b2dnbGU6YmVmb3Jle3RvcDotMTRweH0uc2lkZWJhci10b2dnbGU6YWZ0ZXJ7Ym90dG9tOi0xNHB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZyl9LnNpZGViYXItdG9nZ2xlPmF7Zm9udC1mYW1pbHk6XCJpY29tb29uLXYyXCI7Y29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjUpO3RleHQtZGVjb3JhdGlvbjpub25lfS5zaWRlYmFyLXRvZ2dsZXtwYWRkaW5nOjAuNHJlbSAwLjZyZW07d2lkdGg6MzVweH0uc2lkZWJhci10b2dnbGU+YXtmb250LXNpemU6MXJlbX0uY29udGVudC13cmFwcGVyIC5zaWRlYmFyLXRvZ2dsZXtkaXNwbGF5Om5vbmU7bGVmdDowO2JhY2tncm91bmQtY29sb3I6IzA3MDcwRTtib3JkZXItcmFkaXVzOjAgMnB4IDJweCAwfS5jb250ZW50LXdyYXBwZXIgLnNpZGViYXItdG9nZ2xlOmJlZm9yZSwuY29udGVudC13cmFwcGVyIC5zaWRlYmFyLXRvZ2dsZTphZnRlcntjb250ZW50OnVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PVVURi04LFxcYSAgICAgICA8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgeG1sbnM6eGxpbms9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnIHg9JzBweCcgeT0nMHB4JyB2aWV3Qm94PScwIDAgMTAgMTAnIHhtbDpzcGFjZT0ncHJlc2VydmUnPlxcYSAgICAgICA8cGF0aCBmaWxsPSdyZ2JhKDcsNywxNCwwLjk5OTkpJyBkPSdNMCwxMGgxMFYwQzEwLDUuNTIsNS41MiwxMCwwLDEweicvPlxcYSAgICAgICA8L3N2Zz5cIik7bGVmdDowfS5jb250ZW50LXdyYXBwZXIgLnNpZGViYXItdG9nZ2xlOmJlZm9yZXt0cmFuc2Zvcm06cm90YXRlWSgxODBkZWcpfS5jb250ZW50LXdyYXBwZXIgLnNpZGViYXItdG9nZ2xlOmFmdGVye3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKX0uc2lkZWJhciAuc2lkZWJhci10b2dnbGV7cmlnaHQ6MDtiYWNrZ3JvdW5kLWNvbG9yOiMxNDE0MUY7Ym9yZGVyLXJhZGl1czoycHggMCAwIDJweH0uc2lkZWJhciAuc2lkZWJhci10b2dnbGU6YmVmb3JlLC5zaWRlYmFyIC5zaWRlYmFyLXRvZ2dsZTphZnRlcntjb250ZW50OnVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PVVURi04LFxcYSAgICAgICA8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgeG1sbnM6eGxpbms9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnIHg9JzBweCcgeT0nMHB4JyB2aWV3Qm94PScwIDAgMTAgMTAnIHhtbDpzcGFjZT0ncHJlc2VydmUnPlxcYSAgICAgICA8cGF0aCBmaWxsPSdyZ2JhKDIwLDIwLDMxLDAuOTk5OSknIGQ9J00wLDEwaDEwVjBDMTAsNS41Miw1LjUyLDEwLDAsMTB6Jy8+XFxhICAgICAgIDwvc3ZnPlwiKTtyaWdodDowfUBtZWRpYSAobWF4LXdpZHRoOiA4MDBweCl7LnNpZGViYXItdG9nZ2xle2Rpc3BsYXk6bm9uZX19LmNvbnRlbnQtd3JhcHBlcntmbGV4LWdyb3c6MTt3aWR0aDo3NSU7cG9zaXRpb246cmVsYXRpdmU7Ym9yZGVyLXJhZGl1czoycHggMCAwIDJweDtvdmVyZmxvdzpoaWRkZW47ei1pbmRleDowfS5jb250ZW50LXdyYXBwZXIgLmNvcHlyaWdodHtwYWRkaW5nOi41cmVtIDFyZW0gLjVyZW0gLjVyZW07dGV4dC1hbGlnbjpyaWdodDtmb250LXNpemU6LjlyZW07Y29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjUpfUBtZWRpYSAobWF4LXdpZHRoOiA4MDBweCl7LmNvbnRlbnQtd3JhcHBlcnt3aWR0aDoxMDAlfX1AbWVkaWEgKG1pbi13aWR0aDogODAxcHgpIGFuZCAobWF4LXdpZHRoOiAxMjAwcHgpey5jb250ZW50LXdyYXBwZXJ7d2lkdGg6NzAlfX0uYXJ0aWNsZXtiYWNrZ3JvdW5kOiMxNDE0MUY7Ym9yZGVyLXJhZGl1czoycHggMCAwIDJweDtwYWRkaW5nOjJyZW0gNHJlbSAzcmVtfS5hcnRpY2xlLS1jb250ZW50e21heC13aWR0aDo4NTBweDtmb250LXNpemU6MS4xcmVtfS5hcnRpY2xlLS1jb250ZW50IGgxLC5hcnRpY2xlLS1jb250ZW50IGgyLC5hcnRpY2xlLS1jb250ZW50IGgzLC5hcnRpY2xlLS1jb250ZW50IGg0LC5hcnRpY2xlLS1jb250ZW50IGg1LC5hcnRpY2xlLS1jb250ZW50IGg2e2NvbG9yOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgaDEgYSwuYXJ0aWNsZS0tY29udGVudCBoMiBhLC5hcnRpY2xlLS1jb250ZW50IGgzIGEsLmFydGljbGUtLWNvbnRlbnQgaDQgYSwuYXJ0aWNsZS0tY29udGVudCBoNSBhLC5hcnRpY2xlLS1jb250ZW50IGg2IGF7Y29sb3I6aW5oZXJpdCAhaW1wb3J0YW50O2ZvbnQtd2VpZ2h0OmluaGVyaXQgIWltcG9ydGFudDt0ZXh0LWRlY29yYXRpb246bm9uZX0uYXJ0aWNsZS0tY29udGVudCBoMSBhIGNvZGU6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgaDIgYSBjb2RlOmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IGgzIGEgY29kZTphZnRlciwuYXJ0aWNsZS0tY29udGVudCBoNCBhIGNvZGU6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgaDUgYSBjb2RlOmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IGg2IGEgY29kZTphZnRlcntib3JkZXI6bm9uZX0uYXJ0aWNsZS0tY29udGVudCBoMisuaGlnaGxpZ2h0IHByZSwuYXJ0aWNsZS0tY29udGVudCBoMysuaGlnaGxpZ2h0IHByZSwuYXJ0aWNsZS0tY29udGVudCBoNCsuaGlnaGxpZ2h0IHByZSwuYXJ0aWNsZS0tY29udGVudCBoNSsuaGlnaGxpZ2h0IHByZSwuYXJ0aWNsZS0tY29udGVudCBoNisuaGlnaGxpZ2h0IHByZXttYXJnaW4tdG9wOi41cmVtfS5hcnRpY2xlLS1jb250ZW50IGgyK3ByZSwuYXJ0aWNsZS0tY29udGVudCBoMytwcmUsLmFydGljbGUtLWNvbnRlbnQgaDQrcHJlLC5hcnRpY2xlLS1jb250ZW50IGg1K3ByZSwuYXJ0aWNsZS0tY29udGVudCBoNitwcmV7bWFyZ2luLXRvcDouNXJlbX0uYXJ0aWNsZS0tY29udGVudCBoMisuY29kZS10YWJzLXdyYXBwZXIsLmFydGljbGUtLWNvbnRlbnQgaDMrLmNvZGUtdGFicy13cmFwcGVyLC5hcnRpY2xlLS1jb250ZW50IGg0Ky5jb2RlLXRhYnMtd3JhcHBlciwuYXJ0aWNsZS0tY29udGVudCBoNSsuY29kZS10YWJzLXdyYXBwZXIsLmFydGljbGUtLWNvbnRlbnQgaDYrLmNvZGUtdGFicy13cmFwcGVye21hcmdpbi10b3A6MH0uYXJ0aWNsZS0tY29udGVudCBoMi5tb25vc3BhY2UsLmFydGljbGUtLWNvbnRlbnQgaDMubW9ub3NwYWNlLC5hcnRpY2xlLS1jb250ZW50IGg0Lm1vbm9zcGFjZSwuYXJ0aWNsZS0tY29udGVudCBoNS5tb25vc3BhY2UsLmFydGljbGUtLWNvbnRlbnQgaDYubW9ub3NwYWNle2ZvbnQtZmFtaWx5OlwiSUJNIFBsZXggTW9ub1wiLG1vbm9zcGFjZX0uYXJ0aWNsZS0tY29udGVudCBoMi5ncmVlbiwuYXJ0aWNsZS0tY29udGVudCBoMy5ncmVlbiwuYXJ0aWNsZS0tY29udGVudCBoNC5ncmVlbiwuYXJ0aWNsZS0tY29udGVudCBoNS5ncmVlbiwuYXJ0aWNsZS0tY29udGVudCBoNi5ncmVlbntjb2xvcjojMzRCQjU1fS5hcnRpY2xlLS1jb250ZW50IGgyLm9yYW5nZSwuYXJ0aWNsZS0tY29udGVudCBoMy5vcmFuZ2UsLmFydGljbGUtLWNvbnRlbnQgaDQub3JhbmdlLC5hcnRpY2xlLS1jb250ZW50IGg1Lm9yYW5nZSwuYXJ0aWNsZS0tY29udGVudCBoNi5vcmFuZ2V7Y29sb3I6I0ZGODU2NH0uYXJ0aWNsZS0tY29udGVudCBoMi5jaGVja3BvaW50OjpiZWZvcmUsLmFydGljbGUtLWNvbnRlbnQgaDMuY2hlY2twb2ludDo6YmVmb3JlLC5hcnRpY2xlLS1jb250ZW50IGg0LmNoZWNrcG9pbnQ6OmJlZm9yZSwuYXJ0aWNsZS0tY29udGVudCBoNS5jaGVja3BvaW50OjpiZWZvcmUsLmFydGljbGUtLWNvbnRlbnQgaDYuY2hlY2twb2ludDo6YmVmb3Jle2NvbnRlbnQ6J1xcZTkzYic7Zm9udC1mYW1pbHk6J2ljb21vb24tdjQnO2ZvbnQtc2l6ZToyLjI1cmVtO2NvbG9yOiNkMzA5NzE7ZGlzcGxheTppbmxpbmU7bWFyZ2luOjAgLjVyZW0gMCAwO3ZlcnRpY2FsLWFsaWduOnRvcH0uYXJ0aWNsZS0tY29udGVudCBoMlttZXRhZGF0YV06OmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IGgzW21ldGFkYXRhXTo6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgaDRbbWV0YWRhdGFdOjphZnRlciwuYXJ0aWNsZS0tY29udGVudCBoNVttZXRhZGF0YV06OmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IGg2W21ldGFkYXRhXTo6YWZ0ZXJ7Y29udGVudDphdHRyKG1ldGFkYXRhKTttYXJnaW4tbGVmdDouNjVyZW07cGFkZGluZzouMWVtIC41ZW07Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC4xMik7Zm9udC1zaXplOi43NWVtO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjUwMDtib3JkZXItcmFkaXVzOjFlbTtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmFydGljbGUtLWNvbnRlbnQgaDJbZGF0ZV06OmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IGgyW25vdGVdOjphZnRlciwuYXJ0aWNsZS0tY29udGVudCBoM1tkYXRlXTo6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgaDNbbm90ZV06OmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IGg0W2RhdGVdOjphZnRlciwuYXJ0aWNsZS0tY29udGVudCBoNFtub3RlXTo6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgaDVbZGF0ZV06OmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IGg1W25vdGVdOjphZnRlciwuYXJ0aWNsZS0tY29udGVudCBoNltkYXRlXTo6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgaDZbbm90ZV06OmFmdGVye21hcmdpbi1sZWZ0Oi42NXJlbTtvcGFjaXR5Oi40O2ZvbnQtc2l6ZTouNzVlbTtmb250LXdlaWdodDo1MDA7Zm9udC1zdHlsZTppbmhlcml0fS5hcnRpY2xlLS1jb250ZW50IGgyW2RhdGVdOjphZnRlciwuYXJ0aWNsZS0tY29udGVudCBoM1tkYXRlXTo6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgaDRbZGF0ZV06OmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IGg1W2RhdGVdOjphZnRlciwuYXJ0aWNsZS0tY29udGVudCBoNltkYXRlXTo6YWZ0ZXJ7Y29udGVudDphdHRyKGRhdGUpfS5hcnRpY2xlLS1jb250ZW50IGgyW25vdGVdOjphZnRlciwuYXJ0aWNsZS0tY29udGVudCBoM1tub3RlXTo6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgaDRbbm90ZV06OmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IGg1W25vdGVdOjphZnRlciwuYXJ0aWNsZS0tY29udGVudCBoNltub3RlXTo6YWZ0ZXJ7Y29udGVudDphdHRyKG5vdGUpO2ZvbnQtc2l6ZTouODVlbX0uYXJ0aWNsZS0tY29udGVudCBoMXtmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToyLjc1cmVtO21hcmdpbjouNGVtIDAgLjJlbX0uYXJ0aWNsZS0tY29udGVudCBoMntmb250LXNpemU6Mi4xcmVtO21hcmdpbjotLjI1cmVtIDAgLjVyZW07cGFkZGluZy10b3A6MS43NXJlbTtmb250LXdlaWdodDo1MDA7Y29sb3I6I0ZBRkFGQ30uYXJ0aWNsZS0tY29udGVudCBoM3tmb250LXNpemU6MS43NXJlbTtmb250LXdlaWdodDo1MDA7bWFyZ2luOi0xcmVtIDAgLjVyZW07cGFkZGluZy10b3A6MS43NXJlbX0uYXJ0aWNsZS0tY29udGVudCBoNHtmb250LXNpemU6MS4zNXJlbTtmb250LXN0eWxlOml0YWxpYztmb250LXdlaWdodDo1MDA7bWFyZ2luOi0xLjI1cmVtIDAgLjVyZW07cGFkZGluZy10b3A6MS43NXJlbTtjb2xvcjojRkFGQUZDfS5hcnRpY2xlLS1jb250ZW50IGg1e2ZvbnQtc2l6ZToxLjFyZW07bWFyZ2luOi0xLjI1cmVtIDAgLjI1cmVtO3BhZGRpbmctdG9wOjEuNzVyZW19LmFydGljbGUtLWNvbnRlbnQgaDZ7Zm9udC1zaXplOjEuMXJlbTtmb250LXN0eWxlOml0YWxpYzttYXJnaW46LTEuMjVyZW0gMCAuMjVyZW07cGFkZGluZy10b3A6MS43NXJlbX0uYXJ0aWNsZS0tY29udGVudCBwLC5hcnRpY2xlLS1jb250ZW50IGxpe2NvbG9yOiNENEQ3REQ7bGluZS1oZWlnaHQ6MS44cmVtfS5hcnRpY2xlLS1jb250ZW50IHB7bWFyZ2luOjAgMCAxLjVlbX0uYXJ0aWNsZS0tY29udGVudCBhe2NvbG9yOiMwMEEzRkY7Zm9udC13ZWlnaHQ6NTAwO3RleHQtZGVjb3JhdGlvbjpub25lfS5hcnRpY2xlLS1jb250ZW50IGE6aG92ZXJ7Y29sb3I6I2ZmZn0uYXJ0aWNsZS0tY29udGVudCBhLmhlbHAtbGlua3tkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxcmVtO2hlaWdodDoxcmVtO2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6IzE0MTQxRn0uYXJ0aWNsZS0tY29udGVudCBzdHJvbmd7Y29sb3I6I0ZBRkFGQ30uYXJ0aWNsZS0tY29udGVudCBpbWd7bWF4LXdpZHRoOjEwMCU7bWFyZ2luLWJvdHRvbToycmVtO2JvcmRlci1yYWRpdXM6M3B4O2JveC1zaGFkb3c6MXB4IDNweCAxMHB4ICMwNzA3MEV9LmFydGljbGUtLWNvbnRlbnQgdWwrcD5pbWd7bWFyZ2luLXRvcDoxLjVyZW19LmFydGljbGUtLWNvbnRlbnQgaHJ7Ym9yZGVyLXdpZHRoOjFweCAwIDA7Ym9yZGVyLWNvbG9yOiMzODM4NDY7Ym9yZGVyLXN0eWxlOnNvbGlkO21hcmdpbjoxLjg1cmVtIDAgMS43NXJlbX0uYXJ0aWNsZS0tY29udGVudCAuYmFkZ2V7Zm9udC1zaXplOi43cmVtO21hcmdpbjowIC4ycmVtO3BhZGRpbmc6LjFyZW0gLjRyZW07Ym9yZGVyLXJhZGl1czouNnJlbTtmb250LXdlaWdodDpib2xkO3ZlcnRpY2FsLWFsaWduOnRvcH0uYXJ0aWNsZS0tY29udGVudCAuYmFkZ2UuZHZje2NvbG9yOiMyZTdkMmU7YmFja2dyb3VuZC1jb2xvcjojZThmNWU4fS5hcnRpY2xlLS1jb250ZW50IC5iYWRnZS5sdmN7Y29sb3I6IzE5NzZkMjtiYWNrZ3JvdW5kLWNvbG9yOiNlM2YyZmR9LmFydGljbGUtLWNvbnRlbnQgLmJhZGdlLmV4cGVyaW1lbnRhbHtjb2xvcjojZmU5ZGJjO2JhY2tncm91bmQtY29sb3I6cmdiYSgyMTEsOSwxMTMsMC4xMil9LmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSwuYXJ0aWNsZS0tY29udGVudCAuYmxvY2t7cGFkZGluZzoxLjY1cmVtIDJyZW0gLjFyZW0gMnJlbTttYXJnaW46MXJlbSAwIDJyZW07Ym9yZGVyLXdpZHRoOjAgMCAwIDRweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXJhZGl1czowIDJweCAycHggMDtmb250LXNpemU6MS4wNXJlbX0uYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIHVsOmxhc3QtY2hpbGQsLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBvbDpsYXN0LWNoaWxkLC5hcnRpY2xlLS1jb250ZW50IC5ibG9jayB1bDpsYXN0LWNoaWxkLC5hcnRpY2xlLS1jb250ZW50IC5ibG9jayBvbDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MS44NXJlbX0uYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlPmgyOmZpcnN0LWNoaWxkLC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGU+aDM6Zmlyc3QtY2hpbGQsLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZT5oNDpmaXJzdC1jaGlsZCwuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlPmg1OmZpcnN0LWNoaWxkLC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGU+aDY6Zmlyc3QtY2hpbGQsLmFydGljbGUtLWNvbnRlbnQgLmJsb2NrPmgyOmZpcnN0LWNoaWxkLC5hcnRpY2xlLS1jb250ZW50IC5ibG9jaz5oMzpmaXJzdC1jaGlsZCwuYXJ0aWNsZS0tY29udGVudCAuYmxvY2s+aDQ6Zmlyc3QtY2hpbGQsLmFydGljbGUtLWNvbnRlbnQgLmJsb2NrPmg1OmZpcnN0LWNoaWxkLC5hcnRpY2xlLS1jb250ZW50IC5ibG9jaz5oNjpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjA7cGFkZGluZy10b3A6MC4yNWVtfS5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUubm90ZSwuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlLnRpcCwuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlLmltcG9ydGFudCwuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlLndhcm5pbmcsLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZS53YXJuLC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUuY2F1dGlvbiwuYXJ0aWNsZS0tY29udGVudCAuYmxvY2subm90ZSwuYXJ0aWNsZS0tY29udGVudCAuYmxvY2sudGlwLC5hcnRpY2xlLS1jb250ZW50IC5ibG9jay5pbXBvcnRhbnQsLmFydGljbGUtLWNvbnRlbnQgLmJsb2NrLndhcm5pbmcsLmFydGljbGUtLWNvbnRlbnQgLmJsb2NrLndhcm4sLmFydGljbGUtLWNvbnRlbnQgLmJsb2NrLmNhdXRpb257cG9zaXRpb246cmVsYXRpdmV9LmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZS5ub3RlOmJlZm9yZSwuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlLnRpcDpiZWZvcmUsLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZS5pbXBvcnRhbnQ6YmVmb3JlLC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUud2FybmluZzpiZWZvcmUsLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZS53YXJuOmJlZm9yZSwuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlLmNhdXRpb246YmVmb3JlLC5hcnRpY2xlLS1jb250ZW50IC5ibG9jay5ub3RlOmJlZm9yZSwuYXJ0aWNsZS0tY29udGVudCAuYmxvY2sudGlwOmJlZm9yZSwuYXJ0aWNsZS0tY29udGVudCAuYmxvY2suaW1wb3J0YW50OmJlZm9yZSwuYXJ0aWNsZS0tY29udGVudCAuYmxvY2sud2FybmluZzpiZWZvcmUsLmFydGljbGUtLWNvbnRlbnQgLmJsb2NrLndhcm46YmVmb3JlLC5hcnRpY2xlLS1jb250ZW50IC5ibG9jay5jYXV0aW9uOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtmb250LWZhbWlseTpcImFsZXJ0LWljb25zXCI7Zm9udC1zaXplOjFlbTtsaW5lLWhlaWdodDoxZW07cGFkZGluZzouM3JlbTt0ZXh0LWFsaWduOmNlbnRlcjt0b3A6LS41cmVtO2xlZnQ6LS45NXJlbTtkaXNwbGF5OmJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO2JveC1zaGFkb3c6MXB4IDNweCA1cHggcmdiYSg3LDcsMTQsMC41KX0uYXJ0aWNsZS0tY29udGVudCBoMisubm90ZSwuYXJ0aWNsZS0tY29udGVudCBoMisudGlwLC5hcnRpY2xlLS1jb250ZW50IGgyKy5pbXBvcnRhbnQsLmFydGljbGUtLWNvbnRlbnQgaDIrLndhcm5pbmcsLmFydGljbGUtLWNvbnRlbnQgaDIrLmNhdXRpb24sLmFydGljbGUtLWNvbnRlbnQgaDMrLm5vdGUsLmFydGljbGUtLWNvbnRlbnQgaDMrLnRpcCwuYXJ0aWNsZS0tY29udGVudCBoMysuaW1wb3J0YW50LC5hcnRpY2xlLS1jb250ZW50IGgzKy53YXJuaW5nLC5hcnRpY2xlLS1jb250ZW50IGgzKy5jYXV0aW9uLC5hcnRpY2xlLS1jb250ZW50IGg0Ky5ub3RlLC5hcnRpY2xlLS1jb250ZW50IGg0Ky50aXAsLmFydGljbGUtLWNvbnRlbnQgaDQrLmltcG9ydGFudCwuYXJ0aWNsZS0tY29udGVudCBoNCsud2FybmluZywuYXJ0aWNsZS0tY29udGVudCBoNCsuY2F1dGlvbiwuYXJ0aWNsZS0tY29udGVudCBoNSsubm90ZSwuYXJ0aWNsZS0tY29udGVudCBoNSsudGlwLC5hcnRpY2xlLS1jb250ZW50IGg1Ky5pbXBvcnRhbnQsLmFydGljbGUtLWNvbnRlbnQgaDUrLndhcm5pbmcsLmFydGljbGUtLWNvbnRlbnQgaDUrLmNhdXRpb24sLmFydGljbGUtLWNvbnRlbnQgaDYrLm5vdGUsLmFydGljbGUtLWNvbnRlbnQgaDYrLnRpcCwuYXJ0aWNsZS0tY29udGVudCBoNisuaW1wb3J0YW50LC5hcnRpY2xlLS1jb250ZW50IGg2Ky53YXJuaW5nLC5hcnRpY2xlLS1jb250ZW50IGg2Ky5jYXV0aW9ue21hcmdpbi10b3A6MS4yNXJlbX0uYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3Rle3BhZGRpbmc6MXJlbSAxcmVtIDFyZW0gMS4yNXJlbTtib3JkZXItY29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjI1KX0uYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIHAsLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBsaXtmb250LXNpemU6MS4xNXJlbTtmb250LXN0eWxlOml0YWxpYztjb2xvcjpyZ2JhKDIxMiwyMTUsMjIxLDAuNSl9LmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSAqOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgLmNpdGV7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOi0xcmVtO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtc2l6ZTouODVyZW07b3BhY2l0eTouOH0uYXJ0aWNsZS0tY29udGVudD5wIHNwYW4uY2l0ZXt2ZXJ0aWNhbC1hbGlnbjpzdXBlcjtsaW5lLWhlaWdodDowO2ZvbnQtc2l6ZTouN3JlbTtmb250LXN0eWxlOml0YWxpY31AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpey5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUsLmFydGljbGUtLWNvbnRlbnQgLmJsb2Nre3BhZGRpbmc6MS4zNXJlbSAxLjI1cmVtIC4xcmVtIDEuMjVyZW07bWFyZ2luOi41cmVtIDAgMXJlbX19LmFydGljbGUtLWNvbnRlbnQgLm5vdGU6YmVmb3Jle2NvbnRlbnQ6XCJOXCI7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiMwMEEzRkZ9LmFydGljbGUtLWNvbnRlbnQgLm5vdGV7Ym9yZGVyLWNvbG9yOiMwMEEzRkY7YmFja2dyb3VuZDpyZ2JhKDAsMTYzLDI1NSwwLjEpfS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGgxLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGgyLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGgzLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGg0LC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGg1LC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGg2e2NvbG9yOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgLm5vdGUgaDEgYSwuYXJ0aWNsZS0tY29udGVudCAubm90ZSBoMiBhLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGgzIGEsLmFydGljbGUtLWNvbnRlbnQgLm5vdGUgaDQgYSwuYXJ0aWNsZS0tY29udGVudCAubm90ZSBoNSBhLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGg2IGF7Y29sb3I6aW5oZXJpdCAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGgxIGE6aG92ZXIsLmFydGljbGUtLWNvbnRlbnQgLm5vdGUgaDIgYTpob3ZlciwuYXJ0aWNsZS0tY29udGVudCAubm90ZSBoMyBhOmhvdmVyLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGg0IGE6aG92ZXIsLmFydGljbGUtLWNvbnRlbnQgLm5vdGUgaDUgYTpob3ZlciwuYXJ0aWNsZS0tY29udGVudCAubm90ZSBoNiBhOmhvdmVye2NvbG9yOmluaGVyaXQgIWltcG9ydGFudH0uYXJ0aWNsZS0tY29udGVudCAubm90ZSBwLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGxpe2NvbG9yOiNCRUYwRkZ9LmFydGljbGUtLWNvbnRlbnQgLm5vdGUgc3Ryb25ne2NvbG9yOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgLm5vdGUgYXtjb2xvcjojZmZmfS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGEgY29kZTphZnRlcntib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgcmdiYSgwLDIwMSwyNTUsMC4zNSkgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnR9LmFydGljbGUtLWNvbnRlbnQgLm5vdGUgYTpob3Zlcntjb2xvcjojNkJERkZGfS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGE6aG92ZXIgY29kZTphZnRlcntib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgIzZCREZGRiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudH0uYXJ0aWNsZS0tY29udGVudCAubm90ZSBvbCBsaTpiZWZvcmV7Y29sb3I6I0JFRjBGRn0uYXJ0aWNsZS0tY29udGVudCAubm90ZSBjb2RlLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIHByZXtjb2xvcjojMDBDOUZGO2JhY2tncm91bmQ6IzBhMDcxY30uYXJ0aWNsZS0tY29udGVudCAubm90ZSBpbWd7Ym94LXNoYWRvdzoxcHggM3B4IDEwcHggIzBGMEUxNX0uYXJ0aWNsZS0tY29udGVudCAubm90ZSB0YWJsZXtjb2xvcjojQkVGMEZGO2JveC1zaGFkb3c6MXB4IDNweCAxMHB4ICMwRjBFMTV9LmFydGljbGUtLWNvbnRlbnQgLm5vdGUgdGFibGUgdGhlYWR7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICMwQjNBOEQsIzA2NkZDNSl9LmFydGljbGUtLWNvbnRlbnQgLm5vdGUgdGFibGUgdHI6bnRoLWNoaWxkKGV2ZW4pIHRke2JhY2tncm91bmQ6IzFiM2E1OH0uYXJ0aWNsZS0tY29udGVudCAubm90ZSBibG9ja3F1b3Rle2JvcmRlci1jb2xvcjpyZ2JhKDE5MCwyNDAsMjU1LDAuMjUpfS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIGJsb2NrcXVvdGUgcHtjb2xvcjpyZ2JhKDE5MCwyNDAsMjU1LDAuNil9LmFydGljbGUtLWNvbnRlbnQgLm5vdGUgLmNvZGUtdGFicy13cmFwcGVyIC5jb2RlLXRhYnMgYXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOnJnYmEoMTkwLDI0MCwyNTUsMC41KX0uYXJ0aWNsZS0tY29udGVudCAubm90ZSAuY29kZS10YWJzLXdyYXBwZXIgLmNvZGUtdGFicyBhOmhvdmVye2NvbG9yOiNiZWYwZmZ9LmFydGljbGUtLWNvbnRlbnQgLm5vdGUgLmNvZGUtdGFicy13cmFwcGVyIC5jb2RlLXRhYnMgYS5pcy1hY3RpdmV7Y29sb3I6I2JlZjBmZjtiYWNrZ3JvdW5kOiMwYTA3MWN9LmFydGljbGUtLWNvbnRlbnQgLm5vdGUgaHIsLmFydGljbGUtLWNvbnRlbnQgLm5vdGUgLmV4cGFuZHtib3JkZXItY29sb3I6cmdiYSgwLDE2MywyNTUsMC40KSAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIHByZTo6LXdlYmtpdC1zY3JvbGxiYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDEwLDcsMjgsMCk7d2lkdGg6MTJweDtoZWlnaHQ6MTJweH0uYXJ0aWNsZS0tY29udGVudCAubm90ZSBwcmU6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNre2JhY2tncm91bmQtY29sb3I6IzBhMDcxYztib3JkZXItcmFkaXVzOjAgMCAycHggMnB4fS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIHByZTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojMTkyYTNhO2JvcmRlcjozcHggc29saWQgIzBhMDcxYztib3JkZXItcmFkaXVzOjZweH0uYXJ0aWNsZS0tY29udGVudCAubm90ZSB0YWJsZTo6LXdlYmtpdC1zY3JvbGxiYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI3LDU4LDg4LDApO3dpZHRoOjEycHg7aGVpZ2h0OjEycHh9LmFydGljbGUtLWNvbnRlbnQgLm5vdGUgdGFibGU6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNre2JhY2tncm91bmQtY29sb3I6IzFiM2E1ODtib3JkZXItcmFkaXVzOjAgMCAycHggMnB4fS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIHRhYmxlOjotd2Via2l0LXNjcm9sbGJhci10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiMxOTJhM2E7Ym9yZGVyOjNweCBzb2xpZCAjMWIzYTU4O2JvcmRlci1yYWRpdXM6NnB4fS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHR7Y29sb3I6IzAwQzlGRn0uYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5naCwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5nbywuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5uYSwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5udCwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5udiwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5vd3tjb2xvcjojMDBDOUZGfS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmMsLmFydGljbGUtLWNvbnRlbnQgLm5vdGUgLmhpZ2hsaWdodCAuY2gsLmFydGljbGUtLWNvbnRlbnQgLm5vdGUgLmhpZ2hsaWdodCAuY20sLmFydGljbGUtLWNvbnRlbnQgLm5vdGUgLmhpZ2hsaWdodCAuY3BmLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmMxLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmNzLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLnd7Y29sb3I6IzU2NzM3NX0uYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5naXtiYWNrZ3JvdW5kLWNvbG9yOiM1NjczNzV9LmFydGljbGUtLWNvbnRlbnQgLm5vdGUgLmhpZ2hsaWdodCAuaywuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5rYywuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5rZCwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5rbiwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5rcCwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5rciwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5ubntjb2xvcjojMDBBM0ZGfS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmJwLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmNwLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmRsLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmd0LC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmd1LC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmt0LC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLm5iLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLm5jLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLm5vLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLnNhLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLnNiLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLnNjLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLnNkLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLnNlLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLnNoLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLnN4LC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLnNyLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLnMxLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLnMye2NvbG9yOiMwMDlGNUZ9LmFydGljbGUtLWNvbnRlbnQgLm5vdGUgLmhpZ2hsaWdodCAuZXJyLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmZtLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmdyLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmdkLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLm5kLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLm5lLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLm5mLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLm5sLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLnNpe2NvbG9yOiNCRjNENUV9LmFydGljbGUtLWNvbnRlbnQgLm5vdGUgLmhpZ2hsaWdodCAubSwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5uaSwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5tYiwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5tZiwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5taCwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5taSwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5tbywuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC52YywuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC52ZywuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC52aSwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC52bSwuYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5pbHtjb2xvcjojZmY2ZGIwfS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmdwLC5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLm97Y29sb3I6IzAwQTNGRn0uYXJ0aWNsZS0tY29udGVudCAubm90ZSAuaGlnaGxpZ2h0IC5zc3tjb2xvcjojZTkwfS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmxhbmd1YWdlLWpzIC5taSsubngsLmFydGljbGUtLWNvbnRlbnQgLm5vdGUgLmhpZ2hsaWdodCAubGFuZ3VhZ2UtanMgLm1mKy5ueHtjb2xvcjojZmY2ZGIwfS5hcnRpY2xlLS1jb250ZW50IC5ub3RlIC5oaWdobGlnaHQgLmxhbmd1YWdlLXNxbCAubWkrLm57Y29sb3I6I2ZmNmRiMH0uYXJ0aWNsZS0tY29udGVudCAudGlwe2JvcmRlci1jb2xvcjojMDA5RjVGO2JhY2tncm91bmQ6cmdiYSgwLDE1OSw5NSwwLjEyKX0uYXJ0aWNsZS0tY29udGVudCAudGlwOmJlZm9yZXtjb250ZW50OlwiVFwiO2NvbG9yOiNmZmY7YmFja2dyb3VuZDojMDA5RjVGfS5hcnRpY2xlLS1jb250ZW50IC50aXAgaDEsLmFydGljbGUtLWNvbnRlbnQgLnRpcCBoMiwuYXJ0aWNsZS0tY29udGVudCAudGlwIGgzLC5hcnRpY2xlLS1jb250ZW50IC50aXAgaDQsLmFydGljbGUtLWNvbnRlbnQgLnRpcCBoNSwuYXJ0aWNsZS0tY29udGVudCAudGlwIGg2e2NvbG9yOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgLnRpcCBoMSBhLC5hcnRpY2xlLS1jb250ZW50IC50aXAgaDIgYSwuYXJ0aWNsZS0tY29udGVudCAudGlwIGgzIGEsLmFydGljbGUtLWNvbnRlbnQgLnRpcCBoNCBhLC5hcnRpY2xlLS1jb250ZW50IC50aXAgaDUgYSwuYXJ0aWNsZS0tY29udGVudCAudGlwIGg2IGF7Y29sb3I6aW5oZXJpdCAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC50aXAgaDEgYTpob3ZlciwuYXJ0aWNsZS0tY29udGVudCAudGlwIGgyIGE6aG92ZXIsLmFydGljbGUtLWNvbnRlbnQgLnRpcCBoMyBhOmhvdmVyLC5hcnRpY2xlLS1jb250ZW50IC50aXAgaDQgYTpob3ZlciwuYXJ0aWNsZS0tY29udGVudCAudGlwIGg1IGE6aG92ZXIsLmFydGljbGUtLWNvbnRlbnQgLnRpcCBoNiBhOmhvdmVye2NvbG9yOmluaGVyaXQgIWltcG9ydGFudH0uYXJ0aWNsZS0tY29udGVudCAudGlwIHAsLmFydGljbGUtLWNvbnRlbnQgLnRpcCBsaXtjb2xvcjojNjdENzRFfS5hcnRpY2xlLS1jb250ZW50IC50aXAgc3Ryb25ne2NvbG9yOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgLnRpcCBhe2NvbG9yOiNDNkY5OEV9LmFydGljbGUtLWNvbnRlbnQgLnRpcCBhIGNvZGU6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHJnYmEoMTQ3LDE0OCwyNTUsMC4zNSkgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnR9LmFydGljbGUtLWNvbnRlbnQgLnRpcCBhOmhvdmVye2NvbG9yOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgLnRpcCBhOmhvdmVyIGNvZGU6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50ICNmZmYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnR9LmFydGljbGUtLWNvbnRlbnQgLnRpcCBvbCBsaTpiZWZvcmV7Y29sb3I6IzY3RDc0RX0uYXJ0aWNsZS0tY29udGVudCAudGlwIGNvZGUsLmFydGljbGUtLWNvbnRlbnQgLnRpcCBwcmV7Y29sb3I6IzkzOTRGRjtiYWNrZ3JvdW5kOiMwNDBkMGV9LmFydGljbGUtLWNvbnRlbnQgLnRpcCBpbWd7Ym94LXNoYWRvdzoxcHggM3B4IDEwcHggIzBGMEUxNX0uYXJ0aWNsZS0tY29udGVudCAudGlwIHRhYmxle2NvbG9yOiM2N0Q3NEU7Ym94LXNoYWRvdzoxcHggM3B4IDEwcHggIzBGMEUxNX0uYXJ0aWNsZS0tY29udGVudCAudGlwIHRhYmxlIHRoZWFke2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjMDA2RjQ5LCMwMDlGNUYpfS5hcnRpY2xlLS1jb250ZW50IC50aXAgdGFibGUgdHI6bnRoLWNoaWxkKGV2ZW4pIHRke2JhY2tncm91bmQ6IzFhM2MzNH0uYXJ0aWNsZS0tY29udGVudCAudGlwIGJsb2NrcXVvdGV7Ym9yZGVyLWNvbG9yOnJnYmEoMTAzLDIxNSw3OCwwLjI1KX0uYXJ0aWNsZS0tY29udGVudCAudGlwIGJsb2NrcXVvdGUgcHtjb2xvcjpyZ2JhKDEwMywyMTUsNzgsMC42KX0uYXJ0aWNsZS0tY29udGVudCAudGlwIC5jb2RlLXRhYnMtd3JhcHBlciAuY29kZS10YWJzIGF7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjpyZ2JhKDEwMywyMTUsNzgsMC41KX0uYXJ0aWNsZS0tY29udGVudCAudGlwIC5jb2RlLXRhYnMtd3JhcHBlciAuY29kZS10YWJzIGE6aG92ZXJ7Y29sb3I6IzY3ZDc0ZX0uYXJ0aWNsZS0tY29udGVudCAudGlwIC5jb2RlLXRhYnMtd3JhcHBlciAuY29kZS10YWJzIGEuaXMtYWN0aXZle2NvbG9yOiM2N2Q3NGU7YmFja2dyb3VuZDojMDQwZDBlfS5hcnRpY2xlLS1jb250ZW50IC50aXAuZmxleHtmb250LXN0eWxlOml0YWxpYztkaXNwbGF5OmZsZXh9LmFydGljbGUtLWNvbnRlbnQgLnRpcC5mbGV4IGRpdjpmaXJzdC1jaGlsZHtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46LjI1cmVtIDJyZW0gMCAwfS5hcnRpY2xlLS1jb250ZW50IC50aXAgaHIsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuZXhwYW5ke2JvcmRlci1jb2xvcjpyZ2JhKDAsMTU5LDk1LDAuNCkgIWltcG9ydGFudH0uYXJ0aWNsZS0tY29udGVudCAudGlwIHByZTo6LXdlYmtpdC1zY3JvbGxiYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDQsMTMsMTQsMCk7d2lkdGg6MTJweDtoZWlnaHQ6MTJweH0uYXJ0aWNsZS0tY29udGVudCAudGlwIHByZTo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2t7YmFja2dyb3VuZC1jb2xvcjojMDQwZDBlO2JvcmRlci1yYWRpdXM6MCAwIDJweCAycHh9LmFydGljbGUtLWNvbnRlbnQgLnRpcCBwcmU6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JhY2tncm91bmQtY29sb3I6IzE2MjYyNztib3JkZXI6M3B4IHNvbGlkICMwNDBkMGU7Ym9yZGVyLXJhZGl1czo2cHh9LmFydGljbGUtLWNvbnRlbnQgLnRpcCB0YWJsZTo6LXdlYmtpdC1zY3JvbGxiYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI2LDYwLDUyLDApO3dpZHRoOjEycHg7aGVpZ2h0OjEycHh9LmFydGljbGUtLWNvbnRlbnQgLnRpcCB0YWJsZTo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2t7YmFja2dyb3VuZC1jb2xvcjojMWEzYzM0O2JvcmRlci1yYWRpdXM6MCAwIDJweCAycHh9LmFydGljbGUtLWNvbnRlbnQgLnRpcCB0YWJsZTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojMTYyNjI3O2JvcmRlcjozcHggc29saWQgIzFhM2MzNDtib3JkZXItcmFkaXVzOjZweH0uYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHR7Y29sb3I6IzkzOTRGRn0uYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLmdoLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAuZ28sLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5uYSwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLm50LC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAubnYsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5vd3tjb2xvcjojOTM5NEZGfS5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAuYywuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLmNoLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAuY20sLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5jcGYsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5jMSwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLmNzLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAud3tjb2xvcjojNTY3Mzc1fS5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAuZ2l7YmFja2dyb3VuZC1jb2xvcjojNTY3Mzc1fS5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAuaywuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLmtjLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAua2QsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5rbiwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLmtwLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAua3IsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5ubntjb2xvcjojMDBBM0ZGfS5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAuYnAsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5jcCwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLmRsLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAuZ3QsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5ndSwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLmt0LC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAubmIsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5uYywuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLm5vLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAuc2EsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5zYiwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLnNjLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAuc2QsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5zZSwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLnNoLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAuc3gsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5zciwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLnMxLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAuczJ7Y29sb3I6IzAwOUY1Rn0uYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLmVyciwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLmZtLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAuZ3IsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5nZCwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLm5kLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAubmUsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5uZiwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLm5sLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAuc2l7Y29sb3I6I0JGM0Q1RX0uYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLm0sLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5uaSwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLm1iLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAubWYsLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5taCwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLm1pLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAubW8sLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC52YywuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLnZnLC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAudmksLmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC52bSwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLmlse2NvbG9yOiNmZjZkYjB9LmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5ncCwuYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLm97Y29sb3I6IzAwQTNGRn0uYXJ0aWNsZS0tY29udGVudCAudGlwIC5oaWdobGlnaHQgLnNze2NvbG9yOiNlOTB9LmFydGljbGUtLWNvbnRlbnQgLnRpcCAuaGlnaGxpZ2h0IC5sYW5ndWFnZS1qcyAubWkrLm54LC5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAubGFuZ3VhZ2UtanMgLm1mKy5ueHtjb2xvcjojZmY2ZGIwfS5hcnRpY2xlLS1jb250ZW50IC50aXAgLmhpZ2hsaWdodCAubGFuZ3VhZ2Utc3FsIC5taSsubntjb2xvcjojZmY2ZGIwfS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnR7Ym9yZGVyLWNvbG9yOiM5Mzk0RkY7YmFja2dyb3VuZDpyZ2JhKDE0NywxNDgsMjU1LDAuMTUpfS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQ6YmVmb3Jle2NvbnRlbnQ6XCJJXCI7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiM5Mzk0RkZ9LmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCBoMSwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IGgyLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgaDMsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCBoNCwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IGg1LC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgaDZ7Y29sb3I6I2ZmZn0uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IGgxIGEsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCBoMiBhLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgaDMgYSwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IGg0IGEsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCBoNSBhLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgaDYgYXtjb2xvcjppbmhlcml0ICFpbXBvcnRhbnR9LmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCBoMSBhOmhvdmVyLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgaDIgYTpob3ZlciwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IGgzIGE6aG92ZXIsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCBoNCBhOmhvdmVyLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgaDUgYTpob3ZlciwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IGg2IGE6aG92ZXJ7Y29sb3I6aW5oZXJpdCAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgcCwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IGxpe2NvbG9yOiNCN0I4RkZ9LmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCBzdHJvbmd7Y29sb3I6I2ZmZn0uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IGF7Y29sb3I6Izc5N2FmZn0uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IGEgY29kZTphZnRlcntib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgcmdiYSgxNTksMTQ2LDI1NSwwLjM1KSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudH0uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IGE6aG92ZXJ7Y29sb3I6I2ZmZn0uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IGE6aG92ZXIgY29kZTphZnRlcntib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgI2ZmZiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudH0uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IG9sIGxpOmJlZm9yZXtjb2xvcjojQjdCOEZGfS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgY29kZSwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IHByZXtjb2xvcjojOWY5MmZmO2JhY2tncm91bmQ6IzBhMDcxY30uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IGltZ3tib3gtc2hhZG93OjFweCAzcHggMTBweCAjMTExMTFkfS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgdGFibGV7Y29sb3I6I0I3QjhGRjtib3gtc2hhZG93OjFweCAzcHggMTBweCAjMTExMTFkfS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgdGFibGUgdGhlYWR7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICM1MTNDQzYsIzkzOTRGRil9LmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCB0YWJsZSB0cjpudGgtY2hpbGQoZXZlbikgdGR7YmFja2dyb3VuZDojMWIxYjMzfS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgYmxvY2txdW90ZXtib3JkZXItY29sb3I6cmdiYSgxODMsMTg0LDI1NSwwLjI1KX0uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IGJsb2NrcXVvdGUgcHtjb2xvcjpyZ2JhKDE4MywxODQsMjU1LDAuNil9LmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuY29kZS10YWJzLXdyYXBwZXIgLmNvZGUtdGFicyBhe2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6cmdiYSgxODMsMTg0LDI1NSwwLjUpfS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmNvZGUtdGFicy13cmFwcGVyIC5jb2RlLXRhYnMgYTpob3Zlcntjb2xvcjojYjdiOGZmfS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmNvZGUtdGFicy13cmFwcGVyIC5jb2RlLXRhYnMgYS5pcy1hY3RpdmV7Y29sb3I6I2I3YjhmZjtiYWNrZ3JvdW5kOiMwYTA3MWN9LmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCBociwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5leHBhbmR7Ym9yZGVyLWNvbG9yOnJnYmEoMTQ3LDE0OCwyNTUsMC40KSAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgcHJlOjotd2Via2l0LXNjcm9sbGJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTAsNywyOCwwKTt3aWR0aDoxMnB4O2hlaWdodDoxMnB4fS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgcHJlOjotd2Via2l0LXNjcm9sbGJhci10cmFja3tiYWNrZ3JvdW5kLWNvbG9yOiMwYTA3MWM7Ym9yZGVyLXJhZGl1czowIDAgMnB4IDJweH0uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IHByZTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojNTY1MTllO2JvcmRlcjozcHggc29saWQgIzBhMDcxYztib3JkZXItcmFkaXVzOjZweH0uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IHRhYmxlOjotd2Via2l0LXNjcm9sbGJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjcsMjcsNTEsMCk7d2lkdGg6MTJweDtoZWlnaHQ6MTJweH0uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IHRhYmxlOjotd2Via2l0LXNjcm9sbGJhci10cmFja3tiYWNrZ3JvdW5kLWNvbG9yOiMxYjFiMzM7Ym9yZGVyLXJhZGl1czowIDAgMnB4IDJweH0uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IHRhYmxlOjotd2Via2l0LXNjcm9sbGJhci10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiM1NjUxOWU7Ym9yZGVyOjNweCBzb2xpZCAjMWIxYjMzO2JvcmRlci1yYWRpdXM6NnB4fS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodHtjb2xvcjojOWY5MmZmfS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAuZ2gsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5nbywuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLm5hLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAubnQsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5udiwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLm93e2NvbG9yOiM5ZjkyZmZ9LmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5jLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAuY2gsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5jbSwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLmNwZiwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLmMxLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAuY3MsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC53e2NvbG9yOiM1ZjUxYWN9LmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5naXtiYWNrZ3JvdW5kLWNvbG9yOiM1ZjUxYWN9LmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5rLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAua2MsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5rZCwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLmtuLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAua3AsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5rciwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLm5ue2NvbG9yOiM1MTNDQzZ9LmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5icCwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLmNwLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAuZGwsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5ndCwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLmd1LC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAua3QsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5uYiwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLm5jLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAubm8sLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5zYSwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLnNiLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAuc2MsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5zZCwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLnNlLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAuc2gsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5zeCwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLnNyLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAuczEsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5zMntjb2xvcjojMDA5YTY0fS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAuZXJyLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAuZm0sLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5nciwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLmdkLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAubmQsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5uZSwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLm5mLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAubmwsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5zaXtjb2xvcjojQkYzRDVFfS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAubSwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLm5pLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAubWIsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5tZiwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLm1oLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAubWksLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5tbywuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLnZjLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAudmcsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC52aSwuYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLnZtLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAuaWx7Y29sb3I6I2UyNGJiYn0uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLmdwLC5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAub3tjb2xvcjojMDBhNWVifS5hcnRpY2xlLS1jb250ZW50IC5pbXBvcnRhbnQgLmhpZ2hsaWdodCAuc3N7Y29sb3I6I2U5MH0uYXJ0aWNsZS0tY29udGVudCAuaW1wb3J0YW50IC5oaWdobGlnaHQgLmxhbmd1YWdlLWpzIC5taSsubngsLmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5sYW5ndWFnZS1qcyAubWYrLm54e2NvbG9yOiNlMjRiYmJ9LmFydGljbGUtLWNvbnRlbnQgLmltcG9ydGFudCAuaGlnaGxpZ2h0IC5sYW5ndWFnZS1zcWwgLm1pKy5ue2NvbG9yOiNlMjRiYmJ9LmFydGljbGUtLWNvbnRlbnQgLndhcm4sLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmd7Ym9yZGVyLWNvbG9yOiNGRjg1NjQ7YmFja2dyb3VuZDpyZ2JhKDI1NSw5NywxMzMsMC4xMDE5NjEpfS5hcnRpY2xlLS1jb250ZW50IC53YXJuOmJlZm9yZSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZzpiZWZvcmV7Y29udGVudDpcIldcIjtjb2xvcjojZmZmO2JhY2tncm91bmQ6I0ZGODU2NH0uYXJ0aWNsZS0tY29udGVudCAud2FybiBoMSwuYXJ0aWNsZS0tY29udGVudCAud2FybiBoMiwuYXJ0aWNsZS0tY29udGVudCAud2FybiBoMywuYXJ0aWNsZS0tY29udGVudCAud2FybiBoNCwuYXJ0aWNsZS0tY29udGVudCAud2FybiBoNSwuYXJ0aWNsZS0tY29udGVudCAud2FybiBoNiwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBoMSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBoMiwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBoMywuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBoNCwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBoNSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBoNntjb2xvcjojZmZmfS5hcnRpY2xlLS1jb250ZW50IC53YXJuIGgxIGEsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gaDIgYSwuYXJ0aWNsZS0tY29udGVudCAud2FybiBoMyBhLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIGg0IGEsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gaDUgYSwuYXJ0aWNsZS0tY29udGVudCAud2FybiBoNiBhLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIGgxIGEsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgaDIgYSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBoMyBhLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIGg0IGEsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgaDUgYSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBoNiBhe2NvbG9yOmluaGVyaXQgIWltcG9ydGFudH0uYXJ0aWNsZS0tY29udGVudCAud2FybiBoMSBhOmhvdmVyLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIGgyIGE6aG92ZXIsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gaDMgYTpob3ZlciwuYXJ0aWNsZS0tY29udGVudCAud2FybiBoNCBhOmhvdmVyLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIGg1IGE6aG92ZXIsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gaDYgYTpob3ZlciwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBoMSBhOmhvdmVyLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIGgyIGE6aG92ZXIsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgaDMgYTpob3ZlciwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBoNCBhOmhvdmVyLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIGg1IGE6aG92ZXIsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgaDYgYTpob3Zlcntjb2xvcjppbmhlcml0ICFpbXBvcnRhbnR9LmFydGljbGUtLWNvbnRlbnQgLndhcm4gcCwuYXJ0aWNsZS0tY29udGVudCAud2FybiBsaSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBwLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIGxpe2NvbG9yOiNGRkI2QTB9LmFydGljbGUtLWNvbnRlbnQgLndhcm4gc3Ryb25nLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIHN0cm9uZ3tjb2xvcjojZmZmfS5hcnRpY2xlLS1jb250ZW50IC53YXJuIGEsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgYXtjb2xvcjojRkZEQ0NGICFpbXBvcnRhbnR9LmFydGljbGUtLWNvbnRlbnQgLndhcm4gYSBjb2RlOmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIGEgY29kZTphZnRlcntib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgcmdiYSgyMzYsMTEwLDExMCwwLjM1KSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudH0uYXJ0aWNsZS0tY29udGVudCAud2FybiBhOmhvdmVyLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIGE6aG92ZXJ7Y29sb3I6I2ZmZiAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC53YXJuIGE6aG92ZXIgY29kZTphZnRlciwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBhOmhvdmVyIGNvZGU6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50ICNmZmYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnR9LmFydGljbGUtLWNvbnRlbnQgLndhcm4gb2wgbGk6YmVmb3JlLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIG9sIGxpOmJlZm9yZXtjb2xvcjojRkZCNkEwfS5hcnRpY2xlLS1jb250ZW50IC53YXJuIGNvZGUsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gcHJlLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIGNvZGUsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgcHJle2NvbG9yOiNlYzZlNmU7YmFja2dyb3VuZDojMGQwNjEwfS5hcnRpY2xlLS1jb250ZW50IC53YXJuIGltZywuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBpbWd7Ym94LXNoYWRvdzoxcHggM3B4IDEwcHggIzBkMDYxMH0uYXJ0aWNsZS0tY29udGVudCAud2FybiB0YWJsZSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyB0YWJsZXtjb2xvcjojRkZCNkEwO2JveC1zaGFkb3c6MXB4IDNweCAxMHB4ICMwZDA2MTB9LmFydGljbGUtLWNvbnRlbnQgLndhcm4gdGFibGUgdGhlYWQsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgdGFibGUgdGhlYWR7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICNGOTVGNTMsI0ZGODU2NCl9LmFydGljbGUtLWNvbnRlbnQgLndhcm4gdGFibGUgdHI6bnRoLWNoaWxkKGV2ZW4pIHRkLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIHRhYmxlIHRyOm50aC1jaGlsZChldmVuKSB0ZHtiYWNrZ3JvdW5kOiM0YTJhMmF9LmFydGljbGUtLWNvbnRlbnQgLndhcm4gYmxvY2txdW90ZSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBibG9ja3F1b3Rle2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwxODIsMTYwLDAuMjUpfS5hcnRpY2xlLS1jb250ZW50IC53YXJuIGJsb2NrcXVvdGUgcCwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyBibG9ja3F1b3RlIHB7Y29sb3I6cmdiYSgyNTUsMTgyLDE2MCwwLjYpfS5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5jb2RlLXRhYnMtd3JhcHBlciAuY29kZS10YWJzIGEsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgLmNvZGUtdGFicy13cmFwcGVyIC5jb2RlLXRhYnMgYXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOnJnYmEoMjU1LDE4MiwxNjAsMC41KX0uYXJ0aWNsZS0tY29udGVudCAud2FybiAuY29kZS10YWJzLXdyYXBwZXIgLmNvZGUtdGFicyBhOmhvdmVyLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5jb2RlLXRhYnMtd3JhcHBlciAuY29kZS10YWJzIGE6aG92ZXJ7Y29sb3I6I2ZmYjZhMH0uYXJ0aWNsZS0tY29udGVudCAud2FybiAuY29kZS10YWJzLXdyYXBwZXIgLmNvZGUtdGFicyBhLmlzLWFjdGl2ZSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuY29kZS10YWJzLXdyYXBwZXIgLmNvZGUtdGFicyBhLmlzLWFjdGl2ZXtjb2xvcjojZmZiNmEwO2JhY2tncm91bmQ6IzBkMDYxMH0uYXJ0aWNsZS0tY29udGVudCAud2FybiBociwuYXJ0aWNsZS0tY29udGVudCAud2FybiAuZXhwYW5kLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIGhyLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5leHBhbmR7Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDEzMywxMDAsMC40KSAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC53YXJuIHByZTo6LXdlYmtpdC1zY3JvbGxiYXIsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgcHJlOjotd2Via2l0LXNjcm9sbGJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTMsNiwxNiwwKTt3aWR0aDoxMnB4O2hlaWdodDoxMnB4fS5hcnRpY2xlLS1jb250ZW50IC53YXJuIHByZTo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2ssLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgcHJlOjotd2Via2l0LXNjcm9sbGJhci10cmFja3tiYWNrZ3JvdW5kLWNvbG9yOiMwZDA2MTA7Ym9yZGVyLXJhZGl1czowIDAgMnB4IDJweH0uYXJ0aWNsZS0tY29udGVudCAud2FybiBwcmU6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIHByZTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojMmEyMDI1O2JvcmRlcjozcHggc29saWQgIzBkMDYxMDtib3JkZXItcmFkaXVzOjZweH0uYXJ0aWNsZS0tY29udGVudCAud2FybiB0YWJsZTo6LXdlYmtpdC1zY3JvbGxiYXIsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgdGFibGU6Oi13ZWJraXQtc2Nyb2xsYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSg3NCw0Miw0MiwwKTt3aWR0aDoxMnB4O2hlaWdodDoxMnB4fS5hcnRpY2xlLS1jb250ZW50IC53YXJuIHRhYmxlOjotd2Via2l0LXNjcm9sbGJhci10cmFjaywuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyB0YWJsZTo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2t7YmFja2dyb3VuZC1jb2xvcjojNGEyYTJhO2JvcmRlci1yYWRpdXM6MCAwIDJweCAycHh9LmFydGljbGUtLWNvbnRlbnQgLndhcm4gdGFibGU6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIHRhYmxlOjotd2Via2l0LXNjcm9sbGJhci10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiMxZjE4MWI7Ym9yZGVyOjNweCBzb2xpZCAjNGEyYTJhO2JvcmRlci1yYWRpdXM6NnB4fS5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgLmhpZ2hsaWdodHtjb2xvcjojZWM2ZTZlfS5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmdoLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmdvLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLm5hLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLm50LC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLm52LC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLm93LC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLmdoLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLmdvLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLm5hLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLm50LC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLm52LC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLm93e2NvbG9yOiNlYzZlNmV9LmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAuYywuYXJ0aWNsZS0tY29udGVudCAud2FybiAuaGlnaGxpZ2h0IC5jaCwuYXJ0aWNsZS0tY29udGVudCAud2FybiAuaGlnaGxpZ2h0IC5jbSwuYXJ0aWNsZS0tY29udGVudCAud2FybiAuaGlnaGxpZ2h0IC5jcGYsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAuYzEsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAuY3MsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAudywuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5jLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLmNoLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLmNtLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLmNwZiwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5jMSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5jcywuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC53e2NvbG9yOiM4NDRjNGN9LmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAuZ2ksLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgLmhpZ2hsaWdodCAuZ2l7YmFja2dyb3VuZC1jb2xvcjojODQ0YzRjfS5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmssLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAua2MsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAua2QsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAua24sLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAua3AsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAua3IsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAubm4sLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgLmhpZ2hsaWdodCAuaywuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5rYywuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5rZCwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5rbiwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5rcCwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5rciwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5ubntjb2xvcjojMDBBM0ZGfS5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmJwLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmNwLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmRsLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmd0LC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmd1LC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmt0LC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLm5iLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLm5jLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLm5vLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLnNhLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLnNiLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLnNjLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLnNkLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLnNlLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLnNoLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLnN4LC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLnNyLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLnMxLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLnMyLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLmJwLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLmNwLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLmRsLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLmd0LC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLmd1LC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLmt0LC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLm5iLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLm5jLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLm5vLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLnNhLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLnNiLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLnNjLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLnNkLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLnNlLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLnNoLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLnN4LC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLnNyLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLnMxLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLnMye2NvbG9yOiMwMDlGNUZ9LmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAuZXJyLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmZtLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmdyLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmdkLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLm5kLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLm5lLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLm5mLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLm5sLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLnNpLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLmVyciwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5mbSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5nciwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5nZCwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5uZCwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5uZSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5uZiwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5ubCwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5zaXtjb2xvcjojQkYzRDVFfS5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLm0sLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAubmksLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAubWIsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAubWYsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAubWgsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAubWksLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAubW8sLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAudmMsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAudmcsLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAudmksLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAudm0sLmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAuaWwsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgLmhpZ2hsaWdodCAubSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5uaSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5tYiwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5tZiwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5taCwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5taSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5tbywuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC52YywuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC52ZywuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC52aSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC52bSwuYXJ0aWNsZS0tY29udGVudCAud2FybmluZyAuaGlnaGxpZ2h0IC5pbHtjb2xvcjojZmZiNGZifS5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmdwLC5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLm8sLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgLmhpZ2hsaWdodCAuZ3AsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgLmhpZ2hsaWdodCAub3tjb2xvcjojMDBBM0ZGfS5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLnNzLC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLnNze2NvbG9yOiNlOTB9LmFydGljbGUtLWNvbnRlbnQgLndhcm4gLmhpZ2hsaWdodCAubGFuZ3VhZ2UtanMgLm1pKy5ueCwuYXJ0aWNsZS0tY29udGVudCAud2FybiAuaGlnaGxpZ2h0IC5sYW5ndWFnZS1qcyAubWYrLm54LC5hcnRpY2xlLS1jb250ZW50IC53YXJuaW5nIC5oaWdobGlnaHQgLmxhbmd1YWdlLWpzIC5taSsubngsLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgLmhpZ2hsaWdodCAubGFuZ3VhZ2UtanMgLm1mKy5ueHtjb2xvcjojZmZiNGZifS5hcnRpY2xlLS1jb250ZW50IC53YXJuIC5oaWdobGlnaHQgLmxhbmd1YWdlLXNxbCAubWkrLm4sLmFydGljbGUtLWNvbnRlbnQgLndhcm5pbmcgLmhpZ2hsaWdodCAubGFuZ3VhZ2Utc3FsIC5taSsubntjb2xvcjojZmZiNGZifS5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9ue2JvcmRlci1jb2xvcjojZDMwOTcxO2JhY2tncm91bmQ6cmdiYSgyMTEsOSwxMTMsMC4xMil9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb246YmVmb3Jle2NvbnRlbnQ6XCJDXCI7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNkMzA5NzF9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gaDEsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gaDIsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gaDMsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gaDQsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gaDUsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gaDZ7Y29sb3I6I2ZmZn0uYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiBoMSBhLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIGgyIGEsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gaDMgYSwuYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiBoNCBhLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIGg1IGEsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gaDYgYXtjb2xvcjppbmhlcml0ICFpbXBvcnRhbnR9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gaDEgYTpob3ZlciwuYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiBoMiBhOmhvdmVyLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIGgzIGE6aG92ZXIsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gaDQgYTpob3ZlciwuYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiBoNSBhOmhvdmVyLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIGg2IGE6aG92ZXJ7Y29sb3I6aW5oZXJpdCAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIHAsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gbGl7Y29sb3I6I2ZlOWRiY30uYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiBzdHJvbmd7Y29sb3I6I2ZmZn0uYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiBhe2NvbG9yOiNmM2Q1ZTEgIWltcG9ydGFudH0uYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiBhIGNvZGU6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHJnYmEoMjU1LDEwMywxNTUsMC4zNSkgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnR9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gYTpob3Zlcntjb2xvcjojZmZmICFpbXBvcnRhbnR9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gYTpob3ZlciBjb2RlOmFmdGVye2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCAjZmZmIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50fS5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIG9sIGxpOmJlZm9yZXtjb2xvcjojZmU5ZGJjfS5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIGNvZGUsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gcHJle2NvbG9yOiNmZjY3OWI7YmFja2dyb3VuZDojMGQwNjEwfS5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIGltZ3tib3gtc2hhZG93OjFweCAzcHggMTBweCAjMGYwNTBlfS5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIHRhYmxle2NvbG9yOiNmZTlkYmM7Ym94LXNoYWRvdzoxcHggM3B4IDEwcHggIzBmMDUwZX0uYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiB0YWJsZSB0aGVhZHtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg0NWRlZywgI2QzMDk3MSwjZmY1OThmKX0uYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiB0YWJsZSB0cjpudGgtY2hpbGQoZXZlbikgdGR7YmFja2dyb3VuZDojMzkxYjM1fS5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIGJsb2NrcXVvdGV7Ym9yZGVyLWNvbG9yOnJnYmEoMjU0LDE1NywxODgsMC4yNSl9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gYmxvY2txdW90ZSBwe2NvbG9yOnJnYmEoMjU0LDE1NywxODgsMC42KX0uYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiAuY29kZS10YWJzLXdyYXBwZXIgLmNvZGUtdGFicyBhe2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6cmdiYSgyNTQsMTU3LDE4OCwwLjUpfS5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5jb2RlLXRhYnMtd3JhcHBlciAuY29kZS10YWJzIGE6aG92ZXJ7Y29sb3I6I2ZlOWRiY30uYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiAuY29kZS10YWJzLXdyYXBwZXIgLmNvZGUtdGFicyBhLmlzLWFjdGl2ZXtjb2xvcjojZmU5ZGJjO2JhY2tncm91bmQ6IzBkMDYxMH0uYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiBociwuYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiAuZXhwYW5ke2JvcmRlci1jb2xvcjpyZ2JhKDIxMSw5LDExMywwLjQpICFpbXBvcnRhbnR9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gcHJlOjotd2Via2l0LXNjcm9sbGJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTMsNiwxNiwwKTt3aWR0aDoxMnB4O2hlaWdodDoxMnB4fS5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIHByZTo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2t7YmFja2dyb3VuZC1jb2xvcjojMGQwNjEwO2JvcmRlci1yYWRpdXM6MCAwIDJweCAycHh9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gcHJlOjotd2Via2l0LXNjcm9sbGJhci10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiM1YzFiMzg7Ym9yZGVyOjNweCBzb2xpZCAjMGQwNjEwO2JvcmRlci1yYWRpdXM6NnB4fS5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIHRhYmxlOjotd2Via2l0LXNjcm9sbGJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoNTcsMjcsNTMsMCk7d2lkdGg6MTJweDtoZWlnaHQ6MTJweH0uYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiB0YWJsZTo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2t7YmFja2dyb3VuZC1jb2xvcjojMzkxYjM1O2JvcmRlci1yYWRpdXM6MCAwIDJweCAycHh9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gdGFibGU6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JhY2tncm91bmQtY29sb3I6IzkxMmE1ODtib3JkZXI6M3B4IHNvbGlkICMzOTFiMzU7Ym9yZGVyLXJhZGl1czo2cHh9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodHtjb2xvcjojZmY2NzlifS5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLmdoLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLmdvLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLm5hLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLm50LC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLm52LC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLm93e2NvbG9yOiNmZjY3OWJ9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuYywuYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiAuaGlnaGxpZ2h0IC5jaCwuYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiAuaGlnaGxpZ2h0IC5jbSwuYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiAuaGlnaGxpZ2h0IC5jcGYsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuYzEsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuY3MsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAud3tjb2xvcjojOGYzZjVhfS5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLmdpe2JhY2tncm91bmQtY29sb3I6IzhmM2Y1YX0uYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiAuaGlnaGxpZ2h0IC5rLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLmtjLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLmtkLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLmtuLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLmtwLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLmtyLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLm5ue2NvbG9yOiMzZDk3ZTV9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuYnAsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuY3AsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuZGwsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuZ3QsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuZ3UsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAua3QsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAubmIsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAubmMsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAubm8sLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuc2EsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuc2IsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuc2MsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuc2QsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuc2UsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuc2gsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuc3gsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuc3IsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuczEsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuczJ7Y29sb3I6Izk0N2VmZn0uYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiAuaGlnaGxpZ2h0IC5lcnIsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuZm0sLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuZ3IsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuZ2QsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAubmQsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAubmUsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAubmYsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAubmwsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuc2l7Y29sb3I6I0JGM0Q1RX0uYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiAuaGlnaGxpZ2h0IC5tLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLm5pLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLm1iLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLm1mLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLm1oLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLm1pLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLm1vLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLnZjLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLnZnLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLnZpLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLnZtLC5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLmlse2NvbG9yOiNmZmEwZGV9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAuZ3AsLmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAub3tjb2xvcjojM2Q5N2U1fS5hcnRpY2xlLS1jb250ZW50IC5jYXV0aW9uIC5oaWdobGlnaHQgLnNze2NvbG9yOiNlOTB9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAubGFuZ3VhZ2UtanMgLm1pKy5ueCwuYXJ0aWNsZS0tY29udGVudCAuY2F1dGlvbiAuaGlnaGxpZ2h0IC5sYW5ndWFnZS1qcyAubWYrLm54e2NvbG9yOiNmZmEwZGV9LmFydGljbGUtLWNvbnRlbnQgLmNhdXRpb24gLmhpZ2hsaWdodCAubGFuZ3VhZ2Utc3FsIC5taSsubntjb2xvcjojZmZhMGRlfS5hcnRpY2xlLS1jb250ZW50IC5ibG9jay5zcGVjaWFsLXN0YXRle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjZDMwOTcxLCM5YjJhZmYpO3BhZGRpbmc6NHB4O2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MjVweCAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC5ibG9jay5zcGVjaWFsLXN0YXRlIC5zdGF0ZS1jb250ZW50e2JhY2tncm91bmQ6IzE0MTQxRjtib3JkZXItcmFkaXVzOjIxcHg7cGFkZGluZzpjYWxjKDEuNjVyZW0gLSA0cHgpIGNhbGMoMnJlbSAtIDRweCkgY2FsYyguMXJlbSArIDRweCkgY2FsYygycmVtIC0gNHB4KX0uYXJ0aWNsZS0tY29udGVudCAuYmxvY2suc3BlY2lhbC1zdGF0ZSAuc3RhdGUtY29udGVudCBoNHtjb2xvcjojZmZmfS5hcnRpY2xlLS1jb250ZW50IC5ibG9jay5zcGVjaWFsLXN0YXRlIC5zdGF0ZS1jb250ZW50IHB7bWFyZ2luLWJvdHRvbToxcmVtfS5hcnRpY2xlLS1jb250ZW50IC5ibG9jay5zcGVjaWFsLXN0YXRlIC5zdGF0ZS1jb250ZW50IC5idG57Ym9yZGVyLXJhZGl1czo0cHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICNkMzA5NzEsIzliMmFmZil9LmFydGljbGUtLWNvbnRlbnQgLmJsb2NrLnNwZWNpYWwtc3RhdGUgLnN0YXRlLWNvbnRlbnQgLmJ0bjphZnRlcntiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg0NWRlZywgI2E4MDg1YSwgIzdiMTRkNil9LmFydGljbGUtLWNvbnRlbnQgLmJsb2NrLnNwZWNpYWwtc3RhdGUgLnN0YXRlLWNvbnRlbnQgLmV4cGFuZC13cmFwcGVye2JvcmRlcjpub25lO21hcmdpbjouNXJlbSAwIDEuNXJlbX0uYXJ0aWNsZS0tY29udGVudCAuYmxvY2suc3BlY2lhbC1zdGF0ZSAuc3RhdGUtY29udGVudCAuZXhwYW5ke2JvcmRlcjpub25lO3BhZGRpbmc6MH0uYXJ0aWNsZS0tY29udGVudCAuYmxvY2suc3BlY2lhbC1zdGF0ZSAuc3RhdGUtY29udGVudCAuZXhwYW5kIC5leHBhbmQtY29udGVudCBwe21hcmdpbi1sZWZ0OjJyZW19LmFydGljbGUtLWNvbnRlbnQgLmJsb2NrLnNwZWNpYWwtc3RhdGUgLnN0YXRlLWNvbnRlbnQgLmV4cGFuZCB1bHttYXJnaW4tdG9wOi0xcmVtfS5hcnRpY2xlLS1jb250ZW50IC5ibG9jay5zcGVjaWFsLXN0YXRlIC5zdGF0ZS1jb250ZW50IC5leHBhbmQgdWwuZmVlZGJhY2stY2hhbm5lbHN7cGFkZGluZzowO21hcmdpbjotMXJlbSAwIDEuNXJlbSAycmVtO2xpc3Qtc3R5bGU6bm9uZX0uYXJ0aWNsZS0tY29udGVudCAuYmxvY2suc3BlY2lhbC1zdGF0ZSAuc3RhdGUtY29udGVudCAuZXhwYW5kIHVsLmZlZWRiYWNrLWNoYW5uZWxzIGF7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo1MDA7cG9zaXRpb246cmVsYXRpdmV9LmFydGljbGUtLWNvbnRlbnQgLmJsb2NrLnNwZWNpYWwtc3RhdGUgLnN0YXRlLWNvbnRlbnQgLmV4cGFuZCB1bC5mZWVkYmFjay1jaGFubmVscyBhLmRpc2NvcmQ6YmVmb3Jle2NvbnRlbnQ6dXJsKFwiL3N2Z3MvZGlzY29yZC5zdmdcIik7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjEuMXJlbTt3aWR0aDoxLjI1cmVtO3ZlcnRpY2FsLWFsaWduOnRvcDttYXJnaW46MnB4IC42NXJlbSAwIDB9LmFydGljbGUtLWNvbnRlbnQgLmJsb2NrLnNwZWNpYWwtc3RhdGUgLnN0YXRlLWNvbnRlbnQgLmV4cGFuZCB1bC5mZWVkYmFjay1jaGFubmVscyBhLmNvbW11bml0eTpiZWZvcmV7Y29udGVudDpcIlxcZTkwMFwiO2NvbG9yOiNmZmY7bWFyZ2luOjAgLjY1cmVtIDAgMDtmb250LXNpemU6MS4ycmVtO2ZvbnQtZmFtaWx5OidpY29tb29uLXYyJzt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmFydGljbGUtLWNvbnRlbnQgLmJsb2NrLnNwZWNpYWwtc3RhdGUgLnN0YXRlLWNvbnRlbnQgLmV4cGFuZCB1bC5mZWVkYmFjay1jaGFubmVscyBhLnNsYWNrOmJlZm9yZXtjb250ZW50OnVybChcIi9zdmdzL3NsYWNrLnN2Z1wiKTtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MS4xcmVtO3dpZHRoOjEuMXJlbTt2ZXJ0aWNhbC1hbGlnbjp0ZXh0LXRvcDttYXJnaW4tcmlnaHQ6LjY1cmVtfS5hcnRpY2xlLS1jb250ZW50IC5ibG9jay5zcGVjaWFsLXN0YXRlIC5zdGF0ZS1jb250ZW50IC5leHBhbmQgdWwuZmVlZGJhY2stY2hhbm5lbHMgYS5yZWRkaXQ6YmVmb3Jle2NvbnRlbnQ6dXJsKFwiL3N2Z3MvcmVkZGl0LnN2Z1wiKTtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MS4xcmVtO3dpZHRoOjEuMnJlbTt2ZXJ0aWNhbC1hbGlnbjp0b3A7bWFyZ2luOjJweCAuNjVyZW0gMCAwfS5hcnRpY2xlLS1jb250ZW50IC5ibG9jay5zcGVjaWFsLXN0YXRlIC5zdGF0ZS1jb250ZW50IC5leHBhbmQgdWwuZmVlZGJhY2stY2hhbm5lbHMgYTo6YWZ0ZXJ7Y29udGVudDpcIlxcZTkwYVwiO2ZvbnQtZmFtaWx5OidpY29tb29uLXY0Jztmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToxLjNyZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICNkMzA5NzEsIzliMmFmZik7YmFja2dyb3VuZC1jbGlwOnRleHQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7cmlnaHQ6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwLjI1cmVtKTtvcGFjaXR5OjA7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjJzLCBvcGFjaXR5IC4yc30uYXJ0aWNsZS0tY29udGVudCAuYmxvY2suc3BlY2lhbC1zdGF0ZSAuc3RhdGUtY29udGVudCAuZXhwYW5kIHVsLmZlZWRiYWNrLWNoYW5uZWxzIGE6aG92ZXI6OmFmdGVye3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEuNXJlbSk7b3BhY2l0eToxfS5hcnRpY2xlLS1jb250ZW50IGEuYnRue3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjouNXJlbSAuMjVyZW0gLjVyZW0gMDtwYWRkaW5nOjAuODVyZW0gMS41cmVtO2NvbG9yOiNmZmYgIWltcG9ydGFudDtib3JkZXItcmFkaXVzOjJweDtmb250LXNpemU6MS4wNXJlbTt6LWluZGV4OjE7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICMwNjZGQzUsIzAwQTNGRil9LmFydGljbGUtLWNvbnRlbnQgYS5idG46YWZ0ZXJ7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6YmxvY2s7dG9wOjA7cmlnaHQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlci1yYWRpdXM6MnB4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjMDBBM0ZGLCM2QkRGRkYpO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzO3otaW5kZXg6LTF9LmFydGljbGUtLWNvbnRlbnQgYS5idG46aG92ZXJ7Y3Vyc29yOnBvaW50ZXJ9LmFydGljbGUtLWNvbnRlbnQgYS5idG46aG92ZXI6YWZ0ZXJ7b3BhY2l0eToxfS5hcnRpY2xlLS1jb250ZW50IGEuYnRuLmRvd25sb2FkOmJlZm9yZXtjb250ZW50OlwiXFxlOTFkXCI7Zm9udC1mYW1pbHk6XCJpY29tb29uLXYyXCI7bWFyZ2luLXJpZ2h0Oi41cmVtO2ZvbnQtc2l6ZToxLjFyZW19LmFydGljbGUtLWNvbnRlbnQgYS5idG4uZ2l0aHViOmJlZm9yZXtjb250ZW50OlwiXFxlYWIwXCI7Zm9udC1mYW1pbHk6XCJpY29tb29uLXYyXCI7bWFyZ2luLXJpZ2h0Oi41cmVtO2ZvbnQtc2l6ZToxLjFyZW19LmFydGljbGUtLWNvbnRlbnQgYS5idG4uYXJyb3cgc3Bhbi5DYXJldE91dGxpbmVSaWdodHtmb250LXNpemU6MS41cmVtO2xpbmUtaGVpZ2h0OjA7dmVydGljYWwtYWxpZ246c3ViO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDotLjY1cmVtfS5hcnRpY2xlLS1jb250ZW50IGEuYnRuLnNtYWxse3BhZGRpbmc6LjRyZW0gMXJlbX0uYXJ0aWNsZS0tY29udGVudCBhLmJ0bi5zbWFsbC1wbHVze3BhZGRpbmc6LjI1ZW07bGluZS1oZWlnaHQ6LjY1cmVtfS5hcnRpY2xlLS1jb250ZW50IC5zZWxlY3QtdXJse21hcmdpbjotMi41cmVtIDAgMXJlbTt0ZXh0LWFsaWduOnJpZ2h0O2Rpc3BsYXk6bm9uZX0uYXJ0aWNsZS0tY29udGVudCAudXJsLXRyaWdnZXJ7cGFkZGluZzouMjVyZW0gLjVyZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOi44NXJlbTtmb250LXN0eWxlOml0YWxpYztjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuNSk7YmFja2dyb3VuZDojMDcwNzBFO2JvcmRlci1yYWRpdXM6MCAwIDJweCAycHh9LmFydGljbGUtLWNvbnRlbnQgLnVybC10cmlnZ2VyOmJlZm9yZXtjb250ZW50OlwiXFxlOTI0XCI7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXJpZ2h0Oi4zNXJlbTtmb250LWZhbWlseTpcImljb21vb24tdjJcIjtmb250LXN0eWxlOm5vcm1hbDtmb250LXNpemU6LjhyZW19LmFydGljbGUtLWNvbnRlbnQgLnVybC10cmlnZ2VyOmhvdmVye2NvbG9yOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgbGkgLnVybC10cmlnZ2Vye3BhZGRpbmc6MHJlbSAuNXJlbX0uYXJ0aWNsZS0tY29udGVudCAuY29kZS10YWItY29udGVudCAuc2VsZWN0LXVybHttYXJnaW4tdG9wOi0zLjE1cmVtfS5hcnRpY2xlLS1jb250ZW50IC5jYXB0aW9ue21hcmdpbjotMS44cmVtIDAgMnJlbTtwYWRkaW5nLWxlZnQ6LjI1cmVtO2ZvbnQtc2l6ZTouOTVyZW07Zm9udC1zdHlsZTppdGFsaWN9LmFydGljbGUtLWNvbnRlbnQgLmNhcHRpb24gcHtsaW5lLWhlaWdodDoxLjI1cmVtO2NvbG9yOnJnYmEoMjEyLDIxNSwyMjEsMC44KX0uYXJ0aWNsZS0tY29udGVudCAuY2FwdGlvbiBjb2Rle2ZvbnQtc2l6ZTouOXJlbX0uYXJ0aWNsZS0tY29udGVudCBwKy5jYXB0aW9uLC5hcnRpY2xlLS1jb250ZW50IGxpKy5jYXB0aW9uLC5hcnRpY2xlLS1jb250ZW50IG9sKy5jYXB0aW9uLC5hcnRpY2xlLS1jb250ZW50IHVsKy5jYXB0aW9ue3BhZGRpbmc6MDttYXJnaW46LS43NXJlbSAwIDA7b3BhY2l0eToxfS5hcnRpY2xlLS1jb250ZW50IGgyKy5jYXB0aW9uLC5hcnRpY2xlLS1jb250ZW50IGgzKy5jYXB0aW9uLC5hcnRpY2xlLS1jb250ZW50IGg0Ky5jYXB0aW9uLC5hcnRpY2xlLS1jb250ZW50IGg1Ky5jYXB0aW9uLC5hcnRpY2xlLS1jb250ZW50IGg2Ky5jYXB0aW9ue3BhZGRpbmc6MDttYXJnaW46MDtvcGFjaXR5OjF9LmFydGljbGUtLWNvbnRlbnQgI3F1ZXJ5LXBsYW4tZGlhZ3JhbSsuY2FwdGlvbnttYXJnaW4tdG9wOjB9LmFydGljbGUtLWNvbnRlbnQgLmNoaWxkcmVuLWxpbmtzIGgyLC5hcnRpY2xlLS1jb250ZW50IC5jaGlsZHJlbi1saW5rcyBoMywuYXJ0aWNsZS0tY29udGVudCAuY2hpbGRyZW4tbGlua3MgaDQsLmFydGljbGUtLWNvbnRlbnQgLmxpc3QtbGlua3MgaDIsLmFydGljbGUtLWNvbnRlbnQgLmxpc3QtbGlua3MgaDMsLmFydGljbGUtLWNvbnRlbnQgLmxpc3QtbGlua3MgaDR7bWFyZ2luLXRvcDotLjVyZW19LmFydGljbGUtLWNvbnRlbnQgLmNoaWxkcmVuLWxpbmtzIGgyIGEgYTphZnRlciwuYXJ0aWNsZS0tY29udGVudCAuY2hpbGRyZW4tbGlua3MgaDMgYSBhOmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IC5jaGlsZHJlbi1saW5rcyBoNCBhIGE6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgLmxpc3QtbGlua3MgaDIgYSBhOmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IC5saXN0LWxpbmtzIGgzIGEgYTphZnRlciwuYXJ0aWNsZS0tY29udGVudCAubGlzdC1saW5rcyBoNCBhIGE6YWZ0ZXJ7Y29udGVudDpcIlxcZTkxYVwiO2ZvbnQtZmFtaWx5OlwiaWNvbW9vbi12MlwiO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMC4zNSk7dmVydGljYWwtYWxpZ246Ym90dG9tO3RyYW5zaXRpb246Y29sb3IgLjJzO21hcmdpbi1sZWZ0Oi40cmVtfS5hcnRpY2xlLS1jb250ZW50IC5jaGlsZHJlbi1saW5rcyBoMiBhOmhvdmVyOmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IC5jaGlsZHJlbi1saW5rcyBoMyBhOmhvdmVyOmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IC5jaGlsZHJlbi1saW5rcyBoNCBhOmhvdmVyOmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IC5saXN0LWxpbmtzIGgyIGE6aG92ZXI6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgLmxpc3QtbGlua3MgaDMgYTpob3ZlcjphZnRlciwuYXJ0aWNsZS0tY29udGVudCAubGlzdC1saW5rcyBoNCBhOmhvdmVyOmFmdGVye2NvbG9yOiMwMEEzRkZ9LmFydGljbGUtLWNvbnRlbnQgLmNoaWxkcmVuLWxpbmtzPmhyOmxhc3QtY2hpbGQsLmFydGljbGUtLWNvbnRlbnQgLmxpc3QtbGlua3M+aHI6bGFzdC1jaGlsZHtkaXNwbGF5Om5vbmV9LmFydGljbGUtLWNvbnRlbnQgdWwuY2hpbGRyZW4tbGlzdCt1bHttYXJnaW4tdG9wOi0xLjI1cmVtfS5hcnRpY2xlLS1jb250ZW50IGNvZGUsLmFydGljbGUtLWNvbnRlbnQgcHJle2JhY2tncm91bmQ6IzA3MDcwRTtmb250LWZhbWlseTpcIklCTSBQbGV4IE1vbm9cIixtb25vc3BhY2U7Y29sb3I6I0I3QjhGRn0uYXJ0aWNsZS0tY29udGVudCBwIGNvZGUsLmFydGljbGUtLWNvbnRlbnQgbGkgY29kZSwuYXJ0aWNsZS0tY29udGVudCB0YWJsZSBjb2Rle3BhZGRpbmc6LjFyZW0gLjRyZW0gLjJyZW07Ym9yZGVyLXJhZGl1czoycHg7Y29sb3I6I0I3QjhGRjt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udC1zaXplOjFyZW07Zm9udC1zdHlsZTpub3JtYWx9LmFydGljbGUtLWNvbnRlbnQgaDEgY29kZSwuYXJ0aWNsZS0tY29udGVudCBoMiBjb2RlLC5hcnRpY2xlLS1jb250ZW50IGgzIGNvZGUsLmFydGljbGUtLWNvbnRlbnQgaDQgY29kZSwuYXJ0aWNsZS0tY29udGVudCBoNSBjb2RlLC5hcnRpY2xlLS1jb250ZW50IGg2IGNvZGV7cGFkZGluZzppbmhlcml0ICFpbXBvcnRhbnQ7YmFja2dyb3VuZDppbmhlcml0ICFpbXBvcnRhbnQ7Zm9udC1zaXplOmluaGVyaXQgIWltcG9ydGFudDtmb250LXdlaWdodDppbmhlcml0ICFpbXBvcnRhbnQ7Zm9udC1mYW1pbHk6XCJQcm94aW1hIE5vdmFcIixzYW5zLXNlcmlmO2NvbG9yOmluaGVyaXQgIWltcG9ydGFudH0uYXJ0aWNsZS0tY29udGVudCBhIGNvZGV7Zm9udC13ZWlnaHQ6bm9ybWFsO3RyYW5zaXRpb246Y29sb3IgLjJzO3Bvc2l0aW9uOnJlbGF0aXZlO2NvbG9yOiMwMEEzRkZ9LmFydGljbGUtLWNvbnRlbnQgYSBjb2RlOmFmdGVye2NvbnRlbnQ6XCJcIjtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO3RvcDowO3JpZ2h0OjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDowIC40cmVtIC40cmVtIDA7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHJnYmEoMCwxNjMsMjU1LDAuMzUpIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O3RyYW5zaXRpb246Ym9yZGVyIC4yc30uYXJ0aWNsZS0tY29udGVudCBhOmhvdmVyIGNvZGV7Y29sb3I6I2ZmZn0uYXJ0aWNsZS0tY29udGVudCBhOmhvdmVyIGNvZGU6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50ICNmZmYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnR9LmFydGljbGUtLWNvbnRlbnQgcHJle21hcmdpbjoycmVtIDAgMi4yNXJlbTtwYWRkaW5nOjEuNzVyZW0gMS43NXJlbSAxLjI1cmVtO2JvcmRlci1yYWRpdXM6MnB4O292ZXJmbG93LXg6c2Nyb2xsO292ZXJmbG93LXk6aGlkZGVuO2ZvbnQtc2l6ZToxcmVtfS5hcnRpY2xlLS1jb250ZW50IHByZSBjb2Rle3BhZGRpbmc6MDtsaW5lLWhlaWdodDoxLjdyZW07d2hpdGUtc3BhY2U6cHJlfS5hcnRpY2xlLS1jb250ZW50IHByZSAuYXBpe21hcmdpbi1yaWdodDouMzVyZW07cGFkZGluZzouMTVyZW0gLjVyZW0gLjI1cmVtO2JvcmRlci1yYWRpdXM6MnB4O2NvbG9yOiNmZmY7Zm9udC1mYW1pbHk6XCJJQk0gUGxleCBNb25vXCIsbW9ub3NwYWNlO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zaXplOjFyZW19LmFydGljbGUtLWNvbnRlbnQgcHJlIC5hcGkuZ2V0e2JhY2tncm91bmQ6IzAwOUY1Rn0uYXJ0aWNsZS0tY29udGVudCBwcmUgLmFwaS5wb3N0e2JhY2tncm91bmQ6IzA2NkZDNX0uYXJ0aWNsZS0tY29udGVudCBwcmUgLmFwaS5wYXRjaHtiYWNrZ3JvdW5kOiNFODVCMUN9LmFydGljbGUtLWNvbnRlbnQgcHJlIC5hcGkuZGVsZXRle2JhY2tncm91bmQ6I0JGM0Q1RX0uYXJ0aWNsZS0tY29udGVudCBwcmUgLmFwaS5wdXR7YmFja2dyb3VuZDojNTEzQ0M2fS5hcnRpY2xlLS1jb250ZW50IHByZS5hcGktZW5kcG9pbnQgYXtwb3NpdGlvbjpyZWxhdGl2ZTtjb2xvcjojMDBBM0ZGO3RleHQtZGVjb3JhdGlvbjpub25lfS5hcnRpY2xlLS1jb250ZW50IHByZS5hcGktZW5kcG9pbnQgYTphZnRlcntjb250ZW50OlwiXFxlOTBkXCI7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6LTEuNDVyZW07dG9wOjAuNjVyZW07Zm9udC1mYW1pbHk6XCJpY29tb29uLXY0XCI7Y29sb3I6I2ZmZjtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MS4xcmVtO2xpbmUtaGVpZ2h0OjA7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuMnN9LmFydGljbGUtLWNvbnRlbnQgcHJlLmFwaS1lbmRwb2ludCBhOmhvdmVye2NvbG9yOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgcHJlLmFwaS1lbmRwb2ludCBhOmhvdmVyOmFmdGVye29wYWNpdHk6LjZ9LmFydGljbGUtLWNvbnRlbnQgc3Bhbi5jb2RlLWNhbGxvdXQsLmFydGljbGUtLWNvbnRlbnQgLmNvZGUtcGxhY2Vob2xkZXJ7Zm9udC13ZWlnaHQ6Ym9sZDttYXJnaW46MCAuMTVyZW19LmFydGljbGUtLWNvbnRlbnQgc3Bhbi5jb2RlLWNhbGxvdXQuZ3JlZW4sLmFydGljbGUtLWNvbnRlbnQgLmNvZGUtcGxhY2Vob2xkZXIuZ3JlZW57Y29sb3I6IzAwOUY1Rn0uYXJ0aWNsZS0tY29udGVudCBzcGFuLmNvZGUtY2FsbG91dC5tYWdlbnRhLC5hcnRpY2xlLS1jb250ZW50IC5jb2RlLXBsYWNlaG9sZGVyLm1hZ2VudGF7Y29sb3I6I2QzMDk3MX0uYXJ0aWNsZS0tY29udGVudCBzcGFuLmNvZGUtY2FsbG91dC5vcmFuZ2UsLmFydGljbGUtLWNvbnRlbnQgLmNvZGUtcGxhY2Vob2xkZXIub3Jhbmdle2NvbG9yOiNGOTVGNTN9LmFydGljbGUtLWNvbnRlbnQgc3Bhbi5jb2RlLWNhbGxvdXQuZGVsZXRlLC5hcnRpY2xlLS1jb250ZW50IHNwYW4uY29kZS1jYWxsb3V0LnN0cmlrZSwuYXJ0aWNsZS0tY29udGVudCAuY29kZS1wbGFjZWhvbGRlci5kZWxldGUsLmFydGljbGUtLWNvbnRlbnQgLmNvZGUtcGxhY2Vob2xkZXIuc3RyaWtle3RleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91Z2h9LmFydGljbGUtLWNvbnRlbnQgLmNvZGUtcGxhY2Vob2xkZXItd3JhcHBlcntkaXNwbGF5OmlubGluZTtwb3NpdGlvbjpyZWxhdGl2ZX0uYXJ0aWNsZS0tY29udGVudCAuY29kZS1wbGFjZWhvbGRlci13cmFwcGVyIC5jb2RlLXBsYWNlaG9sZGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjowIC4xNXJlbTtwYWRkaW5nOjA7bGluZS1oZWlnaHQ6MS40ZW07Y29sb3I6I2U2NTlhMjtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTpub3JtYWw7Ym9yZGVyLWJvdHRvbToxcHggZG90dGVkO3RyYW5zaXRpb246Y29sb3IgLjJzO2N1cnNvcjpwb2ludGVyfS5hcnRpY2xlLS1jb250ZW50IC5jb2RlLXBsYWNlaG9sZGVyLXdyYXBwZXIgLmNvZGUtcGxhY2Vob2xkZXIgLmNvZGUtcGxhY2Vob2xkZXItZWRpdC1pY29ue2ZvbnQtc3R5bGU6bm9ybWFsfS5hcnRpY2xlLS1jb250ZW50IC5jb2RlLXBsYWNlaG9sZGVyLXdyYXBwZXIgLmNvZGUtcGxhY2Vob2xkZXIgLmNvZGUtcGxhY2Vob2xkZXItZWRpdC1pY29uOjpiZWZvcmV7bWFyZ2luLWxlZnQ6LjJyZW07Zm9udC1zaXplOi44ZW07dHJhbnNpdGlvbjpvcGFjaXR5IC4ycztvcGFjaXR5Oi42NTt6LWluZGV4Oi0xfS5hcnRpY2xlLS1jb250ZW50IC5jb2RlLXBsYWNlaG9sZGVyLXdyYXBwZXIgLmNvZGUtcGxhY2Vob2xkZXI6aG92ZXJ7Y29sb3I6IzVlZTRlNH0uYXJ0aWNsZS0tY29udGVudCAuY29kZS1wbGFjZWhvbGRlci13cmFwcGVyIC5jb2RlLXBsYWNlaG9sZGVyOmhvdmVyIC5jb2RlLXBsYWNlaG9sZGVyLWVkaXQtaWNvbjo6YmVmb3Jle29wYWNpdHk6MX0uYXJ0aWNsZS0tY29udGVudCAuY29kZS1wbGFjZWhvbGRlci13cmFwcGVyIC5jb2RlLWlucHV0LXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOi0zcHg7bGVmdDotNC41cHg7ei1pbmRleDoxO2NvbG9yOmluaGVyaXR9LmFydGljbGUtLWNvbnRlbnQgLmNvZGUtcGxhY2Vob2xkZXItd3JhcHBlciAuY29kZS1pbnB1dC13cmFwcGVyIGlucHV0LnBsYWNlaG9sZGVyLWVkaXR7d2lkdGg6MTAwJTttYXgtd2lkdGg6MTAwJTtib3JkZXI6MXB4IHNvbGlkICMxQTFBMkE7Ym9yZGVyLXJhZGl1czo0cHg7YmFja2dyb3VuZC1jb2xvcjojMUExQTJBO3BhZGRpbmc6MnB4IDIwcHggMnB4IDZweDtjb2xvcjojNWVlNGU0O2ZvbnQtd2VpZ2h0Om5vcm1hbH0uYXJ0aWNsZS0tY29udGVudCAuY29kZS1wbGFjZWhvbGRlci13cmFwcGVyIC5jb2RlLWlucHV0LXdyYXBwZXIgaW5wdXQucGxhY2Vob2xkZXItZWRpdDpmb2N1c3tvdXRsaW5lOm5vbmU7Ym9yZGVyLWNvbG9yOnJnYmEoOTQsMjI4LDIyOCwwLjc1KTtib3gtc2hhZG93OjFweCAxcHggOHB4IHJnYmEoOTQsMjI4LDIyOCwwLjUpO2JvcmRlci1yYWRpdXM6MnB4fS5hcnRpY2xlLS1jb250ZW50IC5jb2RlLXBsYWNlaG9sZGVyLXdyYXBwZXIgLmNvZGUtaW5wdXQtd3JhcHBlcjpob3ZlcntjdXJzb3I6cG9pbnRlcn0uYXJ0aWNsZS0tY29udGVudCAuY29kZS1wbGFjZWhvbGRlci13cmFwcGVyIC5jb2RlLWlucHV0LXdyYXBwZXI6YWZ0ZXJ7Y29udGVudDpcIlxcZTkzN1wiO2NvbG9yOiM1ZWU0ZTQ7Zm9udC1mYW1pbHk6J2ljb21vb24tdjQnO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6M3B4fS5hcnRpY2xlLS1jb250ZW50IC5jb2RlLXBsYWNlaG9sZGVyLWtleSBjb2Rle2NvbG9yOiNlNjU5YTIgIWltcG9ydGFudH0uYXJ0aWNsZS0tY29udGVudCBwcmUgc3Bhbi50Yy1keW5hbWljLXZhbHVle2JvcmRlcjoxcHggc29saWQ7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzowIC4yNXJlbTstLXBhcmFtLWNvbG9yOiAjZmY3OWM2Oy0tcGFyYW0tYmc6ICNmZjc5YzYzMzstLWVudi1jb2xvcjogIzAwOTJiODstLWVudi1iZzogIzAwOTJiODMzOy0tc2VjcmV0LWNvbG9yOiAjOWEwOWZmOy0tc2VjcmV0LWJnOiAjOTgwOWZmMzN9LmFydGljbGUtLWNvbnRlbnQgcHJlIHNwYW4udGMtZHluYW1pYy12YWx1ZS5wYXJhbXtjb2xvcjp2YXIoLS1wYXJhbS1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1wYXJhbS1iZyk7Ym9yZGVyLWNvbG9yOnZhcigtLXBhcmFtLWNvbG9yKX0uYXJ0aWNsZS0tY29udGVudCBwcmUgc3Bhbi50Yy1keW5hbWljLXZhbHVlLmVudntjb2xvcjp2YXIoLS1lbnYtY29sb3IpO2JhY2tncm91bmQ6dmFyKC0tZW52LWJnKTtib3JkZXItY29sb3I6dmFyKC0tZW52LWNvbG9yKX0uYXJ0aWNsZS0tY29udGVudCBwcmUgc3Bhbi50Yy1keW5hbWljLXZhbHVlLnNlY3JldHtjb2xvcjp2YXIoLS1zZWNyZXQtY29sb3IpO2JhY2tncm91bmQ6dmFyKC0tc2VjcmV0LWJnKTtib3JkZXItY29sb3I6dmFyKC0tc2VjcmV0LWNvbG9yKX1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpey5hcnRpY2xlLS1jb250ZW50IHByZXtwYWRkaW5nOjEuMmVtIDEuMmVtIC43NXJlbX19LmFydGljbGUtLWNvbnRlbnQgZGl2LmNvbHVtbnMtd3JhcHBlcntjb250YWluZXItdHlwZTppbmxpbmUtc2l6ZTtjb250YWluZXItbmFtZTpjb2x1bW5zfS5hcnRpY2xlLS1jb250ZW50IGRpdi5jb2x1bW5zLTJ7Y29sdW1uczoyfS5hcnRpY2xlLS1jb250ZW50IGRpdi5jb2x1bW5zLTN7Y29sdW1uczozfS5hcnRpY2xlLS1jb250ZW50IGRpdi5jb2x1bW5zLTR7Y29sdW1uczo0fS5hcnRpY2xlLS1jb250ZW50IGRpdi5jb2x1bW5zLTIsLmFydGljbGUtLWNvbnRlbnQgZGl2LmNvbHVtbnMtMywuYXJ0aWNsZS0tY29udGVudCBkaXYuY29sdW1ucy00e21hcmdpbjoxLjVyZW0gMCAyLjVyZW19LmFydGljbGUtLWNvbnRlbnQgZGl2LmNvbHVtbnMtMj4qOmZpcnN0LWNoaWxkLC5hcnRpY2xlLS1jb250ZW50IGRpdi5jb2x1bW5zLTM+KjpmaXJzdC1jaGlsZCwuYXJ0aWNsZS0tY29udGVudCBkaXYuY29sdW1ucy00Pio6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfUBjb250YWluZXIgY29sdW1ucyAobWF4LXdpZHRoOiA3ODBweCl7LmFydGljbGUtLWNvbnRlbnQgZGl2LmNvbHVtbnMtNHtjb2x1bW5zOjN9fUBjb250YWluZXIgY29sdW1ucyAobWF4LXdpZHRoOiA1NTBweCl7LmFydGljbGUtLWNvbnRlbnQgZGl2LmNvbHVtbnMtMywuYXJ0aWNsZS0tY29udGVudCBkaXYuY29sdW1ucy00e2NvbHVtbnM6Mn19QGNvbnRhaW5lciBjb2x1bW5zIChtYXgtd2lkdGg6IDM1MHB4KXsuYXJ0aWNsZS0tY29udGVudCBkaXYuY29sdW1ucy0yLC5hcnRpY2xlLS1jb250ZW50IGRpdi5jb2x1bW5zLTMsLmFydGljbGUtLWNvbnRlbnQgZGl2LmNvbHVtbnMtNHtjb2x1bW5zOjF9fS5hcnRpY2xlLS1jb250ZW50IC5tZXJtYWlke29wYWNpdHk6MDtjb2xvcjojMTQxNDFGO21hcmdpbjozcmVtIDA7dHJhbnNpdGlvbjpvcGFjaXR5IC41cztmb250LWZhbWlseTpcIlByb3hpbWEgTm92YVwiLHNhbnMtc2VyaWZ9LmFydGljbGUtLWNvbnRlbnQgLm1lcm1haWQgLmFycm93aGVhZFBhdGgsLmFydGljbGUtLWNvbnRlbnQgLm1lcm1haWQgLmFycm93TWFya2VyUGF0aHtmaWxsOiM0MzQ0NTMgIWltcG9ydGFudH0uYXJ0aWNsZS0tY29udGVudCAubWVybWFpZCAuZWRnZVBhdGggLnBhdGgsLmFydGljbGUtLWNvbnRlbnQgLm1lcm1haWQgLmZsb3djaGFydC1saW5re3N0cm9rZTojNDM0NDUzICFpbXBvcnRhbnR9LmFydGljbGUtLWNvbnRlbnQgLm1lcm1haWQgLmxhYmVsLC5hcnRpY2xlLS1jb250ZW50IC5tZXJtYWlkIC5ub2RlTGFiZWx7Y29sb3I6I0Q0RDdERCAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC5tZXJtYWlkIC5jbHVzdGVyLWxhYmVsIC5ub2RlTGFiZWx7Y29sb3I6I0I3QjhGRiAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC5tZXJtYWlkIC5lZGdlTGFiZWx7Y29sb3I6I0Q0RDdERCAhaW1wb3J0YW50O2JhY2tncm91bmQ6IzA3MDcwRSAhaW1wb3J0YW50O2ZvbnQtc2l6ZTouODVlbTtmb250LXdlaWdodDo1MDB9LmFydGljbGUtLWNvbnRlbnQgLm1lcm1haWQgLmVkZ2VMYWJlbCBwe2JhY2tncm91bmQ6IzE0MTQxRiAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC5tZXJtYWlkIC5ub2RlIHJlY3QsLmFydGljbGUtLWNvbnRlbnQgLm1lcm1haWQgLm5vZGUgY2lyY2xlLC5hcnRpY2xlLS1jb250ZW50IC5tZXJtYWlkIC5ub2RlIGVsbGlwc2UsLmFydGljbGUtLWNvbnRlbnQgLm1lcm1haWQgLm5vZGUgcG9seWdvbiwuYXJ0aWNsZS0tY29udGVudCAubWVybWFpZCAubm9kZSBwYXRoe2ZpbGw6IzE0MTQxRiAhaW1wb3J0YW50O3N0cm9rZTojNDM0NDUzICFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC5tZXJtYWlkIC5ub2RlIHNwYW4ubGFiZWx7Y29sb3I6I0Q0RDdERCAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC5tZXJtYWlkIC5jbHVzdGVyIHJlY3QsLmFydGljbGUtLWNvbnRlbnQgLm1lcm1haWQgLmNsdXN0ZXIgY2lyY2xlLC5hcnRpY2xlLS1jb250ZW50IC5tZXJtYWlkIC5jbHVzdGVyIGVsbGlwc2UsLmFydGljbGUtLWNvbnRlbnQgLm1lcm1haWQgLmNsdXN0ZXIgcG9seWdvbiwuYXJ0aWNsZS0tY29udGVudCAubWVybWFpZCAuY2x1c3RlciBwYXRoe2ZpbGw6IzA3MDcwRSAhaW1wb3J0YW50O3N0cm9rZTpub25lICFpbXBvcnRhbnR9LmFydGljbGUtLWNvbnRlbnQgLm1lcm1haWRbZGF0YS1wcm9jZXNzZWQ9XCJ0cnVlXCJde29wYWNpdHk6MX0uYXJ0aWNsZS0tY29udGVudCAuZXhwYW5kLXdyYXBwZXJ7bWFyZ2luOjJyZW0gMCAycmVtfS5hcnRpY2xlLS1jb250ZW50IGg1Ky5leHBhbmQtd3JhcHBlciwuYXJ0aWNsZS0tY29udGVudCBoNisuZXhwYW5kLXdyYXBwZXJ7bWFyZ2luLXRvcDouNzVyZW19LmFydGljbGUtLWNvbnRlbnQgLmV4cGFuZHtwb3NpdGlvbjpyZWxhdGl2ZTtib3JkZXItdG9wOjFweCBzb2xpZCAjMzgzODQ2O3BhZGRpbmc6Ljc1cmVtIDB9LmFydGljbGUtLWNvbnRlbnQgLmV4cGFuZDpsYXN0LW9mLXR5cGUsLmFydGljbGUtLWNvbnRlbnQgLmV4cGFuZDpvbmx5LWNoaWxke2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMzODM4NDZ9LmFydGljbGUtLWNvbnRlbnQgLmV4cGFuZC1sYWJlbHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtd2VpZ2h0OmJvbGQ7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctcmlnaHQ6Mi41cmVtO2N1cnNvcjpwb2ludGVyfS5hcnRpY2xlLS1jb250ZW50IC5leHBhbmQtbGFiZWw6aG92ZXIgLmV4cGFuZC10b2dnbGV7YmFja2dyb3VuZDojMDBDOUZGfS5hcnRpY2xlLS1jb250ZW50IC5leHBhbmQtbGlua3tkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxcmVtO3JpZ2h0Oi43NXJlbTttaW4taGVpZ2h0OjIwcHg7bWluLXdpZHRoOjIwcHg7Zm9udC1zaXplOjEuMjVyZW07Y29sb3I6I0ZBRkFGQztvcGFjaXR5Oi4zO3RyYW5zaXRpb246b3BhY2l0eSAuMnN9LmFydGljbGUtLWNvbnRlbnQgLmV4cGFuZC1saW5rOmhvdmVye2NvbG9yOiNGQUZBRkM7b3BhY2l0eToxfS5hcnRpY2xlLS1jb250ZW50IC5leHBhbmQtdG9nZ2xle3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi1oZWlnaHQ6MjBweDttaW4td2lkdGg6MjBweDtiYWNrZ3JvdW5kOiMyQUEzRkY7Ym9yZGVyLXJhZGl1czo1MCU7bWFyZ2luLXJpZ2h0Oi43NXJlbTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjJzfS5hcnRpY2xlLS1jb250ZW50IC5leHBhbmQtdG9nZ2xlOmJlZm9yZSwuYXJ0aWNsZS0tY29udGVudCAuZXhwYW5kLXRvZ2dsZTphZnRlcntjb250ZW50OlwiXCI7ZGlzcGxheTpibG9jazt3aWR0aDoxMHB4O2hlaWdodDoycHg7cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDojMTQxNDFGO3RyYW5zaXRpb246YWxsIC40czt0b3A6OXB4O2xlZnQ6NXB4fS5hcnRpY2xlLS1jb250ZW50IC5leHBhbmQtdG9nZ2xlOmFmdGVye3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpfS5hcnRpY2xlLS1jb250ZW50IC5leHBhbmQtdG9nZ2xlLm9wZW46YmVmb3JlLC5hcnRpY2xlLS1jb250ZW50IC5leHBhbmQtdG9nZ2xlLm9wZW46YWZ0ZXJ7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfS5hcnRpY2xlLS1jb250ZW50IC5leHBhbmQtY29udGVudHtwYWRkaW5nLXRvcDoxcmVtfS5hcnRpY2xlLS1jb250ZW50IC5mZWVkYmFja3tkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czoycHg7Ym94LXNoYWRvdzoxcHggMnB4IDZweCAjMDcwNzBFO2JhY2tncm91bmQ6cmdiYSgyMTIsMjE1LDIyMSwwLjAzKX0uYXJ0aWNsZS0tY29udGVudCAuZmVlZGJhY2sgaDR7Y29sb3I6I2ZmZn0uYXJ0aWNsZS0tY29udGVudCAuc3VwcG9ydHtwYWRkaW5nLXJpZ2h0OjJyZW19LmFydGljbGUtLWNvbnRlbnQgLnN1cHBvcnQgdWx7bWFyZ2luLWJvdHRvbToxLjI1cmVtO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmV9LmFydGljbGUtLWNvbnRlbnQgLnN1cHBvcnQgdWwgYXtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjUwMDtwb3NpdGlvbjpyZWxhdGl2ZX0uYXJ0aWNsZS0tY29udGVudCAuc3VwcG9ydCB1bCBhOjphZnRlcntjb250ZW50OlwiXFxlOTBhXCI7Zm9udC1mYW1pbHk6J2ljb21vb24tdjQnO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zaXplOjEuM3JlbTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg0NWRlZywgI2QzMDk3MSwjOWIyYWZmKTtiYWNrZ3JvdW5kLWNsaXA6dGV4dDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDtyaWdodDowO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDAuMjVyZW0pO29wYWNpdHk6MDt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMnMsIG9wYWNpdHkgLjJzfS5hcnRpY2xlLS1jb250ZW50IC5zdXBwb3J0IHVsIGE6aG92ZXI6OmFmdGVye3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEuNXJlbSk7b3BhY2l0eToxfS5hcnRpY2xlLS1jb250ZW50IC5zdXBwb3J0IHVsIGEuZGlzY29yZDpiZWZvcmV7Y29udGVudDp1cmwoXCIvc3Zncy9kaXNjb3JkLnN2Z1wiKTtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MS4xcmVtO3dpZHRoOjEuMjVyZW07dmVydGljYWwtYWxpZ246dG9wO21hcmdpbjoycHggLjY1cmVtIDAgMH0uYXJ0aWNsZS0tY29udGVudCAuc3VwcG9ydCB1bCBhLmNvbW11bml0eTpiZWZvcmV7Y29udGVudDpcIlxcZTkwMFwiO2NvbG9yOiNmZmY7bWFyZ2luLXJpZ2h0Oi43NXJlbTtmb250LXNpemU6MS4ycmVtO2ZvbnQtZmFtaWx5OidpY29tb29uLXYyJzt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmFydGljbGUtLWNvbnRlbnQgLnN1cHBvcnQgdWwgYS5zbGFjazpiZWZvcmV7Y29udGVudDp1cmwoXCIvc3Zncy9zbGFjay5zdmdcIik7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjEuMXJlbTt3aWR0aDoxLjFyZW07dmVydGljYWwtYWxpZ246dGV4dC10b3A7bWFyZ2luLXJpZ2h0Oi44cmVtfS5hcnRpY2xlLS1jb250ZW50IC5zdXBwb3J0IHVsIGEucmVkZGl0OmJlZm9yZXtjb250ZW50OnVybChcIi9zdmdzL3JlZGRpdC5zdmdcIik7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjEuMXJlbTt3aWR0aDoxLjJyZW07dmVydGljYWwtYWxpZ246dG9wO21hcmdpbjoycHggLjc1cmVtIDAgMH0uYXJ0aWNsZS0tY29udGVudCAuYWN0aW9uc3ttaW4td2lkdGg6MjMwcHg7cGFkZGluZy1ib3R0b206MS43NXJlbX0uYXJ0aWNsZS0tY29udGVudCAuYWN0aW9ucyBhe2Rpc3BsYXk6YmxvY2s7cGFkZGluZy1sZWZ0OjFyZW07Zm9udC1zaXplOi45NXJlbX0uYXJ0aWNsZS0tY29udGVudCAuYWN0aW9ucyBhLmJ0bntjb2xvcjojRDREN0REICFpbXBvcnRhbnQ7YmFja2dyb3VuZDojMzMzMzQ2ICFpbXBvcnRhbnR9LmFydGljbGUtLWNvbnRlbnQgLmFjdGlvbnMgYS5idG46YWZ0ZXJ7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICMwNjZGQzUsIzAwQTNGRil9LmFydGljbGUtLWNvbnRlbnQgLmFjdGlvbnMgYS5idG46aG92ZXJ7Y29sb3I6I2ZmZiAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC5hY3Rpb25zIGE6YmVmb3Jle2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDouN3JlbTtmb250LWZhbWlseTonaWNvbW9vbi12Mid9LmFydGljbGUtLWNvbnRlbnQgLmFjdGlvbnMgYS5lZGl0OmJlZm9yZXtjb250ZW50OlwiXFxlOTJmXCI7Zm9udC1zaXplOi44NXJlbX0uYXJ0aWNsZS0tY29udGVudCAuYWN0aW9ucyBhLmlzc3VlOmJlZm9yZXtjb250ZW50OlwiXFxlOTM0XCI7Zm9udC1zaXplOjFyZW19LmFydGljbGUtLWNvbnRlbnQgLmhlbHBmdWx7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uYXJ0aWNsZS0tY29udGVudCAuaGVscGZ1bCBwe21hcmdpbi1ib3R0b206MH0uYXJ0aWNsZS0tY29udGVudCAuaGVscGZ1bCBsYWJlbC5yYWRpby1idG5ze3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi13aWR0aDo0cmVtO3BhZGRpbmc6LjVyZW0gMXJlbTtmb250LXNpemU6Ljk1cmVtO2ZvbnQtd2VpZ2h0OjUwMDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojRkFGQUZDO2JvcmRlci1yYWRpdXM6M3B4O2JhY2tncm91bmQ6cmdiYSgyMTIsMjE1LDIyMSwwLjEpO2N1cnNvcjpwb2ludGVyO3otaW5kZXg6MX0uYXJ0aWNsZS0tY29udGVudCAuaGVscGZ1bCBsYWJlbC5yYWRpby1idG5zOmFmdGVye2NvbnRlbnQ6XCJcIjtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO21hcmdpbjowO3BhZGRpbmc6MDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXItcmFkaXVzOjNweDttaW4td2lkdGg6NHJlbTt6LWluZGV4Oi0xO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzLCBjb2xvciAuMnN9LmFydGljbGUtLWNvbnRlbnQgLmhlbHBmdWwgbGFiZWwucmFkaW8tYnRucyNoZWxwZnVsOmFmdGVye2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjMDA5RjVGLCMzNEJCNTUpfS5hcnRpY2xlLS1jb250ZW50IC5oZWxwZnVsIGxhYmVsLnJhZGlvLWJ0bnMjbm90LWhlbHBmdWw6YWZ0ZXJ7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICNGOTVGNTMsI0ZGODU2NCl9LmFydGljbGUtLWNvbnRlbnQgLmhlbHBmdWwgbGFiZWwucmFkaW8tYnRuczpob3Zlcntjb2xvcjojZmZmfS5hcnRpY2xlLS1jb250ZW50IC5oZWxwZnVsIGxhYmVsLnJhZGlvLWJ0bnM6aG92ZXI6YWZ0ZXJ7b3BhY2l0eToxfS5hcnRpY2xlLS1jb250ZW50IC5oZWxwZnVsIGlucHV0W3R5cGU9J3JhZGlvJ117ZGlzcGxheTpub25lfS5hcnRpY2xlLS1jb250ZW50IC5oZWxwZnVsIC5sb2FkZXItd3JhcHBlciwuYXJ0aWNsZS0tY29udGVudCAuaGVscGZ1bCAjdGhhbmsteW91e3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6bm9uZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiMxNDE0MUZ9LmFydGljbGUtLWNvbnRlbnQgLmhlbHBmdWwgLmxvYWRlci13cmFwcGVye3otaW5kZXg6NX0uYXJ0aWNsZS0tY29udGVudCAuaGVscGZ1bCAubG9hZGVyLXdyYXBwZXIgLmxvYWRlcnttYXJnaW46MCBhdXRvfS5hcnRpY2xlLS1jb250ZW50IC5oZWxwZnVsICN0aGFuay15b3V7ei1pbmRleDoxMH0uYXJ0aWNsZS0tY29udGVudCAuaGVscGZ1bCAjdGhhbmsteW91IHB7dGV4dC1hbGlnbjpjZW50ZXJ9QG1lZGlhIChtYXgtd2lkdGg6IDgwMHB4KXsuYXJ0aWNsZS0tY29udGVudCAuZmVlZGJhY2t7ZmxleC1kaXJlY3Rpb246Y29sdW1ufX1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpey5hcnRpY2xlLS1jb250ZW50IC5hY3Rpb25ze3BhZGRpbmctYm90dG9tOjFyZW19fS5hcnRpY2xlLS1jb250ZW50IC5mbGV4LXdyYXBwZXJ7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO21hcmdpbjoxLjVyZW0gMH0uYXJ0aWNsZS0tY29udGVudCAuZmxleC1jb250YWluZXJ7bWFyZ2luLXJpZ2h0OjEuNXJlbX0uYXJ0aWNsZS0tY29udGVudCAuZmxleC1jb250YWluZXIuaGFsZnt3aWR0aDpjYWxjKDUwJSAtIDEuNXJlbSl9LmFydGljbGUtLWNvbnRlbnQgLmZsZXgtY29udGFpbmVyLnRoaXJke3dpZHRoOmNhbGMoMzMuMzMlIC0gMS41cmVtKX0uYXJ0aWNsZS0tY29udGVudCAuZmxleC1jb250YWluZXIucXVhcnRlcnt3aWR0aDpjYWxjKDI1JSAtIDEuNXJlbSl9LmFydGljbGUtLWNvbnRlbnQgLmZsZXgtY29udGFpbmVyLnR3by10aGlyZHN7d2lkdGg6Y2FsYyg2NiUgLSAycmVtKX0uYXJ0aWNsZS0tY29udGVudCAuZmxleC1jb250YWluZXIuaGFsZiB0YWJsZTpub3QoOmxhc3QtY2hpbGQpLC5hcnRpY2xlLS1jb250ZW50IC5mbGV4LWNvbnRhaW5lci50aGlyZCB0YWJsZTpub3QoOmxhc3QtY2hpbGQpLC5hcnRpY2xlLS1jb250ZW50IC5mbGV4LWNvbnRhaW5lci5xdWFydGVyIHRhYmxlOm5vdCg6bGFzdC1jaGlsZCl7bWFyZ2luLXJpZ2h0OjEuNXJlbX0uYXJ0aWNsZS0tY29udGVudCAuZmxleC1jb250YWluZXIgaW1ne21hcmdpbi1ib3R0b206MH0uYXJ0aWNsZS0tY29udGVudCAuZmxleC1jb250YWluZXIgdGFibGV7ZGlzcGxheTp0YWJsZX0uYXJ0aWNsZS0tY29udGVudCAuZmxleC1jb250YWluZXIgcDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MC41cmVtfS5hcnRpY2xlLS1jb250ZW50IC5mbGV4LWNvbnRhaW5lci5vcGVyYXRvci1leGFtcGxlIC5oaWdobGlnaHQ6Zmlyc3QtY2hpbGQgLmNvZGVibG9jayBwcmV7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MS41cmVtfS5hcnRpY2xlLS1jb250ZW50IC5mbGV4LWNvbnRhaW5lci5vcGVyYXRvci1leGFtcGxlIHRhYmxlOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjEuNXJlbX0uYXJ0aWNsZS0tY29udGVudCAuZmxleC1jb250YWluZXIub3BlcmF0b3ItZXhhbXBsZSB0YWJsZTpmaXJzdC1jaGlsZCB0aHtmb250LXNpemU6MS4wNXJlbX0uYXJ0aWNsZS0tY29udGVudCAuZmxleC1jb250YWluZXIub3BlcmF0b3ItZXhhbXBsZSB0YWJsZTpmaXJzdC1jaGlsZCB0aCwuYXJ0aWNsZS0tY29udGVudCAuZmxleC1jb250YWluZXIub3BlcmF0b3ItZXhhbXBsZSB0YWJsZTpmaXJzdC1jaGlsZCB0ZHtwYWRkaW5nOi42NXJlbSAxLjE1cmVtfUBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCl7LmFydGljbGUtLWNvbnRlbnQgLmZsZXgtY29udGFpbmVyLmhhbGYsLmFydGljbGUtLWNvbnRlbnQgLmZsZXgtY29udGFpbmVyLnRoaXJkLC5hcnRpY2xlLS1jb250ZW50IC5mbGV4LWNvbnRhaW5lci50d28tdGhpcmRze3dpZHRoOmNhbGMoMTAwJSAtIDFyZW0pfS5hcnRpY2xlLS1jb250ZW50IC5mbGV4LWNvbnRhaW5lci5xdWFydGVye3dpZHRoOmNhbGMoNTAlIC0gMXJlbSl9LmFydGljbGUtLWNvbnRlbnQgLmZsZXgtY29udGFpbmVyIHA6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjEuNXJlbX19LmFydGljbGUtLWNvbnRlbnQgaDI6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgaDM6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgaDQ6YWZ0ZXJ7Y29udGVudDphdHRyKGRhdGEtdHlwZSk7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLWxlZnQ6LjVyZW07Zm9udC1zdHlsZTppdGFsaWM7Zm9udC1zaXplOi42MmVtO2ZvbnQtd2VpZ2h0OjIwMDtvcGFjaXR5Oi41fS5hcnRpY2xlLS1jb250ZW50IC5mdW5jdGlvbi1saXN0IGEuZXhwZXJpbWVudGFsOjphZnRlcntjb250ZW50OidcXGU5MDMnO2ZvbnQtZmFtaWx5OidpY29tb29uLXY0JzttYXJnaW4tbGVmdDouNDVyZW07Y29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjM1KTtmb250LXN0eWxlOm5vcm1hbDtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtZ3JvdXAta2V5cy1kZW1vIHRhYmxle21hcmdpbi1ib3R0b206MS4yNXJlbX0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1ncm91cC1rZXlzLWRlbW8gdGFibGUgdGQ6Zmlyc3QtY2hpbGQsLmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtZ3JvdXAta2V5cy1kZW1vIHRhYmxlIHRoOmZpcnN0LWNoaWxke3RleHQtYWxpZ246bGVmdH0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1ncm91cC1rZXlzLWRlbW8gdGFibGUgdGQ6bGFzdC1jaGlsZCwuYXJ0aWNsZS0tY29udGVudCAjZmx1eC1ncm91cC1rZXlzLWRlbW8gdGFibGUgdGg6bGFzdC1jaGlsZHt0ZXh0LWFsaWduOnJpZ2h0fS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LWdyb3VwLWtleXMtZGVtbyB0YWJsZSB0ZC5ncm91cGVkLWJ5LC5hcnRpY2xlLS1jb250ZW50ICNmbHV4LWdyb3VwLWtleXMtZGVtbyB0YWJsZSB0aC5ncm91cGVkLWJ5e2ZvbnQtd2VpZ2h0OmJvbGR9LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtZ3JvdXAta2V5cy1kZW1vIHRhYmxlIHRoLmdyb3VwZWQtYnl7Y29sb3I6I0Q2RjYyMn0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1ncm91cC1rZXlzLWRlbW8gdGFibGUgdGQuZ3JvdXBlZC1ieXtjb2xvcjojRDZGNjIyfS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LWdyb3VwLWtleXMtZGVtbyAjZ3JvdXAtYnktY29sdW1ucyAuY29sdW1uLWxpc3R7cGFkZGluZzowO21hcmdpbjouNXJlbSAwIDA7bGlzdC1zdHlsZTpub25lfS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LWdyb3VwLWtleXMtZGVtbyAjZ3JvdXAtYnktY29sdW1ucyAuY29sdW1uLWxpc3QgbGl7bWFyZ2luOjA7bGluZS1oZWlnaHQ6MS4zNXJlbX0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1ncm91cC1rZXlzLWRlbW8gI2dyb3VwLWJ5LWNvbHVtbnMgbGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzouMjVyZW0gMDtjb2xvcjojRDREN0REO3Bvc2l0aW9uOnJlbGF0aXZlfS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LWdyb3VwLWtleXMtZGVtbyAjZ3JvdXAtYnktY29sdW1ucyBsYWJlbDphZnRlcntjb250ZW50OmF0dHIoZGF0YS1jb3VudCk7bWFyZ2luLWxlZnQ6MDtmb250LXNpemU6Ljg1cmVtO29wYWNpdHk6LjV9LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtZ3JvdXAta2V5cy1kZW1vICNncm91cC1ieS1jb2x1bW5zIC5jaGVja2JveHtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtoZWlnaHQ6MS4xNWVtO3dpZHRoOjEuMTVlbTtiYWNrZ3JvdW5kOnJnYmEoMjEyLDIxNSwyMjEsMC4wNSk7bWFyZ2luLXJpZ2h0Oi4zcmVtO3ZlcnRpY2FsLWFsaWduOnRleHQtdG9wO2JvcmRlci1yYWRpdXM6MnB4O2N1cnNvcjpwb2ludGVyO2JvcmRlcjoxLjVweCBzb2xpZCByZ2JhKDIxMiwyMTUsMjIxLDAuMik7dXNlci1zZWxlY3Q6bm9uZX0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1ncm91cC1rZXlzLWRlbW8gI2dyb3VwLWJ5LWNvbHVtbnMgaW5wdXRbdHlwZT0nY2hlY2tib3gnXXttYXJnaW4tcmlnaHQ6LTEuMXJlbTtwYWRkaW5nOjA7dmVydGljYWwtYWxpZ246dG9wO29wYWNpdHk6MDtjdXJzb3I6cG9pbnRlcn0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1ncm91cC1rZXlzLWRlbW8gI2dyb3VwLWJ5LWNvbHVtbnMgaW5wdXRbdHlwZT0nY2hlY2tib3gnXSsuY2hlY2tib3g6YWZ0ZXJ7Y29udGVudDpcIlwiO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0Oi41cmVtO3dpZHRoOi41cmVtO2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6IzAwQTNGRjt0b3A6NTAlO2xlZnQ6NTAlO29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoMikgdHJhbnNsYXRlKC0yMCUsIC0yMCUpO3RyYW5zaXRpb246YWxsIC4yc30uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1ncm91cC1rZXlzLWRlbW8gI2dyb3VwLWJ5LWNvbHVtbnMgaW5wdXRbdHlwZT0nY2hlY2tib3gnXTpjaGVja2VkKy5jaGVja2JveDphZnRlcntvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpIHRyYW5zbGF0ZSgtNTAlLCAtNTAlKX0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1ncm91cC1rZXlzLWRlbW8gcHJlI2dyb3VwLWJ5LWV4YW1wbGV7bGluZS1oZWlnaHQ6MS40cmVtO2ZvbnQtc2l6ZTouOTVyZW19LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtZ3JvdXAta2V5cy1kZW1vIHByZSNncm91cC1ieS1leGFtcGxlIC5ueHtjb2xvcjojMDBBM0ZGfS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LWdyb3VwLWtleXMtZGVtbyBwcmUjZ3JvdXAtYnktZXhhbXBsZSAuczJ7Y29sb3I6IzAwOUY1Rn0uYXJ0aWNsZS0tY29udGVudCAuZmx1eC13YXRlci1kaWFncmFte2JhY2tncm91bmQ6dXJsKFwiL2ltZy9mbHV4LzAteC13YXRlci1wcm9jZXNzLWRhcmsuc3ZnXCIpO21hcmdpbjoycmVtIDAgLjVyZW07d2lkdGg6MTAwJTtoZWlnaHQ6MDtwYWRkaW5nLXRvcDo2My43MSU7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0fS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LWRhdGEtbW9kZWx7bWF4LXdpZHRoOjUwMHB4O21hcmdpbjozcmVtIDB9LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtZGF0YS1tb2RlbCAuc3RyZWFtLW9mLXRhYmxlc3twb3NpdGlvbjpyZWxhdGl2ZTtib3JkZXI6MXB4IGRhc2hlZCAjRDREN0REO3BhZGRpbmc6MXJlbTtib3JkZXItcmFkaXVzOjRweH0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1kYXRhLW1vZGVsIC5zdHJlYW0tb2YtdGFibGVzOmJlZm9yZXtjb250ZW50OlwiU3RyZWFtIG9mIHRhYmxlc1wiO2ZvbnQtd2VpZ2h0OjUwMDtjb2xvcjojRkFGQUZDO2JhY2tncm91bmQ6IzE0MTQxRjtwb3NpdGlvbjphYnNvbHV0ZTtwYWRkaW5nOjAgMXJlbTt0b3A6LS42NXJlbX0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1kYXRhLW1vZGVsIHRhYmxle2Rpc3BsYXk6dGFibGU7d2lkdGg6MTAwJTtvdmVyZmxvdzp2aXNpYmxlO21hcmdpbjowfS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LWRhdGEtbW9kZWwgdGFibGUgdGgsLmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtZGF0YS1tb2RlbCB0YWJsZSB0ZHtib3JkZXItcmlnaHQ6MXB4IGRhc2hlZCByZ2JhKDIxMiwyMTUsMjIxLDAuMjUpfS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LWRhdGEtbW9kZWwgdGFibGUgdGg6bGFzdC1jaGlsZCwuYXJ0aWNsZS0tY29udGVudCAjZmx1eC1kYXRhLW1vZGVsIHRhYmxlIHRkOmxhc3QtY2hpbGR7Ym9yZGVyOm5vbmV9LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtZGF0YS1tb2RlbCB0YWJsZSB0aHtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwwLjI1KX0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1kYXRhLW1vZGVsIC50YWJsZS1ncm91cHtwYWRkaW5nOjFyZW19LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtZGF0YS1tb2RlbCAudGFibGUtZ3JvdXA6Zmlyc3QtY2hpbGR7Ym9yZGVyOjFweCBkYXNoZWQgI0Q0RDdERDtib3JkZXItcmFkaXVzOjJweDtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW4tYm90dG9tOi4yNXJlbX0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1kYXRhLW1vZGVsIC50YWJsZS1ncm91cDpmaXJzdC1jaGlsZDpiZWZvcmV7Y29udGVudDpcIlRhYmxlXCI7Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOiNGQUZBRkM7YmFja2dyb3VuZDojMTQxNDFGO3Bvc2l0aW9uOmFic29sdXRlO3BhZGRpbmc6MCAuNzVyZW07dG9wOi0uNjVyZW07cmlnaHQ6MXJlbX0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1kYXRhLW1vZGVsIC50YWJsZS1ncm91cDpudGgtY2hpbGQoMikgdGg6Zmlyc3QtY2hpbGR7Ym9yZGVyOm5vbmV9LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtZGF0YS1tb2RlbCAudGFibGUtZ3JvdXA6bnRoLWNoaWxkKDIpIHRoOm50aC1jaGlsZCgyKXtib3JkZXItdG9wOjFweCBkYXNoZWQgI0Q0RDdERDtib3JkZXItbGVmdDoxcHggZGFzaGVkIHJnYmEoMjU1LDI1NSwyNTUsMC44NSk7Ym9yZGVyLXJpZ2h0OjFweCBkYXNoZWQgcmdiYSgyNTUsMjU1LDI1NSwwLjg1KTtwb3NpdGlvbjpyZWxhdGl2ZX0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1kYXRhLW1vZGVsIC50YWJsZS1ncm91cDpudGgtY2hpbGQoMikgdGg6bnRoLWNoaWxkKDIpOmJlZm9yZXtjb250ZW50OlwiQ29sdW1uXCI7Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOiNmZmYsMC44NTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LjJyZW07bGVmdDouNXJlbX0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1kYXRhLW1vZGVsIC50YWJsZS1ncm91cDpudGgtY2hpbGQoMikgdGQ6Zmlyc3QtY2hpbGR7Ym9yZGVyOm5vbmV9LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtZGF0YS1tb2RlbCAudGFibGUtZ3JvdXA6bnRoLWNoaWxkKDIpIHRkOm50aC1jaGlsZCgyKXtib3JkZXItbGVmdDoxcHggZGFzaGVkICNENEQ3REQ7Ym9yZGVyLXJpZ2h0OjFweCBkYXNoZWQgI0Q0RDdERH0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1kYXRhLW1vZGVsIC50YWJsZS1ncm91cDpudGgtY2hpbGQoMikgdHI6bGFzdC1jaGlsZCB0ZDpudGgtY2hpbGQoMil7Ym9yZGVyLWJvdHRvbToxcHggZGFzaGVkICNENEQ3RER9LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtZGF0YS1tb2RlbCAudGFibGUtZ3JvdXA6bnRoLWNoaWxkKDMpIHRyOm50aC1jaGlsZCgyKXtib3JkZXItdG9wOjFweCBkYXNoZWQgI0Q0RDdERDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI0Q0RDdERH0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1kYXRhLW1vZGVsIC50YWJsZS1ncm91cDpudGgtY2hpbGQoMykgdHI6bnRoLWNoaWxkKDIpIHRkOmZpcnN0LWNoaWxke2JvcmRlci1sZWZ0OjFweCBkYXNoZWQgI0Q0RDdERDtwb3NpdGlvbjpyZWxhdGl2ZX0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC1kYXRhLW1vZGVsIC50YWJsZS1ncm91cDpudGgtY2hpbGQoMykgdHI6bnRoLWNoaWxkKDIpIHRkOmZpcnN0LWNoaWxkOmJlZm9yZXtjb250ZW50OlwiUm93XCI7Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOiNGQUZBRkM7cG9zaXRpb246YWJzb2x1dGU7dG9wOi4xNXJlbTtsZWZ0Oi41cmVtfS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LWRhdGEtbW9kZWwgLnRhYmxlLWdyb3VwOm50aC1jaGlsZCgzKSB0cjpudGgtY2hpbGQoMikgdGQ6bGFzdC1jaGlsZHtib3JkZXItcmlnaHQ6MXB4IGRhc2hlZCAjRDREN0REfS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LXRhYmxlLW9wc3tkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO21heC13aWR0aDo2NTBweDttYXJnaW4tYm90dG9tOjJyZW19LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtdGFibGUtb3BzIC5zdHJlYW0tb2YtdGFibGVze2ZsZXgtZ3JvdzoxfS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LXRhYmxlLW9wcyAuc3RyZWFtLW9mLXRhYmxlczpmaXJzdC1jaGlsZHtwYWRkaW5nLWxlZnQ6MH0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC10YWJsZS1vcHMgLnN0cmVhbS1vZi10YWJsZXM6bGFzdC1jaGlsZHtwYWRkaW5nLXJpZ2h0OjB9LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtdGFibGUtb3BzIC5vcGVyYXRpb257ZGlzcGxheTpmbGV4O2ZsZXgtZ3JvdzoxO2FsaWduLWl0ZW1zOmNlbnRlcn0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC10YWJsZS1vcHMgLm9wZXJhdGlvbiAuYXJyb3d7cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZDojRDREN0REO2ZsZXgtZ3JvdzoxO2hlaWdodDoxcHg7bWFyZ2luOjAgLjc1cmVtO29wYWNpdHk6LjM1fS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LXRhYmxlLW9wcyAub3BlcmF0aW9uIC5hcnJvdzphZnRlcntjb250ZW50OlwiXCI7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjdweCAwIDdweCA4cHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICNENEQ3REQ7cmlnaHQ6LTFweDt0b3A6LTdweH0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC10YWJsZS1vcHMgLm9wZXJhdGlvbiBwe21hcmdpbjowO3RleHQtYWxpZ246Y2VudGVyfS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LXRhYmxlLW9wcyB0YWJsZXtkaXNwbGF5OnRhYmxlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6dmlzaWJsZTttYXJnaW46MXJlbSAwfS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LXRhYmxlLW9wcyB0YWJsZSB0aCwuYXJ0aWNsZS0tY29udGVudCAjZmx1eC10YWJsZS1vcHMgdGFibGUgdGR7Ym9yZGVyLXJpZ2h0OjFweCBkYXNoZWQgcmdiYSgyMTIsMjE1LDIyMSwwLjI1KX0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC10YWJsZS1vcHMgdGFibGUgdGg6bGFzdC1jaGlsZCwuYXJ0aWNsZS0tY29udGVudCAjZmx1eC10YWJsZS1vcHMgdGFibGUgdGQ6bGFzdC1jaGlsZHtib3JkZXI6bm9uZX0uYXJ0aWNsZS0tY29udGVudCAjZmx1eC10YWJsZS1vcHMgdGFibGUgdGh7Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMC4yNSl9QG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KXsuYXJ0aWNsZS0tY29udGVudCAjZmx1eC10YWJsZS1vcHMgdGg6bGFzdC1jaGlsZCwuYXJ0aWNsZS0tY29udGVudCAjZmx1eC10YWJsZS1vcHMgdGQ6bGFzdC1jaGlsZHtkaXNwbGF5Om5vbmV9LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtdGFibGUtb3BzIHRoOm50aC1jaGlsZCgyKSwuYXJ0aWNsZS0tY29udGVudCAjZmx1eC10YWJsZS1vcHMgdGQ6bnRoLWNoaWxkKDIpe2JvcmRlcjpub25lfS5hcnRpY2xlLS1jb250ZW50ICNmbHV4LXRhYmxlLW9wcyB0aDpudGgtY2hpbGQoMil7Ym9yZGVyLXJhZGl1czowIDJweCAwIDB9LmFydGljbGUtLWNvbnRlbnQgI2ZsdXgtdGFibGUtb3BzIHRyOmxhc3QtY2hpbGQgdGQ6bnRoLWNoaWxkKDIpe2JvcmRlci1yYWRpdXM6MCAwIDJweCAwfX0uYXJ0aWNsZS0tY29udGVudCAuZnMtZGlhZ3JhbXtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MXJlbSAwIDJyZW07cGFkZGluZzoxLjVyZW0gMi41cmVtIDEuNXJlbSAxLjVyZW07Zm9udC1mYW1pbHk6XCJJQk0gUGxleCBNb25vXCIsbW9ub3NwYWNlO2JvcmRlci1yYWRpdXM6MnB4O2JveC1zaGFkb3c6MXB4IDNweCAxMHB4ICMwNzA3MEV9LmFydGljbGUtLWNvbnRlbnQgLmZzLWRpYWdyYW0+dWx7cGFkZGluZzowO21hcmdpbjowfS5hcnRpY2xlLS1jb250ZW50IC5mcy1kaWFncmFtPnVsIGxpe2xpbmUtaGVpZ2h0OjJyZW07Y29sb3I6I0I3QjhGRn0uYXJ0aWNsZS0tY29udGVudCAuZnMtZGlhZ3JhbT51bCB1bHtwYWRkaW5nLWxlZnQ6MnJlbTttYXJnaW46MH0uYXJ0aWNsZS0tY29udGVudCAuZnMtZGlhZ3JhbT51bCB1bCBsaXtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46MCAwIDAgLTEuNDVyZW07cGFkZGluZy1sZWZ0OjEuNDVyZW07bGluZS1oZWlnaHQ6Mi41cmVtO2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjQjdCOEZGfS5hcnRpY2xlLS1jb250ZW50IC5mcy1kaWFncmFtPnVsIHVsIGxpOmJlZm9yZXtjb250ZW50OlwiXCI7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MXJlbTtoZWlnaHQ6LjI1cmVtO21hcmdpbi1yaWdodDouNTVyZW07bWFyZ2luLWxlZnQ6LTEuNDVyZW07Ym9yZGVyLXRvcDoxcHggc29saWQgI0I3QjhGRn0uYXJ0aWNsZS0tY29udGVudCAuZnMtZGlhZ3JhbT51bCB1bCBsaTpsYXN0LWNoaWxke2JvcmRlcjpub25lfS5hcnRpY2xlLS1jb250ZW50IC5mcy1kaWFncmFtPnVsIHVsIGxpOmxhc3QtY2hpbGQ6YWZ0ZXJ7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO21hcmdpbjowO3BhZGRpbmc6MDtsZWZ0OjA7dG9wOjA7aGVpZ2h0OjEuNHJlbTtib3JkZXItbGVmdDoxcHggc29saWQgI0I3QjhGRn0uYXJ0aWNsZS0tY29udGVudCAuZnMtZGlhZ3JhbSB1bHtsaXN0LXN0eWxlOm5vbmV9LmFydGljbGUtLWNvbnRlbnQgI3NoYXJkLWRpYWdyYW0sLmFydGljbGUtLWNvbnRlbnQgI2RhdGEtcmV0ZW50aW9ue2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWF4LXdpZHRoOjU1MHB4O21hcmdpbjoyLjVyZW0gYXV0byAzcmVtfS5hcnRpY2xlLS1jb250ZW50ICNzaGFyZC1kaWFncmFtIHAsLmFydGljbGUtLWNvbnRlbnQgI2RhdGEtcmV0ZW50aW9uIHB7bWFyZ2luLWJvdHRvbTowO2xpbmUtaGVpZ2h0OjEuMjVlbX0uYXJ0aWNsZS0tY29udGVudCAjc2hhcmQtZGlhZ3JhbSAucGVyaW9kcywuYXJ0aWNsZS0tY29udGVudCAjZGF0YS1yZXRlbnRpb24gLnBlcmlvZHN7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uYXJ0aWNsZS0tY29udGVudCAjc2hhcmQtZGlhZ3JhbSAudGltZWxpbmUsLmFydGljbGUtLWNvbnRlbnQgI2RhdGEtcmV0ZW50aW9uIC50aW1lbGluZXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O21hcmdpbi10b3A6LjI1cmVtO3BhZGRpbmc6MCAuNXJlbX0uYXJ0aWNsZS0tY29udGVudCAjc2hhcmQtZGlhZ3JhbSAudGltZWxpbmUgLmludGVydmFsLC5hcnRpY2xlLS1jb250ZW50ICNkYXRhLXJldGVudGlvbiAudGltZWxpbmUgLmludGVydmFse2JvcmRlci10b3A6MXB4IHNvbGlkICNENEQ3REQ7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjRDREN0REO2hlaWdodDouNzVyZW07ZmxleC1ncm93OjF9LmFydGljbGUtLWNvbnRlbnQgI3NoYXJkLWRpYWdyYW0gLnRpbWVsaW5lIC5pbnRlcnZhbDpmaXJzdC1jaGlsZCwuYXJ0aWNsZS0tY29udGVudCAjZGF0YS1yZXRlbnRpb24gLnRpbWVsaW5lIC5pbnRlcnZhbDpmaXJzdC1jaGlsZHtib3JkZXItbGVmdDoxcHggc29saWQgI0Q0RDdERH0uYXJ0aWNsZS0tY29udGVudCAjc2hhcmQtZGlhZ3JhbSAudGltZWxpbmUgLm9uZS1xdWFydGVyLC5hcnRpY2xlLS1jb250ZW50ICNkYXRhLXJldGVudGlvbiAudGltZWxpbmUgLm9uZS1xdWFydGVye3dpZHRoOjI1JTtoZWlnaHQ6Ljc1cmVtfS5hcnRpY2xlLS1jb250ZW50ICNzaGFyZC1kaWFncmFtIC50aW1lbGluZSAudGhyZWUtcXVhcnRlcnMsLmFydGljbGUtLWNvbnRlbnQgI2RhdGEtcmV0ZW50aW9uIC50aW1lbGluZSAudGhyZWUtcXVhcnRlcnN7d2lkdGg6NzUlO2hlaWdodDouNzVyZW19LmFydGljbGUtLWNvbnRlbnQgI3NoYXJkLWRpYWdyYW0gLnRpbWVsaW5lIC5ib3JkZXItbGVmdCwuYXJ0aWNsZS0tY29udGVudCAjZGF0YS1yZXRlbnRpb24gLnRpbWVsaW5lIC5ib3JkZXItbGVmdHtib3JkZXItbGVmdDoxcHggc29saWQgI0Q0RDdERH0uYXJ0aWNsZS0tY29udGVudCAjc2hhcmQtZGlhZ3JhbSAudGltZWxpbmUgLnJldGVudGlvbi1sYWJlbCwuYXJ0aWNsZS0tY29udGVudCAjZGF0YS1yZXRlbnRpb24gLnRpbWVsaW5lIC5yZXRlbnRpb24tbGFiZWx7cG9zaXRpb246cmVsYXRpdmV9LmFydGljbGUtLWNvbnRlbnQgI3NoYXJkLWRpYWdyYW0gLnRpbWVsaW5lIC5yZXRlbnRpb24tbGFiZWw6YmVmb3JlLC5hcnRpY2xlLS1jb250ZW50ICNkYXRhLXJldGVudGlvbiAudGltZWxpbmUgLnJldGVudGlvbi1sYWJlbDpiZWZvcmV7Y29udGVudDpcIlwiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOi42NXJlbTttYXJnaW4tcmlnaHQ6LjVyZW07Ym9yZGVyLXRvcDoxcHggc29saWQgI0Q0RDdERDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmFydGljbGUtLWNvbnRlbnQgI3NoYXJkLWRpYWdyYW0gLnRpbWVsaW5lIC5kZWxldGVkLWxhYmVsLC5hcnRpY2xlLS1jb250ZW50ICNkYXRhLXJldGVudGlvbiAudGltZWxpbmUgLmRlbGV0ZWQtbGFiZWx7Y29sb3I6I0JGM0Q1RTt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6LjlyZW19LmFydGljbGUtLWNvbnRlbnQgI3NoYXJkLWRpYWdyYW0gLnNoYXJkLWdyb3VwcywuYXJ0aWNsZS0tY29udGVudCAjZGF0YS1yZXRlbnRpb24gLnNoYXJkLWdyb3Vwc3tkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2p1c3RpZnktY29udGVudDpzcGFjZS1hcm91bmQ7bWFyZ2luLXRvcDouMjVyZW07cGFkZGluZzouNXJlbTtsaW5lLWhlaWdodDoxcmVtfS5hcnRpY2xlLS1jb250ZW50ICNzaGFyZC1kaWFncmFtIC5zaGFyZC1ncm91cHMgLnNoYXJkLWdyb3VwLC5hcnRpY2xlLS1jb250ZW50ICNkYXRhLXJldGVudGlvbiAuc2hhcmQtZ3JvdXBzIC5zaGFyZC1ncm91cHttYXJnaW46MCAuMjVyZW07dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzouNXJlbTtib3JkZXItcmFkaXVzOi41cmVtO2JhY2tncm91bmQ6IzI2MjczODtmbGV4LWdyb3c6MTtib3gtc2hhZG93OjJweCAycHggOHB4ICMwNzA3MEV9LmFydGljbGUtLWNvbnRlbnQgI3NoYXJkLWRpYWdyYW0gLnNoYXJkLWdyb3VwcyAuc2hhcmQtZ3JvdXAgcDpmaXJzdC1jaGlsZCwuYXJ0aWNsZS0tY29udGVudCAjZGF0YS1yZXRlbnRpb24gLnNoYXJkLWdyb3VwcyAuc2hhcmQtZ3JvdXAgcDpmaXJzdC1jaGlsZHttYXJnaW4tYm90dG9tOi43NXJlbX0uYXJ0aWNsZS0tY29udGVudCAjc2hhcmQtZGlhZ3JhbSAuc2hhcmQtZ3JvdXBzIC5zaGFyZC1ncm91cCAuc2hhcmQsLmFydGljbGUtLWNvbnRlbnQgI2RhdGEtcmV0ZW50aW9uIC5zaGFyZC1ncm91cHMgLnNoYXJkLWdyb3VwIC5zaGFyZHtkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6LjVyZW07cGFkZGluZzouNjVyZW0gMXJlbTtjb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6LjI1cmVtO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLCAjOEUxRkMzLCMwNjZGQzUpO2JhY2tncm91bmQtYXR0YWNobWVudDpmaXhlZH0uYXJ0aWNsZS0tY29udGVudCAjc2hhcmQtZGlhZ3JhbSAuc2hhcmQtZ3JvdXBzIC5zaGFyZC1ncm91cC5kZWxldGVkLC5hcnRpY2xlLS1jb250ZW50ICNkYXRhLXJldGVudGlvbiAuc2hhcmQtZ3JvdXBzIC5zaGFyZC1ncm91cC5kZWxldGVke29wYWNpdHk6LjN9LmFydGljbGUtLWNvbnRlbnQgI3NoYXJkLWRpYWdyYW0gLnNoYXJkLWdyb3VwcyAuc2hhcmQtZ3JvdXAuZGVsZXRlZCAuc2hhcmQsLmFydGljbGUtLWNvbnRlbnQgI2RhdGEtcmV0ZW50aW9uIC5zaGFyZC1ncm91cHMgLnNoYXJkLWdyb3VwLmRlbGV0ZWQgLnNoYXJke2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjQkYzRDVFLCNEQzRFNTgpfS5hcnRpY2xlLS1jb250ZW50IC5zZXJpZXMtZGlhZ3JhbXtkaXNwbGF5OmZsZXg7d2lkdGg6Zml0LWNvbnRlbnQ7bWF4LXdpZHRoOjEwMCU7bWFyZ2luOjFyZW0gMy4yNXJlbSAxLjc1cmVtIDA7cGFkZGluZy1yaWdodDoxLjVyZW07Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCAjRDZGNjIyfS5hcnRpY2xlLS1jb250ZW50IC5zZXJpZXMtZGlhZ3JhbSB0YWJsZXttYXJnaW46MH0uYXJ0aWNsZS0tY29udGVudCAuc2VyaWVzLWRpYWdyYW06YWZ0ZXJ7Y29udGVudDpcIlNlcmllc1wiO3RvcDo0cmVtO3JpZ2h0Oi0zLjVyZW19LmFydGljbGUtLWNvbnRlbnQgLnNlcmllcy1kaWFncmFtOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTozcmVtfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlIHRyLnBvaW50e2JvcmRlcjoycHggc29saWQgI0Q2RjYyMn0uYXJ0aWNsZS0tY29udGVudCB0YWJsZSB0ci5wb2ludDphZnRlcntjb250ZW50OlwiUG9pbnRcIjtib3R0b206LS44cmVtO2xlZnQ6MXJlbX0uYXJ0aWNsZS0tY29udGVudCAuc2VyaWVzLWRpYWdyYW0sLmFydGljbGUtLWNvbnRlbnQgdGFibGUgdHIucG9pbnR7cG9zaXRpb246cmVsYXRpdmV9LmFydGljbGUtLWNvbnRlbnQgLnNlcmllcy1kaWFncmFtOmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IHRhYmxlIHRyLnBvaW50OmFmdGVye2NvbG9yOiMyMDIwMjg7YmFja2dyb3VuZDojRDZGNjIyO2JvcmRlci1yYWRpdXM6MnB4O3Bvc2l0aW9uOmFic29sdXRlO2ZvbnQtc2l6ZTouOXJlbTtmb250LXdlaWdodDo1MDA7cGFkZGluZzouMnJlbSAuNXJlbTtsaW5lLWhlaWdodDouOXJlbX0uYXJ0aWNsZS0tY29udGVudCAuc3FsIHRhYmxlIHRyLnBvaW50c3twb3NpdGlvbjpyZWxhdGl2ZX0uYXJ0aWNsZS0tY29udGVudCAuc3FsIHRhYmxlIHRyLnBvaW50cyB0ZDpmaXJzdC1jaGlsZDpiZWZvcmUsLmFydGljbGUtLWNvbnRlbnQgLnNxbCB0YWJsZSB0ci5wb2ludHMgdGQ6Zmlyc3QtY2hpbGQ6YWZ0ZXJ7ZGlzcGxheTpibG9jaztib3JkZXItcmFkaXVzOjJweDtwb3NpdGlvbjphYnNvbHV0ZTtmb250LXNpemU6LjlyZW07Zm9udC13ZWlnaHQ6NTAwO3BhZGRpbmc6LjJyZW0gLjVyZW07bGluZS1oZWlnaHQ6LjlyZW07ei1pbmRleDoxO3RvcDotLjI1cmVtO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzLCB0b3AgLjJzfS5hcnRpY2xlLS1jb250ZW50IC5zcWwgdGFibGUgdHIucG9pbnRzIHRkOmZpcnN0LWNoaWxkOmJlZm9yZXtjb250ZW50OlwiUG9pbnQgMVwiO2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZDMwOTcxfS5hcnRpY2xlLS1jb250ZW50IC5zcWwgdGFibGUgdHIucG9pbnRzIHRkOmZpcnN0LWNoaWxkOmFmdGVye2NvbnRlbnQ6XCJQb2ludCAyXCI7Y29sb3I6IzIwMjAyODtiYWNrZ3JvdW5kOiNENkY2MjI7bGVmdDo1cmVtfS5hcnRpY2xlLS1jb250ZW50IC5zcWwgdGFibGUgdHIucG9pbnRzOmhvdmVyIHRkOmZpcnN0LWNoaWxkOmJlZm9yZSwuYXJ0aWNsZS0tY29udGVudCAuc3FsIHRhYmxlIHRyLnBvaW50czpob3ZlciB0ZDpmaXJzdC1jaGlsZDphZnRlcntvcGFjaXR5OjE7dG9wOi0uNjVyZW19LmFydGljbGUtLWNvbnRlbnQgLnNxbCB0YWJsZSBzcGFuLnBvaW50e3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5hcnRpY2xlLS1jb250ZW50IC5zcWwgdGFibGUgc3Bhbi5wb2ludC5vbmU6YmVmb3Jle2NvbnRlbnQ6XCJcIjtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMCU7aGVpZ2h0OjJweDtib3JkZXItdG9wOjJweCBzb2xpZCAjZDMwOTcxO2JvdHRvbTotMnB4fS5hcnRpY2xlLS1jb250ZW50IC5zcWwgdGFibGUgc3Bhbi5wb2ludC50d286YWZ0ZXJ7Y29udGVudDpcIlwiO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtoZWlnaHQ6MnB4O2JvcmRlci10b3A6MnB4IHNvbGlkICNENkY2MjI7Ym90dG9tOi04cHh9LmFydGljbGUtLWNvbnRlbnQgI2xpbmUtcHJvdG9jb2wtYW5hdG9teXtvdmVyZmxvdzpzY3JvbGw7bWFyZ2luOjNyZW0gMCAyLjVyZW19LmFydGljbGUtLWNvbnRlbnQgI2xpbmUtcHJvdG9jb2wtYW5hdG9teSBwe3BhZGRpbmc6M3JlbSAwIDJyZW07d2hpdGUtc3BhY2U6bm93cmFwO2ZvbnQtZmFtaWx5OlwiSUJNIFBsZXggTW9ub1wiLG1vbm9zcGFjZTtvdmVyZmxvdzp2aXNpYmxlO3RleHQtYWxpZ246Y2VudGVyfS5hcnRpY2xlLS1jb250ZW50ICNsaW5lLXByb3RvY29sLWFuYXRvbXkgcCBzcGFue3BhZGRpbmc6Ljc1cmVtIDAgLjc1cmVtfS5hcnRpY2xlLS1jb250ZW50ICNsaW5lLXByb3RvY29sLWFuYXRvbXkgcCBzcGFuLmVse3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci10b3A6MnB4IHNvbGlkICNENkY2MjJ9LmFydGljbGUtLWNvbnRlbnQgI2xpbmUtcHJvdG9jb2wtYW5hdG9teSBwIHNwYW4uZWw6YmVmb3Jle2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7Zm9udC1mYW1pbHk6XCJQcm94aW1hIE5vdmFcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZTouOTVyZW07Y29sb3I6I0Q2RjYyMjtmb250LXdlaWdodDo1MDA7dG9wOi0yLjc1cmVtO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfS5hcnRpY2xlLS1jb250ZW50ICNsaW5lLXByb3RvY29sLWFuYXRvbXkgcCBzcGFuLmVsOmFmdGVye2NvbnRlbnQ6XCJcIjtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxcmVtO3dpZHRoOjJweDt0b3A6LTFyZW07bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSk7YmFja2dyb3VuZDojRDZGNjIyfS5hcnRpY2xlLS1jb250ZW50ICNsaW5lLXByb3RvY29sLWFuYXRvbXkgcCBzcGFuLmVsLm1lYXN1cmVtZW50OmJlZm9yZXtjb250ZW50OlwibWVhc3VyZW1lbnRcIn0uYXJ0aWNsZS0tY29udGVudCAjbGluZS1wcm90b2NvbC1hbmF0b215IHAgc3Bhbi5lbC50YWdzZXQ6YmVmb3Jle2NvbnRlbnQ6XCJ0YWcgc2V0XCJ9LmFydGljbGUtLWNvbnRlbnQgI2xpbmUtcHJvdG9jb2wtYW5hdG9teSBwIHNwYW4uZWwuZmllbGRzZXQ6YmVmb3Jle2NvbnRlbnQ6XCJmaWVsZCBzZXRcIn0uYXJ0aWNsZS0tY29udGVudCAjbGluZS1wcm90b2NvbC1hbmF0b215IHAgc3Bhbi5lbC50aW1lc3RhbXA6YmVmb3Jle2NvbnRlbnQ6XCJ0aW1lc3RhbXBcIn0uYXJ0aWNsZS0tY29udGVudCAjbGluZS1wcm90b2NvbC1hbmF0b215IHAgc3Bhbi53aGl0ZXNwYWNlLC5hcnRpY2xlLS1jb250ZW50ICNsaW5lLXByb3RvY29sLWFuYXRvbXkgcCBzcGFuLmNvbW1he3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNENkY2MjJ9LmFydGljbGUtLWNvbnRlbnQgI2xpbmUtcHJvdG9jb2wtYW5hdG9teSBwIHNwYW4ud2hpdGVzcGFjZTpiZWZvcmUsLmFydGljbGUtLWNvbnRlbnQgI2xpbmUtcHJvdG9jb2wtYW5hdG9teSBwIHNwYW4uY29tbWE6YmVmb3Jle3doaXRlLXNwYWNlOm5vd3JhcDtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2ZvbnQtZmFtaWx5OlwiUHJveGltYSBOb3ZhXCIsc2Fucy1zZXJpZjtmb250LXNpemU6Ljk1cmVtO2NvbG9yOiNENkY2MjI7Zm9udC13ZWlnaHQ6NTAwO2JvdHRvbTotMi43NXJlbTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKX0uYXJ0aWNsZS0tY29udGVudCAjbGluZS1wcm90b2NvbC1hbmF0b215IHAgc3Bhbi53aGl0ZXNwYWNlOmFmdGVyLC5hcnRpY2xlLS1jb250ZW50ICNsaW5lLXByb3RvY29sLWFuYXRvbXkgcCBzcGFuLmNvbW1hOmFmdGVye2NvbnRlbnQ6XCJcIjtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxcmVtO3dpZHRoOjJweDtib3R0b206LTFyZW07bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSk7YmFja2dyb3VuZDojRDZGNjIyfS5hcnRpY2xlLS1jb250ZW50ICNsaW5lLXByb3RvY29sLWFuYXRvbXkgcCBzcGFuLndoaXRlc3BhY2Uud2hpdGVzcGFjZTpiZWZvcmUsLmFydGljbGUtLWNvbnRlbnQgI2xpbmUtcHJvdG9jb2wtYW5hdG9teSBwIHNwYW4uY29tbWEud2hpdGVzcGFjZTpiZWZvcmV7Y29udGVudDphdHRyKGRhdGEtd2hpdGVzcGFjZSkgXCIgd2hpdGVzcGFjZVwifS5hcnRpY2xlLS1jb250ZW50ICNsaW5lLXByb3RvY29sLWFuYXRvbXkgcCBzcGFuLndoaXRlc3BhY2UuY29tbWE6YmVmb3JlLC5hcnRpY2xlLS1jb250ZW50ICNsaW5lLXByb3RvY29sLWFuYXRvbXkgcCBzcGFuLmNvbW1hLmNvbW1hOmJlZm9yZXtjb250ZW50OmF0dHIoZGF0YS13aGl0ZXNwYWNlKSBcIjFzdCBjb21tYVwifS5hcnRpY2xlLS1jb250ZW50ICNsaW5lLXByb3RvY29sLWFuYXRvbXkudjMgcCBzcGFuLm1lYXN1cmVtZW50OjpiZWZvcmV7Y29udGVudDpcInRhYmxlXCJ9LmFydGljbGUtLWNvbnRlbnQgI2xpbmUtcHJvdG9jb2wtYW5hdG9teS5oaWRlLWVsZW1lbnRzIHAgc3Bhbi5lbHtib3JkZXI6bm9uZX0uYXJ0aWNsZS0tY29udGVudCAjbGluZS1wcm90b2NvbC1hbmF0b215LmhpZGUtZWxlbWVudHMgcCBzcGFuLmVsOmJlZm9yZSwuYXJ0aWNsZS0tY29udGVudCAjbGluZS1wcm90b2NvbC1hbmF0b215LmhpZGUtZWxlbWVudHMgcCBzcGFuLmVsOmFmdGVye2Rpc3BsYXk6bm9uZX0uYXJ0aWNsZS0tY29udGVudCAjbGluZS1wcm90b2NvbC1hbmF0b215LmhpZGUtY29tbWFzIHAgc3Bhbi5jb21tYXtib3JkZXI6bm9uZX0uYXJ0aWNsZS0tY29udGVudCAjbGluZS1wcm90b2NvbC1hbmF0b215LmhpZGUtY29tbWFzIHAgc3Bhbi5jb21tYTpiZWZvcmUsLmFydGljbGUtLWNvbnRlbnQgI2xpbmUtcHJvdG9jb2wtYW5hdG9teS5oaWRlLWNvbW1hcyBwIHNwYW4uY29tbWE6YWZ0ZXJ7ZGlzcGxheTpub25lfS5hcnRpY2xlLS1jb250ZW50ICNsaW5lLXByb3RvY29sLWFuYXRvbXkuaGlkZS13aGl0ZXNwYWNlIHAgc3Bhbi53aGl0ZXNwYWNle2JvcmRlcjpub25lfS5hcnRpY2xlLS1jb250ZW50ICNsaW5lLXByb3RvY29sLWFuYXRvbXkuaGlkZS13aGl0ZXNwYWNlIHAgc3Bhbi53aGl0ZXNwYWNlOmJlZm9yZSwuYXJ0aWNsZS0tY29udGVudCAjbGluZS1wcm90b2NvbC1hbmF0b215LmhpZGUtd2hpdGVzcGFjZSBwIHNwYW4ud2hpdGVzcGFjZTphZnRlcntkaXNwbGF5Om5vbmV9LmFydGljbGUtLWNvbnRlbnQgI2luZmx1eHFsLXdpbmRvdy1kaWFncmFte21pbi13aWR0aDo1MjBweDtvdmVyZmxvdzpzY3JvbGw7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvd30uYXJ0aWNsZS0tY29udGVudCAjaW5mbHV4cWwtd2luZG93LWRpYWdyYW0gI3RpbWVyYW5nZS1sYWJlbHtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDouN3JlbTttYXJnaW46MTAuNXJlbSAuNXJlbSA2LjVyZW0gLjVyZW07Ym9yZGVyLXdpZHRoOjFweCAwIDFweCAxcHg7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjpyZ2JhKDIxMiwyMTUsMjIxLDAuMyl9LmFydGljbGUtLWNvbnRlbnQgI2luZmx1eHFsLXdpbmRvdy1kaWFncmFtICN0aW1lcmFuZ2UtbGFiZWw6OmJlZm9yZXtjb250ZW50OlwiUXVlcmllZCB0aW1lIHJhbmdlXCI7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kOiMxNDE0MUY7cGFkZGluZzowIC43NXJlbTtmb250LXdlaWdodDo1MDA7Zm9udC1zaXplOi45cmVtO2NvbG9yOnJnYmEoMjEyLDIxNSwyMjEsMC41KTt0cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7d2hpdGUtc3BhY2U6bm93cmFwO3RvcDoxMy41cmVtO2xlZnQ6LTQuN3JlbX0uYXJ0aWNsZS0tY29udGVudCAjaW5mbHV4cWwtd2luZG93LWRpYWdyYW0gdGR7Zm9udC13ZWlnaHQ6bWVkaXVtO2NvbG9yOiNGQUZBRkN9LmFydGljbGUtLWNvbnRlbnQgI2luZmx1eHFsLXdpbmRvdy1kaWFncmFtIHRkIHNwYW4uZXhjbHVkZXtvcGFjaXR5Oi4zNTtmb250LXdlaWdodDpub3JtYWx9LmFydGljbGUtLWNvbnRlbnQgI2luZmx1eHFsLXdpbmRvdy1kaWFncmFtIC53aW5kb3dze2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47cGFkZGluZzo0cmVtIDAgMi41cmVtIC4yNXJlbX0uYXJ0aWNsZS0tY29udGVudCAjaW5mbHV4cWwtd2luZG93LWRpYWdyYW0gLndpbmRvdy1ob3Vye2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2hlaWdodDoxMDAlO21hcmdpbi1ib3R0b206LjVyZW07Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYmEoMjEyLDIxNSwyMjEsMC4zKTtmbGV4OjEgMSAwO3Bvc2l0aW9uOnJlbGF0aXZlfS5hcnRpY2xlLS1jb250ZW50ICNpbmZsdXhxbC13aW5kb3ctZGlhZ3JhbSAud2luZG93LWhvdXI6OmJlZm9yZSwuYXJ0aWNsZS0tY29udGVudCAjaW5mbHV4cWwtd2luZG93LWRpYWdyYW0gLndpbmRvdy1ob3VyOjphZnRlcntjb250ZW50OlwiXCI7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jazt3aWR0aDo5cHg7aGVpZ2h0OjFweDtsZWZ0Oi0xMHB4O2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMjEyLDIxNSwyMjEsMC4zKX0uYXJ0aWNsZS0tY29udGVudCAjaW5mbHV4cWwtd2luZG93LWRpYWdyYW0gLndpbmRvdy1ob3VyOjpiZWZvcmV7dG9wOjB9LmFydGljbGUtLWNvbnRlbnQgI2luZmx1eHFsLXdpbmRvdy1kaWFncmFtIC53aW5kb3ctaG91cjo6YWZ0ZXJ7Ym90dG9tOi0xcHh9LmFydGljbGUtLWNvbnRlbnQgI2luZmx1eHFsLXdpbmRvdy1kaWFncmFtIC53aW5kb3ctaG91ciBwe3doaXRlLXNwYWNlOm5vd3JhcDttYXJnaW4tdG9wOi41NXJlbTtwb3NpdGlvbjpyZWxhdGl2ZX0uYXJ0aWNsZS0tY29udGVudCAjaW5mbHV4cWwtd2luZG93LWRpYWdyYW0gLndpbmRvdy1ob3VyIHA6OmJlZm9yZXtjb250ZW50OlwiXCI7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXJpZ2h0Oi41cmVtO3dpZHRoOjFyZW07aGVpZ2h0OjA7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgyMTIsMjE1LDIyMSwwLjMpO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uYXJ0aWNsZS0tY29udGVudCAjaW5mbHV4cWwtd2luZG93LWRpYWdyYW0gLndpbmRvdy1ob3VyIHA6OmFmdGVye2NvbnRlbnQ6XCJQcmVkZWZpbmVkIHdpbmRvdyBib3VuZGFyeVwiO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjEuMjVyZW07bGVmdDoxLjVyZW07Zm9udC1zaXplOi45cmVtO2ZvbnQtd2VpZ2h0OjUwMDtjb2xvcjpyZ2JhKDIxMiwyMTUsMjIxLDAuNSl9LmFydGljbGUtLWNvbnRlbnQgLnNjYWxpbmctc3RyYXRlZ3l7bWFyZ2luOjJyZW0gMCAzcmVtfS5hcnRpY2xlLS1jb250ZW50IC5zY2FsaW5nLXN0cmF0ZWd5IC5ub2Rle2JvcmRlcjoycHggc29saWQgI0Q0RDdERDtib3JkZXItcmFkaXVzOjZweDtoZWlnaHQ6NnJlbTt3aWR0aDo0cmVtfS5hcnRpY2xlLS1jb250ZW50IC5zY2FsaW5nLXN0cmF0ZWd5IC5kYXNoZWR7Ym9yZGVyLXN0eWxlOmRhc2hlZDtib3JkZXItY29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjUpfS5hcnRpY2xlLS1jb250ZW50IC5zY2FsaW5nLXN0cmF0ZWd5IC5vdXRlcntoZWlnaHQ6YXV0bzt3aWR0aDpmaXQtY29udGVudDtwb3NpdGlvbjpyZWxhdGl2ZX0uYXJ0aWNsZS0tY29udGVudCAuc2NhbGluZy1zdHJhdGVneSAuaW5uZXJ7bWFyZ2luOjJyZW0gMS4yNXJlbSAtMnB4fS5hcnRpY2xlLS1jb250ZW50IC5zY2FsaW5nLXN0cmF0ZWd5Lmhvcml6b250YWx7ZGlzcGxheTpmbGV4fS5hcnRpY2xlLS1jb250ZW50IC5zY2FsaW5nLXN0cmF0ZWd5Lmhvcml6b250YWwgLm5vZGU6bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6MS4yNXJlbX0uYXJ0aWNsZS0tY29udGVudCAjcXVlcnktcGxhbi1kaWFncmFte2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Zm9udC1zaXplOjFyZW07bWFyZ2luOjNyZW0gMCAzLjVyZW07bWF4LXdpZHRoOjgwMHB4fS5hcnRpY2xlLS1jb250ZW50ICNxdWVyeS1wbGFuLWRpYWdyYW0gLnBsYW4tY29sdW1ue3BhZGRpbmc6MCAuNXJlbX0uYXJ0aWNsZS0tY29udGVudCAjcXVlcnktcGxhbi1kaWFncmFtIC5wbGFuLWJsb2Nre2JhY2tncm91bmQ6IzA3MDcwRTtjb2xvcjojQjdCOEZGO3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MXJlbSAxLjVyZW07Ym9yZGVyLXJhZGl1czo0cHh9LmFydGljbGUtLWNvbnRlbnQgI3F1ZXJ5LXBsYW4tZGlhZ3JhbSAucGxhbi1hcnJvd3ttYXJnaW46LjVyZW0gYXV0bztoZWlnaHQ6MS41cmVtO3dpZHRoOjFweDtib3JkZXItbGVmdDoxcHggc29saWQgI0I3QjhGRjtwb3NpdGlvbjpyZWxhdGl2ZX0uYXJ0aWNsZS0tY29udGVudCAjcXVlcnktcGxhbi1kaWFncmFtIC5wbGFuLWFycm93OmJlZm9yZXtjb250ZW50OlwiXFwyNUIyXCI7cG9zaXRpb246YWJzb2x1dGU7dG9wOi4yNXJlbTtsZWZ0Oi0uMzJyZW07Y29sb3I6I0I3QjhGRjtsaW5lLWhlaWdodDowfS5hcnRpY2xlLS1jb250ZW50ICNxdWVyeS1wbGFuLWRpYWdyYW0gLnBsYW4tYXJyb3cuc3BsaXR7d2lkdGg6NTAlO21hcmdpbi10b3A6MnJlbTtoZWlnaHQ6MXJlbTtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjtib3JkZXItd2lkdGg6MXB4IDFweCAwIDFweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOiNCN0I4RkZ9LmFydGljbGUtLWNvbnRlbnQgI3F1ZXJ5LXBsYW4tZGlhZ3JhbSAucGxhbi1hcnJvdy5zcGxpdDpiZWZvcmV7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0xLjI1cmVtO2xlZnQ6LTAuMjZyZW07d2lkdGg6MDttYXJnaW4tbGVmdDouMnJlbX0uYXJ0aWNsZS0tY29udGVudCAjcXVlcnktcGxhbi1kaWFncmFtIC5wbGFuLWFycm93LnNwbGl0OmFmdGVye2NvbnRlbnQ6XCJcIjtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcmVtO3dpZHRoOjA7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNCN0I4RkY7bWFyZ2luOi0xcmVtIDB9LmFydGljbGUtLWNvbnRlbnQgI3F1ZXJ5LXBsYW4tZGlhZ3JhbSAucGxhbi1zaW5nbGUtY29sdW1ue2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5hcnRpY2xlLS1jb250ZW50ICNxdWVyeS1wbGFuLWRpYWdyYW0gLnBsYW4tZG91YmxlLWNvbHVtbntkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZH0uYXJ0aWNsZS0tY29udGVudCAjc3NvLWF1dGgtZmxvd3ttYXgtd2lkdGg6NjUwcHg7bWFyZ2luOjJyZW0gYXV0b30uYXJ0aWNsZS0tY29udGVudCAjc3NvLWF1dGgtZmxvdyAucm93e2Rpc3BsYXk6ZmxleH0uYXJ0aWNsZS0tY29udGVudCAjc3NvLWF1dGgtZmxvdyAucm93LmxlZnR7anVzdGlmeS1jb250ZW50OnN0YXJ0fS5hcnRpY2xlLS1jb250ZW50ICNzc28tYXV0aC1mbG93IC5yb3cuY2VudGVye2p1c3RpZnktY29udGVudDpjZW50ZXJ9LmFydGljbGUtLWNvbnRlbnQgI3Nzby1hdXRoLWZsb3cgLnJvdy5yaWdodHtqdXN0aWZ5LWNvbnRlbnQ6ZW5kfS5hcnRpY2xlLS1jb250ZW50ICNzc28tYXV0aC1mbG93IC5hdXRoLWl0ZW17bWFyZ2luOjFyZW07Y29sb3I6I2ZmZjtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3BhZGRpbmc6MS41cmVtIDEuNzVyZW07YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoLTEzNWRlZywgIzhFMUZDMywjMDY2RkM1KTtib3JkZXItcmFkaXVzOjRweDttaW4td2lkdGg6MjIwcHg7bWluLWhlaWdodDo5MHB4O3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OjUwMH0uYXJ0aWNsZS0tY29udGVudCAjc3NvLWF1dGgtZmxvdyAjYXV0aDA6OmFmdGVyLC5hcnRpY2xlLS1jb250ZW50ICNzc28tYXV0aC1mbG93ICNpZHA6OmFmdGVye2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDouMjVyZW07Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtc2l6ZToxcmVtO29wYWNpdHk6Ljc1fS5hcnRpY2xlLS1jb250ZW50ICNzc28tYXV0aC1mbG93ICNhdXRoMDo6YWZ0ZXJ7Y29udGVudDpcIk1hbmFnZWQgYnkgSW5mbHV4RGF0YVwifS5hcnRpY2xlLS1jb250ZW50ICNzc28tYXV0aC1mbG93ICNpZHA6OmFmdGVye2NvbnRlbnQ6XCJNYW5hZ2VkIGJ5IHlvdVwifS5hcnRpY2xlLS1jb250ZW50ICNzc28tYXV0aC1mbG93IC5hcnJvd3tkaXNwbGF5OmJsb2NrO3dpZHRoOjY1cHg7aGVpZ2h0OjY1cHg7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2NvbG9yOiNENEQ3REQ7Ym9yZGVyLXN0eWxlOmRhc2hlZDtib3JkZXItY29sb3I6I0Q0RDdERH0uYXJ0aWNsZS0tY29udGVudCAjc3NvLWF1dGgtZmxvdyAuYXJyb3cucmlnaHQ6YmVmb3JlLC5hcnRpY2xlLS1jb250ZW50ICNzc28tYXV0aC1mbG93IC5hcnJvdy5sZWZ0OmJlZm9yZXtjb250ZW50OmF0dHIoc3RlcCk7YmFja2dyb3VuZDojMTQxNDFGO2ZvbnQtc2l6ZTouOXJlbTt3aWR0aDoxLjVyZW07aGVpZ2h0OjEuNXJlbTtib3JkZXI6MXB4IHNvbGlkICNENEQ3REQ7dGV4dC1hbGlnbjpjZW50ZXI7bGluZS1oZWlnaHQ6MS41cmVtO2JvcmRlci1yYWRpdXM6NTAlfS5hcnRpY2xlLS1jb250ZW50ICNzc28tYXV0aC1mbG93IC5hcnJvdy5yaWdodDphZnRlciwuYXJ0aWNsZS0tY29udGVudCAjc3NvLWF1dGgtZmxvdyAuYXJyb3cubGVmdDphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtsaW5lLWhlaWdodDowO2ZvbnQtc2l6ZToxLjM1cmVtfS5hcnRpY2xlLS1jb250ZW50ICNzc28tYXV0aC1mbG93IC5hcnJvdy5yaWdodHtib3JkZXItcmFkaXVzOjAgMTAwJSAwIDA7Ym9yZGVyLXdpZHRoOjJweCAycHggMCAwO2FsaWduLXNlbGY6ZmxleC1lbmR9LmFydGljbGUtLWNvbnRlbnQgI3Nzby1hdXRoLWZsb3cgLmFycm93LnJpZ2h0OmJlZm9yZXt0cmFuc2xhdGU6NDUlIC00NSV9LmFydGljbGUtLWNvbnRlbnQgI3Nzby1hdXRoLWZsb3cgLmFycm93LnJpZ2h0OmFmdGVye2NvbnRlbnQ6XCLij7dcIjtib3R0b206MDtyaWdodDotLjRyZW19LmFydGljbGUtLWNvbnRlbnQgI3Nzby1hdXRoLWZsb3cgLmFycm93LmxlZnR7Ym9yZGVyLXJhZGl1czowIDAgMCAxMDAlO2JvcmRlci13aWR0aDowIDAgMnB4IDJweDthbGlnbi1zZWxmOmZsZXgtc3RhcnR9LmFydGljbGUtLWNvbnRlbnQgI3Nzby1hdXRoLWZsb3cgLmFycm93LmxlZnQ6YmVmb3Jle3RyYW5zbGF0ZTotNDUlIDQ1JX0uYXJ0aWNsZS0tY29udGVudCAjc3NvLWF1dGgtZmxvdyAuYXJyb3cubGVmdDphZnRlcntjb250ZW50Olwi4o+2XCI7dG9wOjA7bGVmdDotLjRyZW19QG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KXsuYXJ0aWNsZS0tY29udGVudCAjc3NvLWF1dGgtZmxvd3ttYXgtd2lkdGg6MzUwcHg7bWFyZ2luOjZyZW0gYXV0b30uYXJ0aWNsZS0tY29udGVudCAjc3NvLWF1dGgtZmxvdyAucm93e2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttYXJnaW46LTUwcHggMH0uYXJ0aWNsZS0tY29udGVudCAjc3NvLWF1dGgtZmxvdyAuYXV0aC1pdGVte21hcmdpbjouNXJlbSAwfS5hcnRpY2xlLS1jb250ZW50ICNzc28tYXV0aC1mbG93IC5hcnJvd3t3aWR0aDoycmVtO2hlaWdodDo1NXB4fS5hcnRpY2xlLS1jb250ZW50ICNzc28tYXV0aC1mbG93IC5hcnJvdy5yaWdodCwuYXJ0aWNsZS0tY29udGVudCAjc3NvLWF1dGgtZmxvdyAuYXJyb3cubGVmdHtib3JkZXItd2lkdGg6MCAycHggMCAwO2JvcmRlci1yYWRpdXM6MH0uYXJ0aWNsZS0tY29udGVudCAjc3NvLWF1dGgtZmxvdyAuYXJyb3cucmlnaHR7YWxpZ24tc2VsZjpmbGV4LXN0YXJ0O21hcmdpbi1sZWZ0OjRyZW19LmFydGljbGUtLWNvbnRlbnQgI3Nzby1hdXRoLWZsb3cgLmFycm93LnJpZ2h0OmJlZm9yZXt0cmFuc2xhdGU6NjAlIC0xNSV9LmFydGljbGUtLWNvbnRlbnQgI3Nzby1hdXRoLWZsb3cgLmFycm93LmxlZnR7YWxpZ24tc2VsZjpmbGV4LWVuZDttYXJnaW4tcmlnaHQ6NnJlbX0uYXJ0aWNsZS0tY29udGVudCAjc3NvLWF1dGgtZmxvdyAuYXJyb3cubGVmdDpiZWZvcmV7dHJhbnNsYXRlOjYwJSAxMCV9LmFydGljbGUtLWNvbnRlbnQgI3Nzby1hdXRoLWZsb3cgLmFycm93LmxlZnQ6YWZ0ZXJ7cmlnaHQ6LS40cmVtO2xlZnQ6dW5zZXR9fS5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmV7bWFyZ2luOjNyZW0gYXV0b30uYXJ0aWNsZS0tY29udGVudCAjcXVpeC1kb3duc2FtcGxlLXBpcGVsaW5lIC5sb2dvLXJvd3tkaXNwbGF5OmZsZXh9LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAubG9nby1yb3cudG9we2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206LTIuNnJlbX0uYXJ0aWNsZS0tY29udGVudCAjcXVpeC1kb3duc2FtcGxlLXBpcGVsaW5lIC5sb2dvLXJvdy50b3AgLnF1aXgtY29ubmVjdG9ye21hcmdpbi10b3A6LjVyZW19LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAubG9nby1yb3cuYm90dG9te2p1c3RpZnktY29udGVudDpmbGV4LWVuZDttYXJnaW4tdG9wOi0yLjZyZW19LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAuaW5mbHV4ZGItY29ubmVjdG9ye2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyO3dpZHRoOjI5JX0uYXJ0aWNsZS0tY29udGVudCAjcXVpeC1kb3duc2FtcGxlLXBpcGVsaW5lIC5pbmZsdXhkYi1sb2dve2JhY2tncm91bmQ6dXJsKFwiL3N2Z3MvaW5mbHV4ZGItbG9nby13aGl0ZS5zdmdcIik7d2lkdGg6MTc1cHg7aGVpZ2h0OjU1cHg7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtc2l6ZTpjb250YWluO3Bvc2l0aW9uOnJlbGF0aXZlfS5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmUgLmluZmx1eGRiLWxvZ286YWZ0ZXJ7Y29udGVudDphdHRyKGRhdGEtcHJlY2lzaW9uKSBcIiBkYXRhIGRiXCI7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOi0ycHg7bGVmdDo0NXB4O3dpZHRoOjEwMCU7Y29sb3I6I0Q0RDdERDtmb250LXN0eWxlOml0YWxpYztmb250LXNpemU6MXJlbX0uYXJ0aWNsZS0tY29udGVudCAjcXVpeC1kb3duc2FtcGxlLXBpcGVsaW5lIC5xdWl4LWNvbm5lY3RvcntkaXNwbGF5OmJsb2NrO2hlaWdodDo4MHB4O3dpZHRoOjIwcHg7cG9zaXRpb246cmVsYXRpdmV9LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAucXVpeC1jb25uZWN0b3I6YmVmb3Jle2NvbnRlbnQ6XCJcIjtkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7YmFja2dyb3VuZC1jb2xvcjojRDREN0REO21hc2staW1hZ2U6dXJsKFwiL3N2Z3MvcXVpeC1jb25uZWN0b3ItcGx1Zy5zdmdcIik7bWFzay1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtc2l6ZTpjb250YWlufS5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmUgLnF1aXgtY29ubmVjdG9yOmFmdGVye2NvbnRlbnQ6XCJDb25uZWN0b3JcIjtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxLjVyZW07bGVmdDoxLjc1cmVtO3BhZGRpbmc6LjI1cmVtIC41cmVtO2NvbG9yOiNENEQ3REQ7Zm9udC1zaXplOjFyZW07Zm9udC1zdHlsZTppdGFsaWM7YmFja2dyb3VuZC1jb2xvcjojMTQxNDFGO2JvcmRlci1yYWRpdXM6NnB4O2JvcmRlcjoxLjVweCBzb2xpZCByZ2JhKDIxMiwyMTUsMjIxLDAuNSk7Ym94LXNoYWRvdzoycHggMnB4IDZweCByZ2JhKDE1LDE0LDIxLDAuNSl9LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAucXVpeC1zdHJlYW0tY29udGFpbmVye2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7Ym9yZGVyOjJweCBkYXNoZWQgI0Q0RDdERDtiYWNrZ3JvdW5kOnJnYmEoMjEyLDIxNSwyMjEsMC4xKTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjIuNXJlbTtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXJ9LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAucXVpeC1zdHJlYW0tY29tcG9uZW50e3BhZGRpbmc6MXJlbTtib3JkZXItcmFkaXVzOjRweDtib3JkZXItc3R5bGU6ZGFzaGVkO2JvcmRlci13aWR0aDoycHg7cG9zaXRpb246cmVsYXRpdmV9LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAucXVpeC1zdHJlYW0tY29tcG9uZW50IHB7bWFyZ2luOjA7bGluZS1oZWlnaHQ6MS4ycmVtO2ZvbnQtc2l6ZToxcmVtO3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiNGQUZBRkN9LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAucXVpeC1zdHJlYW0tY29tcG9uZW50OmJlZm9yZXtjb250ZW50OnVybChcIi9zdmdzL3F1aXgtcHl0aG9uLWhlYXJ0LnN2Z1wiKTtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7dG9wOi0xNXB4O2xlZnQ6LTE1cHg7ZmlsdGVyOmRyb3Atc2hhZG93KDJweCAwcHggMHB4ICMxNDE0MUYpIGRyb3Atc2hhZG93KC0ycHggMHB4IDBweCAjMTQxNDFGKSBkcm9wLXNoYWRvdygwcHggMnB4IDBweCAjMTQxNDFGKSBkcm9wLXNoYWRvdygwcHggLTJweCAwcHggIzE0MTQxRil9LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAucXVpeC1zdHJlYW0tY29tcG9uZW50I3NvdXJjZS1wcm9kdWNlcntiYWNrZ3JvdW5kOnJnYmEoNDIsMTYzLDI1NSwwLjIpO2JvcmRlci1jb2xvcjojMkFBM0ZGfS5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmUgLnF1aXgtc3RyZWFtLWNvbXBvbmVudCNkb3duc2FtcGxpbmctcHJvY2Vzc3tiYWNrZ3JvdW5kOnJnYmEoMTkxLDQ3LDIyOSwwLjIpO2JvcmRlci1jb2xvcjojQkYyRkU1fS5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmUgLnF1aXgtc3RyZWFtLWNvbXBvbmVudCNzaW5rLWNvbnN1bWVye2JhY2tncm91bmQ6cmdiYSgyNDQsMTQxLDU2LDAuMik7Ym9yZGVyLWNvbG9yOiNGNDhEMzh9LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAuYXJyb3d7bWFyZ2luOi41cmVtIC43NXJlbSAuNXJlbSAuNXJlbTtoZWlnaHQ6MnB4O3dpZHRoOmF1dG87bWluLXdpZHRoOjI1cHg7YmFja2dyb3VuZDojRDREN0REO3Bvc2l0aW9uOnJlbGF0aXZlfS5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmUgLmFycm93OmFmdGVye2NvbnRlbnQ6XCLilrZcIjtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotNHB4O3RvcDotLjQ4ZW07Zm9udC1zaXplOi43NXJlbTtjb2xvcjojRDREN0REfS5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmUgLmthZmthLXRvZ2dsZXtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO3dpZHRoOjYwcHg7bWluLXdpZHRoOjYwcHg7aGVpZ2h0OjQwcHg7Ym9yZGVyLXJhZGl1czoyMHB4O2JhY2tncm91bmQ6IzA3MDcwRTtwb3NpdGlvbjpyZWxhdGl2ZX0uYXJ0aWNsZS0tY29udGVudCAjcXVpeC1kb3duc2FtcGxlLXBpcGVsaW5lIC5rYWZrYS10b2dnbGU6YWZ0ZXJ7Y29udGVudDpcIlRPUElDOlxcYVwiIGF0dHIodG9waWMpO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjIxNSU7Y29sb3I6I0Q0RDdERDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXN0eWxlOml0YWxpYztib3R0b206LTQycHg7Zm9udC1zaXplOi45cmVtO2xlZnQ6LTYwJTt3aGl0ZS1zcGFjZTpwcmUtd3JhcH0uYXJ0aWNsZS0tY29udGVudCAjcXVpeC1kb3duc2FtcGxlLXBpcGVsaW5lIC5rYWZrYS10b2dnbGUgLnRvZ2dsZS1pY29ue2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjM0cHg7d2lkdGg6MzRweDttYXJnaW46M3B4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6dXJsKFwiL3N2Z3MvYXBhY2hlLWthZmthLWljb24uc3ZnXCIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtiYWNrZ3JvdW5kLXNpemU6ODYlO2JhY2tncm91bmQtcG9zaXRpb246OTAlO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdH0uYXJ0aWNsZS0tY29udGVudCAjcXVpeC1kb3duc2FtcGxlLXBpcGVsaW5lICNxdWl4LWJyYW5kLWljb25ze2hlaWdodDo1MHB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi10b3A6LTNyZW19LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAjcXVpeC1icmFuZC1pY29ucz4qe2hlaWdodDo0NXB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JhY2tncm91bmQtY29sb3I6IzBGMEUxNTtib3JkZXItcmFkaXVzOjZweDttYXJnaW4tcmlnaHQ6LjI1cmVtO2JveC1zaGFkb3c6MCAxcHggMTBweCByZ2JhKDI1NSwyNTUsMjU1LDAuMSl9LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAjcXVpeC1icmFuZC1pY29ucz4qIGltZ3ttYXJnaW46MDtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLXJhZGl1czowO2hlaWdodDoxMDAlfS5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmUgI3F1aXgtYnJhbmQtaWNvbnMgLnF1aXgtbG9nb3twYWRkaW5nOi43NXJlbX0uYXJ0aWNsZS0tY29udGVudCAjcXVpeC1kb3duc2FtcGxlLXBpcGVsaW5lICNxdWl4LWJyYW5kLWljb25zIC5xdWl4LXN0cmVhbXMtbG9nb3twb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOi42cmVtfS5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmUgI3F1aXgtYnJhbmQtaWNvbnMgLnF1aXgtc3RyZWFtcy1sb2dvOjphZnRlcntjb250ZW50OlwiUXVpeFxcQSBTdHJlYW1zXCI7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6cHJlLXdyYXA7Zm9udC1zaXplOi45MnJlbTtmb250LXdlaWdodDo1MDA7Y29sb3I6I2ZmZjtsaW5lLWhlaWdodDouOXJlbTttYXJnaW4tbGVmdDouMTVyZW19LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLmdyb3VwcyAuZ3JvdXB7cG9zaXRpb246cmVsYXRpdmU7b3V0bGluZS1zdHlsZTpzb2xpZDtvdXRsaW5lLXdpZHRoOjNweDtvdXRsaW5lLW9mZnNldDotNXB4O2JvcmRlci1yYWRpdXM6MTBweH0uYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMuZ3JvdXBzIC5ncm91cDo6YmVmb3Jle2NvbnRlbnQ6XCJSb3cgR3JvdXBcIjtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6LjI1cmVtIC41cmVtO3Bvc2l0aW9uOmFic29sdXRlO3RvcDozcHg7bGVmdDozcHg7Ym9yZGVyLXJhZGl1czo0cHg7Y29sb3I6I2ZmZjtmb250LXNpemU6LjhyZW07Zm9udC13ZWlnaHQ6Ym9sZDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjAyZW07Ym94LXNoYWRvdzo0cHggNHB4IDRweCAjMTQxNDFGfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMgLmdyb3VwIHRkOm50aC1jaGlsZCgyKSwuYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMuZ3JvdXBzIC5ncm91cCB0ZDpudGgtY2hpbGQoMyl7Zm9udC13ZWlnaHQ6Ym9sZDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO3RleHQtZGVjb3JhdGlvbi10aGlja25lc3M6MnB4O3RleHQtdW5kZXJsaW5lLW9mZnNldDo1cHh9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLmdyb3VwcyAuZ3JvdXA6bnRoLW9mLXR5cGUoMSl7b3V0bGluZS1jb2xvcjojZDMwOTcxfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMgLmdyb3VwOm50aC1vZi10eXBlKDEpOjpiZWZvcmV7YmFja2dyb3VuZDojZDMwOTcxfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMgLmdyb3VwOm50aC1vZi10eXBlKDEpIHRkOm50aC1jaGlsZCgyKSwuYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMuZ3JvdXBzIC5ncm91cDpudGgtb2YtdHlwZSgxKSB0ZDpudGgtY2hpbGQoMyl7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiNkMzA5NzF9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLmdyb3VwcyAuZ3JvdXA6bnRoLW9mLXR5cGUoMil7b3V0bGluZS1jb2xvcjojOWIyYWZmfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMgLmdyb3VwOm50aC1vZi10eXBlKDIpOjpiZWZvcmV7YmFja2dyb3VuZDojOWIyYWZmfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMgLmdyb3VwOm50aC1vZi10eXBlKDIpIHRkOm50aC1jaGlsZCgyKSwuYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMuZ3JvdXBzIC5ncm91cDpudGgtb2YtdHlwZSgyKSB0ZDpudGgtY2hpbGQoMyl7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiM5YjJhZmZ9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLmdyb3VwcyAuZ3JvdXA6bnRoLW9mLXR5cGUoMyl7b3V0bGluZS1jb2xvcjojMkFBM0ZGfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMgLmdyb3VwOm50aC1vZi10eXBlKDMpOjpiZWZvcmV7YmFja2dyb3VuZDojMkFBM0ZGfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMgLmdyb3VwOm50aC1vZi10eXBlKDMpIHRkOm50aC1jaGlsZCgyKSwuYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMuZ3JvdXBzIC5ncm91cDpudGgtb2YtdHlwZSgzKSB0ZDpudGgtY2hpbGQoMyl7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiMyQUEzRkZ9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLmdyb3VwcyAuZ3JvdXA6bnRoLW9mLXR5cGUoNCl7b3V0bGluZS1jb2xvcjojMEIzQThEfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMgLmdyb3VwOm50aC1vZi10eXBlKDQpOjpiZWZvcmV7YmFja2dyb3VuZDojMEIzQThEfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMgLmdyb3VwOm50aC1vZi10eXBlKDQpIHRkOm50aC1jaGlsZCgyKSwuYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMuZ3JvdXBzIC5ncm91cDpudGgtb2YtdHlwZSg0KSB0ZDpudGgtY2hpbGQoMyl7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiMwQjNBOER9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLmdyb3Vwcy13aXRoLWZyYW1lIC5mcmFtZSwuYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMuZ3JvdXBzLXdpdGgtZnJhbWUgdHIuY3VycmVudC1yb3d7cG9zaXRpb246cmVsYXRpdmU7b3V0bGluZS1zdHlsZTpzb2xpZDtvdXRsaW5lLXdpZHRoOjNweDtvdXRsaW5lLW9mZnNldDotNXB4O2JvcmRlci1yYWRpdXM6MTBweH0uYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMuZ3JvdXBzLXdpdGgtZnJhbWUgLmZyYW1lOjphZnRlciwuYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMuZ3JvdXBzLXdpdGgtZnJhbWUgdHIuY3VycmVudC1yb3c6OmFmdGVye2Rpc3BsYXk6YmxvY2s7cGFkZGluZzouMjVyZW0gLjVyZW07cG9zaXRpb246YWJzb2x1dGU7dG9wOjNweDtsZWZ0OjNweDtib3JkZXItcmFkaXVzOjRweDtjb2xvcjojZmZmO2ZvbnQtc2l6ZTouOHJlbTtmb250LXdlaWdodDpib2xkO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouMDJlbTtib3gtc2hhZG93OjRweCA0cHggNHB4ICMxNDE0MUZ9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLmdyb3Vwcy13aXRoLWZyYW1lIC5mcmFtZSB0cjpudGgtY2hpbGQobiArIDEpOm50aC1jaGlsZCgtbiArIDMpIHRkLC5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMtd2l0aC1mcmFtZSB0ci5jdXJyZW50LXJvdyB0cjpudGgtY2hpbGQobiArIDEpOm50aC1jaGlsZCgtbiArIDMpIHRke3RleHQtZGVjb3JhdGlvbi1jb2xvcjojZDMwOTcxfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMtd2l0aC1mcmFtZSAuZnJhbWUgdHI6bnRoLWNoaWxkKG4gKyA0KTpudGgtY2hpbGQoLW4gKyA2KSB0ZCwuYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMuZ3JvdXBzLXdpdGgtZnJhbWUgdHIuY3VycmVudC1yb3cgdHI6bnRoLWNoaWxkKG4gKyA0KTpudGgtY2hpbGQoLW4gKyA2KSB0ZHt0ZXh0LWRlY29yYXRpb24tY29sb3I6I0JGMkZFNX0uYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMuZ3JvdXBzLXdpdGgtZnJhbWUgLmZyYW1lIHRyOm50aC1jaGlsZChuICsgNyk6bnRoLWNoaWxkKC1uICsgOCkgdGQsLmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLmdyb3Vwcy13aXRoLWZyYW1lIHRyLmN1cnJlbnQtcm93IHRyOm50aC1jaGlsZChuICsgNyk6bnRoLWNoaWxkKC1uICsgOCkgdGR7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiMyQUEzRkZ9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLmdyb3Vwcy13aXRoLWZyYW1lIC5mcmFtZSB0ZDpudGgtY2hpbGQobiArIDIpOm50aC1jaGlsZCgtbiArIDMpLC5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMtd2l0aC1mcmFtZSB0ci5jdXJyZW50LXJvdyB0ZDpudGgtY2hpbGQobiArIDIpOm50aC1jaGlsZCgtbiArIDMpe2ZvbnQtd2VpZ2h0OmJvbGQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzOjJweDt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6NXB4fS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMtd2l0aC1mcmFtZSB0ci5jdXJyZW50LXJvd3tvdXRsaW5lLWNvbG9yOiNkMzA5NzF9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLmdyb3Vwcy13aXRoLWZyYW1lIHRyLmN1cnJlbnQtcm93OjphZnRlcntjb250ZW50OlwiQ3VycmVudCBSb3dcIjtiYWNrZ3JvdW5kOiNkMzA5NzF9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLmdyb3Vwcy13aXRoLWZyYW1lIHRyLmN1cnJlbnQtcm93IHRke3RleHQtZGVjb3JhdGlvbi1jb2xvcjojMkFBM0ZGICFpbXBvcnRhbnR9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLmdyb3Vwcy13aXRoLWZyYW1lIC5mcmFtZXtvdXRsaW5lLWNvbG9yOiM5YjJhZmZ9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLmdyb3Vwcy13aXRoLWZyYW1lIC5mcmFtZTo6YWZ0ZXJ7Y29udGVudDpcIkZyYW1lXCI7YmFja2dyb3VuZDojOWIyYWZmfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMtd2l0aC1mcmFtZSAuZ3JvdXB7cG9zaXRpb246cmVsYXRpdmU7b3V0bGluZS1jb2xvcjojMEIzQThEfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMtd2l0aC1mcmFtZSAuZ3JvdXAgdGQ6bnRoLWNoaWxkKDIpLC5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5ncm91cHMtd2l0aC1mcmFtZSAuZ3JvdXAgdGQ6bnRoLWNoaWxkKDMpe2ZvbnQtd2VpZ2h0OmJvbGQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzOjJweDt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6NXB4O3RleHQtZGVjb3JhdGlvbi1jb2xvcjojMEIzQThEfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5yYW5nZS1pbnRlcnZhbCAuZnJhbWUsLmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLnJhbmdlLWludGVydmFsIHRyLmN1cnJlbnQtcm93e3Bvc2l0aW9uOnJlbGF0aXZlO291dGxpbmUtc3R5bGU6c29saWQ7b3V0bGluZS13aWR0aDozcHg7b3V0bGluZS1vZmZzZXQ6LTVweDtib3JkZXItcmFkaXVzOjEwcHh9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLnJhbmdlLWludGVydmFsIC5mcmFtZSB0ZDpmaXJzdC1jaGlsZCwuYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMucmFuZ2UtaW50ZXJ2YWwgdHIuY3VycmVudC1yb3cgdGQ6Zmlyc3QtY2hpbGR7Zm9udC13ZWlnaHQ6Ym9sZDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO3RleHQtZGVjb3JhdGlvbi10aGlja25lc3M6MnB4O3RleHQtdW5kZXJsaW5lLW9mZnNldDo1cHg7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiM5YjJhZmZ9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLnJhbmdlLWludGVydmFsIC5mcmFtZTo6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLnJhbmdlLWludGVydmFsIHRyLmN1cnJlbnQtcm93OjphZnRlcntkaXNwbGF5OmJsb2NrO3BhZGRpbmc6LjI1cmVtIC41cmVtO3Bvc2l0aW9uOmFic29sdXRlO3RvcDozcHg7cmlnaHQ6M3B4O2JvcmRlci1yYWRpdXM6NHB4O2NvbG9yOiNmZmY7Zm9udC1zaXplOi44cmVtO2ZvbnQtd2VpZ2h0OmJvbGQ7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi4wMmVtO2JveC1zaGFkb3c6LTRweCA0cHggNHB4ICMxNDE0MUZ9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLnJhbmdlLWludGVydmFsIHRyLmN1cnJlbnQtcm93e291dGxpbmUtY29sb3I6I2QzMDk3MX0uYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMucmFuZ2UtaW50ZXJ2YWwgdHIuY3VycmVudC1yb3cgdGQ6Zmlyc3QtY2hpbGR7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiNkMzA5NzF9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLnJhbmdlLWludGVydmFsIHRyLmN1cnJlbnQtcm93OjphZnRlcntjb250ZW50OlwiQ3VycmVudCBSb3dcIjtiYWNrZ3JvdW5kOiNkMzA5NzE7Ym94LXNoYWRvdzotNHB4IDRweCA0cHggIzI2MjczOH0uYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMucmFuZ2UtaW50ZXJ2YWwgLmZyYW1le291dGxpbmUtY29sb3I6IzliMmFmZn0uYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMucmFuZ2UtaW50ZXJ2YWwgLmZyYW1lOjphZnRlcntjb250ZW50OlwiRnJhbWVcIjtiYWNrZ3JvdW5kOiM5YjJhZmZ9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLnJhbmdlLW51bWVyaWMgLmZyYW1lLC5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5yYW5nZS1udW1lcmljIHRyLmN1cnJlbnQtcm93LC5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5yb3dzIC5mcmFtZSwuYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMucm93cyB0ci5jdXJyZW50LXJvd3twb3NpdGlvbjpyZWxhdGl2ZTtvdXRsaW5lLXN0eWxlOnNvbGlkO291dGxpbmUtd2lkdGg6M3B4O291dGxpbmUtb2Zmc2V0Oi01cHg7Ym9yZGVyLXJhZGl1czoxMHB4fS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5yYW5nZS1udW1lcmljIC5mcmFtZTo6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLnJhbmdlLW51bWVyaWMgdHIuY3VycmVudC1yb3c6OmFmdGVyLC5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5yb3dzIC5mcmFtZTo6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLnJvd3MgdHIuY3VycmVudC1yb3c6OmFmdGVye2Rpc3BsYXk6YmxvY2s7cGFkZGluZzouMjVyZW0gLjVyZW07cG9zaXRpb246YWJzb2x1dGU7dG9wOjNweDtsZWZ0OjNweDtib3JkZXItcmFkaXVzOjRweDtjb2xvcjojZmZmO2ZvbnQtc2l6ZTouOHJlbTtmb250LXdlaWdodDpib2xkO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouMDJlbTtib3gtc2hhZG93OjRweCA0cHggNHB4ICMxNDE0MUZ9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLnJhbmdlLW51bWVyaWMgdHIuY3VycmVudC1yb3csLmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLnJvd3MgdHIuY3VycmVudC1yb3d7b3V0bGluZS1jb2xvcjojZDMwOTcxfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5yYW5nZS1udW1lcmljIHRyLmN1cnJlbnQtcm93OjphZnRlciwuYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMucm93cyB0ci5jdXJyZW50LXJvdzo6YWZ0ZXJ7Y29udGVudDpcIkN1cnJlbnQgUm93XCI7YmFja2dyb3VuZDojZDMwOTcxfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5yYW5nZS1udW1lcmljIC5mcmFtZSwuYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMucm93cyAuZnJhbWV7b3V0bGluZS1jb2xvcjojOWIyYWZmfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLndpbmRvdy1mcmFtZS11bml0cy5yYW5nZS1udW1lcmljIC5mcmFtZTo6YWZ0ZXIsLmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLnJvd3MgLmZyYW1lOjphZnRlcntjb250ZW50OlwiRnJhbWVcIjtiYWNrZ3JvdW5kOiM5YjJhZmZ9LmFydGljbGUtLWNvbnRlbnQgdGFibGUud2luZG93LWZyYW1lLXVuaXRzLnJhbmdlLW51bWVyaWMgLmZyYW1lIHRkOm50aC1jaGlsZCgzKXtmb250LXdlaWdodDpib2xkO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7dGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzczoycHg7dGV4dC11bmRlcmxpbmUtb2Zmc2V0OjVweDt0ZXh0LWRlY29yYXRpb24tY29sb3I6IzliMmFmZn0uYXJ0aWNsZS0tY29udGVudCB0YWJsZS53aW5kb3ctZnJhbWUtdW5pdHMucmFuZ2UtbnVtZXJpYyAuZnJhbWUgdHIuY3VycmVudC1yb3cgdGQ6bnRoLWNoaWxkKDMpe3RleHQtZGVjb3JhdGlvbi1jb2xvcjojZDMwOTcxfUBtZWRpYSAobWF4LXdpZHRoOiAxMjgwcHgpey5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmV7bWF4LXdpZHRoOjMyNXB4fS5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmUgLmxvZ28tcm93IC5pbmZsdXhkYi1jb25uZWN0b3J7d2lkdGg6MTAwJX0uYXJ0aWNsZS0tY29udGVudCAjcXVpeC1kb3duc2FtcGxlLXBpcGVsaW5lIC5xdWl4LXN0cmVhbS1jb250YWluZXJ7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmUgLmFycm93e21hcmdpbjouNXJlbSAuNXJlbSAuNzVyZW0gLjVyZW07d2lkdGg6MnB4O21pbi13aWR0aDoycHg7aGVpZ2h0OmF1dG87bWluLWhlaWdodDoyNXB4fS5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmUgLmFycm93OmFmdGVye2NvbnRlbnQ6XCLilrxcIjtyaWdodDotNC4yNXB4O2JvdHRvbTotLjVlbTt0b3A6dW5zZXQ7Zm9udC1zaXplOjFyZW19LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAua2Fma2EtdG9nZ2xle21hcmdpbi1ib3R0b206MS41cmVtfS5hcnRpY2xlLS1jb250ZW50ICNxdWl4LWRvd25zYW1wbGUtcGlwZWxpbmUgLmthZmthLXRvZ2dsZTphZnRlcntjb250ZW50OlwiVE9QSUM6IFwiIGF0dHIodG9waWMpO3dpZHRoOjQwMCU7Ym90dG9tOi0yNXB4O2xlZnQ6LTE1MCV9LmFydGljbGUtLWNvbnRlbnQgI3F1aXgtZG93bnNhbXBsZS1waXBlbGluZSAjcXVpeC1icmFuZC1pY29uc3ttYXJnaW4tdG9wOjEuNXJlbTthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn19QG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KXsuYXJ0aWNsZS0tY29udGVudCAjc2hhcmQtZGlhZ3JhbXtmbGV4LWRpcmVjdGlvbjpyb3d9LmFydGljbGUtLWNvbnRlbnQgI3NoYXJkLWRpYWdyYW0gLnBlcmlvZHN7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21hcmdpbi1yaWdodDouNXJlbX0uYXJ0aWNsZS0tY29udGVudCAjc2hhcmQtZGlhZ3JhbSAudGltZWxpbmV7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3BhZGRpbmc6LjVyZW0gMH0uYXJ0aWNsZS0tY29udGVudCAjc2hhcmQtZGlhZ3JhbSAudGltZWxpbmUgLmludGVydmFse3dpZHRoOi43NXJlbTtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmU7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNENEQ3REQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI0Q0RDdERH0uYXJ0aWNsZS0tY29udGVudCAjc2hhcmQtZGlhZ3JhbSAudGltZWxpbmUgLmludGVydmFsOmZpcnN0LWNoaWxke2JvcmRlci10b3A6MXB4IHNvbGlkICNENEQ3RER9LmFydGljbGUtLWNvbnRlbnQgI3NoYXJkLWRpYWdyYW0gLnNoYXJkLWdyb3Vwc3tmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmFydGljbGUtLWNvbnRlbnQgI3NoYXJkLWRpYWdyYW0gLnNoYXJkLWdyb3VwcyAuc2hhcmQtZ3JvdXB7bWFyZ2luOi4yNXJlbSAwfS5hcnRpY2xlLS1jb250ZW50IC5zZXJpZXMtZGlhZ3JhbXt3aWR0aDphdXRvfS5hcnRpY2xlLS1jb250ZW50ICNpbmZsdXhxbC13aW5kb3ctZGlhZ3JhbXtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDttaW4td2lkdGg6MzAwcHh9LmFydGljbGUtLWNvbnRlbnQgI2luZmx1eHFsLXdpbmRvdy1kaWFncmFtIC53aW5kb3ctaG91cnt3aWR0aDo2MHB4fS5hcnRpY2xlLS1jb250ZW50ICNpbmZsdXhxbC13aW5kb3ctZGlhZ3JhbSAud2luZG93LWhvdXIgcHt0cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLXRvcDo4Ljc1cmVtO2ZvbnQtc2l6ZTouOTVyZW19LmFydGljbGUtLWNvbnRlbnQgI2luZmx1eHFsLXdpbmRvdy1kaWFncmFtIC53aW5kb3ctaG91ciBwOjpiZWZvcmV7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyk7cG9zaXRpb246YWJzb2x1dGU7dG9wOi0uNXJlbTtsZWZ0OjQuNXJlbX0uYXJ0aWNsZS0tY29udGVudCAjaW5mbHV4cWwtd2luZG93LWRpYWdyYW0gLndpbmRvdy1ob3VyIHA6OmFmdGVye2xlZnQ6MH19LmFydGljbGUtLWNvbnRlbnQgLmluZmx1eGRidS1iYW5uZXJ7YmFja2dyb3VuZC1jb2xvcjojMDIwYTQ3O21hcmdpbjoyLjVyZW0gMCAzcmVtO3BhZGRpbmc6Mi41cmVtO2JvcmRlci1yYWRpdXM6MS41cmVtO2JveC1zaGFkb3c6MnB4IDJweCA4cHggIzA3MDcwRTtiYWNrZ3JvdW5kLWltYWdlOnVybChcIi9zdmdzL2hvbWUtYmctY2lyY2xlLXJpZ2h0LnN2Z1wiKTtiYWNrZ3JvdW5kLXNpemU6Y292ZXI7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcn0uYXJ0aWNsZS0tY29udGVudCAuaW5mbHV4ZGJ1LWJhbm5lciAuaW5mbHV4ZGJ1LWxvZ297bWF4LXdpZHRoOjE3MHB4O21hcmdpbjowIDAgMXJlbTtib3gtc2hhZG93Om5vbmV9LmFydGljbGUtLWNvbnRlbnQgLmluZmx1eGRidS1iYW5uZXIgLmJhbm5lci1jb250ZW50e21hcmdpbi1yaWdodDoxcmVtO21heC13aWR0aDo2NSV9LmFydGljbGUtLWNvbnRlbnQgLmluZmx1eGRidS1iYW5uZXIgLmJhbm5lci1jb250ZW50IGg0e21hcmdpbi10b3A6LTEuNzVyZW07Zm9udC1zaXplOjEuNXJlbTtmb250LXN0eWxlOm5vcm1hbDtjb2xvcjojZmZmfS5hcnRpY2xlLS1jb250ZW50IC5pbmZsdXhkYnUtYmFubmVyIC5iYW5uZXItY29udGVudCBwe21hcmdpbi1ib3R0b206MDtjb2xvcjojZmZmfS5hcnRpY2xlLS1jb250ZW50IC5pbmZsdXhkYnUtYmFubmVyIC5iYW5uZXItY29udGVudCBwIHN0cm9uZ3tjb2xvcjojZmZmfS5hcnRpY2xlLS1jb250ZW50IC5pbmZsdXhkYnUtYmFubmVyIC5iYW5uZXItY3Rhe3Bvc2l0aW9uOnJlbGF0aXZlfS5hcnRpY2xlLS1jb250ZW50IC5pbmZsdXhkYnUtYmFubmVyIC5iYW5uZXItY3RhIGF7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjFyZW0gMS41cmVtO2NvbG9yOiNmZmY7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLXJhZGl1czoycHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICNkMzA5NzEsIzliMmFmZik7ei1pbmRleDoxfS5hcnRpY2xlLS1jb250ZW50IC5pbmZsdXhkYnUtYmFubmVyIC5iYW5uZXItY3RhIGE6YWZ0ZXJ7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO3BhZGRpbmc6MDt0b3A6MDtyaWdodDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyLXJhZGl1czoycHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMjcwZGVnLCAjNzcxY2M3LCNiMjAyNWIpO3RyYW5zaXRpb246b3BhY2l0eSAuMnM7ei1pbmRleDotMTtvcGFjaXR5OjB9LmFydGljbGUtLWNvbnRlbnQgLmluZmx1eGRidS1iYW5uZXIgLmJhbm5lci1jdGEgYTpob3ZlcjphZnRlcntvcGFjaXR5OjF9QG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KXsuYXJ0aWNsZS0tY29udGVudCAuaW5mbHV4ZGJ1LWJhbm5lcntmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmFydGljbGUtLWNvbnRlbnQgLmluZmx1eGRidS1iYW5uZXIgLmJhbm5lci1jb250ZW50e21heC13aWR0aDoxMDAlfS5hcnRpY2xlLS1jb250ZW50IC5pbmZsdXhkYnUtYmFubmVyIC5iYW5uZXItY29udGVudCBoNHttYXJnaW4tdG9wOi0xLjI1cmVtfS5hcnRpY2xlLS1jb250ZW50IC5pbmZsdXhkYnUtYmFubmVyIC5iYW5uZXItY3Rhe21hcmdpbi10b3A6MS43NXJlbTt3aWR0aDoxMDAlfX0uYXJ0aWNsZS0tY29udGVudCAuaW5mbHV4cWwtdGFibGUtbWV0YSBwe2ZvbnQtc2l6ZTouOXJlbTtsaW5lLWhlaWdodDoxLjI1cmVtfS5hcnRpY2xlLS1jb250ZW50IC5pbmZsdXhxbC10YWJsZS1tZXRhIHA6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjByZW19LmFydGljbGUtLWNvbnRlbnQgdGFibGUrLmluZmx1eHFsLXRhYmxlLW1ldGF7bWFyZ2luLXRvcDotMS41cmVtfS5hcnRpY2xlLS1jb250ZW50IC5rZXliaW5kaW5ne2ZvbnQtZmFtaWx5OlwiUHJveGltYSBOb3ZhXCIsc2Fucy1zZXJpZn0uYXJ0aWNsZS0tY29udGVudCAua2V5YmluZGluZyBjb2Rle2ZvbnQtZmFtaWx5OlwiUHJveGltYSBOb3ZhXCIsc2Fucy1zZXJpZn0uYXJ0aWNsZS0tY29udGVudCAua2V5YmluZGluZy5vc3ggY29kZXtmb250LWZhbWlseTotYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCxcIlByb3hpbWEgTm92YVwiLHNhbnMtc2VyaWYsXCJIZWx2ZXRpY2EgTmV1ZVwiLEFyaWFsLHNhbnMtc2VyaWZ9LmFydGljbGUtLWNvbnRlbnQgLmtleWJpbmRpbmcgY29kZS5vc3h7Zm9udC1mYW1pbHk6LWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsXCJQcm94aW1hIE5vdmFcIixzYW5zLXNlcmlmLFwiSGVsdmV0aWNhIE5ldWVcIixBcmlhbCxzYW5zLXNlcmlmfS5hcnRpY2xlLS1jb250ZW50ICNsaXN0LWZpbHRlcnN7ZGlzcGxheTpmbGV4O2ZsZXgtZmxvdzpyb3cgd3JhcDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5hcnRpY2xlLS1jb250ZW50ICNsaXN0LWZpbHRlcnMgLmZpbHRlci1jYXRlZ29yeXtmbGV4OjEgMSAyMDBweDttYXJnaW46MCAxLjI1cmVtIDEuMjVyZW0gMDttYXgtd2lkdGg6MzMlfS5hcnRpY2xlLS1jb250ZW50ICNsaXN0LWZpbHRlcnMgLmZpbHRlci1jYXRlZ29yeS50d28tY29sdW1uc3tmbGV4OjEgMiA0MDBweDttYXgtd2lkdGg6NjYlfS5hcnRpY2xlLS1jb250ZW50ICNsaXN0LWZpbHRlcnMgLmZpbHRlci1jYXRlZ29yeS50d28tY29sdW1ucyAuZmlsdGVyLWxpc3R7Y29sdW1uczoyfS5hcnRpY2xlLS1jb250ZW50ICNsaXN0LWZpbHRlcnMgaDV7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgyMTIsMjE1LDIyMSwwLjI1KTtwYWRkaW5nLWJvdHRvbTouNjVyZW19LmFydGljbGUtLWNvbnRlbnQgI2xpc3QtZmlsdGVycyAuZmlsdGVyLWxpc3R7cGFkZGluZzowO21hcmdpbjouNXJlbSAwIDA7bGlzdC1zdHlsZTpub25lfS5hcnRpY2xlLS1jb250ZW50ICNsaXN0LWZpbHRlcnMgLmZpbHRlci1saXN0IGxpe21hcmdpbjowO2xpbmUtaGVpZ2h0OjEuMzVyZW19LmFydGljbGUtLWNvbnRlbnQgI2xpc3QtZmlsdGVycyBsYWJlbHtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6LjI1cmVtIDA7Y29sb3I6I0Q0RDdERDtwb3NpdGlvbjpyZWxhdGl2ZX0uYXJ0aWNsZS0tY29udGVudCAjbGlzdC1maWx0ZXJzIGxhYmVsOmFmdGVye2NvbnRlbnQ6YXR0cihkYXRhLWNvdW50KTttYXJnaW4tbGVmdDowO2ZvbnQtc2l6ZTouODVyZW07b3BhY2l0eTouNX0uYXJ0aWNsZS0tY29udGVudCAjbGlzdC1maWx0ZXJzIC5jaGVja2JveHtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtoZWlnaHQ6MS4xNWVtO3dpZHRoOjEuMTVlbTtiYWNrZ3JvdW5kOnJnYmEoMjEyLDIxNSwyMjEsMC4wNSk7bWFyZ2luLXJpZ2h0Oi4zcmVtO3ZlcnRpY2FsLWFsaWduOnRleHQtdG9wO2JvcmRlci1yYWRpdXM6MnB4O2N1cnNvcjpwb2ludGVyO2JvcmRlcjoxLjVweCBzb2xpZCByZ2JhKDIxMiwyMTUsMjIxLDAuMik7dXNlci1zZWxlY3Q6bm9uZX0uYXJ0aWNsZS0tY29udGVudCAjbGlzdC1maWx0ZXJzIGlucHV0W3R5cGU9J2NoZWNrYm94J117bWFyZ2luLXJpZ2h0Oi0xLjFyZW07cGFkZGluZzowO3ZlcnRpY2FsLWFsaWduOnRvcDtvcGFjaXR5OjA7Y3Vyc29yOnBvaW50ZXJ9LmFydGljbGUtLWNvbnRlbnQgI2xpc3QtZmlsdGVycyBpbnB1dFt0eXBlPSdjaGVja2JveCddKy5jaGVja2JveDphZnRlcntjb250ZW50OlwiXCI7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6LjVyZW07d2lkdGg6LjVyZW07Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDojMDBBM0ZGO3RvcDo1MCU7bGVmdDo1MCU7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSgyKSB0cmFuc2xhdGUoLTIwJSwgLTIwJSk7dHJhbnNpdGlvbjphbGwgLjJzfS5hcnRpY2xlLS1jb250ZW50ICNsaXN0LWZpbHRlcnMgaW5wdXRbdHlwZT0nY2hlY2tib3gnXTpjaGVja2VkKy5jaGVja2JveDphZnRlcntvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpIHRyYW5zbGF0ZSgtNTAlLCAtNTAlKX1AbWVkaWEgKG1heC13aWR0aDogMTEwMHB4KXsuYXJ0aWNsZS0tY29udGVudCAjbGlzdC1maWx0ZXJzIC5maWx0ZXItY2F0ZWdvcnl7bWF4LXdpZHRoOjUwJX0uYXJ0aWNsZS0tY29udGVudCAjbGlzdC1maWx0ZXJzIC5maWx0ZXItY2F0ZWdvcnkudHdvLWNvbHVtbnMsLmFydGljbGUtLWNvbnRlbnQgI2xpc3QtZmlsdGVycyAuZmlsdGVyLWNhdGVnb3J5LnRocmVlLWNvbHVtbnN7bWF4LXdpZHRoOjEwMCV9fUBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCl7LmFydGljbGUtLWNvbnRlbnQgI2xpc3QtZmlsdGVycyAuZmlsdGVyLWNhdGVnb3J5e21heC13aWR0aDoxMDAlfX0uYXJ0aWNsZS0tY29udGVudCBvbCwuYXJ0aWNsZS0tY29udGVudCB1bHtwYWRkaW5nLWxlZnQ6MS42cmVtO21hcmdpbjoxcmVtIDAgMS41cmVtIDB9LmFydGljbGUtLWNvbnRlbnQgb2wgb2wsLmFydGljbGUtLWNvbnRlbnQgb2wgdWwsLmFydGljbGUtLWNvbnRlbnQgdWwgb2wsLmFydGljbGUtLWNvbnRlbnQgdWwgdWx7bWFyZ2luOjB9LmFydGljbGUtLWNvbnRlbnQgdWx7bGlzdC1zdHlsZS10eXBlOmRpc2N9LmFydGljbGUtLWNvbnRlbnQgdWwgbGk6YmVmb3Jle2NvbnRlbnQ6XCJcIiAhaW1wb3J0YW50O2Rpc3BsYXk6bm9uZX0uYXJ0aWNsZS0tY29udGVudCB1bCBvbHtsaXN0LXN0eWxlOnJldmVydH0uYXJ0aWNsZS0tY29udGVudCB1bCBvbCBsaTo6bWFya2Vye2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6I0ZBRkFGQ30uYXJ0aWNsZS0tY29udGVudCBvbHtsaXN0LXN0eWxlOm5vbmU7Y291bnRlci1yZXNldDppdGVtfS5hcnRpY2xlLS1jb250ZW50IG9sIGxpe3Bvc2l0aW9uOnJlbGF0aXZlO2NvdW50ZXItaW5jcmVtZW50Oml0ZW19LmFydGljbGUtLWNvbnRlbnQgb2wgbGk6YmVmb3Jle2NvbnRlbnQ6Y291bnRlcihpdGVtKSBcIi4gXCI7cG9zaXRpb246YWJzb2x1dGU7bGVmdDotMS42ZW07Y29sb3I6I0ZBRkFGQztmb250LXdlaWdodDpib2xkfS5hcnRpY2xlLS1jb250ZW50IG9sIGxpPm9sIGxpOmJlZm9yZXtjb250ZW50OmNvdW50ZXIoaXRlbSwgbG93ZXItbGF0aW4pIFwiLiBcIn0uYXJ0aWNsZS0tY29udGVudCBvbCBsaT5vbCBsaSBvbCBsaTpiZWZvcmV7Y29udGVudDpjb3VudGVyKGl0ZW0pIFwiLiBcIn0uYXJ0aWNsZS0tY29udGVudCBvbCBsaT5vbCBsaSBvbCBsaSBvbCBsaTpiZWZvcmV7Y29udGVudDpjb3VudGVyKGl0ZW0sIGxvd2VyLWxhdGluKSBcIi4gXCJ9LmFydGljbGUtLWNvbnRlbnQgb2wgbGk+b2wgbGkgb2wgbGkgb2wgbGkgb2wgbGk6YmVmb3Jle2NvbnRlbnQ6Y291bnRlcihpdGVtKSBcIi4gXCJ9LmFydGljbGUtLWNvbnRlbnQgb2wgbGkgdWx7Y291bnRlci1yZXNldDppdGVtfS5hcnRpY2xlLS1jb250ZW50IG9sIGxpIHVsPm9se2NvdW50ZXItcmVzZXQ6aXRlbX0uYXJ0aWNsZS0tY29udGVudCBsaXttYXJnaW46LjI1cmVtIDB9LmFydGljbGUtLWNvbnRlbnQgbGk6bm90KDpsYXN0LWNoaWxkKT5wOm9ubHktY2hpbGR7bWFyZ2luLWJvdHRvbTowfS5hcnRpY2xlLS1jb250ZW50IGxpIHArdWwsLmFydGljbGUtLWNvbnRlbnQgbGkgcCtvbHttYXJnaW46LS45cmVtIDAgLjVyZW19LmFydGljbGUtLWNvbnRlbnQgbGkgLmxpc3Qtbm90ZXtmb250LXNpemU6Ljg1cmVtfS5hcnRpY2xlLS1jb250ZW50IGxpIGg0LC5hcnRpY2xlLS1jb250ZW50IGxpIGg1LC5hcnRpY2xlLS1jb250ZW50IGxpIGg2e21hcmdpbi10b3A6MWVtO3BhZGRpbmctdG9wOjB9LmFydGljbGUtLWNvbnRlbnQgZW0ub3A5MCwuYXJ0aWNsZS0tY29udGVudCBzcGFuLm9wOTAsLmFydGljbGUtLWNvbnRlbnQgc3Ryb25nLm9wOTB7b3BhY2l0eTouOX0uYXJ0aWNsZS0tY29udGVudCBlbS5vcDg1LC5hcnRpY2xlLS1jb250ZW50IHNwYW4ub3A4NSwuYXJ0aWNsZS0tY29udGVudCBzdHJvbmcub3A4NXtvcGFjaXR5Oi44NX0uYXJ0aWNsZS0tY29udGVudCBlbS5vcDgwLC5hcnRpY2xlLS1jb250ZW50IHNwYW4ub3A4MCwuYXJ0aWNsZS0tY29udGVudCBzdHJvbmcub3A4MHtvcGFjaXR5Oi44fS5hcnRpY2xlLS1jb250ZW50IGVtLm9wNzUsLmFydGljbGUtLWNvbnRlbnQgc3Bhbi5vcDc1LC5hcnRpY2xlLS1jb250ZW50IHN0cm9uZy5vcDc1e29wYWNpdHk6Ljc1fS5hcnRpY2xlLS1jb250ZW50IGVtLm9wNzAsLmFydGljbGUtLWNvbnRlbnQgc3Bhbi5vcDcwLC5hcnRpY2xlLS1jb250ZW50IHN0cm9uZy5vcDcwe29wYWNpdHk6Ljd9LmFydGljbGUtLWNvbnRlbnQgZW0ub3A2NSwuYXJ0aWNsZS0tY29udGVudCBzcGFuLm9wNjUsLmFydGljbGUtLWNvbnRlbnQgc3Ryb25nLm9wNjV7b3BhY2l0eTouNjV9LmFydGljbGUtLWNvbnRlbnQgZW0ub3A2MCwuYXJ0aWNsZS0tY29udGVudCBzcGFuLm9wNjAsLmFydGljbGUtLWNvbnRlbnQgc3Ryb25nLm9wNjB7b3BhY2l0eTouNn0uYXJ0aWNsZS0tY29udGVudCBlbS5vcDU1LC5hcnRpY2xlLS1jb250ZW50IHNwYW4ub3A1NSwuYXJ0aWNsZS0tY29udGVudCBzdHJvbmcub3A1NXtvcGFjaXR5Oi41NX0uYXJ0aWNsZS0tY29udGVudCBlbS5vcDUwLC5hcnRpY2xlLS1jb250ZW50IHNwYW4ub3A1MCwuYXJ0aWNsZS0tY29udGVudCBzdHJvbmcub3A1MHtvcGFjaXR5Oi41fS5hcnRpY2xlLS1jb250ZW50IGVtLm9wNDUsLmFydGljbGUtLWNvbnRlbnQgc3Bhbi5vcDQ1LC5hcnRpY2xlLS1jb250ZW50IHN0cm9uZy5vcDQ1e29wYWNpdHk6LjQ1fS5hcnRpY2xlLS1jb250ZW50IGVtLm9wNDAsLmFydGljbGUtLWNvbnRlbnQgc3Bhbi5vcDQwLC5hcnRpY2xlLS1jb250ZW50IHN0cm9uZy5vcDQwe29wYWNpdHk6LjR9LmFydGljbGUtLWNvbnRlbnQgZW0ub3AzNSwuYXJ0aWNsZS0tY29udGVudCBzcGFuLm9wMzUsLmFydGljbGUtLWNvbnRlbnQgc3Ryb25nLm9wMzV7b3BhY2l0eTouMzV9LmFydGljbGUtLWNvbnRlbnQgZW0ub3AzMCwuYXJ0aWNsZS0tY29udGVudCBzcGFuLm9wMzAsLmFydGljbGUtLWNvbnRlbnQgc3Ryb25nLm9wMzB7b3BhY2l0eTouM30uYXJ0aWNsZS0tY29udGVudCBlbS5vcDI1LC5hcnRpY2xlLS1jb250ZW50IHNwYW4ub3AyNSwuYXJ0aWNsZS0tY29udGVudCBzdHJvbmcub3AyNXtvcGFjaXR5Oi4yNX0uYXJ0aWNsZS0tY29udGVudCBlbS5vcDIwLC5hcnRpY2xlLS1jb250ZW50IHNwYW4ub3AyMCwuYXJ0aWNsZS0tY29udGVudCBzdHJvbmcub3AyMHtvcGFjaXR5Oi4yfS5hcnRpY2xlLS1jb250ZW50IGVtLm9wMTUsLmFydGljbGUtLWNvbnRlbnQgc3Bhbi5vcDE1LC5hcnRpY2xlLS1jb250ZW50IHN0cm9uZy5vcDE1e29wYWNpdHk6LjE1fS5hcnRpY2xlLS1jb250ZW50IGVtLm9wMTAsLmFydGljbGUtLWNvbnRlbnQgc3Bhbi5vcDEwLC5hcnRpY2xlLS1jb250ZW50IHN0cm9uZy5vcDEwe29wYWNpdHk6LjF9LmFydGljbGUtLWNvbnRlbnQgLnBhZ2UtbmF2LWJ0bnN7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbjozcmVtIDAgMXJlbX0uYXJ0aWNsZS0tY29udGVudCAucGFnZS1uYXYtYnRucyAuYnRue2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6NDklO3RleHQtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcn0uYXJ0aWNsZS0tY29udGVudCAucGFnZS1uYXYtYnRucyAuYnRuLnByZXZ7bWFyZ2luOjAgYXV0byAwIDA7cGFkZGluZzouNzVyZW0gMS4yNXJlbSAuNzVyZW0gLjc1cmVtfS5hcnRpY2xlLS1jb250ZW50IC5wYWdlLW5hdi1idG5zIC5idG4ucHJldjpiZWZvcmV7Y29udGVudDpcIlxcZTkwYVwiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtZmFtaWx5OlwiaWNvbW9vbi12MlwiO21hcmdpbi1yaWdodDouNXJlbTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmFydGljbGUtLWNvbnRlbnQgLnBhZ2UtbmF2LWJ0bnMgLmJ0bi5uZXh0e21hcmdpbjowIDAgMCBhdXRvO3BhZGRpbmc6Ljc1cmVtIC43NXJlbSAuNzVyZW0gMS4yNXJlbTtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZX0uYXJ0aWNsZS0tY29udGVudCAucGFnZS1uYXYtYnRucyAuYnRuLm5leHQ6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5MGNcIjtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LWZhbWlseTpcImljb21vb24tdjJcIjttYXJnaW4tbGVmdDouNXJlbTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmFydGljbGUtLWNvbnRlbnQgLnBhZ2UtbmF2LWJ0bnMgLmJ0bjpvbmx5LWNoaWxke21heC13aWR0aDpub25lfS5hcnRpY2xlLS1jb250ZW50IC5yZWxhdGVke2JvcmRlci10b3A6MXB4IHNvbGlkICMzODM4NDY7cGFkZGluZy10b3A6MS41cmVtfS5hcnRpY2xlLS1jb250ZW50IC5yZWxhdGVkIGg0e2ZvbnQtc2l6ZToxLjE1cmVtfS5hcnRpY2xlLS1jb250ZW50IC5yZWxhdGVkIHVse2xpc3Qtc3R5bGU6bm9uZTtwYWRkaW5nOjA7bWFyZ2luLXRvcDowfS5hcnRpY2xlLS1jb250ZW50IC5yZWxhdGVkIGxpe21hcmdpbjouNXJlbSAwO2xpbmUtaGVpZ2h0OjEuMjVyZW19LmFydGljbGUtLWNvbnRlbnQgLmV4cGFuZC13cmFwcGVyKy5yZWxhdGVke2JvcmRlci10b3A6bm9uZTttYXJnaW4tdG9wOi0ycmVtfS5hcnRpY2xlLS1jb250ZW50ICNyZWxlYXNlLXRvY3ttYXJnaW46MnJlbSAwIDNyZW19LmFydGljbGUtLWNvbnRlbnQgI3JlbGVhc2UtdG9jIHVse2xpc3Qtc3R5bGU6bm9uZTtvdmVyZmxvdzpoaWRkZW47cGFkZGluZy1sZWZ0OjA7bWFyZ2luLWJvdHRvbTouNzVyZW07dHJhbnNpdGlvbjpoZWlnaHQgLjJzfS5hcnRpY2xlLS1jb250ZW50ICNyZWxlYXNlLXRvYyB1bCBsaXtsaW5lLWhlaWdodDoxLjJlbTttYXJnaW46LjVyZW0gMH0uYXJ0aWNsZS0tY29udGVudCAjcmVsZWFzZS10b2MgdWwgbGk6OmFmdGVye2NvbnRlbnQ6YXR0cihkYXRlKTtmb250LXNpemU6MXJlbTttYXJnaW4tbGVmdDouNXJlbTtjb2xvcjpyZ2JhKDIxMiwyMTUsMjIxLDAuNSl9LmFydGljbGUtLWNvbnRlbnQgI3JlbGVhc2UtdG9jLmNsdXN0ZXJlZCB1bHtwYWRkaW5nLWxlZnQ6MS41cmVtfS5hcnRpY2xlLS1jb250ZW50ICNyZWxlYXNlLXRvYy5jbHVzdGVyZWQgdWwgLmNoZWNrcG9pbnR7bWFyZ2luLWxlZnQ6LTEuNXJlbX0uYXJ0aWNsZS0tY29udGVudCAjcmVsZWFzZS10b2MuY2x1c3RlcmVkIHVsIC5jaGVja3BvaW50OjpiZWZvcmV7Y29udGVudDonXFxlOTNiJyAhaW1wb3J0YW50O2ZvbnQtZmFtaWx5OidpY29tb29uLXY0Jztjb2xvcjojZDMwOTcxO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjowIC41cmVtIDAgMDt2ZXJ0aWNhbC1hbGlnbjp0b3B9LmFydGljbGUtLWNvbnRlbnQgI3JlbGVhc2UtdG9jIC5zaG93LW1vcmV7Y29sb3I6IzAwQTNGRjt0cmFuc2l0aW9uOmNvbG9yIC4ycztmb250LXdlaWdodDo1MDA7Zm9udC1zaXplOjFyZW19LmFydGljbGUtLWNvbnRlbnQgI3JlbGVhc2UtdG9jIC5zaG93LW1vcmU6OmJlZm9yZXtjb250ZW50OidcXGU5MzUnO2ZvbnQtZmFtaWx5OidpY29tb29uLXY0Jztmb250LXNpemU6LjlyZW07Y29sb3I6IzE0MTQxRjtiYWNrZ3JvdW5kOiMwMEEzRkY7Ym9yZGVyLXJhZGl1czo1MCU7bWFyZ2luLXJpZ2h0Oi41cmVtO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMTVzfS5hcnRpY2xlLS1jb250ZW50ICNyZWxlYXNlLXRvYyAuc2hvdy1tb3JlOmhvdmVye2N1cnNvcjpwb2ludGVyO2NvbG9yOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgI3JlbGVhc2UtdG9jIC5zaG93LW1vcmU6aG92ZXI6OmJlZm9yZXtiYWNrZ3JvdW5kOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgcHJlOjotd2Via2l0LXNjcm9sbGJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoNyw3LDE0LDApO3dpZHRoOjEycHg7aGVpZ2h0OjEycHh9LmFydGljbGUtLWNvbnRlbnQgcHJlOjotd2Via2l0LXNjcm9sbGJhci10cmFja3tiYWNrZ3JvdW5kLWNvbG9yOiMwNzA3MEU7Ym9yZGVyLXJhZGl1czowIDAgMnB4IDJweH0uYXJ0aWNsZS0tY29udGVudCBwcmU6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JhY2tncm91bmQtY29sb3I6IzI5MjkzMztib3JkZXI6M3B4IHNvbGlkICMwNzA3MEU7Ym9yZGVyLXJhZGl1czo2cHh9LmFydGljbGUtLWNvbnRlbnQgdGFibGU6Oi13ZWJraXQtc2Nyb2xsYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgzOCwzOSw1NiwwKTt3aWR0aDoxMnB4O2hlaWdodDoxMnB4fS5hcnRpY2xlLS1jb250ZW50IHRhYmxlOjotd2Via2l0LXNjcm9sbGJhci10cmFja3tiYWNrZ3JvdW5kLWNvbG9yOiMyNjI3Mzg7Ym9yZGVyLXJhZGl1czowIDAgMnB4IDJweH0uYXJ0aWNsZS0tY29udGVudCB0YWJsZTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojMEYwRTE1O2JvcmRlcjozcHggc29saWQgIzI2MjczODtib3JkZXItcmFkaXVzOjZweH0uYXJ0aWNsZS0tY29udGVudCBzdmdbaWRePSdnZW8tczItY2VsbHMtJ117bWF4LXdpZHRoOjI1MHB4fS5hcnRpY2xlLS1jb250ZW50IHN2Z1tpZF49J2dlby1zMi1jZWxscy0nXSAuZ2VvLWNlbGx7ZmlsbDpyZ2JhKDQyLDE2MywyNTUsMC4yNSk7c3Ryb2tlOiMyQUEzRkY7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwfS5hcnRpY2xlLS1jb250ZW50IHN2Z1tpZF49J2dlby1zMi1jZWxscy0nXSAuZ2VvLXJlZ2lvbntmaWxsOnJnYmEoMjA2LDg4LDIzNSwwLjM1KTtzdHJva2U6I0NFNThFQjtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmFydGljbGUtLWNvbnRlbnQgc3ZnW2lkXj0nZ2VvLXMyLWNlbGxzLSddIC5nZW8tcG9pbnR7ZmlsbDojRDZGNjIyfS5hcnRpY2xlLS1jb250ZW50IHN2ZyN0aW1lZC1tb3ZpbmctYXZlcmFnZXttYXJnaW46MXJlbSAwIDNyZW07bWF4LXdpZHRoOjQyNXB4fS5hcnRpY2xlLS1jb250ZW50IHN2ZyN0aW1lZC1tb3ZpbmctYXZlcmFnZSAuc3Qwe3N0cm9rZTojRDREN0REfS5hcnRpY2xlLS1jb250ZW50IHN2ZyN0aW1lZC1tb3ZpbmctYXZlcmFnZSAuc3Qxe2ZpbGw6I0Q0RDdERH0uYXJ0aWNsZS0tY29udGVudCBzdmcjdGltZWQtbW92aW5nLWF2ZXJhZ2UgLnN0Mntmb250LWZhbWlseTpcIlByb3hpbWEgTm92YVwiLHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NTAwfS5hcnRpY2xlLS1jb250ZW50IHN2ZyNqb2luLWRpYWdyYW17ZGlzcGxheTpibG9jazttYXgtd2lkdGg6MjUwcHg7bWFyZ2luOjFyZW0gMCAycmVtfS5hcnRpY2xlLS1jb250ZW50IHN2ZyNqb2luLWRpYWdyYW0uY2VudGVye21hcmdpbjowIGF1dG8gMnJlbSBhdXRvfS5hcnRpY2xlLS1jb250ZW50IHN2ZyNqb2luLWRpYWdyYW0uc21hbGx7bWF4LXdpZHRoOjEyNXB4fS5hcnRpY2xlLS1jb250ZW50IHN2ZyNqb2luLWRpYWdyYW0uc21hbGwgcGF0aHtzdHJva2Utd2lkdGg6M30uYXJ0aWNsZS0tY29udGVudCBzdmcjam9pbi1kaWFncmFtIHBhdGh7c3Ryb2tlOiNENEQ3REQ7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lfS5hcnRpY2xlLS1jb250ZW50IHN2ZyNqb2luLWRpYWdyYW0uaW5uZXIgcGF0aCNjZW50ZXJ7ZmlsbDpyZ2JhKDIxMiwyMTUsMjIxLDAuMzUpfS5hcnRpY2xlLS1jb250ZW50IHN2ZyNqb2luLWRpYWdyYW0ubGVmdCBwYXRoI2xlZnQsLmFydGljbGUtLWNvbnRlbnQgc3ZnI2pvaW4tZGlhZ3JhbS5sZWZ0IHBhdGgjY2VudGVye2ZpbGw6cmdiYSgyMTIsMjE1LDIyMSwwLjM1KX0uYXJ0aWNsZS0tY29udGVudCBzdmcjam9pbi1kaWFncmFtLnJpZ2h0IHBhdGgjY2VudGVyLC5hcnRpY2xlLS1jb250ZW50IHN2ZyNqb2luLWRpYWdyYW0ucmlnaHQgcGF0aCNyaWdodHtmaWxsOnJnYmEoMjEyLDIxNSwyMjEsMC4zNSl9LmFydGljbGUtLWNvbnRlbnQgc3ZnI2pvaW4tZGlhZ3JhbS5mdWxsIHBhdGgjbGVmdCwuYXJ0aWNsZS0tY29udGVudCBzdmcjam9pbi1kaWFncmFtLmZ1bGwgcGF0aCNjZW50ZXIsLmFydGljbGUtLWNvbnRlbnQgc3ZnI2pvaW4tZGlhZ3JhbS5mdWxsIHBhdGgjcmlnaHR7ZmlsbDpyZ2JhKDIxMiwyMTUsMjIxLDAuMzUpfS5hcnRpY2xlLS1jb250ZW50IHN2ZyNpbmZsdXhkYi12My1zdG9yYWdlLWFyY2hpdGVjdHVyZXttYXJnaW46MnJlbSAwIDNyZW07bWF4LXdpZHRoOjc1MHB4fS5hcnRpY2xlLS1jb250ZW50IHN2ZyNpbmZsdXhkYi12My1zdG9yYWdlLWFyY2hpdGVjdHVyZSAuc2hhcGV7ZmlsbDpub25lO3N0cm9rZTojRDREN0REO3N0cm9rZS13aWR0aDoxLjU7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmFydGljbGUtLWNvbnRlbnQgc3ZnI2luZmx1eGRiLXYzLXN0b3JhZ2UtYXJjaGl0ZWN0dXJlIC5zaGFwZS5vcDcwe29wYWNpdHk6MC43fS5hcnRpY2xlLS1jb250ZW50IHN2ZyNpbmZsdXhkYi12My1zdG9yYWdlLWFyY2hpdGVjdHVyZSAuc2hhcGUub3A1MHtvcGFjaXR5OjAuNX0uYXJ0aWNsZS0tY29udGVudCBzdmcjaW5mbHV4ZGItdjMtc3RvcmFnZS1hcmNoaXRlY3R1cmUgLnNoYXBlLm9wMjV7b3BhY2l0eTowLjI1fS5hcnRpY2xlLS1jb250ZW50IHN2ZyNpbmZsdXhkYi12My1zdG9yYWdlLWFyY2hpdGVjdHVyZSAuc2hhcGUuZGFzaGVke3N0cm9rZS13aWR0aDoxO3N0cm9rZS1kYXNoYXJyYXk6NCwzfS5hcnRpY2xlLS1jb250ZW50IHN2ZyNpbmZsdXhkYi12My1zdG9yYWdlLWFyY2hpdGVjdHVyZSAudGl0bGV7ZmlsbDojOTM5NEZGO2ZvbnQtd2VpZ2h0OjUwMDtmb250LXNpemU6MjBweH0uYXJ0aWNsZS0tY29udGVudCBzdmcjaW5mbHV4ZGItdjMtc3RvcmFnZS1hcmNoaXRlY3R1cmUgLnRleHR7ZmlsbDojRDREN0REO2ZvbnQtc2l6ZToxOHB4fS5hcnRpY2xlLS1jb250ZW50IHN2ZyNpbmZsdXhkYi12My1zdG9yYWdlLWFyY2hpdGVjdHVyZSAudGV4dC5zbWFsbHtmb250LXNpemU6MTZweH0uYXJ0aWNsZS0tY29udGVudCBzdmcjaW5mbHV4ZGItdjMtc3RvcmFnZS1hcmNoaXRlY3R1cmUgLnRleHQuYm9sZHtmb250LXdlaWdodDo1MDA7Y29sb3I6I0ZBRkFGQ30uYXJ0aWNsZS0tY29udGVudCBzdmcjaW5mbHV4ZGItdjMtc3RvcmFnZS1hcmNoaXRlY3R1cmUgLnRleHQuaXRhbGlje2ZvbnQtc3R5bGU6aXRhbGljfS5hcnRpY2xlLS1jb250ZW50IHN2ZyNpbmZsdXhkYi12My1zdG9yYWdlLWFyY2hpdGVjdHVyZSAuZGlhZ3JhbS1saW5le2ZpbGw6bm9uZTtzdHJva2U6I0Q2RjYyMjtzdHJva2Utd2lkdGg6MS41O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5hcnRpY2xlLS1jb250ZW50IHN2ZyNpbmZsdXhkYi12My1zdG9yYWdlLWFyY2hpdGVjdHVyZSAuZGlhZ3JhbS1saW5lLmRhc2hlZHtzdHJva2UtZGFzaGFycmF5OjIsNH0uYXJ0aWNsZS0tY29udGVudCBzdmcjaW5mbHV4ZGItdjMtc3RvcmFnZS1hcmNoaXRlY3R1cmUgLmFycm93e2ZpbGw6I0Q2RjYyMn1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpey5hcnRpY2xlLS1jb250ZW50IHN2ZyNqb2luLWRpYWdyYW17bWFyZ2luOjFyZW0gYXV0byAycmVtfX0uYXJ0aWNsZS0tY29udGVudCBzcGFuLmtleS1nZW8tY2VsbHtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luOjAgLjVyZW0gLjI1cmVtIDA7d2lkdGg6MS4xZW07aGVpZ2h0OjEuMWVtO2JvcmRlcjoycHggc29saWQgIzJBQTNGRjtiYWNrZ3JvdW5kOnJnYmEoNDIsMTYzLDI1NSwwLjI1KTtib3JkZXItcmFkaXVzOjJweH0uYXJ0aWNsZS0tY29udGVudCBzcGFuLmtleS1nZW8tcmVnaW9ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW46MCAuNXJlbSAuMjVyZW0gMDt3aWR0aDoxLjFlbTtoZWlnaHQ6MS4xZW07Ym9yZGVyOjJweCBzb2xpZCAjQ0U1OEVCO2JhY2tncm91bmQ6cmdiYSgyMDYsODgsMjM1LDAuMzUpO2JvcmRlci1yYWRpdXM6MnB4fS5hcnRpY2xlLS1jb250ZW50IHNwYW4ua2V5LWdlby1wb2ludHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MCAuN3JlbSAwIC4yNXJlbTt3aWR0aDouNjVyZW07aGVpZ2h0Oi42NXJlbTtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOiNENkY2MjJ9LmFydGljbGUtLWNvbnRlbnQgLnRhYnMtd3JhcHBlcnttYXJnaW46Mi41cmVtIDAgLjVyZW19LmFydGljbGUtLWNvbnRlbnQgLmNvZGUtdGFicy13cmFwcGVye21hcmdpbjoxLjVyZW0gMCAuNXJlbX0uYXJ0aWNsZS0tY29udGVudCAudGFicyBwe2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcH0uYXJ0aWNsZS0tY29udGVudCAudGFicyBhe2ZsZXgtZ3JvdzoxO21hcmdpbjoycHg7cG9zaXRpb246cmVsYXRpdmU7Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NTAwO3BhZGRpbmc6LjY1cmVtIDEuMjVyZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiNBNEE4QjYgIWltcG9ydGFudDtib3JkZXItcmFkaXVzOjJweDtiYWNrZ3JvdW5kLWNvbG9yOiMwNzA3MEU7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4ycywgY29sb3IgLjJzO3otaW5kZXg6MX0uYXJ0aWNsZS0tY29udGVudCAudGFicyBhOmFmdGVye2NvbnRlbnQ6XCJcIjtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO3RvcDowO3JpZ2h0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXItcmFkaXVzOjJweDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg0NWRlZywgIzA2NkZDNSwjMDBBM0ZGKTtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IC4yczt6LWluZGV4Oi0xfS5hcnRpY2xlLS1jb250ZW50IC50YWJzIGE6aG92ZXJ7Y29sb3I6I2ZmZiAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC50YWJzIGE6aG92ZXI6YWZ0ZXJ7b3BhY2l0eToxfS5hcnRpY2xlLS1jb250ZW50IC50YWJzIGEuaXMtYWN0aXZle2NvbG9yOiNmZmYgIWltcG9ydGFudH0uYXJ0aWNsZS0tY29udGVudCAudGFicyBhLmlzLWFjdGl2ZTphZnRlcntvcGFjaXR5OjE7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICMwNjZGQzUsIzAwQTNGRil9LmFydGljbGUtLWNvbnRlbnQgLnRhYnMuc21hbGwgcHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uYXJ0aWNsZS0tY29udGVudCAudGFicy5zbWFsbCBhe2ZsZXgtZ3Jvdzp1bnNldDtwYWRkaW5nOi4zNXJlbSAxcmVtfS5hcnRpY2xlLS1jb250ZW50IC50YWJzLnNtYWxsIC50YWItdmlldy1vdXRwdXR7cGFkZGluZzouNXJlbSAuNXJlbSAwO2ZvbnQtc2l6ZTouOXJlbTtvcGFjaXR5Oi42NTtmb250LXN0eWxlOml0YWxpYzt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzfS5hcnRpY2xlLS1jb250ZW50IC50YWJzLnNtYWxsIC50YWItdmlldy1vdXRwdXQ6YmVmb3Jle2NvbnRlbnQ6XCJcXGU5N2FcIjttYXJnaW4tcmlnaHQ6MC4yNWVtO2ZvbnQtZmFtaWx5OidpY29tb29uLXYzJztmb250LXN0eWxlOm5vcm1hbH0uYXJ0aWNsZS0tY29udGVudCAudGFicy5zbWFsbCBhLmlzLWFjdGl2ZSsudGFiLXZpZXctb3V0cHV0e29wYWNpdHk6MH0uYXJ0aWNsZS0tY29udGVudCAudGFicy5tZWRpdW0gcHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uYXJ0aWNsZS0tY29udGVudCAudGFicy5tZWRpdW0gYXtmbGV4LWdyb3c6dW5zZXR9LmFydGljbGUtLWNvbnRlbnQgLnRhYnMuZXZlbi13cmFwIGF7ZmxleC1iYXNpczoyNSV9LmFydGljbGUtLWNvbnRlbnQgLmNvZGUtdGFicyBwe21hcmdpbjowO3RleHQtYWxpZ246cmlnaHQ7ZGlzcGxheTpibG9ja30uYXJ0aWNsZS0tY29udGVudCAuY29kZS10YWJzIGF7cGFkZGluZzouMXJlbSAuNzVyZW07bWFyZ2luOjA7Ym9yZGVyLXJhZGl1czoycHggMnB4IDAgMDtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MXJlbTtiYWNrZ3JvdW5kOiMxNDE0MUY7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwwLjUpfS5hcnRpY2xlLS1jb250ZW50IC5jb2RlLXRhYnMgYTpob3Zlcntjb2xvcjojZmZmfS5hcnRpY2xlLS1jb250ZW50IC5jb2RlLXRhYnMgYS5pcy1hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMDcwNzBFO2NvbG9yOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgLmNvZGUtdGFiLWNvbnRlbnR7cGFkZGluZzowfS5hcnRpY2xlLS1jb250ZW50IC5jb2RlLXRhYi1jb250ZW50IHByZXttYXJnaW46MCAwIDNyZW07Ym9yZGVyLXJhZGl1czoycHggMCAycHggMnB4fS5hcnRpY2xlLS1jb250ZW50IC50YWItY29udGVudCwuYXJ0aWNsZS0tY29udGVudCAuY29kZS10YWJzLWNvbnRlbnR7bWFyZ2luOi43NXJlbSAwIDNyZW07d2lkdGg6MTAwJX0uYXJ0aWNsZS0tY29udGVudCAudGFiLWNvbnRlbnQ+Om5vdCh0YWJsZSwuZnMtZGlhZ3JhbSxpbWcpLC5hcnRpY2xlLS1jb250ZW50IC5jb2RlLXRhYnMtY29udGVudD46bm90KHRhYmxlLC5mcy1kaWFncmFtLGltZyl7d2lkdGg6MTAwJTttYXJnaW4tbGVmdDowfS5hcnRpY2xlLS1jb250ZW50IC50YWItY29udGVudCB0YWJsZTpsYXN0LWNoaWxkLC5hcnRpY2xlLS1jb250ZW50IC5jb2RlLXRhYnMtY29udGVudCB0YWJsZTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0uYXJ0aWNsZS0tY29udGVudCAudGFiLWNvbnRlbnQ6bm90KDpmaXJzdC1vZi10eXBlKXtkaXNwbGF5Om5vbmV9LmFydGljbGUtLWNvbnRlbnQgLmNvZGUtdGFiLWNvbnRlbnQ6bm90KDpmaXJzdC1vZi10eXBlKXtkaXNwbGF5Om5vbmV9LmFydGljbGUtLWNvbnRlbnQgdGFibGV7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOjFyZW0gMXJlbSAzcmVtIDA7Ym9yZGVyLXNwYWNpbmc6MDtjb2xvcjojRDREN0REO21heC13aWR0aDoxMDAlO292ZXJmbG93LXg6YXV0bztvdmVyZmxvdy15OmhpZGRlbjtib3gtc2hhZG93OjFweCAzcHggMTBweCAjMDcwNzBFO2JvcmRlci1yYWRpdXM6MnB4fS5hcnRpY2xlLS1jb250ZW50IHRhYmxlIHRoLC5hcnRpY2xlLS1jb250ZW50IHRhYmxlIHRke3BhZGRpbmc6Ljg1cmVtIDEuMjVyZW19LmFydGljbGUtLWNvbnRlbnQgdGFibGUgdGhlYWR7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoOTBkZWcsICM4RTFGQzMsIzA2NkZDNSk7YmFja2dyb3VuZC1hdHRhY2htZW50OmZpeGVkfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlIHRoe2NvbG9yOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgdGFibGUgdGggc3Ryb25ne2NvbG9yOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgdGFibGUgdGg6Zmlyc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czoycHggMCAwIDB9LmFydGljbGUtLWNvbnRlbnQgdGFibGUgdGg6bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMnB4IDAgMH0uYXJ0aWNsZS0tY29udGVudCB0YWJsZSB0ZHtmb250LXNpemU6MS4wNXJlbTtsaW5lLWhlaWdodDoxLjVlbX0uYXJ0aWNsZS0tY29udGVudCB0YWJsZSB0ZCBjb2Rle2ZvbnQtc2l6ZTouOTVyZW19LmFydGljbGUtLWNvbnRlbnQgdGFibGUgdHI6bnRoLWNoaWxkKGV2ZW4pe2JhY2tncm91bmQ6IzI2MjczOH0uYXJ0aWNsZS0tY29udGVudCB0YWJsZSB0cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAwIDAgMnB4fS5hcnRpY2xlLS1jb250ZW50IHRhYmxlIHRyOmxhc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMCAycHggMH0uYXJ0aWNsZS0tY29udGVudCB0YWJsZSBpbWd7bWFyZ2luLWJvdHRvbTowfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlLmNsb3VkLXVybHMgYXt3aGl0ZS1zcGFjZTpub3dyYXB9LmFydGljbGUtLWNvbnRlbnQgdGFibGUuY2xvdWQtdXJscyBwe21hcmdpbjowIDAgLjVyZW0gMH0uYXJ0aWNsZS0tY29udGVudCB0YWJsZS5jbG91ZC11cmxzIHA6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LmFydGljbGUtLWNvbnRlbnQgdGFibGUuY2xvdWQtdXJscyAuY2x1c3Rlci1uYW1le2ZvbnQtd2VpZ2h0OjUwMDtjb2xvcjojRkFGQUZDfS5hcnRpY2xlLS1jb250ZW50IHRhYmxlK3RhYmxle21hcmdpbi10b3A6LTEuNXJlbX0uYXJ0aWNsZS0tY29udGVudCAjZmxhZ3M6bm90KC5uby1zaG9ydGhhbmQpK3RhYmxlIHRkOm50aC1jaGlsZCgyKSBjb2RlLC5hcnRpY2xlLS1jb250ZW50ICNvcHRpb25zOm5vdCgubm8tc2hvcnRoYW5kKSt0YWJsZSB0ZDpudGgtY2hpbGQoMikgY29kZSwuYXJ0aWNsZS0tY29udGVudCAjZ2xvYmFsLWZsYWdzK3RhYmxlIHRkOm50aC1jaGlsZCgyKSBjb2RlLC5hcnRpY2xlLS1jb250ZW50ICNnbG9iYWwtb3B0aW9ucyt0YWJsZSB0ZDpudGgtY2hpbGQoMikgY29kZSwuYXJ0aWNsZS0tY29udGVudCAuc2hvcnRoYW5kLWZsYWdzK3RhYmxlIHRkOm50aC1jaGlsZCgyKSBjb2Rle21hcmdpbi1sZWZ0Oi0ycmVtfS5hcnRpY2xlLS1jb250ZW50IHAudGFibGUtZ3JvdXAta2V5e21hcmdpbjoxcmVtIDAgLS43NXJlbTtmb250LXdlaWdodDo1MDA7Zm9udC1zaXplOi45NXJlbX0uYXJ0aWNsZS0tY29udGVudCB0YWJsZSsudGFibGUtZ3JvdXAta2V5e21hcmdpbi10b3A6LTJyZW19LmFydGljbGUtLWNvbnRlbnQgdGFibGUuZmx1eC1pbmZsdXhkYi12ZXJzaW9ucyB0Ym9keXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2V9LmFydGljbGUtLWNvbnRlbnQgdGFibGUuZmx1eC1pbmZsdXhkYi12ZXJzaW9ucyB0Ym9keSB0cntkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59LmFydGljbGUtLWNvbnRlbnQgLnRhZ3N7Ym9yZGVyLXRvcDoxcHggc29saWQgIzM4Mzg0NjtwYWRkaW5nLXRvcDoxLjc1cmVtO21hcmdpbjoycmVtIDAgMXJlbX0uYXJ0aWNsZS0tY29udGVudCAudGFncyAudGFne2JhY2tncm91bmQ6IzA3MDcwRTttYXJnaW46LjEycmVtIDA7cGFkZGluZzouNHJlbSAuNjVyZW07Zm9udC1zdHlsZTppdGFsaWM7Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOnJnYmEoMjEyLDIxNSwyMjEsMC43NSkgIWltcG9ydGFudDtmb250LXNpemU6LjlyZW07Ym9yZGVyLXJhZGl1czoxcmVtfS5hcnRpY2xlLS1jb250ZW50IC50YWdzIC50YWc6YWZ0ZXJ7Ym9yZGVyLXJhZGl1czoxcmVtO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjQkYyRkU1LCM5Mzk0RkYpfS5hcnRpY2xlLS1jb250ZW50IC50YWdzIC50YWc6aG92ZXJ7Y29sb3I6I2ZmZiAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IC5yZWxhdGVkKy50YWdzLC5hcnRpY2xlLS1jb250ZW50IC5leHBhbmQtd3JhcHBlcisudGFnc3tib3JkZXI6bm9uZTtwYWRkaW5nLXRvcDowO21hcmdpbjoxLjVyZW0gMCAxcmVtfS5hcnRpY2xlLS1jb250ZW50IC5wbHVnaW4tY2FyZHtwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjFyZW0gMS41cmVtO21hcmdpbi1ib3R0b206LjVyZW07anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZDpyZ2JhKDcsNywxNCwwLjQpO2JvcmRlci1yYWRpdXM6MnB4fS5hcnRpY2xlLS1jb250ZW50IC5wbHVnaW4tY2FyZCBoM3twYWRkaW5nOjA7bWFyZ2luLXRvcDouMjVyZW19LmFydGljbGUtLWNvbnRlbnQgLnBsdWdpbi1jYXJkLm5ldyBoMzphZnRlcntjb250ZW50OlwiTmV3XCI7bWFyZ2luLWxlZnQ6LjNyZW07cGFkZGluZzouMjVyZW0gLjVyZW07Zm9udC1zdHlsZTppdGFsaWM7Y29sb3I6I0Q2RjYyMjtmb250LXNpemU6MS4ycmVtO29wYWNpdHk6MX0uYXJ0aWNsZS0tY29udGVudCAucGx1Z2luLWNhcmQgcC5tZXRhe21hcmdpbjouNzVyZW0gMDtmb250LXdlaWdodDo1MDA7bGluZS1oZWlnaHQ6MS43NXJlbX0uYXJ0aWNsZS0tY29udGVudCAucGx1Z2luLWNhcmQgcC5tZXRhIC5kZXByZWNhdGVke21hcmdpbi1sZWZ0Oi41cmVtO2ZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiNlOTB9LmFydGljbGUtLWNvbnRlbnQgLnBsdWdpbi1jYXJkIC5pbmZvPnA6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOi41cmVtfS5hcnRpY2xlLS1jb250ZW50IC5wbHVnaW4tY2FyZCAuaW5mbz51bDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206LjVyZW19LmFydGljbGUtLWNvbnRlbnQgLnBsdWdpbi1jYXJkIC5pbmZvPm9sOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTouNXJlbX0uYXJ0aWNsZS0tY29udGVudCAucGx1Z2luLWNhcmQgLnBsdWdpbi1saW5re3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjAuNXJlbTtvcGFjaXR5OjAuMjU7dHJhbnNpdGlvbjpvcGFjaXR5IC4ycywgYmFja2dyb3VuZCAuMnMsIGNvbG9yIC4ycztiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg0NWRlZywgIzA2NkZDNSwjMDBBM0ZGKX0uYXJ0aWNsZS0tY29udGVudCAucGx1Z2luLWNhcmQ6aG92ZXIgLnBsdWdpbi1saW5re29wYWNpdHk6MTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg0NWRlZywgIzA2NkZDNSwjMDBBM0ZGKX0uYXJ0aWNsZS0tY29udGVudCAucGx1Z2luLWNhcmQgYmxvY2txdW90ZXtib3JkZXItY29sb3I6IzAwQTNGRjtiYWNrZ3JvdW5kOnJnYmEoMCwxNjMsMjU1LDAuMTIpfS5hcnRpY2xlLS1jb250ZW50IC5wbHVnaW4tY2FyZCBibG9ja3F1b3RlIGgzLC5hcnRpY2xlLS1jb250ZW50IC5wbHVnaW4tY2FyZCBibG9ja3F1b3RlIGg0LC5hcnRpY2xlLS1jb250ZW50IC5wbHVnaW4tY2FyZCBibG9ja3F1b3RlIGg1LC5hcnRpY2xlLS1jb250ZW50IC5wbHVnaW4tY2FyZCBibG9ja3F1b3RlIGg2e2NvbG9yOiNmZmZ9LmFydGljbGUtLWNvbnRlbnQgLnBsdWdpbi1jYXJkIGJsb2NrcXVvdGUgcCwuYXJ0aWNsZS0tY29udGVudCAucGx1Z2luLWNhcmQgYmxvY2txdW90ZSBsaXtjb2xvcjojQkVGMEZGO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtc3R5bGU6bm9ybWFsfS5hcnRpY2xlLS1jb250ZW50IC5wbHVnaW4tY2FyZCBibG9ja3F1b3RlIHN0cm9uZ3tjb2xvcjppbmhlcml0fS5hcnRpY2xlLS1jb250ZW50IC5wbHVnaW4tY2FyZCBibG9ja3F1b3RlIGF7Y29sb3I6I2ZmZn0uYXJ0aWNsZS0tY29udGVudCAucGx1Z2luLWNhcmQgYmxvY2txdW90ZSBhIGNvZGU6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHJnYmEoMCwyMDEsMjU1LDAuMzUpIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50fS5hcnRpY2xlLS1jb250ZW50IC5wbHVnaW4tY2FyZCBibG9ja3F1b3RlIGE6aG92ZXJ7Y29sb3I6IzZCREZGRn0uYXJ0aWNsZS0tY29udGVudCAucGx1Z2luLWNhcmQgYmxvY2txdW90ZSBhOmhvdmVyIGNvZGU6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50ICM2QkRGRkYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnR9LmFydGljbGUtLWNvbnRlbnQgLnBsdWdpbi1jYXJkIGJsb2NrcXVvdGUgb2wgbGk6YmVmb3Jle2NvbG9yOiNCRUYwRkZ9LmFydGljbGUtLWNvbnRlbnQgLnBsdWdpbi1jYXJkIGJsb2NrcXVvdGUgY29kZSwuYXJ0aWNsZS0tY29udGVudCAucGx1Z2luLWNhcmQgYmxvY2txdW90ZSBwcmV7Y29sb3I6IzAwQzlGRjtiYWNrZ3JvdW5kOiMwYTA3MWN9QG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KXsuYXJ0aWNsZS0tY29udGVudCAucGx1Z2luLWNhcmQgLnBsdWdpbi1saW5re29wYWNpdHk6MTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg0NWRlZywgIzA2NkZDNSwjMDBBM0ZGKTtwYWRkaW5nOi4yNXJlbSAuMzVyZW0gLjM1cmVtO2xpbmUtaGVpZ2h0OjB9LmFydGljbGUtLWNvbnRlbnQgLnBsdWdpbi1jYXJkIC5wbHVnaW4tbGluayAuaWNvbi1naXRodWJ7bWFyZ2luOjB9LmFydGljbGUtLWNvbnRlbnQgLnBsdWdpbi1jYXJkIC5wbHVnaW4tbGluayAuaGlkZXtkaXNwbGF5Om5vbmV9fS5hcnRpY2xlLS1jb250ZW50IC50aXRsZXttYXJnaW4tYm90dG9tOjIuNjVyZW19LmFydGljbGUtLWNvbnRlbnQgLnRpdGxlIC5tZXRhZGF0YXtwYWRkaW5nOjA7bWFyZ2luOjB9LmFydGljbGUtLWNvbnRlbnQgLnRpdGxlIC5tZXRhZGF0YSBsaXttYXJnaW4tYm90dG9tOjA7cGFkZGluZzouNDVlbSAuNzVlbTtjb2xvcjojZmZmO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjA3KTtmb250LXNpemU6Ljk1cmVtO2ZvbnQtd2VpZ2h0OjUwMDtsaW5lLWhlaWdodDoxLjFyZW07Ym9yZGVyLXJhZGl1czoxLjFlbTtkaXNwbGF5OmlubGluZS1ibG9ja30uYXJ0aWNsZS0tY29udGVudCAudGl0bGUgLm1ldGFkYXRhIGxpLnVwZGF0ZWQtaW4sLmFydGljbGUtLWNvbnRlbnQgLnRpdGxlIC5tZXRhZGF0YSBsaS5kYXRlLC5hcnRpY2xlLS1jb250ZW50IC50aXRsZSAubWV0YWRhdGEgbGkuZmx1eC1pbmZsdXhkYntwYWRkaW5nOjAgMCAwIC40ZW07YmFja2dyb3VuZDpub25lO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOml0YWxpYztjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuNil9LmFydGljbGUtLWNvbnRlbnQgLnRpdGxlIC5tZXRhZGF0YSAudXBkYXRlZC1pbisuZGF0ZTo6YmVmb3Jle2NvbnRlbnQ6XCLigKJcIiAhaW1wb3J0YW50O2Rpc3BsYXk6aW5saW5lO21hcmdpbi1yaWdodDouNXJlbX0uYXJ0aWNsZS0tY29udGVudCAudGl0bGUgLm1ldGFkYXRhIC5mbHV4LWluZmx1eGRiIGF7Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTouOTt0cmFuc2l0aW9uOmNvbG9yIC4ycywgb3BhY2l0eSAuMnN9LmFydGljbGUtLWNvbnRlbnQgLnRpdGxlIC5tZXRhZGF0YSAuZmx1eC1pbmZsdXhkYiBhOmhvdmVye29wYWNpdHk6MX1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpey5hcnRpY2xlLS1jb250ZW50IC50aXRsZXttYXJnaW4tYm90dG9tOjJyZW19LmFydGljbGUtLWNvbnRlbnQgLnRpdGxlIGgxe21hcmdpbjouMzVlbSAwIC4yZW07Zm9udC1zaXplOjIuNHJlbX19LmFydGljbGUtLWNvbnRlbnQgLnRydW5jYXRle3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbi1ib3R0b206My41cmVtfS5hcnRpY2xlLS1jb250ZW50IC50cnVuY2F0ZSAudHJ1bmNhdGUtY29udGVudHtvdmVyZmxvdzpoaWRkZW47bWF4LWhlaWdodDo5OTk5cHg7dHJhbnNpdGlvbjptYXgtaGVpZ2h0IC40c30uYXJ0aWNsZS0tY29udGVudCAudHJ1bmNhdGUgLnRydW5jYXRlLWNvbnRlbnQuY2xvc2Vke21pbi1oZWlnaHQ6MjUwcHg7bWF4LWhlaWdodDoyNXZofS5hcnRpY2xlLS1jb250ZW50IC50cnVuY2F0ZSAudHJ1bmNhdGUtYm90dG9te3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTotMzBweDt3aWR0aDoxMDAlO3otaW5kZXg6MTAwO2hlaWdodDphdXRvfS5hcnRpY2xlLS1jb250ZW50IC50cnVuY2F0ZSBhLnRydW5jYXRlLXRvZ2dsZXtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMHB4O21hcmdpbjowIGF1dG87Y29sb3I6I0Q0RDdERDtiYWNrZ3JvdW5kOiMxNDE0MUY7cGFkZGluZzouNDVyZW07dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOi43NXJlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Ym9yZGVyLXJhZGl1czoycHg7dHJhbnNpdGlvbjpjb2xvciAuMnN9LmFydGljbGUtLWNvbnRlbnQgLnRydW5jYXRlIGEudHJ1bmNhdGUtdG9nZ2xlOmJlZm9yZXtjb250ZW50OlwiU2hvdyBMZXNzXCJ9LmFydGljbGUtLWNvbnRlbnQgLnRydW5jYXRlIGEudHJ1bmNhdGUtdG9nZ2xlOmhvdmVye2NvbG9yOiMwMEEzRkZ9LmFydGljbGUtLWNvbnRlbnQgLnRydW5jYXRlLmNsb3NlZCAudHJ1bmNhdGUtYm90dG9te2JvdHRvbTowO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgyMCwyMCwzMSwwKSwgIzE0MTQxZik7aGVpZ2h0OjEwMHB4fS5hcnRpY2xlLS1jb250ZW50IC50cnVuY2F0ZS5jbG9zZWQgYS50cnVuY2F0ZS10b2dnbGV7bWFyZ2luLXRvcDo3NXB4fS5hcnRpY2xlLS1jb250ZW50IC50cnVuY2F0ZS5jbG9zZWQgYS50cnVuY2F0ZS10b2dnbGU6YmVmb3Jle2NvbnRlbnQ6XCJTaG93IE1vcmVcIn0uYXJ0aWNsZS0tY29udGVudCAudmlkZW9zLXdyYXBwZXJ7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO21hcmdpbi10b3A6MS41cmVtfS5hcnRpY2xlLS1jb250ZW50IC52aWRlby1jYXJke21heC13aWR0aDoyNDBweDttYXJnaW46MCAxLjc1cmVtIC43NXJlbSAwfS5hcnRpY2xlLS1jb250ZW50IC52aWRlby1jYXJkIGF7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZX0uYXJ0aWNsZS0tY29udGVudCAudmlkZW8tY2FyZCBhOmFmdGVye2NvbnRlbnQ6XCJcXGU5MTRcIjtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Zm9udC1mYW1pbHk6XCJpY29tb29uXCI7dG9wOi42NXJlbTtyaWdodDouNjVyZW07aGVpZ2h0OjEuNXJlbTt3aWR0aDoxLjVyZW07Y29sb3I6I2ZmZjtwYWRkaW5nOi4zNXJlbTtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMC4yNSk7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuM3N9LmFydGljbGUtLWNvbnRlbnQgLnZpZGVvLWNhcmQgYTpob3ZlcjphZnRlcntvcGFjaXR5OjF9LmFydGljbGUtLWNvbnRlbnQgLnZpZGVvLWNhcmQgaW1ne21hcmdpbi1ib3R0b206MH0uYXJ0aWNsZS0tY29udGVudCAudmlkZW8tY2FyZCAudmlkZW8tdGl0bGV7bWFyZ2luOi4yNXJlbSAwIDA7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc2l6ZTouOXJlbTtjb2xvcjojRkFGQUZDO2xpbmUtaGVpZ2h0OjEuMjVyZW19LmFydGljbGUtLWNvbnRlbnQgLnZpZGVvLWNhcmQgLnZpZGVvLWRhdGV7Zm9udC1zaXplOi44cmVtO2NvbG9yOnJnYmEoMjEyLDIxNSwyMjEsMC42KTtsaW5lLWhlaWdodDoxcmVtfS5hcnRpY2xlLS1jb250ZW50IC52aWRlby1jb250ZW50IC52aWRlby1kYXRle2NvbG9yOnJnYmEoMjEyLDIxNSwyMjEsMC42KTttYXJnaW4tdG9wOi0xLjc1cmVtO2ZvbnQtd2VpZ2h0OjUwMDtmb250LXNpemU6LjlyZW19LmFydGljbGUtLWNvbnRlbnQgLnZpZGVvLWNvbnRlbnQgLnZpZGVve21heC13aWR0aDpub25lO21hcmdpbjowIDAgMnJlbX0uYXJ0aWNsZS0tY29udGVudCAudmlkZW97d2lkdGg6MTAwJTttYXgtd2lkdGg6NjIwcHg7bWFyZ2luOjJyZW0gMH1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpey5hcnRpY2xlLS1jb250ZW50IC52aWRlby1jYXJke21heC13aWR0aDoxMDAlO21hcmdpbi1yaWdodDowfX0uYXJ0aWNsZS0tY29udGVudCAucmVxdWlyZWQsLmFydGljbGUtLWNvbnRlbnQgLnJlcXtjb2xvcjojRkY4NTY0O2ZvbnQtd2VpZ2h0OjUwMDtmb250LXN0eWxlOml0YWxpYzttYXJnaW46MCAuMTVyZW0gMCAuMXJlbX0uYXJ0aWNsZS0tY29udGVudCAucmVxdWlyZWQuYXN0ZXJpc2ssLmFydGljbGUtLWNvbnRlbnQgLnJlcS5hc3Rlcmlza3ttYXJnaW46MCAtLjFyZW0gMCAtLjVyZW19LmFydGljbGUtLWNvbnRlbnQgLnJlcXVpcmVkLmtleSwuYXJ0aWNsZS0tY29udGVudCAucmVxLmtleXtmb250LXNpemU6LjlyZW07Zm9udC13ZWlnaHQ6NTAwfS5hcnRpY2xlLS1jb250ZW50IC5yZXF1aXJlZC5ub3JtYWwsLmFydGljbGUtLWNvbnRlbnQgLnJlcS5ub3JtYWx7Zm9udC1zdHlsZTpub3JtYWx9LmFydGljbGUtLWNvbnRlbnQgLnJlcXVpcmVkLmJsdWUsLmFydGljbGUtLWNvbnRlbnQgLnJlcS5ibHVle2NvbG9yOiMyQUEzRkZ9LmFydGljbGUtLWNvbnRlbnQgLnJlcXVpcmVkLmdyZWVuLC5hcnRpY2xlLS1jb250ZW50IC5yZXEuZ3JlZW57Y29sb3I6IzAwOUY1Rn0uYXJ0aWNsZS0tY29udGVudCAucmVxdWlyZWQubWFnZW50YSwuYXJ0aWNsZS0tY29udGVudCAucmVxLm1hZ2VudGF7Y29sb3I6I0NFNThFQn0uYXJ0aWNsZS0tY29udGVudCAucmVxdWlyZWQucGluaywuYXJ0aWNsZS0tY29udGVudCAucmVxLnBpbmt7Y29sb3I6I2QzMDk3MX0uYXJ0aWNsZS0tY29udGVudCBoMisua2VlcC11cmwsLmFydGljbGUtLWNvbnRlbnQgaDMrLmtlZXAtdXJsLC5hcnRpY2xlLS1jb250ZW50IGg0Ky5rZWVwLXVybCwuYXJ0aWNsZS0tY29udGVudCBoNSsua2VlcC11cmwsLmFydGljbGUtLWNvbnRlbnQgaDYrLmtlZXAtdXJse21hcmdpbi10b3A6LTEuNXJlbTt6LWluZGV4Oi0xMDB9LmFydGljbGUtLWNvbnRlbnQgYS5xLWxpbmt7Zm9udC1zaXplOi44cmVtO3ZlcnRpY2FsLWFsaWduOnN1cGVyO2xpbmUtaGVpZ2h0OjA7Y29sb3I6I2ZmZjtvcGFjaXR5Oi41O3RyYW5zaXRpb246b3BhY2l0eSAuMnN9LmFydGljbGUtLWNvbnRlbnQgYS5xLWxpbms6aG92ZXJ7b3BhY2l0eToxfS5hcnRpY2xlLS1jb250ZW50IHAucmVhZC1tb3Jle3RleHQtYWxpZ246cmlnaHQ7Zm9udC1zdHlsZTppdGFsaWN9LmFydGljbGUtLWNvbnRlbnQgLmhpZ2hsaWdodCtwLnJlYWQtbW9yZSwuYXJ0aWNsZS0tY29udGVudCBwcmUrcC5yZWFkLW1vcmUsLmFydGljbGUtLWNvbnRlbnQgY29kZStwLnJlYWQtbW9yZSwuYXJ0aWNsZS0tY29udGVudCAuZmxleC13cmFwcGVyK3AucmVhZC1tb3Jle21hcmdpbjotLjc1cmVtIDAgLjVyZW19LmFydGljbGUtLWNvbnRlbnQgLm5vd3JhcHt3aGl0ZS1zcGFjZTpub3dyYXB9LmFydGljbGUtLWNvbnRlbnQgLmFsbC1jYXBze3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtmb250LXNpemU6MS4wNXJlbTtsZXR0ZXItc3BhY2luZzouMWVtO2ZvbnQtd2VpZ2h0OjUwMCAhaW1wb3J0YW50fS5hcnRpY2xlLS1jb250ZW50IHNwYW4ub3JhbmdlLC5hcnRpY2xlLS1jb250ZW50IHN0cm9uZy5vcmFuZ2UsLmFydGljbGUtLWNvbnRlbnQgZW0ub3Jhbmdle2NvbG9yOiNGRjg1NjR9LmFydGljbGUtLWNvbnRlbnQgc3Bhbi5ibHVlLC5hcnRpY2xlLS1jb250ZW50IHN0cm9uZy5ibHVlLC5hcnRpY2xlLS1jb250ZW50IGVtLmJsdWV7Y29sb3I6IzJBQTNGRn0uYXJ0aWNsZS0tY29udGVudCBzcGFuLmdyZWVuLC5hcnRpY2xlLS1jb250ZW50IHN0cm9uZy5ncmVlbiwuYXJ0aWNsZS0tY29udGVudCBlbS5ncmVlbntjb2xvcjojMDA5RjVGfS5hcnRpY2xlLS1jb250ZW50IHNwYW4ubWFnZW50YSwuYXJ0aWNsZS0tY29udGVudCBzdHJvbmcubWFnZW50YSwuYXJ0aWNsZS0tY29udGVudCBlbS5tYWdlbnRhe2NvbG9yOiNDRTU4RUJ9LmFydGljbGUtLWNvbnRlbnQgc3Bhbi5waW5rLC5hcnRpY2xlLS1jb250ZW50IHN0cm9uZy5waW5rLC5hcnRpY2xlLS1jb250ZW50IGVtLnBpbmt7Y29sb3I6I2QzMDk3MX0uYXJ0aWNsZS0tY29udGVudCAuZ2V0LXN0YXJ0ZWQtYnRuc3tkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2p1c3RpZnktY29udGVudDpzcGFjZS1hcm91bmQ7YWxpZ24taXRlbXM6ZmxleC1zdGFydDttYXJnaW4tYm90dG9tOjJyZW19LmFydGljbGUtLWNvbnRlbnQgLmdldC1zdGFydGVkLWJ0bnMgYS5idG57bWF4LXdpZHRoOjMwMHB4O3dpZHRoOjEwMCU7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzoxcmVtfUBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCl7LmFydGljbGV7cGFkZGluZzoxLjVyZW0gMS41cmVtIDNyZW19LmFydGljbGUgaDJ7Zm9udC1zaXplOjEuOXJlbX0uYXJ0aWNsZSBoM3tmb250LXNpemU6MS41NXJlbX0uYXJ0aWNsZSBoNHtmb250LXNpemU6MS4zcmVtfX0uYXJ0aWNsZS0tY29udGVudCAuaW5saW5le21hcmdpbjowIC4xNXJlbX0uYXJ0aWNsZS0tY29udGVudCAuaW5saW5lLm1pZGRsZTpiZWZvcmV7dmVydGljYWwtYWxpZ246bWlkZGxlfS5hcnRpY2xlLS1jb250ZW50IC5pbmxpbmUudG9wOmJlZm9yZXt2ZXJ0aWNhbC1hbGlnbjp0ZXh0LXRvcH0uYXJ0aWNsZS0tY29udGVudCAuaW5saW5lLmJvdHRvbTpiZWZvcmV7dmVydGljYWwtYWxpZ246Ym90dG9tfS5hcnRpY2xlLS1jb250ZW50IC5pbmxpbmUueHNtYWxsOmJlZm9yZXtmb250LXNpemU6LjhyZW19LmFydGljbGUtLWNvbnRlbnQgLmlubGluZS5zbWFsbDpiZWZvcmV7Zm9udC1zaXplOi45cmVtfS5hcnRpY2xlLS1jb250ZW50IC5pbmxpbmUubGFyZ2U6YmVmb3Jle2ZvbnQtc2l6ZToxLjFyZW19LmFydGljbGUtLWNvbnRlbnQgLmlubGluZS5hZGQtYnRuLXJvdW5ke2ZvbnQtZmFtaWx5OlwiaWNvbW9vbi12MlwiO2NvbG9yOiNmZmY7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICM1YzEwYTAsICM4ZTFmYzMpO2JvcmRlci1yYWRpdXM6NTAlO21hcmdpbjowIC4yNXJlbTtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0ZXh0LXRvcDtmb250LXNpemU6LjdyZW07d2lkdGg6MjBweDtoZWlnaHQ6MjBweDtwYWRkaW5nLWxlZnQ6LjI5cmVtO2xpbmUtaGVpZ2h0OjEuMjVyZW19LmFydGljbGUtLWNvbnRlbnQgLmlubGluZS5hZGQtYnRuLXJvdW5kLnYzLC5hcnRpY2xlLS1jb250ZW50IC5pbmxpbmUuYWRkLWJ0bi1yb3VuZC52NHtwb3NpdGlvbjpyZWxhdGl2ZTtiYWNrZ3JvdW5kOiMzODM4NDY7d2lkdGg6MThweDtoZWlnaHQ6MThweDtmb250LXNpemU6LjY1cmVtO2xpbmUtaGVpZ2h0OjByZW07cGFkZGluZzo5cHggMCAwIDRweH0uYXJ0aWNsZS0tY29udGVudCAuaW5saW5lLnVpLXRvZ2dsZXtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoyOHB4O2hlaWdodDoxNnB4O2JvcmRlci1yYWRpdXM6LjdyZW07dmVydGljYWwtYWxpZ246dGV4dC10b3A7bWFyZ2luLXRvcDoycHh9LmFydGljbGUtLWNvbnRlbnQgLmlubGluZS51aS10b2dnbGUgLmNpcmNsZXtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtoZWlnaHQ6OHB4O3dpZHRoOjhweDtiYWNrZ3JvdW5kOiNmZmY7dG9wOjRweDtyaWdodDo0cHh9LmFydGljbGUtLWNvbnRlbnQgLmlubGluZS51aS10b2dnbGUuYmx1ZXtiYWNrZ3JvdW5kOiMwMEEzRkZ9LmFydGljbGUtLWNvbnRlbnQgLmlubGluZS51aS10b2dnbGUuZ3JlZW57YmFja2dyb3VuZDojMDA5RjVGfS5hcnRpY2xlLS1jb250ZW50IC5pbmxpbmUudWktdG9nZ2xlLm9mZntiYWNrZ3JvdW5kOiMzMzMzNDZ9LmFydGljbGUtLWNvbnRlbnQgLmlubGluZS51aS10b2dnbGUub2ZmIC5jaXJjbGV7bGVmdDo0cHh9LmFydGljbGUtLWNvbnRlbnQgLmlubGluZS51aS10b2dnbGUudjMsLmFydGljbGUtLWNvbnRlbnQgLmlubGluZS51aS10b2dnbGUudjR7d2lkdGg6MjZweH0uYXJ0aWNsZS0tY29udGVudCAuaW5saW5lLnVpLXRvZ2dsZS52MyAuY2lyY2xlLC5hcnRpY2xlLS1jb250ZW50IC5pbmxpbmUudWktdG9nZ2xlLnY0IC5jaXJjbGV7aGVpZ2h0OjEycHg7d2lkdGg6MTJweDt0b3A6MnB4O3JpZ2h0OjJweH0uYXJ0aWNsZS0tY29udGVudCAuaW5saW5lLnVpLXRvZ2dsZS52My5vZmYgLmNpcmNsZSwuYXJ0aWNsZS0tY29udGVudCAuaW5saW5lLnVpLXRvZ2dsZS52NC5vZmYgLmNpcmNsZXtsZWZ0OjJweH0uYXJ0aWNsZS0tY29udGVudCAuaW5saW5lLm5vdGVib29rLWFkZC1jZWxse2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci1yYWRpdXM6NTAlO2hlaWdodDoxLjNyZW07d2lkdGg6MS4zcmVtO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjNWMxMGEwIDAlLCAjOGUxZmMzIDEwMCUpO3ZlcnRpY2FsLWFsaWduOnRleHQtYm90dG9tO3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiNmZmY7Zm9udC1zaXplOi44cmVtfS5hcnRpY2xlLS1jb250ZW50IC5pbmxpbmUubm90ZWJvb2stYWRkLWNlbGw+c3BhbntkaXNwbGF5OmJsb2NrO21hcmdpbjowLjNyZW0gMH0uYXJ0aWNsZS0tY29udGVudCAubmF2LWl0ZW17ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246dG9wO21hcmdpbi1ib3R0b206MS4yNXJlbX0uYXJ0aWNsZS0tY29udGVudCAubmF2LWl0ZW06YWZ0ZXJ7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoycHg7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDojYmUyZWU0O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDE4MGRlZywgI2JlMmVlNCAwLCAjMDBhM2ZmKX0uYXJ0aWNsZS0tY29udGVudCAubmF2LWl0ZW06Zmlyc3QtY2hpbGR7bWFyZ2luLXJpZ2h0OjEuMjVyZW19LmFydGljbGUtLWNvbnRlbnQgLm5hdi1pdGVtLmFjY291bnR7cGFkZGluZzouMjVyZW07cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MjEwcHg7aGVpZ2h0OjU2cHh9LmFydGljbGUtLWNvbnRlbnQgLm5hdi1pdGVtLmFjY291bnQ6YWZ0ZXJ7ZGlzcGxheTpub25lfS5hcnRpY2xlLS1jb250ZW50IC5uYXYtaXRlbS5hY2NvdW50IC5hY2N0LWlubmVye2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjpyZWxhdGl2ZTthbGlnbi1pdGVtczpjZW50ZXI7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOiMyOTI5MzM7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyOjNweCBzb2xpZCAjNjc2OTc4fS5hcnRpY2xlLS1jb250ZW50IC5uYXYtaXRlbS5hY2NvdW50IC5hY2N0LWlubmVyOmFmdGVye2NvbnRlbnQ6XCJcIjtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxcmVtO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDo1cHggNXB4IDAgNXB4O2JvcmRlci1jb2xvcjojRTdFOEVCIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50fS5hcnRpY2xlLS1jb250ZW50IC5uYXYtaXRlbS5hY2NvdW50IC5hY2N0LWljb257bWFyZ2luOjAgLjlyZW0gMCAuNXJlbTtib3JkZXItcmFkaXVzOjUwJTtoZWlnaHQ6MjhweDt3aWR0aDoyOHB4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjMDBhM2ZmLCAjNjdkNzRlKTtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5hcnRpY2xlLS1jb250ZW50IC5uYXYtaXRlbS5hY2NvdW50IC5hY2N0LWljb24gLmljb257bWFyZ2luLWxlZnQ6LS4xcmVtO2ZvbnQtc2l6ZToycmVtfS5hcnRpY2xlLS1jb250ZW50IC5uYXYtaXRlbS5hY2NvdW50IC5hY2N0LWxhYmVsIC51c2VybmFtZXtjb2xvcjojRTdFOEVCO2ZvbnQtd2VpZ2h0OjUwMDtmb250LXNpemU6Ljg1cmVtO2xpbmUtaGVpZ2h0OjEuMnJlbX0uYXJ0aWNsZS0tY29udGVudCAubmF2LWl0ZW0uYWNjb3VudCAuYWNjdC1sYWJlbCAub3JnbmFtZXtjb2xvcjojOTk5REFCO2ZvbnQtc2l6ZTouNzVyZW07bGluZS1oZWlnaHQ6Ljc1cmVtfS5hcnRpY2xlLS1jb250ZW50IC5uYXYtaXRlbS5hY2NvdW50LnNtYWxse3dpZHRoOjU2cHh9LmFydGljbGUtLWNvbnRlbnQgLm5hdi1pdGVtLmFjY291bnQuc21hbGwgLmFjY3QtaW5uZXJ7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9LmFydGljbGUtLWNvbnRlbnQgLm5hdi1pdGVtLmFjY291bnQuc21hbGwgLmFjY3QtaW5uZXI6YWZ0ZXJ7ZGlzcGxheTpub25lfS5hcnRpY2xlLS1jb250ZW50IC5uYXYtaXRlbS5hY2NvdW50LnNtYWxsIC5hY2N0LWljb257bWFyZ2luOjB9LmFydGljbGUtLWNvbnRlbnQgLm5hdi1pY29ue2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6bGVmdDthbGlnbi1pdGVtczpjZW50ZXI7Y29sb3I6I2ZmZjt3aWR0aDoyMTBweDtoZWlnaHQ6NTZweDtmb250LWZhbWlseTpcIlJ1YmlrXCIsc2Fucy1zZXJpZjtmb250LXdlaWdodDo1MDA7cGFkZGluZzouOXJlbSAxLjFyZW07Zm9udC1zaXplOjFyZW07cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZDojMzgzODQ2fS5hcnRpY2xlLS1jb250ZW50IC5uYXYtaWNvbiAuaWNvbntkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MS4zNXJlbTttYXJnaW4tcmlnaHQ6MXJlbX0uYXJ0aWNsZS0tY29udGVudCAubmF2LWljb24gLm5hdi1pY29uLWxhYmVse2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MDtmb250LXNpemU6MXJlbX0uYXJ0aWNsZS0tY29udGVudCAubmF2LWljb246YmVmb3JlLC5hcnRpY2xlLS1jb250ZW50IC5uYXYtaWNvbjphZnRlcntjb250ZW50OlwiXCI7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO2hlaWdodDoycHg7ei1pbmRleDoyO3dpZHRoOjEycHh9LmFydGljbGUtLWNvbnRlbnQgLm5hdi1pY29uOmJlZm9yZXt0b3A6MDtiYWNrZ3JvdW5kOiNiZTJlZTQ7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoOTBkZWcsICNiZTJlZTQgMCwgcmdiYSgxOTAsNDYsMjI4LDApKX0uYXJ0aWNsZS0tY29udGVudCAubmF2LWljb246YWZ0ZXJ7Ym90dG9tOjA7YmFja2dyb3VuZDojMDBhM2ZmO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLCAjMDBhM2ZmIDAsIHJnYmEoMTkwLDQ2LDIyOCwwKSl9LmFydGljbGUtLWNvbnRlbnQgLm5hdi1pY29uLnNtYWxse2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtwYWRkaW5nOjA7d2lkdGg6NTZweDtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmFydGljbGUtLWNvbnRlbnQgLm5hdi1pY29uLnNtYWxsIC5pY29ue3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbjowfS5hcnRpY2xlLS1jb250ZW50IC5uYXYtaWNvbi5zbWFsbCAubmF2LWljb24tbGFiZWx7cGFkZGluZzowO21hcmdpbi10b3A6Ljc1cmVtO2ZvbnQtc2l6ZTouNjdyZW07bGluZS1oZWlnaHQ6MH0ubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12MywubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12NCwubmF2LWl0ZW1zLXY0IC5uYXYtaXRlbS12MywubmF2LWl0ZW1zLXY0IC5uYXYtaXRlbS12NHtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW46MCAxcmVtIDEuMjVyZW0gMDttYXgtd2lkdGg6MjI1cHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQocmdiYSg1LDQxLDY3LDAuOSksIHJnYmEoNiwzNCw1NiwwLjkpKTtjb2xvcjojZmZmO2hlaWdodDo2MHB4O2JvcmRlci1yYWRpdXM6MnB4fS5uYXYtaXRlbXMtdjMgLm5hdi1pdGVtLXYzLmFjY291bnQsLm5hdi1pdGVtcy12MyAubmF2LWl0ZW0tdjQuYWNjb3VudCwubmF2LWl0ZW1zLXY0IC5uYXYtaXRlbS12My5hY2NvdW50LC5uYXYtaXRlbXMtdjQgLm5hdi1pdGVtLXY0LmFjY291bnR7cGFkZGluZzo4cHh9Lm5hdi1pdGVtcy12MyAubmF2LWl0ZW0tdjMuYWNjb3VudCAuYWNjdC1pbm5lci12MywubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12My5hY2NvdW50IC5hY2N0LWlubmVyLXY0LC5uYXYtaXRlbXMtdjMgLm5hdi1pdGVtLXY0LmFjY291bnQgLmFjY3QtaW5uZXItdjMsLm5hdi1pdGVtcy12MyAubmF2LWl0ZW0tdjQuYWNjb3VudCAuYWNjdC1pbm5lci12NCwubmF2LWl0ZW1zLXY0IC5uYXYtaXRlbS12My5hY2NvdW50IC5hY2N0LWlubmVyLXYzLC5uYXYtaXRlbXMtdjQgLm5hdi1pdGVtLXYzLmFjY291bnQgLmFjY3QtaW5uZXItdjQsLm5hdi1pdGVtcy12NCAubmF2LWl0ZW0tdjQuYWNjb3VudCAuYWNjdC1pbm5lci12MywubmF2LWl0ZW1zLXY0IC5uYXYtaXRlbS12NC5hY2NvdW50IC5hY2N0LWlubmVyLXY0e2Rpc3BsYXk6ZmxleDtiYWNrZ3JvdW5kLWNvbG9yOiNmMWYxZjMwZDtib3JkZXItcmFkaXVzOjJweH0ubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12My5hY2NvdW50IC5hY2N0LWljb24tdjMsLm5hdi1pdGVtcy12MyAubmF2LWl0ZW0tdjMuYWNjb3VudCAuYWNjdC1pY29uLXY0LC5uYXYtaXRlbXMtdjMgLm5hdi1pdGVtLXY0LmFjY291bnQgLmFjY3QtaWNvbi12MywubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12NC5hY2NvdW50IC5hY2N0LWljb24tdjQsLm5hdi1pdGVtcy12NCAubmF2LWl0ZW0tdjMuYWNjb3VudCAuYWNjdC1pY29uLXYzLC5uYXYtaXRlbXMtdjQgLm5hdi1pdGVtLXYzLmFjY291bnQgLmFjY3QtaWNvbi12NCwubmF2LWl0ZW1zLXY0IC5uYXYtaXRlbS12NC5hY2NvdW50IC5hY2N0LWljb24tdjMsLm5hdi1pdGVtcy12NCAubmF2LWl0ZW0tdjQuYWNjb3VudCAuYWNjdC1pY29uLXY0e2Rpc3BsYXk6ZmxleDthbGlnbi1jb250ZW50OmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2ZvbnQtd2VpZ2h0OmJvbGQ7d2lkdGg6NDRweDtoZWlnaHQ6NDRweDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg1NGRlZywgI0JFMkVFNCwjMDBBM0ZGKTtib3JkZXItcmFkaXVzOjJweH0ubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12My5hY2NvdW50IC5hY2N0LWljb24tdjMgLmluaXRpYWwsLm5hdi1pdGVtcy12MyAubmF2LWl0ZW0tdjMuYWNjb3VudCAuYWNjdC1pY29uLXY0IC5pbml0aWFsLC5uYXYtaXRlbXMtdjMgLm5hdi1pdGVtLXY0LmFjY291bnQgLmFjY3QtaWNvbi12MyAuaW5pdGlhbCwubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12NC5hY2NvdW50IC5hY2N0LWljb24tdjQgLmluaXRpYWwsLm5hdi1pdGVtcy12NCAubmF2LWl0ZW0tdjMuYWNjb3VudCAuYWNjdC1pY29uLXYzIC5pbml0aWFsLC5uYXYtaXRlbXMtdjQgLm5hdi1pdGVtLXYzLmFjY291bnQgLmFjY3QtaWNvbi12NCAuaW5pdGlhbCwubmF2LWl0ZW1zLXY0IC5uYXYtaXRlbS12NC5hY2NvdW50IC5hY2N0LWljb24tdjMgLmluaXRpYWwsLm5hdi1pdGVtcy12NCAubmF2LWl0ZW0tdjQuYWNjb3VudCAuYWNjdC1pY29uLXY0IC5pbml0aWFse2FsaWduLXNlbGY6Y2VudGVyfS5uYXYtaXRlbXMtdjMgLm5hdi1pdGVtLXYzLmFjY291bnQgLmFjY3QtbGFiZWwtdjMsLm5hdi1pdGVtcy12MyAubmF2LWl0ZW0tdjMuYWNjb3VudCAuYWNjdC1sYWJlbC12NCwubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12NC5hY2NvdW50IC5hY2N0LWxhYmVsLXYzLC5uYXYtaXRlbXMtdjMgLm5hdi1pdGVtLXY0LmFjY291bnQgLmFjY3QtbGFiZWwtdjQsLm5hdi1pdGVtcy12NCAubmF2LWl0ZW0tdjMuYWNjb3VudCAuYWNjdC1sYWJlbC12MywubmF2LWl0ZW1zLXY0IC5uYXYtaXRlbS12My5hY2NvdW50IC5hY2N0LWxhYmVsLXY0LC5uYXYtaXRlbXMtdjQgLm5hdi1pdGVtLXY0LmFjY291bnQgLmFjY3QtbGFiZWwtdjMsLm5hdi1pdGVtcy12NCAubmF2LWl0ZW0tdjQuYWNjb3VudCAuYWNjdC1sYWJlbC12NHtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjhweCAwcHggMHB4IDhweDt3aWR0aDoxNjVweH0ubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12My5hY2NvdW50IC5hY2N0LWxhYmVsLXYzIC51c2VybmFtZSwubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12My5hY2NvdW50IC5hY2N0LWxhYmVsLXY0IC51c2VybmFtZSwubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12NC5hY2NvdW50IC5hY2N0LWxhYmVsLXYzIC51c2VybmFtZSwubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12NC5hY2NvdW50IC5hY2N0LWxhYmVsLXY0IC51c2VybmFtZSwubmF2LWl0ZW1zLXY0IC5uYXYtaXRlbS12My5hY2NvdW50IC5hY2N0LWxhYmVsLXYzIC51c2VybmFtZSwubmF2LWl0ZW1zLXY0IC5uYXYtaXRlbS12My5hY2NvdW50IC5hY2N0LWxhYmVsLXY0IC51c2VybmFtZSwubmF2LWl0ZW1zLXY0IC5uYXYtaXRlbS12NC5hY2NvdW50IC5hY2N0LWxhYmVsLXYzIC51c2VybmFtZSwubmF2LWl0ZW1zLXY0IC5uYXYtaXRlbS12NC5hY2NvdW50IC5hY2N0LWxhYmVsLXY0IC51c2VybmFtZXtmb250LXNpemU6Ljc1cmVtO2xpbmUtaGVpZ2h0Oi43NXJlbTtmb250LXdlaWdodDo1MDA7Y29sb3I6IzllOWVhZH0ubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12My5hY2NvdW50IC5hY2N0LWxhYmVsLXYzIC5vcmduYW1lLC5uYXYtaXRlbXMtdjMgLm5hdi1pdGVtLXYzLmFjY291bnQgLmFjY3QtbGFiZWwtdjQgLm9yZ25hbWUsLm5hdi1pdGVtcy12MyAubmF2LWl0ZW0tdjQuYWNjb3VudCAuYWNjdC1sYWJlbC12MyAub3JnbmFtZSwubmF2LWl0ZW1zLXYzIC5uYXYtaXRlbS12NC5hY2NvdW50IC5hY2N0LWxhYmVsLXY0IC5vcmduYW1lLC5uYXYtaXRlbXMtdjQgLm5hdi1pdGVtLXYzLmFjY291bnQgLmFjY3QtbGFiZWwtdjMgLm9yZ25hbWUsLm5hdi1pdGVtcy12NCAubmF2LWl0ZW0tdjMuYWNjb3VudCAuYWNjdC1sYWJlbC12NCAub3JnbmFtZSwubmF2LWl0ZW1zLXY0IC5uYXYtaXRlbS12NC5hY2NvdW50IC5hY2N0LWxhYmVsLXYzIC5vcmduYW1lLC5uYXYtaXRlbXMtdjQgLm5hdi1pdGVtLXY0LmFjY291bnQgLmFjY3QtbGFiZWwtdjQgLm9yZ25hbWV7Zm9udC1zaXplOi44NXJlbTtsaW5lLWhlaWdodDoxcmVtfS5uYXYtaXRlbXMtdjMgLm5hdi1pY29uLXYzLC5uYXYtaXRlbXMtdjMgLm5hdi1pY29uLXY0LC5uYXYtaXRlbXMtdjQgLm5hdi1pY29uLXYzLC5uYXYtaXRlbXMtdjQgLm5hdi1pY29uLXY0e2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6MTAwJTt3aWR0aDo2MHB4O2ZsZXgtc2hyaW5rOjB9Lm5hdi1pdGVtcy12MyBwLm5hdi1sYWJlbC12MywubmF2LWl0ZW1zLXYzIHAubmF2LWxhYmVsLXY0LC5uYXYtaXRlbXMtdjQgcC5uYXYtbGFiZWwtdjMsLm5hdi1pdGVtcy12NCBwLm5hdi1sYWJlbC12NHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MDtwYWRkaW5nOjA7Zm9udC1mYW1pbHk6XCJSdWJpa1wiLHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc2l6ZToxLjE1cmVtO21pbi13aWR0aDoyMjVweDtjb2xvcjojZmZmfS5uYXYtaXRlbXMtdjMgLmNmLWljb24sLm5hdi1pdGVtcy12NCAuY2YtaWNvbntkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MS4zNXJlbX0ubmF2LWl0ZW1zLXYzIC5jZi1pY29uLnYzLC5uYXYtaXRlbXMtdjQgLmNmLWljb24udjN7Zm9udC1mYW1pbHk6J2ljb21vb24tdjMnfS5uYXYtaXRlbXMtdjMgLmNmLWljb24udjQsLm5hdi1pdGVtcy12NCAuY2YtaWNvbi52NHtmb250LWZhbWlseTonaWNvbW9vbi12NCd9QG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KXsuYXJ0aWNsZS0tY29udGVudC5uYXYtaXRlbTpudGgtY2hpbGQoMil7ZGlzcGxheTpub25lfS5hcnRpY2xlLS1jb250ZW50Lm5hdi1pdGVtLXYzOm50aC1jaGlsZCgyKXtkaXNwbGF5Om5vbmV9LmFydGljbGUtLWNvbnRlbnQubmF2LWl0ZW0tdjQ6bnRoLWNoaWxkKDIpe2Rpc3BsYXk6bm9uZX19cHJle2xpbmUtaGVpZ2h0OjEuMjVyZW19Y29kZVtjbGFzcyo9XCJsYW5ndWFnZS1cIl0scHJlW2NsYXNzKj1cImxhbmd1YWdlLVwiXXtkaXJlY3Rpb246bHRyO3RleHQtYWxpZ246bGVmdDt3b3JkLXNwYWNpbmc6bm9ybWFsO3dvcmQtYnJlYWs6bm9ybWFsO3dvcmQtd3JhcDpub3JtYWw7LW1vei10YWItc2l6ZTo0Oy1vLXRhYi1zaXplOjQ7dGFiLXNpemU6NDstd2Via2l0LWh5cGhlbnM6bm9uZTstbW96LWh5cGhlbnM6bm9uZTstbXMtaHlwaGVuczpub25lO2h5cGhlbnM6bm9uZX1wcmVbY2xhc3MqPVwibGFuZ3VhZ2UtXCJdOjotbW96LXNlbGVjdGlvbixwcmVbY2xhc3MqPVwibGFuZ3VhZ2UtXCJdIDo6LW1vei1zZWxlY3Rpb24sY29kZVtjbGFzcyo9XCJsYW5ndWFnZS1cIl06Oi1tb3otc2VsZWN0aW9uLGNvZGVbY2xhc3MqPVwibGFuZ3VhZ2UtXCJdIDo6LW1vei1zZWxlY3Rpb257YmFja2dyb3VuZDpyZ2JhKDAsMTYzLDI1NSwwLjI1KX1wcmVbY2xhc3MqPVwibGFuZ3VhZ2UtXCJdOjpzZWxlY3Rpb24scHJlW2NsYXNzKj1cImxhbmd1YWdlLVwiXSA6OnNlbGVjdGlvbixjb2RlW2NsYXNzKj1cImxhbmd1YWdlLVwiXTo6c2VsZWN0aW9uLGNvZGVbY2xhc3MqPVwibGFuZ3VhZ2UtXCJdIDo6c2VsZWN0aW9ue2JhY2tncm91bmQ6cmdiYSgwLDE2MywyNTUsMC4yNSl9QG1lZGlhIHByaW50e2NvZGVbY2xhc3MqPVwibGFuZ3VhZ2UtXCJdLHByZVtjbGFzcyo9XCJsYW5ndWFnZS1cIl17dGV4dC1zaGFkb3c6bm9uZX19cHJlW2NsYXNzKj1cImxhbmd1YWdlLVwiXXtvdmVyZmxvdzphdXRvfTpub3QocHJlKT5jb2RlW2NsYXNzKj1cImxhbmd1YWdlLVwiXXt3aGl0ZS1zcGFjZTpub3JtYWx9LmhpZ2hsaWdodHtjb2xvcjojQjdCOEZGfS5oaWdobGlnaHQgLmdoLC5oaWdobGlnaHQgLmdvLC5oaWdobGlnaHQgLm5hLC5oaWdobGlnaHQgLm50LC5oaWdobGlnaHQgLm52LC5oaWdobGlnaHQgLm93e2NvbG9yOiNCN0I4RkZ9LmhpZ2hsaWdodCAuYywuaGlnaGxpZ2h0IC5jaCwuaGlnaGxpZ2h0IC5jbSwuaGlnaGxpZ2h0IC5jcGYsLmhpZ2hsaWdodCAuYzEsLmhpZ2hsaWdodCAuY3MsLmhpZ2hsaWdodCAud3tjb2xvcjojNTQ1NjY3fS5oaWdobGlnaHQgLmdpe2JhY2tncm91bmQtY29sb3I6IzU0NTY2N30uaGlnaGxpZ2h0IC5rLC5oaWdobGlnaHQgLmtjLC5oaWdobGlnaHQgLmtkLC5oaWdobGlnaHQgLmtuLC5oaWdobGlnaHQgLmtwLC5oaWdobGlnaHQgLmtyLC5oaWdobGlnaHQgLm5ue2NvbG9yOiMwMEEzRkZ9LmhpZ2hsaWdodCAuYnAsLmhpZ2hsaWdodCAuY3AsLmhpZ2hsaWdodCAuZGwsLmhpZ2hsaWdodCAuZ3QsLmhpZ2hsaWdodCAuZ3UsLmhpZ2hsaWdodCAua3QsLmhpZ2hsaWdodCAubmIsLmhpZ2hsaWdodCAubmMsLmhpZ2hsaWdodCAubm8sLmhpZ2hsaWdodCAuc2EsLmhpZ2hsaWdodCAuc2IsLmhpZ2hsaWdodCAuc2MsLmhpZ2hsaWdodCAuc2QsLmhpZ2hsaWdodCAuc2UsLmhpZ2hsaWdodCAuc2gsLmhpZ2hsaWdodCAuc3gsLmhpZ2hsaWdodCAuc3IsLmhpZ2hsaWdodCAuczEsLmhpZ2hsaWdodCAuczJ7Y29sb3I6IzAwOUY1Rn0uaGlnaGxpZ2h0IC5lcnIsLmhpZ2hsaWdodCAuZm0sLmhpZ2hsaWdodCAuZ3IsLmhpZ2hsaWdodCAuZ2QsLmhpZ2hsaWdodCAubmQsLmhpZ2hsaWdodCAubmUsLmhpZ2hsaWdodCAubmYsLmhpZ2hsaWdodCAubmwsLmhpZ2hsaWdodCAuc2l7Y29sb3I6I0JGM0Q1RX0uaGlnaGxpZ2h0IC5nZHt0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdofS5oaWdobGlnaHQgLm0sLmhpZ2hsaWdodCAubmksLmhpZ2hsaWdodCAubWIsLmhpZ2hsaWdodCAubWYsLmhpZ2hsaWdodCAubWgsLmhpZ2hsaWdodCAubWksLmhpZ2hsaWdodCAubW8sLmhpZ2hsaWdodCAudmMsLmhpZ2hsaWdodCAudmcsLmhpZ2hsaWdodCAudmksLmhpZ2hsaWdodCAudm0sLmhpZ2hsaWdodCAuaWx7Y29sb3I6I2ZmNmRiMH0uaGlnaGxpZ2h0IC5ncCwuaGlnaGxpZ2h0IC5ve2NvbG9yOiMwMEEzRkZ9LmhpZ2hsaWdodCAuc3N7Y29sb3I6I2U5MH0uaGlnaGxpZ2h0IC5jcyAuZ2gsLmhpZ2hsaWdodCAuZ3UsLmhpZ2hsaWdodCAuZ3AsLmhpZ2hsaWdodCAuZ3MsLmhpZ2hsaWdodCAuaywuaGlnaGxpZ2h0IC5rYywuaGlnaGxpZ2h0IC5rZCwuaGlnaGxpZ2h0IC5rbiwuaGlnaGxpZ2h0IC5rcCwuaGlnaGxpZ2h0IC5rciwuaGlnaGxpZ2h0IC5rdCwuaGlnaGxpZ2h0IC5uYywuaGlnaGxpZ2h0IC5uZSwuaGlnaGxpZ2h0IC5uaSwuaGlnaGxpZ2h0IC5ubiAubnQsLmhpZ2hsaWdodCAub3csLmhpZ2hsaWdodCAuc2V7Zm9udC13ZWlnaHQ6Ym9sZH0uaGlnaGxpZ2h0IC5jLC5oaWdobGlnaHQgLmNoLC5oaWdobGlnaHQgLmNtLC5oaWdobGlnaHQgLmNwZiwuaGlnaGxpZ2h0IC5jMSwuaGlnaGxpZ2h0IC5jcywuaGlnaGxpZ2h0IC5nZSwuaGlnaGxpZ2h0IC5zZCwuaGlnaGxpZ2h0IC53e2ZvbnQtc3R5bGU6aXRhbGljfS5oaWdobGlnaHQgLmxhbmd1YWdlLWpzIC5taSsubngsLmhpZ2hsaWdodCAubGFuZ3VhZ2UtanMgLm1mKy5ueHtjb2xvcjojZmY2ZGIwfS5oaWdobGlnaHQgLmxhbmd1YWdlLXNxbCAubWkrLm57Y29sb3I6I2ZmNmRiMH0uYWxnb2xpYS1hdXRvY29tcGxldGV7d2lkdGg6MTAwJX0uYWxnb2xpYS1hdXRvY29tcGxldGUgI2FsZ29saWEtc2VhcmNoLWlucHV0e2JhY2tncm91bmQ6IzFBMUEyQSAhaW1wb3J0YW50fS5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuZHMtZHJvcGRvd24tbWVudXt3aWR0aDo3NHZ3O21heC13aWR0aDo4MDBweDtiYWNrZ3JvdW5kOiMxQTFBMkE7YmFja2dyb3VuZC1jb2xvcjojMUExQTJBO2JvcmRlcjpub25lO2JveC1zaGFkb3c6MnB4IDJweCAxMHB4IHJnYmEoMTUsMTQsMjEsMC41KTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgMC4yc30uYWxnb2xpYS1hdXRvY29tcGxldGUgLmRzLWRyb3Bkb3duLW1lbnUgW2NsYXNzXj1kcy1kYXRhc2V0LV17Ym9yZGVyOm5vbmU7YmFja2dyb3VuZDojMUExQTJBO2JhY2tncm91bmQtY29sb3I6IzFBMUEyQX0uYWxnb2xpYS1hdXRvY29tcGxldGUgLmRzLWRyb3Bkb3duLW1lbnU6YmVmb3Jle2Rpc3BsYXk6bm9uZX0uYWxnb2xpYS1hdXRvY29tcGxldGUgLmRzLWRyb3Bkb3duLW1lbnUgLmRzLXN1Z2dlc3Rpb25ze3BhZGRpbmc6LjVyZW0gMnJlbSAycmVtfS5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbntiYWNrZ3JvdW5kOiMxQTFBMkF9LmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1jYXRlZ29yeS1oZWFkZXJ7Y29sb3I6I2ZmZjtib3JkZXItY29sb3I6IzM4Mzg0Njt0ZXh0LWRlY29yYXRpb246bm9uZX0uYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLWNhdGVnb3J5LWhlYWRlci1sdmwwe2ZvbnQtc2l6ZToxLjVyZW07Zm9udC13ZWlnaHQ6Ym9sZCAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOjFyZW19LmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1zdWJjYXRlZ29yeS1jb2x1bW57Y29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjUpICFpbXBvcnRhbnR9LmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1zdWJjYXRlZ29yeS1jb2x1bW46YmVmb3Jle2JhY2tncm91bmQ6IzM4Mzg0Nn0uYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLXRpdGxle2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6I2ZmZn0uYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLXRleHR7Zm9udC1zaXplOjAuOHJlbTtjb2xvcjojRDREN0REfS5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0taGlnaGxpZ2h0e2NvbG9yOiMwMEEzRkZ9LmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1jb250ZW50OmJlZm9yZXtiYWNrZ3JvdW5kOiMzODM4NDZ9LmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb25fX21haW4gLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLWNhdGVnb3J5LWhlYWRlciwuYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24uYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbl9fc2Vjb25kYXJ5e3RleHQtZGVjb3JhdGlvbjpub25lfS5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uX19tYWluIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1jYXRlZ29yeS1oZWFkZXJ7cGFkZGluZy1ib3R0b206Ljc1cmVtO21hcmdpbi1ib3R0b206LjVyZW19LmFsZ29saWEtYXV0b2NvbXBsZXRlLmFsZ29saWEtYXV0b2NvbXBsZXRlLWxlZnQgLmRzLWRyb3Bkb3duLW1lbnV7bGVmdDoyNHZ3ICFpbXBvcnRhbnQ7dG9wOi0uNDVyZW0gIWltcG9ydGFudH0uZHMtc3VnZ2VzdGlvbjpub3QoOmZpcnN0LWNoaWxkKSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tY2F0ZWdvcnktaGVhZGVye21hcmdpbi10b3A6MS41cmVtfS5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbiAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0td3JhcHBlcntwYWRkaW5nOjB9LmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1zdWJjYXRlZ29yeS1jb2x1bW57ZGlzcGxheTpub25lfS5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbiAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tY29udGVudHttYXJnaW46MnB4IDA7cGFkZGluZzouNzVyZW07d2lkdGg6MTAwJTtmbG9hdDpub25lfS5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbiAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tY29udGVudDpiZWZvcmV7ZGlzcGxheTpub25lfS5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1jb250ZW50LmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLW5vLXJlc3VsdHN7dGV4dC1hbGlnbjpjZW50ZXJ9LmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uIC5zZWFyY2gtcHJvZHVjdC12ZXJzaW9ue2ZvbnQtc2l6ZTouOGVtO2ZvbnQtd2VpZ2h0OjUwMDtvcGFjaXR5Oi41O21hcmdpbi1sZWZ0Oi4zNXJlbX0uYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLXRpdGxlIC5zZWFyY2gtcHJvZHVjdC12ZXJzaW9ue2Rpc3BsYXk6bm9uZX0uc2VhcmNoLWFsbC1jb250ZW50e3BhZGRpbmc6MC41cmVtIDAuNzVyZW07Zm9udC1zaXplOjAuOHJlbTt0ZXh0LWFsaWduOnJpZ2h0fS5zZWFyY2gtYWxsLWNvbnRlbnQgYXtjb2xvcjojRDREN0REO29wYWNpdHk6LjY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5IC4yc30uc2VhcmNoLWFsbC1jb250ZW50IGE6aG92ZXJ7b3BhY2l0eToxfS5zZWFyY2gtbm8tcmVzdWx0c3twYWRkaW5nOjJyZW07dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjEuMXJlbTtjb2xvcjpyZ2JhKDIxMiwyMTUsMjIxLDAuNzUpO2ZvbnQtc3R5bGU6aXRhbGljfS5zZWFyY2gtbm8tcmVzdWx0cyBhe3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjouNXJlbSAuMjVyZW0gLjVyZW0gMDtwYWRkaW5nOjAuODVyZW0gMS41cmVtO2NvbG9yOiNmZmYgIWltcG9ydGFudDtib3JkZXItcmFkaXVzOjJweDtmb250LXNpemU6MS4xcmVtO2ZvbnQtd2VpZ2h0OjUwMDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZTt6LWluZGV4OjE7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICMwNjZGQzUsIzAwQTNGRil9LnNlYXJjaC1uby1yZXN1bHRzIGE6YWZ0ZXJ7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6YmxvY2s7dG9wOjA7cmlnaHQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlci1yYWRpdXM6MnB4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjMDBBM0ZGLCM2QkRGRkYpO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzO3otaW5kZXg6LTF9LnNlYXJjaC1uby1yZXN1bHRzIGE6aG92ZXJ7Y3Vyc29yOnBvaW50ZXJ9LnNlYXJjaC1uby1yZXN1bHRzIGE6aG92ZXI6YWZ0ZXJ7b3BhY2l0eToxfUBtZWRpYSAobWluLXdpZHRoOiA4MDFweCkgYW5kIChtYXgtd2lkdGg6IDEyMDBweCl7LmFsZ29saWEtYXV0b2NvbXBsZXRlIC5kcy1kcm9wZG93bi1tZW51e21heC13aWR0aDo3MHZ3fS5hbGdvbGlhLWF1dG9jb21wbGV0ZS5hbGdvbGlhLWF1dG9jb21wbGV0ZS1sZWZ0IC5kcy1kcm9wZG93bi1tZW51e2xlZnQ6MjguNXZ3ICFpbXBvcnRhbnQ7dG9wOi0uNDVyZW0gIWltcG9ydGFudH19QG1lZGlhIChtYXgtd2lkdGg6IDgwMHB4KXsuYWxnb2xpYS1hdXRvY29tcGxldGUgLmRzLWRyb3Bkb3duLW1lbnV7bWF4LXdpZHRoOjEwMHZ3O3dpZHRoOjEwMHZ3O21pbi13aWR0aDowfS5hbGdvbGlhLWF1dG9jb21wbGV0ZS5hbGdvbGlhLWF1dG9jb21wbGV0ZS1sZWZ0IC5kcy1kcm9wZG93bi1tZW51e2xlZnQ6LTFyZW0gIWltcG9ydGFudDt0b3A6MTEyJSAhaW1wb3J0YW50fX1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpey5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuZHMtZHJvcGRvd24tbWVudXt3aWR0aDoxMDB2d30uYWxnb2xpYS1hdXRvY29tcGxldGUgLmRzLWRyb3Bkb3duLW1lbnUgLmRzLXN1Z2dlc3Rpb25ze3BhZGRpbmc6LjVyZW19fS5jYXJkc3tkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OnZpc2libGU7Ym9yZGVyLXJhZGl1czoycHggMCAwIDJweDttaW4taGVpZ2h0OjcwMHB4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjMTMwMDJELCM4RTFGQzMpfS5jYXJkcyBhe3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOmluaGVyaXR9LmNhcmRzICNsYW5kaW5nLWhpdmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3otaW5kZXg6MH0uY2FyZHMgI2xhbmRpbmctaGl2ZSBwYXRoLC5jYXJkcyAjbGFuZGluZy1oaXZlIGVsbGlwc2V7ZmlsbDpyZ2JhKDE0NywxNDgsMjU1LDAuMjUpfS5jYXJkcyAubWFpbnt3aWR0aDo2NiU7cGFkZGluZzo1cmVtIDJ2dyA1cmVtIDQuNXZ3O2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47dGV4dC1hbGlnbjpjZW50ZXI7ei1pbmRleDoxfS5jYXJkcyAuZ3JvdXB7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO3dpZHRoOjM0JTtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LmNhcmRzIC5jYXJkLnNte2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmNlbnRlcjt0ZXh0LWFsaWduOmxlZnQ7d2lkdGg6OTAlO3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbi1ib3R0b206MXB4O3BhZGRpbmc6MCAzLjV2dyAwIDN2dzttaW4taGVpZ2h0OjE0MHB4O2JhY2tncm91bmQ6cmdiYSgyNCwyNCwzMiwwLjQpO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuNHMsIHdpZHRoIC4yc30uY2FyZHMgLmNhcmQuc206bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LmNhcmRzIC5jYXJkLnNtOmhvdmVye2JhY2tncm91bmQ6IzAwQTNGRjt3aWR0aDoxMDAlfS5jYXJkcyAuY2FyZC5zbTpob3ZlciBoM3tmb250LXdlaWdodDo1MDA7Zm9udC1zaXplOjEuMnJlbX0uY2FyZHMgLmNhcmQuc206aG92ZXIgcHtvcGFjaXR5OjE7bWF4LWhlaWdodDozLjc1cmVtfS5jYXJkcyAuY2FyZC5zbSBoM3tmb250LXNpemU6MS4xcmVtO3RyYW5zaXRpb246YWxsIC4yczttYXJnaW46MH0uY2FyZHMgLmNhcmQuc20gcHttYXJnaW46LjVyZW0gMCAwO21heC1oZWlnaHQ6MDt3aWR0aDo4MCU7Y29sb3I6I2ZmZjtmb250LXNpemU6Ljk1cmVtO2xpbmUtaGVpZ2h0OjEuMjVyZW07b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuMnMgLjFzLCBtYXgtaGVpZ2h0IC4yc30uY2FyZHMgLmNhcmQgaDEsLmNhcmRzIC5jYXJkIGgyLC5jYXJkcyAuY2FyZCBoMywuY2FyZHMgLmNhcmQgaDR7Zm9udC13ZWlnaHQ6MzAwO2NvbG9yOiNmZmZ9LmNhcmRzIC5jYXJkIGgxe21hcmdpbjowIDAgMS4yNXJlbTtmb250LXNpemU6Mi41cmVtO3otaW5kZXg6MX0uY2FyZHMgLmNhcmQjZ2V0LXN0YXJ0ZWQgLmF2b2lkLXdyYXB7ZGlzcGxheTppbmxpbmUtYmxvY2t9LmNhcmRzIC5jYXJkI2dldC1zdGFydGVkIC5idG57cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztwYWRkaW5nOjEuMjVyZW0gNHJlbTtjb2xvcjojZmZmO2ZvbnQtc2l6ZToxLjJyZW07Zm9udC13ZWlnaHQ6NTAwO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjMDY2RkM1LCMwMEEzRkYpO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMnMsIGNvbG9yIC4ycztib3JkZXItcmFkaXVzOjJweDt6LWluZGV4OjF9LmNhcmRzIC5jYXJkI2dldC1zdGFydGVkIC5idG46YmVmb3Jle2NvbnRlbnQ6XCJcIjtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO3RvcDowO3JpZ2h0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXItcmFkaXVzOjJweDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg0NWRlZywgIzAwQTNGRiwjNkJERkZGKTtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IC4yczt6LWluZGV4Oi0xfS5jYXJkcyAuY2FyZCNnZXQtc3RhcnRlZCAuYnRuOmhvdmVyOmJlZm9yZXtvcGFjaXR5OjF9LmNhcmRzIC5jYXJkI2dldC1zdGFydGVkIC5iZXRhOmFmdGVye2NvbnRlbnQ6J2JldGEnO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtmb250LXN0eWxlOml0YWxpYztmb250LXNpemU6LjQ1ZW07bWFyZ2luOi04cHggMCAwIC41ZW07cGFkZGluZzouMXJlbSAuNnJlbSAuMTJyZW07Ym9yZGVyLXJhZGl1czoxcmVtO2JvcmRlcjowLjE1cmVtIHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC41KTt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciAuMnN9QG1lZGlhIChtYXgtd2lkdGg6IDEyODBweCl7LmNhcmRzIC5jYXJkLmZ1bGx7cGFkZGluZzozLjVyZW19LmNhcmRzIC5jYXJkLnF1YXJ0ZXJ7d2lkdGg6NDglfX1AbWVkaWEgKG1heC13aWR0aDogMTE1MHB4KXsuY2FyZHN7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5jYXJkcyAubWFpbnt3aWR0aDoxMDAlfS5jYXJkcyAuZ3JvdXB7d2lkdGg6MTAwJX0uY2FyZHMgLmdyb3VwIC5jYXJkLnNte21hcmdpbi1yaWdodDoxcHg7cGFkZGluZzoycmVtO2ZsZXgtZ3JvdzoyO3dpZHRoOjQ5JTt0ZXh0LWFsaWduOmNlbnRlcn0uY2FyZHMgLmdyb3VwIC5jYXJkLnNtIGgze21hcmdpbjowIDAgLjVyZW07Zm9udC1zaXplOjEuMXJlbTtmb250LXdlaWdodDo1MDB9LmNhcmRzIC5ncm91cCAuY2FyZC5zbSBwe29wYWNpdHk6LjY7cG9zaXRpb246cmVsYXRpdmU7bWF4LWhlaWdodDpmaXQtY29udGVudDt3aWR0aDphdXRvO21hcmdpbjowfS5jYXJkcyAuZ3JvdXAgLmNhcmQuc206aG92ZXJ7YmFja2dyb3VuZDojMDBBM0ZGfS5jYXJkcyAuZ3JvdXAgLmNhcmQuc206aG92ZXIgaDN7dHJhbnNmb3JtOm5vbmV9LmNhcmRzIC5ncm91cCAuY2FyZC5zbTpob3ZlciBwe29wYWNpdHk6MTttYXgtaGVpZ2h0OmZpdC1jb250ZW50fX1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpey5jYXJkcyAuZ3JvdXB7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5jYXJkcyAuZ3JvdXAgLmNhcmQuc217d2lkdGg6MTAwJTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOjEuMjVyZW19LmNhcmRzIC5jYXJkIGgxe2ZvbnQtc2l6ZToycmVtfS5jYXJkcyAuY2FyZC5tYWlue3BhZGRpbmc6Mi41cmVtfS5jYXJkcyAuY2FyZC5tYWluI2dldC1zdGFydGVkIC5idG57Zm9udC1zaXplOjFyZW07bWFyZ2luOjAgMCAuMzVyZW19fS5jdXJyZW50LXRpbWVzdGFtcCwuY3VycmVudC1kYXRlLC5jdXJyZW50LXRpbWUsLmVudGVycHJpc2UtZW9sLWRhdGV7Y29sb3I6I0Q0RDdERDtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LWZhbWlseTpcIlByb3hpbWEgTm92YVwiLHNhbnMtc2VyaWY7d2hpdGUtc3BhY2U6bm93cmFwfS5ub3dyYXB7d2hpdGUtc3BhY2U6bm93cmFwfS5lcnJvci1wYWdle3BhZGRpbmc6MXJlbTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYXJvdW5kfS5lcnJvci1wYWdlIC5lcnJvci1jb250ZW50e21hcmdpbi10b3A6MTB2aDttYXgtd2lkdGg6MzgwcHh9LmVycm9yLXBhZ2UgLmVycm9yLWNvZGV7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYXJvdW5kO21hcmdpbjowIGF1dG87d2lkdGg6MTVyZW07aGVpZ2h0OjE1cmVtO21heC13aWR0aDo4MHZ3O21heC1oZWlnaHQ6ODB2dztib3JkZXItcmFkaXVzOjUwJTtib3gtc2hhZG93OjVweCA1cHggMzBweCByZ2JhKDE1LDE0LDIxLDAuNSl9LmVycm9yLXBhZ2UgLmVycm9yLWNvZGUgLmVycm9yLWNvZGUtYm9yZGVye2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZDtib3JkZXI6MnB4IHNvbGlkIHJnYmEoMCwxNjMsMjU1LDAuNSk7d2lkdGg6OTAlO2hlaWdodDo5MCU7Ym9yZGVyLXJhZGl1czo1MCV9LmVycm9yLXBhZ2UgLmVycm9yLWNvZGUgaDF7Y29sb3I6IzAwQTNGRjtmb250LXNpemU6NXJlbTtmb250LXdlaWdodDozMDA7dGV4dC1hbGlnbjpjZW50ZXJ9LmVycm9yLXBhZ2UgYXtjb2xvcjojMDBBM0ZGO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGR9LmVycm9yLXBhZ2UgYTpob3Zlcntjb2xvcjojZmZmfS5lcnJvci1wYWdlIC53YXlmaW5kaW5ne2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYXJvdW5kO2FsaWduLWNvbnRlbnQ6Y2VudGVyO21hcmdpbjoycmVtIDAgMS41cmVtfS5lcnJvci1wYWdlIC53YXlmaW5kaW5nIC5idG57ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtZ3JvdzoxO21hcmdpbi1yaWdodDo0cHg7cGFkZGluZzouNzVyZW0gMXJlbTtib3JkZXItcmFkaXVzOjJweDt0ZXh0LWFsaWduOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtjb2xvcjojZmZmO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMnM7ei1pbmRleDoxO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjMDY2RkM1LCMwMEEzRkYpfS5lcnJvci1wYWdlIC53YXlmaW5kaW5nIC5idG4uYmFjazpiZWZvcmV7Y29udGVudDpcIlxcZTkwYVwiO2ZvbnQtZmFtaWx5OlwiaWNvbW9vbi12MlwiO21hcmdpbi1yaWdodDouMzVyZW07dmVydGljYWwtYWxpZ246dGV4dC10b3B9LmVycm9yLXBhZ2UgLndheWZpbmRpbmcgLmJ0bjphZnRlcntjb250ZW50OlwiXCI7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jazt0b3A6MDtyaWdodDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyLXJhZGl1czoycHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICMwMEEzRkYsIzZCREZGRik7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuMnM7ei1pbmRleDotMX0uZXJyb3ItcGFnZSAud2F5ZmluZGluZyAuYnRuOmhvdmVye2N1cnNvcjpwb2ludGVyfS5lcnJvci1wYWdlIC53YXlmaW5kaW5nIC5idG46aG92ZXI6YWZ0ZXJ7b3BhY2l0eToxfS5lcnJvci1wYWdlIHB7Y29sb3I6I0Q0RDdERDtsaW5lLWhlaWdodDoxLjVyZW19LmZvb3Rlci13aWRnZXRze3Bvc2l0aW9uOmZpeGVkO2JvdHRvbToxcmVtO3JpZ2h0OjFyZW07d2lkdGg6YXV0bztoZWlnaHQ6YXV0bztkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2p1c3RpZnktY29udGVudDpmbGV4LWVuZDthbGlnbi1pdGVtczpmbGV4LWVuZDt6LWluZGV4OjEwMH0uZm9vdGVyLXdpZGdldHMgLndpZGdldHtoZWlnaHQ6NTBweDt3aWR0aDo1MHB4O2JvcmRlci1yYWRpdXM6NnB4O3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaGFkb3c6MnB4IDJweCA2cHggcmdiYSgxNSwxNCwyMSwwLjUpO2NvbG9yOiNmZmZ9LmZvb3Rlci13aWRnZXRzIC53aWRnZXQ6bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tYm90dG9tOjVweH0uZm9vdGVyLXdpZGdldHMgLndpZGdldDpiZWZvcmV7Y29udGVudDphdHRyKGRhdGEtdG9vbHRpcCk7cGFkZGluZzouMjVyZW0gLjVyZW07ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxMXB4O3JpZ2h0OjYwcHg7d2lkdGg6YXV0bzt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udC1zaXplOi45cmVtO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyLXJhZGl1czo2cHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMjcwZGVnLCAjZDMwOTcxLCM5YjJhZmYpO3BvaW50ZXItZXZlbnRzOm5vbmU7ei1pbmRleDotMTtvcGFjaXR5OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTVweCk7dHJhbnNpdGlvbjpvcGFjaXR5IC4ycywgdHJhbnNmb3JtIC4yc30uZm9vdGVyLXdpZGdldHMgLndpZGdldDphZnRlcntjb250ZW50OlwiXCI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjE0cHg7cmlnaHQ6NTZweDt3aWR0aDowcHg7aGVpZ2h0OjBweDtvcGFjaXR5OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTVweCk7dHJhbnNpdGlvbjpvcGFjaXR5IC4ycywgdHJhbnNmb3JtIC4yc30uZm9vdGVyLXdpZGdldHMgLndpZGdldDpob3ZlcntjdXJzb3I6cG9pbnRlcn0uZm9vdGVyLXdpZGdldHMgLndpZGdldDpob3ZlcjpiZWZvcmUsLmZvb3Rlci13aWRnZXRzIC53aWRnZXQ6aG92ZXI6YWZ0ZXJ7b3BhY2l0eToxO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfS5mb290ZXItd2lkZ2V0cyAud2lkZ2V0Lm1hZ2VudGF7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoOTBkZWcsICNkMzA5NzEsIzliMmFmZil9LmZvb3Rlci13aWRnZXRzIC53aWRnZXQubWFnZW50YTpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMjcwZGVnLCAjZDMwOTcxLCM5YjJhZmYpfS5mb290ZXItd2lkZ2V0cyAud2lkZ2V0Lm1hZ2VudGE6YWZ0ZXJ7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDoxMHB4IDAgMTBweCA1cHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICNkMzA5NzF9LmZvb3Rlci13aWRnZXRzIC53aWRnZXQuYmx1ZXtjb2xvcjpyZ2JhKDIsMTAsNzEsMC43KTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgyNzBkZWcsICMwMEEzRkYsIzVlZTRlNCl9LmZvb3Rlci13aWRnZXRzIC53aWRnZXQuYmx1ZTpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoOTBkZWcsICMwMEEzRkYsIzVlZTRlNCl9LmZvb3Rlci13aWRnZXRzIC53aWRnZXQuYmx1ZTphZnRlcntib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjEwcHggMCAxMHB4IDVweDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgIzVlZTRlNH0uY3VzdG9tLXRpbWUtdHJpZ2dlciBhe2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2ZvbnQtc2l6ZToxLjJyZW07Y29sb3I6cmdiYSgyLDEwLDcxLDAuOCk7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LmFzay1haS10cmlnZ2VyIC5hc2stYWktb3Blbnt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3RleHQtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Zm9udC1zaXplOi44cmVtO2ZvbnQtd2VpZ2h0OmJvbGR9LmFzay1haS10cmlnZ2VyIC5hc2stYWktb3BlbiAuaWNvbi1pbmZsdXgtbG9nb3ttYXJnaW4tYm90dG9tOi4xNXJlbTtmb250LXNpemU6MXJlbX0uYXNrLWFpLXRyaWdnZXIgLmFzay1haS1vcGVuOmhvdmVye2N1cnNvcjpwb2ludGVyfUBrZXlmcmFtZXMgZmFkZUluQW5pbWF0aW9uezAle29wYWNpdHk6MH0xMDAle29wYWNpdHk6MX19QG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KXsuZm9vdGVyLXdpZGdldHN7Ym90dG9tOi43NXJlbTtyaWdodDouNzVyZW19fS5tb2RhbHtkaXNwbGF5Om5vbmU7cGFkZGluZzoxcmVtO3Bvc2l0aW9uOmZpeGVkO3RvcDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ei1pbmRleDoxMDF9Lm1vZGFsIC5tb2RhbC1vdmVybGF5e3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjQkUyRUU0LCMwMEEzRkYpO29wYWNpdHk6Ljg1fS5tb2RhbCAubW9kYWwtd3JhcHBlcntkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5tb2RhbCAubW9kYWwtYm9keXtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7b3ZlcmZsb3cteTphdXRvO292ZXJmbG93LXg6aGlkZGVuO21heC13aWR0aDo2NTBweDttYXgtaGVpZ2h0Ojk3LjV2aDttYXJnaW4tdG9wOjEwdmg7cGFkZGluZzouNzVyZW0gMnJlbSAxLjVyZW07Ym9yZGVyLXJhZGl1czozcHg7YmFja2dyb3VuZDojMTQxNDFGO2NvbG9yOiNENEQ3REQ7Zm9udC1zaXplOjFyZW07dHJhbnNpdGlvbjptYXJnaW4gLjRzO3Njcm9sbC1iZWhhdmlvcjpzbW9vdGg7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9Lm1vZGFsIC5tb2RhbC1ib2R5Ojotd2Via2l0LXNjcm9sbGJhcnt3aWR0aDo4cHh9Lm1vZGFsIC5tb2RhbC1ib2R5Ojotd2Via2l0LXNjcm9sbGJhci10cmFja3tiYWNrZ3JvdW5kOnJnYmEoNTYsNTYsNzAsMC4yKTtib3JkZXItcmFkaXVzOjRweH0ubW9kYWwgLm1vZGFsLWJvZHk6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JhY2tncm91bmQ6cmdiYSgyMTIsMjE1LDIyMSwwLjMpO2JvcmRlci1yYWRpdXM6NHB4fS5tb2RhbCAubW9kYWwtYm9keTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDIxMiwyMTUsMjIxLDAuNSl9Lm1vZGFsLm9wZW4gLm1vZGFsLWJvZHl7bWFyZ2luLXRvcDowfS5tb2RhbCAjbW9kYWwtY2xvc2V7cG9zaXRpb246YWJzb2x1dGU7cGFkZGluZzouMjVyZW07dG9wOjFyZW07cmlnaHQ6MXJlbTtjb2xvcjpyZ2JhKDIxMiwyMTUsMjIxLDAuNSk7dHJhbnNpdGlvbjpjb2xvciAuMnM7dGV4dC1kZWNvcmF0aW9uOm5vbmV9Lm1vZGFsICNtb2RhbC1jbG9zZTpob3Zlcntjb2xvcjojRDREN0REfS5tb2RhbCAubW9kYWwtY29udGVudHtkaXNwbGF5Om5vbmU7b3ZlcmZsb3c6dmlzaWJsZTt3aWR0aDo1ODZweDttYXgtd2lkdGg6MTAwJTtmbGV4LXNocmluazowfS5tb2RhbCAubW9kYWwtY29udGVudCBoM3tjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjUwMDtmb250LXNpemU6MS40cmVtO21hcmdpbi1ib3R0b206MXJlbX0ubW9kYWwgLm1vZGFsLWNvbnRlbnQgaDR7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo1MDA7bWFyZ2luOjFyZW0gMCAwLjVyZW0gMnB4fS5tb2RhbCAubW9kYWwtY29udGVudCBoNXttYXJnaW46LjVyZW0gMCAwO2NvbG9yOiNGQUZBRkN9Lm1vZGFsIC5tb2RhbC1jb250ZW50IHAsLm1vZGFsIC5tb2RhbC1jb250ZW50IGxpe21hcmdpbjouMjVyZW0gMDtsaW5lLWhlaWdodDoxLjVyZW19Lm1vZGFsIC5tb2RhbC1jb250ZW50IHAgc3Ryb25nLC5tb2RhbCAubW9kYWwtY29udGVudCBsaSBzdHJvbmd7Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOiNGQUZBRkN9Lm1vZGFsIC5tb2RhbC1jb250ZW50IHAubm90ZSwubW9kYWwgLm1vZGFsLWNvbnRlbnQgbGkubm90ZXtwYWRkaW5nLXRvcDoxLjI1cmVtO21hcmdpbi10b3A6MS41cmVtO2NvbG9yOnJnYmEoMjEyLDIxNSwyMjEsMC41KTtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDIxMiwyMTUsMjIxLDAuMjUpO2ZvbnQtc2l6ZTouOXJlbTtmb250LXN0eWxlOml0YWxpY30ubW9kYWwgLm1vZGFsLWNvbnRlbnQgYXtjb2xvcjojMDBBM0ZGO2ZvbnQtd2VpZ2h0OjUwMDt0ZXh0LWRlY29yYXRpb246bm9uZTt0cmFuc2l0aW9uOmNvbG9yIC4yc30ubW9kYWwgLm1vZGFsLWNvbnRlbnQgYTpob3Zlcntjb2xvcjojZmZmfS5tb2RhbCAucHJvZHVjdHN7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LXdyYXA6d3JhcDtmbGV4LWdyb3c6MTtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0ubW9kYWwgLnByb2R1Y3QgLnByb3ZpZGVyc3tkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7cGFkZGluZzouNXJlbSAxcmVtO2JhY2tncm91bmQ6cmdiYSgyMTIsMjE1LDIyMSwwLjA1KTtib3JkZXItcmFkaXVzOjJweH0ubW9kYWwgLnByb2R1Y3QgLnByb3ZpZGVycyAucHJvdmlkZXJ7ZmxleC1ncm93OjF9Lm1vZGFsIC5wcm9kdWN0IC5wcm92aWRlcnMgLnByb3ZpZGVyOm5vdCg6bGFzdC1jaGlsZCl7bWFyZ2luLXJpZ2h0OjFyZW19Lm1vZGFsIC5wcm9kdWN0IC5wcm92aWRlcnMgdWx7bWFyZ2luOi41cmVtIC41cmVtIC41cmVtIDA7cGFkZGluZzowO2xpc3Qtc3R5bGU6bm9uZX0ubW9kYWwgLnByb2R1Y3QgLnByb3ZpZGVycyB1bC5jbHVzdGVyc3twYWRkaW5nLWxlZnQ6MS43NXJlbX0ubW9kYWwgLnByb2R1Y3QgLnByb3ZpZGVycyBwLnJlZ2lvbiAuZmFrZS1yYWRpb3twb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MS4xNWVtO3dpZHRoOjEuMTVlbTttYXJnaW46MCAwLjNyZW0gMCAwLjFyZW07Ym9yZGVyLXJhZGl1czoycHg7Ym9yZGVyOjEuNXB4IHNvbGlkIHRyYW5zcGFyZW50O2JhY2tncm91bmQ6cmdiYSgyMTIsMjE1LDIyMSwwLjA1KTtib3JkZXI6MS41cHggc29saWQgcmdiYSgyMTIsMjE1LDIyMSwwLjIpO3ZlcnRpY2FsLWFsaWduOnRleHQtdG9wO2N1cnNvcjpwb2ludGVyfS5tb2RhbCAucHJvZHVjdCAucHJvdmlkZXJzIHAucmVnaW9uIC5mYWtlLXJhZGlvOmFmdGVye2NvbnRlbnQ6XCJcIjtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO2hlaWdodDouNXJlbTt3aWR0aDouNXJlbTt0b3A6LjIzcmVtO2xlZnQ6LjIzcmVtO2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6cmdiYSgyMTIsMjE1LDIyMSwwLjMpO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzfS5tb2RhbCAucHJvZHVjdCAucHJvdmlkZXJzIHAucmVnaW9uIC5mYWtlLXJhZGlvLmNoZWNrZWQ6YWZ0ZXJ7b3BhY2l0eToxfS5tb2RhbCBsaS5jdXN0b217ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0ubW9kYWwgI2N1c3RvbS11cmx7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJTtwYWRkaW5nLWxlZnQ6LjVyZW07cG9zaXRpb246cmVsYXRpdmV9Lm1vZGFsICNjdXN0b20tdXJsOmFmdGVye2Rpc3BsYXk6bm9uZTtjb250ZW50OmF0dHIoZGF0YS1tZXNzYWdlKTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTEuOHJlbTtyaWdodDowO2ZvbnQtc2l6ZTouODVyZW07Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOiNEQzRFNTh9Lm1vZGFsICNjdXN0b20tdXJsLmVycm9yOmFmdGVye2Rpc3BsYXk6YmxvY2t9Lm1vZGFsICNjdXN0b20tdXJsLmVycm9yIGlucHV0I2N1c3RvbS11cmwtZmllbGQsLm1vZGFsICNjdXN0b20tdXJsLmVycm9yIGlucHV0I2RlZGljYXRlZC11cmwtZmllbGQsLm1vZGFsICNjdXN0b20tdXJsLmVycm9yIGlucHV0I2NsdXN0ZXJlZC11cmwtZmllbGR7Ym9yZGVyLWNvbG9yOiNEQzRFNTh9Lm1vZGFsICNjdXN0b20tdXJsLmVycm9yIGlucHV0I2N1c3RvbS11cmwtZmllbGQ6Zm9jdXMsLm1vZGFsICNjdXN0b20tdXJsLmVycm9yIGlucHV0I2RlZGljYXRlZC11cmwtZmllbGQ6Zm9jdXMsLm1vZGFsICNjdXN0b20tdXJsLmVycm9yIGlucHV0I2NsdXN0ZXJlZC11cmwtZmllbGQ6Zm9jdXN7Ym9yZGVyLWNvbG9yOiNEQzRFNTg7Ym94LXNoYWRvdzoxcHggMXB4IDEwcHggcmdiYSgyMjAsNzgsODgsMC41KX0ubW9kYWwgI2N1c3RvbS11cmwgaW5wdXQjY3VzdG9tLXVybC1maWVsZCwubW9kYWwgI2N1c3RvbS11cmwgaW5wdXQjZGVkaWNhdGVkLXVybC1maWVsZCwubW9kYWwgI2N1c3RvbS11cmwgaW5wdXQjY2x1c3RlcmVkLXVybC1maWVsZHtmb250LWZhbWlseTpcIlByb3hpbWEgTm92YVwiLHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NTAwO2JhY2tncm91bmQ6IzE4MTgyMDtib3JkZXItcmFkaXVzOjJweDtib3JkZXI6MXB4IHNvbGlkICMxQTFBMkE7cGFkZGluZzouNWVtO3dpZHRoOjEwMCU7Y29sb3I6I2ZmZjt0cmFuc2l0aW9uLXByb3BlcnR5OmJvcmRlciwgYm94LXNoYWRvdzt0cmFuc2l0aW9uLWR1cmF0aW9uOi4ycztib3gtc2hhZG93OjJweCAycHggNnB4IHJnYmEoMTUsMTQsMjEsMC41KX0ubW9kYWwgI2N1c3RvbS11cmwgaW5wdXQjY3VzdG9tLXVybC1maWVsZDpmb2N1cywubW9kYWwgI2N1c3RvbS11cmwgaW5wdXQjZGVkaWNhdGVkLXVybC1maWVsZDpmb2N1cywubW9kYWwgI2N1c3RvbS11cmwgaW5wdXQjY2x1c3RlcmVkLXVybC1maWVsZDpmb2N1c3tvdXRsaW5lOm5vbmU7Ym9yZGVyLWNvbG9yOiMwMEEzRkY7Ym94LXNoYWRvdzoxcHggMXB4IDEwcHggcmdiYSgwLDE2MywyNTUsMC41KTtib3JkZXItcmFkaXVzOjJweH0ubW9kYWwgI2N1c3RvbS11cmwgaW5wdXQjY3VzdG9tLXVybC1maWVsZDo6cGxhY2Vob2xkZXIsLm1vZGFsICNjdXN0b20tdXJsIGlucHV0I2RlZGljYXRlZC11cmwtZmllbGQ6OnBsYWNlaG9sZGVyLC5tb2RhbCAjY3VzdG9tLXVybCBpbnB1dCNjbHVzdGVyZWQtdXJsLWZpZWxkOjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuNDUpO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOml0YWxpY30ubW9kYWwgI2RlZGljYXRlZC11cmxzIC5wcm92aWRlcnMsLm1vZGFsICNjbHVzdGVyZWQtdXJscyAucHJvdmlkZXJze3BhZGRpbmctYm90dG9tOjFyZW19Lm1vZGFsICNkZWRpY2F0ZWQtdXJscyAjY3VzdG9tLXVybCwubW9kYWwgI2NsdXN0ZXJlZC11cmxzICNjdXN0b20tdXJse21hcmdpbi10b3A6LjVyZW07cGFkZGluZzowfS5tb2RhbCAucmFkaW97cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjEuMTVlbTt3aWR0aDoxLjE1ZW07YmFja2dyb3VuZDpyZ2JhKDIxMiwyMTUsMjIxLDAuMDUpO21hcmdpbjowIC4zcmVtIDAgLjFyZW07dmVydGljYWwtYWxpZ246dGV4dC10b3A7Ym9yZGVyLXJhZGl1czoycHg7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjEuNXB4IHNvbGlkIHJnYmEoMjEyLDIxNSwyMjEsMC4yKTt1c2VyLXNlbGVjdDpub25lfS5tb2RhbCBpbnB1dFt0eXBlPSdyYWRpbydde21hcmdpbi1yaWdodDotMS4xcmVtO3BhZGRpbmc6MDt2ZXJ0aWNhbC1hbGlnbjp0b3A7b3BhY2l0eTowO2N1cnNvcjpwb2ludGVyfS5tb2RhbCBpbnB1dFt0eXBlPSdyYWRpbyddKy5yYWRpbzphZnRlcntjb250ZW50OlwiXCI7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6LjVyZW07d2lkdGg6LjVyZW07Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDojMDBBM0ZGO3RvcDo1MCU7bGVmdDo1MCU7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSgyKSB0cmFuc2xhdGUoLTIwJSwgLTIwJSk7dHJhbnNpdGlvbjphbGwgLjJzfS5tb2RhbCBpbnB1dFt0eXBlPSdyYWRpbyddOmNoZWNrZWQrLnJhZGlvOmFmdGVye29wYWNpdHk6MTt0cmFuc2Zvcm06c2NhbGUoMSkgdHJhbnNsYXRlKC01MCUsIC01MCUpfS5tb2RhbCB0ZDphZnRlciwubW9kYWwgbGFiZWw6YWZ0ZXIsLm1vZGFsIGxpOmFmdGVye2Rpc3BsYXk6aW5saW5lO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtmb250LXN0eWxlOml0YWxpYztmb250LXdlaWdodDo1MDA7Zm9udC1zaXplOi43NWVtO21hcmdpbi1sZWZ0Oi4zNXJlbTtwYWRkaW5nOi4xcmVtIC4zcmVtIC4xMnJlbSAuMzJyZW07bGluZS1oZWlnaHQ6Ljc1cmVtO2JvcmRlci1yYWRpdXM6MXJlbX0ubW9kYWwgdGQuYmV0YTphZnRlciwubW9kYWwgbGFiZWwuYmV0YTphZnRlciwubW9kYWwgbGkuYmV0YTphZnRlcntjb250ZW50OlwiYmV0YVwiO2NvbG9yOiNmZmY7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICMwNjZGQzUsIzAwQTNGRil9Lm1vZGFsIGxhYmVsOmFmdGVye21hcmdpbi1sZWZ0Oi4xNXJlbX0ubW9kYWwgI3ByZWYtdGFic3twYWRkaW5nOjA7bWFyZ2luOjAgMCAtNXB4O2xpc3Qtc3R5bGU6bm9uZTtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyfS5tb2RhbCAucHJlZi10YWJ7cGFkZGluZzouNzVyZW0gMS4yNXJlbTttYXJnaW4tcmlnaHQ6NXB4O3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OmJvbGQ7d2lkdGg6NDklO2NvbG9yOnJnYmEoMjEyLDIxNSwyMjEsMC43KTtiYWNrZ3JvdW5kOnJnYmEoMjEyLDIxNSwyMjEsMC4wNSk7Ym9yZGVyLXJhZGl1czoycHg7Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpjb2xvciAuMnN9Lm1vZGFsIC5wcmVmLXRhYjpsYXN0LWNoaWxke21hcmdpbi1yaWdodDowfS5tb2RhbCAucHJlZi10YWI6aG92ZXJ7Y29sb3I6IzAwQTNGRn0ubW9kYWwgLnByZWYtdGFiLmFjdGl2ZXtjb2xvcjojZmZmO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjMDY2RkM1LCMwMEEzRkYpfS5tb2RhbCAucHJlZi10YWIgc3Bhbi5lcGhlbWVyYWx7ZGlzcGxheTppbmxpbmV9Lm1vZGFsIC5wcmVmLXRhYiBzcGFuLmFiYnI6YWZ0ZXJ7ZGlzcGxheTpub25lO2NvbnRlbnQ6XCIuXCJ9Lm1vZGFsIC5wcm9kdWN0LmFjdGl2ZXtkaXNwbGF5OmJsb2NrfS5tb2RhbCAucHJvZHVjdC5pbmFjdGl2ZXtkaXNwbGF5Om5vbmV9QG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KXsubW9kYWwgLnByZWYtdGFiIHNwYW4uZXBoZW1lcmFse2Rpc3BsYXk6bm9uZX0ubW9kYWwgLnByZWYtdGFiIHNwYW4uYWJicjphZnRlcntkaXNwbGF5OmlubGluZX19Lm1vZGFsIC5mb3JtLWJ1dHRvbnN7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDplbmQ7bWFyZ2luLXRvcDoxcmVtfS5tb2RhbCB0ZXh0YXJlYXtyZXNpemU6dmVydGljYWw7Zm9udC1mYW1pbHk6XCJQcm94aW1hIE5vdmFcIixzYW5zLXNlcmlmO2ZvbnQtd2VpZ2h0OjUwMDtiYWNrZ3JvdW5kOiMxQTFBMkE7Ym9yZGVyLXJhZGl1czoycHg7Ym9yZGVyOjFweCBzb2xpZCAjMUExQTJBO21hcmdpbi10b3A6MXJlbTtwYWRkaW5nOi41ZW07d2lkdGg6MTAwJTtoZWlnaHQ6OHJlbTtjb2xvcjojZmZmO3RyYW5zaXRpb24tcHJvcGVydHk6Ym9yZGVyLCBib3gtc2hhZG93O3RyYW5zaXRpb24tZHVyYXRpb246LjJzO2JveC1zaGFkb3c6MnB4IDJweCA2cHggcmdiYSgxNSwxNCwyMSwwLjUpfS5tb2RhbCB0ZXh0YXJlYTpmb2N1c3tvdXRsaW5lOm5vbmU7Ym9yZGVyLWNvbG9yOiMwMEEzRkY7Ym94LXNoYWRvdzoxcHggMXB4IDEwcHggcmdiYSgwLDE2MywyNTUsMC41KTtib3JkZXItcmFkaXVzOjJweH0ubW9kYWwgdGV4dGFyZWE6OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMC40NSk7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6aXRhbGljfS5tb2RhbCBpbnB1dFt0eXBlPSdzdWJtaXQnXXtwYWRkaW5nOjAuNjVyZW0gMS4xcmVtO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjMDY2RkM1LCMwMEEzRkYpO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MnB4O2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6NTAwO29wYWNpdHk6MTt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzO3otaW5kZXg6MX0ubW9kYWwgaW5wdXRbdHlwZT0nc3VibWl0J106aG92ZXJ7b3BhY2l0eTowfS5tb2RhbCAuc3VibWl0LXdyYXBwZXJ7cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICMwMEEzRkYsIzZCREZGRik7Ym9yZGVyLXJhZGl1czoycHg7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo1MDB9Lm1vZGFsIC5zdWJtaXQtd3JhcHBlcjpiZWZvcmV7Y29udGVudDpcIlN1Ym1pdFwiO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO3BhZGRpbmc6MC42NXJlbSAxLjFyZW07ei1pbmRleDowfS5tb2RhbCAjbm8tdGhhbmtze21hcmdpbi1yaWdodDouNXJlbTtwYWRkaW5nOjAuNjVyZW0gMS4xcmVtO2JhY2tncm91bmQ6cmdiYSgyMTIsMjE1LDIyMSwwLjEpO2NvbG9yOnJnYmEoMjUwLDI1MCwyNTIsMC42NSk7Ym9yZGVyLXJhZGl1czoycHg7Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpjb2xvciAuMnN9Lm1vZGFsICNuby10aGFua3M6aG92ZXJ7Y29sb3I6I0ZBRkFGQ30ubW9kYWwgLmxpZmVjeWNsZS13cmFwcGVye3Bvc2l0aW9uOnJlbGF0aXZlfS5tb2RhbCAubG9hZGVyLXdyYXBwZXIsLm1vZGFsICN0aGFuay15b3V7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpub25lO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQtY29sb3I6IzE0MTQxRn0ubW9kYWwgLmxvYWRlci13cmFwcGVye3otaW5kZXg6NX0ubW9kYWwgLmxvYWRlci13cmFwcGVyIC5sb2FkZXJ7bWFyZ2luOjAgYXV0b30ubW9kYWwgI3RoYW5rLXlvdXt6LWluZGV4OjEwO2ZvbnQtc2l6ZToxLjJyZW07Zm9udC1zdHlsZTppdGFsaWM7Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOnJnYmEoMjEyLDIxNSwyMjEsMC42NSl9Lm1vZGFsICN0aGFuay15b3UgcHt0ZXh0LWFsaWduOmNlbnRlcn0ubW9kYWwgI2ZsdXgtaW5mbHV4ZGItdmVyc2lvbnN7bWF4LXdpZHRoOjM3NXB4fS5tb2RhbCAjZmx1eC1pbmZsdXhkYi12ZXJzaW9ucyAuZmxleC13cmFwcGVye2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OjEwMCV9Lm1vZGFsICNmbHV4LWluZmx1eGRiLXZlcnNpb25zIC5pbmZsdXhkYi12ZXJzaW9uc3ttYXJnaW4tdG9wOjEuNXJlbTtvdmVyZmxvdzpzY3JvbGx9Lm1vZGFsICNmbHV4LWluZmx1eGRiLXZlcnNpb25zIC52ZXJzaW9uLWxpc3R7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlfS5tb2RhbCAjZmx1eC1pbmZsdXhkYi12ZXJzaW9ucyAudmVyc2lvbi1yb3d7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7cGFkZGluZzouMTVyZW0gMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjMzgzODQ2fS5tb2RhbCAjZmx1eC1pbmZsdXhkYi12ZXJzaW9ucyAudmVyc2lvbi1yb3c6bGFzdC1jaGlsZHtib3JkZXItdG9wOjFweCBzb2xpZCAjMzgzODQ2fS5tb2RhbCAjZmx1eC1pbmZsdXhkYi12ZXJzaW9ucyAudmVyc2lvbi1yb3cgLnZlcnNpb24tY29sOmxhc3QtY2hpbGR7cGFkZGluZy1yaWdodDoxcmVtO3RleHQtYWxpZ246cmlnaHR9Lm1vZGFsICNmbHV4LWluZmx1eGRiLXZlcnNpb25zIGg0e21hcmdpbi10b3A6MS41cmVtfS5tb2RhbCAjZmx1eC1pbmZsdXhkYi12ZXJzaW9ucyBoNCwubW9kYWwgI2ZsdXgtaW5mbHV4ZGItdmVyc2lvbnMgc3Bhbi5tZWRpdW17Zm9udC1zaXplOjEuMTVyZW19Lm1vZGFsICNmbHV4LWluZmx1eGRiLXZlcnNpb25zIGgzIGNvZGV7YmFja2dyb3VuZDojMDcwNzBFO2ZvbnQtZmFtaWx5OlwiSUJNIFBsZXggTW9ub1wiLG1vbm9zcGFjZTtjb2xvcjojQjdCOEZGO3BhZGRpbmc6LjFyZW0gLjRyZW0gLjJyZW07Ym9yZGVyLXJhZGl1czoycHg7d2hpdGUtc3BhY2U6bm93cmFwO2ZvbnQtc2l6ZTouODVlbTtmb250LXN0eWxlOm5vcm1hbH0ubW9kYWwgI2ZsdXgtaW5mbHV4ZGItdmVyc2lvbnMgc3Bhbi5tZWRpdW17Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOiNmZmZ9Lm1vZGFsICNmbHV4LWluZmx1eGRiLXZlcnNpb25zIHNwYW4uZmx1eC12ZXJzaW9ue29wYWNpdHk6LjU7Zm9udC1zaXplOi45cmVtfS5tb2RhbCAjZmx1eC1pbmZsdXhkYi12ZXJzaW9ucyBzcGFuLmRlcHJlY2F0ZWQ6YmVmb3Jle2NvbnRlbnQ6J+KAoic7Y29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjUpO21hcmdpbi1yaWdodDouNHJlbX0ubW9kYWwgI2ZsdXgtaW5mbHV4ZGItdmVyc2lvbnMgc3Bhbi5jaGVja21hcmstbmV3e2ZvbnQtc2l6ZToxLjFyZW07Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojMzRCQjU1fS5tb2RhbCAjZmx1eC1pbmZsdXhkYi12ZXJzaW9ucyBzcGFuLmNoZWNrbWFyay1uZXcucGVuZGluZ3tjb2xvcjojMkFBM0ZGfS5tb2RhbCAjZmx1eC1pbmZsdXhkYi12ZXJzaW9ucyAuY29sb3Ita2V5e21hcmdpbi10b3A6MS41cmVtO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmV9Lm1vZGFsICNmbHV4LWluZmx1eGRiLXZlcnNpb25zIC5jb2xvci1rZXkgbGl7Zm9udC1zdHlsZTppdGFsaWM7Y29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjY1KX0ubW9kYWwgI2ZsdXgtaW5mbHV4ZGItdmVyc2lvbnMgLmNvbG9yLWtleSBsaSNkZXByZWNhdGVkLWtleSBzcGFue21hcmdpbi1sZWZ0Oi4yNXJlbX0ubW9kYWwgI2ZsdXgtaW5mbHV4ZGItdmVyc2lvbnMgLm1vcmUtaW5mb3ttYXJnaW4tdG9wOjEuNXJlbX0ubW9kYWwgI2ZsdXgtaW5mbHV4ZGItdmVyc2lvbnMgLm5vLXN1cHBvcnR7bWFyZ2luOjFyZW0gMXJlbSAzcmVtO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToxLjE1cmVtO2ZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOnJnYmEoMjEyLDIxNSwyMjEsMC42NSl9Lm1vZGFsICNpbmZsdXhkYi1ncy1kYXRlLXNlbGVjdHt3aWR0aDphdXRvO21heC13aWR0aDoyNjBweH0ubW9kYWwgI2luZmx1eGRiLWdzLWRhdGUtc2VsZWN0IHB7bWFyZ2luLWJvdHRvbToxLjVyZW19Lm1vZGFsICNpbmZsdXhkYi1ncy1kYXRlLXNlbGVjdCBhLmJ0bntwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MS4yNXJlbSAwIC41cmVtO3BhZGRpbmc6MC44NXJlbSAxLjVyZW07Y29sb3I6I2ZmZiAhaW1wb3J0YW50O2JvcmRlci1yYWRpdXM6MnB4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouMDZyZW07Zm9udC1zaXplOjFyZW07ZmxvYXQ6cmlnaHQ7ei1pbmRleDoxO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjMDY2RkM1LCMwMEEzRkYpfS5tb2RhbCAjaW5mbHV4ZGItZ3MtZGF0ZS1zZWxlY3QgYS5idG46YWZ0ZXJ7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6YmxvY2s7dG9wOjA7cmlnaHQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlci1yYWRpdXM6MnB4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjMDBBM0ZGLCM2QkRGRkYpO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzO3otaW5kZXg6LTF9Lm1vZGFsICNpbmZsdXhkYi1ncy1kYXRlLXNlbGVjdCBhLmJ0bjpob3ZlcntjdXJzb3I6cG9pbnRlcn0ubW9kYWwgI2luZmx1eGRiLWdzLWRhdGUtc2VsZWN0IGEuYnRuOmhvdmVyOmFmdGVye29wYWNpdHk6MX1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpey5tb2RhbHtwYWRkaW5nOi41cmVtO292ZXJmbG93OnNjcm9sbH0ubW9kYWwgLm1vZGFsLWJvZHl7cGFkZGluZzouNXJlbSAxLjVyZW0gMS41cmVtfX0ubG9hZGVyLC5sb2FkZXI6YWZ0ZXJ7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6MTBlbTtoZWlnaHQ6MTBlbX0ubG9hZGVye2ZvbnQtc2l6ZTozcHg7cG9zaXRpb246cmVsYXRpdmU7Ym9yZGVyLXRvcDoxLjFlbSBzb2xpZCByZ2JhKDIxMiwyMTUsMjIxLDAuMSk7Ym9yZGVyLXJpZ2h0OjEuMWVtIHNvbGlkIHJnYmEoMjEyLDIxNSwyMjEsMC4xKTtib3JkZXItYm90dG9tOjEuMWVtIHNvbGlkIHJnYmEoMjEyLDIxNSwyMjEsMC4xKTtib3JkZXItbGVmdDoxLjFlbSBzb2xpZCAjMkFBM0ZGO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApO2FuaW1hdGlvbjpsb2FkOCAuNnMgaW5maW5pdGUgbGluZWFyfUBrZXlmcmFtZXMgbG9hZDh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fS5mZWF0dXJlLWNhbGxvdXR7cGFkZGluZzouNXJlbSAuNXJlbSAuNXJlbSAuNzVyZW07YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICNGOTVGNTMsI0JFMkVFNCk7Ym9yZGVyLXJhZGl1czoycHg7Zm9udC1zaXplOi45NXJlbTtmb250LXN0eWxlOml0YWxpYztmb250LXdlaWdodDo1MDA7Y29sb3I6I2ZmZjtib3gtc2hhZG93OjJweCAycHggNnB4IHJnYmEoMzIsMzIsNDAsMC4zNSk7ei1pbmRleDoxMDA7dHJhbnNpdGlvbjptYXJnaW4gLjNzIGVhc2Utb3V0O2Rpc3BsYXk6bm9uZX0uZmVhdHVyZS1jYWxsb3V0IHB7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luOjB9LmZlYXR1cmUtY2FsbG91dCBwOmFmdGVye2NvbnRlbnQ6XCJcIjtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDowO2hlaWdodDowO2JvcmRlci1zdHlsZTpzb2xpZH0uZmVhdHVyZS1jYWxsb3V0IHA6aG92ZXJ7Y3Vyc29yOmRlZmF1bHR9LmZlYXR1cmUtY2FsbG91dCAubmV3e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbi1yaWdodDouMjVyZW07Zm9udC1zaXplOi44cmVtO3BhZGRpbmc6LjFyZW0gLjM1cmVtO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjI1KTtib3JkZXItcmFkaXVzOjFyZW19LmZlYXR1cmUtY2FsbG91dCAuY2xvc2V7bWFyZ2luLWxlZnQ6LjVyZW07Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwwLjUpO3RleHQtZGVjb3JhdGlvbjpub25lfS5mZWF0dXJlLWNhbGxvdXQgLmNsb3NlOmhvdmVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMC45KX0uZmVhdHVyZS1jYWxsb3V0ICNpbmZsdXhkYi11cmwtc2VsZWN0b3J7cG9zaXRpb246YWJzb2x1dGU7dG9wOjNyZW07cmlnaHQ6Ljc1cmVtfS5mZWF0dXJlLWNhbGxvdXQgI2luZmx1eGRiLXVybC1zZWxlY3RvciBwOmFmdGVye3RvcDotMXJlbTtyaWdodDoxLjg1cmVtO2JvcmRlci13aWR0aDowIDdweCA4cHggN3B4O2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjQ0IzOUM0IHRyYW5zcGFyZW50fS5mZWF0dXJlLWNhbGxvdXQgI2luZmx1eGRiLXVybC1zZWxlY3Rvci5zdGFydC1wb3NpdGlvbnttYXJnaW4tdG9wOjIuNXJlbX1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpey5mZWF0dXJlLWNhbGxvdXQjaW5mbHV4ZGItdXJsLXNlbGVjdG9ye3RvcDouNTVyZW07cmlnaHQ6NS4xNXJlbX0uZmVhdHVyZS1jYWxsb3V0I2luZmx1eGRiLXVybC1zZWxlY3RvciBwOmFmdGVye3RvcDouMTVyZW07cmlnaHQ6LTE2cHg7Ym9yZGVyLXdpZHRoOjdweCAwIDdweCA4cHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICNDMjMxRDl9LmZlYXR1cmUtY2FsbG91dCNpbmZsdXhkYi11cmwtc2VsZWN0b3Iuc3RhcnQtcG9zaXRpb257bWFyZ2luLXRvcDoyLjVyZW19fWJvZHkudjEgLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSxib2R5LnBsYXRmb3JtIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGV7cGFkZGluZzoxLjY1cmVtIDJyZW07bWFyZ2luOjFyZW0gMCAycmVtO2JvcmRlci13aWR0aDowIDAgMCA0cHg7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1yYWRpdXM6MCAycHggMnB4IDA7Ym9yZGVyLWNvbG9yOiMwMEEzRkY7YmFja2dyb3VuZDpyZ2JhKDAsMTYzLDI1NSwwLjEpfWJvZHkudjEgLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBwLGJvZHkudjEgLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBsaSxib2R5LnBsYXRmb3JtIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgcCxib2R5LnBsYXRmb3JtIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgbGl7Zm9udC1zaXplOi45NXJlbTtmb250LXN0eWxlOmluaGVyaXR9Ym9keS52MSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIHVsOmxhc3QtY2hpbGQsYm9keS52MSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIG9sOmxhc3QtY2hpbGQsYm9keS5wbGF0Zm9ybSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIHVsOmxhc3QtY2hpbGQsYm9keS5wbGF0Zm9ybSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIG9sOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbToxLjg1cmVtfWJvZHkudjEgLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBoMSxib2R5LnYxIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgaDIsYm9keS52MSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIGgzLGJvZHkudjEgLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBoNCxib2R5LnYxIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgaDUsYm9keS52MSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIGg2LGJvZHkucGxhdGZvcm0gLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBoMSxib2R5LnBsYXRmb3JtIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgaDIsYm9keS5wbGF0Zm9ybSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIGgzLGJvZHkucGxhdGZvcm0gLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBoNCxib2R5LnBsYXRmb3JtIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgaDUsYm9keS5wbGF0Zm9ybSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIGg2e2NvbG9yOiNmZmZ9Ym9keS52MSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIHAsYm9keS52MSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIGxpLGJvZHkucGxhdGZvcm0gLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBwLGJvZHkucGxhdGZvcm0gLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBsaXtjb2xvcjojQkVGMEZGfWJvZHkudjEgLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBzdHJvbmcsYm9keS5wbGF0Zm9ybSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIHN0cm9uZ3tjb2xvcjppbmhlcml0fWJvZHkudjEgLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBhLGJvZHkucGxhdGZvcm0gLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBhe2NvbG9yOiNmZmZ9Ym9keS52MSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIGEgY29kZTphZnRlcixib2R5LnBsYXRmb3JtIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgYSBjb2RlOmFmdGVye2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCByZ2JhKDAsMjAxLDI1NSwwLjM1KSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudH1ib2R5LnYxIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgYTpob3Zlcixib2R5LnBsYXRmb3JtIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgYTpob3Zlcntjb2xvcjojNkJERkZGfWJvZHkudjEgLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBhOmhvdmVyIGNvZGU6YWZ0ZXIsYm9keS5wbGF0Zm9ybSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIGE6aG92ZXIgY29kZTphZnRlcntib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgIzZCREZGRiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudH1ib2R5LnYxIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgb2wgbGk6YmVmb3JlLGJvZHkucGxhdGZvcm0gLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBvbCBsaTpiZWZvcmV7Y29sb3I6I0JFRjBGRn1ib2R5LnYxIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgY29kZSxib2R5LnYxIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgcHJlLGJvZHkucGxhdGZvcm0gLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBjb2RlLGJvZHkucGxhdGZvcm0gLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBwcmV7Y29sb3I6IzAwQzlGRjtiYWNrZ3JvdW5kOiMwYTA3MWN9Ym9keS52MSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIGltZyxib2R5LnBsYXRmb3JtIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgaW1ne2JveC1zaGFkb3c6MXB4IDNweCAxMHB4ICMwRjBFMTV9Ym9keS52MSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIHRhYmxlLGJvZHkucGxhdGZvcm0gLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSB0YWJsZXtjb2xvcjojQkVGMEZGO2JveC1zaGFkb3c6MXB4IDNweCAxMHB4ICMwRjBFMTV9Ym9keS52MSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIHRhYmxlIHRoZWFkLGJvZHkucGxhdGZvcm0gLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSB0YWJsZSB0aGVhZHtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg0NWRlZywgIzBCM0E4RCwjMDY2RkM1KX1ib2R5LnYxIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgdGFibGUgdHI6bnRoLWNoaWxkKGV2ZW4pIHRkLGJvZHkucGxhdGZvcm0gLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSB0YWJsZSB0cjpudGgtY2hpbGQoZXZlbikgdGR7YmFja2dyb3VuZDojMWIzYTU4fWJvZHkudjEgLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBibG9ja3F1b3RlLGJvZHkucGxhdGZvcm0gLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBibG9ja3F1b3Rle2JvcmRlci1jb2xvcjpyZ2JhKDE5MCwyNDAsMjU1LDAuMjUpfWJvZHkudjEgLmFydGljbGUgLmFydGljbGUtLWNvbnRlbnQgYmxvY2txdW90ZSBibG9ja3F1b3RlIHAsYm9keS5wbGF0Zm9ybSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIGJsb2NrcXVvdGUgcHtjb2xvcjpyZ2JhKDE5MCwyNDAsMjU1LDAuNil9Ym9keS52MSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIC5jb2RlLXRhYnMtd3JhcHBlciAuY29kZS10YWJzIGEsYm9keS5wbGF0Zm9ybSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIC5jb2RlLXRhYnMtd3JhcHBlciAuY29kZS10YWJzIGF7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjpyZ2JhKDE5MCwyNDAsMjU1LDAuNSl9Ym9keS52MSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIC5jb2RlLXRhYnMtd3JhcHBlciAuY29kZS10YWJzIGE6aG92ZXIsYm9keS5wbGF0Zm9ybSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIC5jb2RlLXRhYnMtd3JhcHBlciAuY29kZS10YWJzIGE6aG92ZXJ7Y29sb3I6I2JlZjBmZn1ib2R5LnYxIC5hcnRpY2xlIC5hcnRpY2xlLS1jb250ZW50IGJsb2NrcXVvdGUgLmNvZGUtdGFicy13cmFwcGVyIC5jb2RlLXRhYnMgYS5pcy1hY3RpdmUsYm9keS5wbGF0Zm9ybSAuYXJ0aWNsZSAuYXJ0aWNsZS0tY29udGVudCBibG9ja3F1b3RlIC5jb2RlLXRhYnMtd3JhcHBlciAuY29kZS10YWJzIGEuaXMtYWN0aXZle2NvbG9yOiNiZWYwZmY7YmFja2dyb3VuZDojMGEwNzFjfSNkb2NzLW5vdGlmaWNhdGlvbnN7cG9zaXRpb246Zml4ZWQ7dG9wOjY1cHg7cmlnaHQ6MTBweDt6LWluZGV4OjEwMDt3aWR0aDpjYWxjKDEwMHZ3IC0gMjBweCk7bWF4LXdpZHRoOjQ1MHB4O3RyYW5zaXRpb246YWxsIC40cyBlYXNlLCB0b3AgMHN9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9ue2Rpc3BsYXk6bm9uZTtyaWdodDotNTBweDtvcGFjaXR5OjA7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZzoxLjI1cmVtIDIuNXJlbSAxLjI1cmVtIDEuMjVyZW07Ym9yZGVyLXJhZGl1czoycHg7Ym94LXNoYWRvdzoycHggMnB4IDZweCByZ2JhKDMyLDMyLDQwLDAuMzUpO21hcmdpbi1ib3R0b206MTBweDtjb2xvcjojZmZmfSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiAubm90aWZpY2F0aW9uLXRpdGxlIGgze21hcmdpbi1ib3R0b206MXJlbTt0cmFuc2l0aW9uOmZvbnQtc2l6ZSAuMnN9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIC5ub3RpZmljYXRpb24tY29udGVudC13cmFwcGVye3Bvc2l0aW9uOnJlbGF0aXZlfSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiBjb2Rle2ZvbnQtc2l6ZTouODVyZW19I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIC5ub3RpZmljYXRpb24tc2x1Z3tmb250LXNpemU6Ljk3cmVtO21hcmdpbjotLjVyZW0gMCAxLjVyZW0gMH0jZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gLm5vdGlmaWNhdGlvbi1zbHVnKy5ub3RpZmljYXRpb24tY29udGVudHtib3JkZXItdG9wOjFweCBkb3R0ZWQgcmdiYSgyNTUsMjU1LDI1NSwwLjUpO3BhZGRpbmctdG9wOjEuMjVyZW19I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIC5ub3RpZmljYXRpb24tc2x1ZzpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0jZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gLm5vdGlmaWNhdGlvbi1zbHVnIHA6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIC5ub3RpZmljYXRpb24tY29udGVudHtmb250LXNpemU6MS4wNXJlbTtvcGFjaXR5OjE7bWF4LWhlaWdodDo1MDBweDttYXJnaW4tYm90dG9tOjEuNXJlbTt0cmFuc2l0aW9uOm9wYWNpdHkgLjRzLCBtYXgtaGVpZ2h0IC4ycyBlYXNlLW91dCwgbWFyZ2luIC4ycyBlYXNlLW91dCwgcGFkZGluZyAuMnN9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIC5ub3RpZmljYXRpb24tY29udGVudCBoMSwjZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gLm5vdGlmaWNhdGlvbi1jb250ZW50IGgyLCNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiAubm90aWZpY2F0aW9uLWNvbnRlbnQgaDMsI2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIC5ub3RpZmljYXRpb24tY29udGVudCBoNCwjZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gLm5vdGlmaWNhdGlvbi1jb250ZW50IGg1LCNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiAubm90aWZpY2F0aW9uLWNvbnRlbnQgaDZ7bWFyZ2luOjFyZW0gMCAuNzVyZW19I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIC5ub3RpZmljYXRpb24tY29udGVudCBoMTpmaXJzdC1jaGlsZCwjZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gLm5vdGlmaWNhdGlvbi1jb250ZW50IGgyOmZpcnN0LWNoaWxkLCNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiAubm90aWZpY2F0aW9uLWNvbnRlbnQgaDM6Zmlyc3QtY2hpbGQsI2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIC5ub3RpZmljYXRpb24tY29udGVudCBoNDpmaXJzdC1jaGlsZCwjZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gLm5vdGlmaWNhdGlvbi1jb250ZW50IGg1OmZpcnN0LWNoaWxkLCNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiAubm90aWZpY2F0aW9uLWNvbnRlbnQgaDY6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiAuY2xvc2Utbm90aWZpY2F0aW9ue3Bvc2l0aW9uOmFic29sdXRlO3RvcDo4cHg7cmlnaHQ6OHB4O2ZvbnQtc2l6ZToxLjdyZW07Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpjb2xvciAuMnM7Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuNSl9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIC5jbG9zZS1ub3RpZmljYXRpb246aG92ZXJ7Y29sb3I6I2ZmZn0jZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gLnNob3d7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjFyZW07bGVmdDoxLjI1cmVtO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtmb250LXNpemU6LjhyZW07Zm9udC13ZWlnaHQ6Ym9sZDtvcGFjaXR5Oi43NTt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzfSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiAuc2hvdzpob3ZlcntjdXJzb3I6cG9pbnRlcjtvcGFjaXR5OjF9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIC5zaG93OmJlZm9yZXtjb250ZW50OlwiU2hvdyBsZXNzXCJ9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uLm5vdGV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICMwMEEzRkYsIzM0QkI1NSl9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uLm5vdGUgYTpob3Zlcntjb2xvcjojMDAzRTM0fSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbi5ub3RlIGNvZGV7Y29sb3I6IzAwM0UzNDtiYWNrZ3JvdW5kOnJnYmEoMCw2Miw1MiwwLjI1KX0jZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24ubm90ZSBwcmV7YmFja2dyb3VuZDpyZ2JhKDAsNjIsNTIsMC4yNSl9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uLndhcm57YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMjI1ZGVnLCAjRjQ4RDM4LCNEQzRFNTgpfSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbi53YXJuIGE6aG92ZXJ7Y29sb3I6IzJGMUYyOX0jZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24ud2FybiBjb2Rle2NvbG9yOiNmZmJiZGQ7YmFja2dyb3VuZDpyZ2JhKDQ3LDMxLDQxLDAuMzUpfSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbi53YXJuIHByZXtiYWNrZ3JvdW5kOnJnYmEoNDcsMzEsNDEsMC4zNSl9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uLmdhLWFubm91bmNlbWVudHtiYWNrZ3JvdW5kLWltYWdlOnVybChcIi9zdmdzL2luZmx1eGRiMy1nYS1iYWNrZ3JvdW5kLnN2Z1wiKTtiYWNrZ3JvdW5kLXNpemU6Y292ZXJ9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uLmdhLWFubm91bmNlbWVudCBhOmhvdmVye2NvbG9yOiMwMjBhNDd9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uLmdhLWFubm91bmNlbWVudCBjb2Rle2NvbG9yOiMwMDNFMzQ7YmFja2dyb3VuZDpyZ2JhKDAsNjIsNTIsMC4yNSl9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uLmdhLWFubm91bmNlbWVudCBwcmV7YmFja2dyb3VuZDpyZ2JhKDAsNjIsNTIsMC4yNSl9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uLmdhLWFubm91bmNlbWVudCBoM3tmb250LXNpemU6MS40cmVtICFpbXBvcnRhbnR9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uLmdhLWFubm91bmNlbWVudCAubm90aWZpY2F0aW9uLXNsdWd7Zm9udC1zaXplOjEuMTVyZW19I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uLmdhLWFubm91bmNlbWVudCAubm90aWZpY2F0aW9uLXNsdWcgLmJ0bntkaXNwbGF5OmlubGluZS1ibG9jaztiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzAyMGE0NztwYWRkaW5nOi41cmVtIDFyZW07Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjFyZW19I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIGgxLCNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiBoMiwjZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gaDMsI2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIGg0LCNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiBoNSwjZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gaDZ7Zm9udC13ZWlnaHQ6NTAwO21hcmdpbjoxcmVtIDAgLjc1cmVtfSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiBoMTpmaXJzdC1jaGlsZCwjZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gaDI6Zmlyc3QtY2hpbGQsI2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIGgzOmZpcnN0LWNoaWxkLCNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiBoNDpmaXJzdC1jaGlsZCwjZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gaDU6Zmlyc3QtY2hpbGQsI2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIGg2OmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0jZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gaDEsI2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIGgye2ZvbnQtc2l6ZToxLjZyZW19I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIGgze2ZvbnQtc2l6ZToxLjM1cmVtfSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiBoNHtmb250LXNpemU6MS4ycmVtfSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiBoNXtmb250LXNpemU6MS4xcmVtfSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiBoNntmb250LXNpemU6MS4wNXJlbTtmb250LXN0eWxlOml0YWxpY30jZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gcCwjZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gbGl7bGluZS1oZWlnaHQ6MS41cmVtfSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiBwe21hcmdpbjowIDAgLjc1cmVtfSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbiBhe2ZvbnQtd2VpZ2h0OmJvbGQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6I2ZmZjt0cmFuc2l0aW9uOmNvbG9yIC4yc30jZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gdWwsI2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIG9se3BhZGRpbmctbGVmdDoxLjVyZW19I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIGNvZGV7cGFkZGluZzouMTVyZW0gLjRyZW07Ym9yZGVyLXJhZGl1czoycHg7Zm9udC13ZWlnaHQ6Ym9sZH0jZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gcHJle3BhZGRpbmc6MXJlbTtib3JkZXItcmFkaXVzOjJweDtvdmVyZmxvdzpzY3JvbGx9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uIHByZSBjb2Rle2JhY2tncm91bmQ6dHJhbnNwYXJlbnQgIWltcG9ydGFudH0jZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gaHJ7Ym9yZGVyLXdpZHRoOjFweCAwIDAgMDtib3JkZXItc3R5bGU6ZG90dGVkO2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuNSl9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uLm1pbiAubm90aWZpY2F0aW9uLXRpdGxlIGgze2ZvbnQtc2l6ZToxLjE1cmVtfSNkb2NzLW5vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbi5taW4gLm5vdGlmaWNhdGlvbi1jb250ZW50e21heC1oZWlnaHQ6MDttYXJnaW46MDtwYWRkaW5nOjA7b3BhY2l0eTowO3BvaW50ZXItZXZlbnRzOm5vbmV9I2RvY3Mtbm90aWZpY2F0aW9ucyAubm90aWZpY2F0aW9uLm1pbiAuc2hvdzo6YmVmb3Jle2NvbnRlbnQ6XCJTaG93IG1vcmVcIn0jZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gLnRpdGxlLXRhZ3twYWRkaW5nOi4xNXJlbSAuNDVyZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2ZvbnQtc2l6ZTouODVyZW07Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1mYW1pbHk6XCJJQk0gUGxleCBNb25vXCIsbW9ub3NwYWNlO2JhY2tncm91bmQ6IzAyMGE0N30jZG9jcy1ub3RpZmljYXRpb25zIC5ub3RpZmljYXRpb24gLnRpdGxlLXRhZytoM3ttYXJnaW4tdG9wOi43NXJlbX1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpeyNkb2NzLW5vdGlmaWNhdGlvbnN7dG9wOjUwcHh9fS5jb2RlYmxvY2t7cG9zaXRpb246cmVsYXRpdmV9LmNvZGUtY29udHJvbHN7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpmbGV4LWVuZDt0b3A6LjVyZW07cmlnaHQ6LjVyZW19LmNvZGUtY29udHJvbHMgLmNvZGUtY29udHJvbHMtdG9nZ2xle3BhZGRpbmc6LjA1cmVtIC4xNXJlbTtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MS4xNXJlbTtjb2xvcjojQjdCOEZGO29wYWNpdHk6LjU7dHJhbnNpdGlvbjpvcGFjaXR5IC4ycztib3JkZXItcmFkaXVzOjJweDtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOm5vbmU7bGluZS1oZWlnaHQ6MDtjdXJzb3I6cG9pbnRlcn0uY29kZS1jb250cm9scyAuY29kZS1jb250cm9scy10b2dnbGU6aG92ZXIsLmNvZGUtY29udHJvbHMgLmNvZGUtY29udHJvbHMtdG9nZ2xlOmZvY3VzLXZpc2libGV7b3BhY2l0eToxO2JhY2tncm91bmQtY29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjEpO2JhY2tkcm9wLWZpbHRlcjpibHVyKDE1cHgpfS5jb2RlLWNvbnRyb2xzIHVsLmNvZGUtY29udHJvbC1vcHRpb25ze2xpc3Qtc3R5bGU6bm9uZTtwYWRkaW5nOi41cmVtO21hcmdpbjowO2JvcmRlci1yYWRpdXM6MnB4O2JhY2tncm91bmQtY29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjA1KTtiYWNrZHJvcC1maWx0ZXI6Ymx1cigxNXB4KTtkaXNwbGF5Om5vbmV9LmNvZGUtY29udHJvbHMgdWwuY29kZS1jb250cm9sLW9wdGlvbnMgYnV0dG9ue2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmxlZnQ7bWFyZ2luOjA7cGFkZGluZzouNHJlbSAuNXJlbSAuNnJlbTtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyLXJhZGl1czoycHg7Y29sb3I6I0ZBRkFGQztmb250LXNpemU6Ljg3cmVtO2xpbmUtaGVpZ2h0OjA7Y3Vyc29yOnBvaW50ZXJ9LmNvZGUtY29udHJvbHMgdWwuY29kZS1jb250cm9sLW9wdGlvbnMgYnV0dG9uOmhvdmVyLC5jb2RlLWNvbnRyb2xzIHVsLmNvZGUtY29udHJvbC1vcHRpb25zIGJ1dHRvbjpmb2N1cy12aXNpYmxle2JhY2tncm91bmQtY29sb3I6cmdiYSgyMTIsMjE1LDIyMSwwLjA3KX0uY29kZS1jb250cm9scyB1bC5jb2RlLWNvbnRyb2wtb3B0aW9ucyBidXR0b24gLmNmLWljb257bWFyZ2luLXJpZ2h0Oi4zNXJlbX0uY29kZS1jb250cm9scyB1bC5jb2RlLWNvbnRyb2wtb3B0aW9ucyBidXR0b24uY29weS1jb2RlIC5tZXNzYWdle3RleHQtc2hhZG93OjBweCAwcHggOHB4IHJnYmEoMjEyLDIxNSwyMjEsMCk7Zm9udC13ZWlnaHQ6bm9ybWFsO3RyYW5zaXRpb246Y29sb3IgLjJzLCB0ZXh0LXNoYWRvdyAuMnN9LmNvZGUtY29udHJvbHMgdWwuY29kZS1jb250cm9sLW9wdGlvbnMgYnV0dG9uLmNvcHktY29kZS5zdWNjZXNzPi5tZXNzYWdle3RleHQtc2hhZG93OjBweCAwcHggOHB4IHJnYmEoMjEyLDIxNSwyMjEsMC41KTtmb250LXdlaWdodDpib2xkfS5jb2RlLWNvbnRyb2xzIHVsLmNvZGUtY29udHJvbC1vcHRpb25zIGJ1dHRvbi5jb3B5LWNvZGUuZmFpbGVkPi5tZXNzYWdle2NvbG9yOiNEQzRFNTg7dGV4dC1zaGFkb3c6MHB4IDBweCA4cHggcmdiYSgyMjAsNzgsODgsMC41KTtmb250LXdlaWdodDpib2xkfS5jb2RlLWNvbnRyb2xzIHVsLmNvZGUtY29udHJvbC1vcHRpb25zIGxpe21hcmdpbjowfS5jb2RlLWNvbnRyb2xzLm9wZW4gLmNvZGUtY29udHJvbHMtdG9nZ2xle2Rpc3BsYXk6bm9uZX0uY29kZS1jb250cm9scy5vcGVuIC5jb2RlLWNvbnRyb2wtb3B0aW9uc3tkaXNwbGF5OmJsb2NrfS5mdWxsc2NyZWVuLWNvZGV7ZGlzcGxheTpub25lO3otaW5kZXg6MTAwMDtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMHZoO3dpZHRoOjEwMHZ3O3BhZGRpbmc6MnJlbTtiYWNrZ3JvdW5kOiMwNzA3MEU7b3ZlcmZsb3c6c2Nyb2xsICFpbXBvcnRhbnR9LmZ1bGxzY3JlZW4tY29kZSAuZnVsbHNjcmVlbi1jbG9zZXtwb3NpdGlvbjpmaXhlZDtwYWRkaW5nOi4xcmVtO3JpZ2h0Oi43NXJlbTt0b3A6LjVyZW07ZGlzcGxheTpibG9jaztjb2xvcjojQjdCOEZGO2ZvbnQtc2l6ZToycmVtO3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQ6IzA3MDcwRTtib3JkZXItcmFkaXVzOjJweH0uZnVsbHNjcmVlbi1jb2RlIC5mdWxsc2NyZWVuLWNsb3NlIHNwYW57b3BhY2l0eTowLjU7dHJhbnNpdGlvbjpvcGFjaXR5IDAuMnN9LmZ1bGxzY3JlZW4tY29kZSAuZnVsbHNjcmVlbi1jbG9zZTpob3ZlciBzcGFue29wYWNpdHk6MX0uZnVsbHNjcmVlbi1jb2RlIHByZXtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjEuNzVyZW07Zm9udC1mYW1pbHk6XCJJQk0gUGxleCBNb25vXCIsbW9ub3NwYWNlfS5mdWxsc2NyZWVuLWNvZGUgcHJlIGNvZGUsLmZ1bGxzY3JlZW4tY29kZSBwcmUgcHJle2JhY2tncm91bmQ6IzA3MDcwRTtmb250LWZhbWlseTpcIklCTSBQbGV4IE1vbm9cIixtb25vc3BhY2U7Y29sb3I6I0I3QjhGRn0uZnVsbHNjcmVlbi1jb2RlIHByZSBwIGNvZGUsLmZ1bGxzY3JlZW4tY29kZSBwcmUgbGkgY29kZSwuZnVsbHNjcmVlbi1jb2RlIHByZSB0YWJsZSBjb2Rle3BhZGRpbmc6LjFyZW0gLjRyZW0gLjJyZW07Ym9yZGVyLXJhZGl1czoycHg7Y29sb3I6I0I3QjhGRjt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udC1zaXplOjFyZW07Zm9udC1zdHlsZTpub3JtYWx9LmZ1bGxzY3JlZW4tY29kZSBwcmUgaDEgY29kZSwuZnVsbHNjcmVlbi1jb2RlIHByZSBoMiBjb2RlLC5mdWxsc2NyZWVuLWNvZGUgcHJlIGgzIGNvZGUsLmZ1bGxzY3JlZW4tY29kZSBwcmUgaDQgY29kZSwuZnVsbHNjcmVlbi1jb2RlIHByZSBoNSBjb2RlLC5mdWxsc2NyZWVuLWNvZGUgcHJlIGg2IGNvZGV7cGFkZGluZzppbmhlcml0ICFpbXBvcnRhbnQ7YmFja2dyb3VuZDppbmhlcml0ICFpbXBvcnRhbnQ7Zm9udC1zaXplOmluaGVyaXQgIWltcG9ydGFudDtmb250LXdlaWdodDppbmhlcml0ICFpbXBvcnRhbnQ7Zm9udC1mYW1pbHk6XCJQcm94aW1hIE5vdmFcIixzYW5zLXNlcmlmO2NvbG9yOmluaGVyaXQgIWltcG9ydGFudH0uZnVsbHNjcmVlbi1jb2RlIHByZSBhIGNvZGV7Zm9udC13ZWlnaHQ6bm9ybWFsO3RyYW5zaXRpb246Y29sb3IgLjJzO3Bvc2l0aW9uOnJlbGF0aXZlO2NvbG9yOiMwMEEzRkZ9LmZ1bGxzY3JlZW4tY29kZSBwcmUgYSBjb2RlOmFmdGVye2NvbnRlbnQ6XCJcIjtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO3RvcDowO3JpZ2h0OjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDowIC40cmVtIC40cmVtIDA7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHJnYmEoMCwxNjMsMjU1LDAuMzUpIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O3RyYW5zaXRpb246Ym9yZGVyIC4yc30uZnVsbHNjcmVlbi1jb2RlIHByZSBhOmhvdmVyIGNvZGV7Y29sb3I6I2ZmZn0uZnVsbHNjcmVlbi1jb2RlIHByZSBhOmhvdmVyIGNvZGU6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50ICNmZmYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnR9LmZ1bGxzY3JlZW4tY29kZSBwcmUgcHJle21hcmdpbjoycmVtIDAgMi4yNXJlbTtwYWRkaW5nOjEuNzVyZW0gMS43NXJlbSAxLjI1cmVtO2JvcmRlci1yYWRpdXM6MnB4O292ZXJmbG93LXg6c2Nyb2xsO292ZXJmbG93LXk6aGlkZGVuO2ZvbnQtc2l6ZToxcmVtfS5mdWxsc2NyZWVuLWNvZGUgcHJlIHByZSBjb2Rle3BhZGRpbmc6MDtsaW5lLWhlaWdodDoxLjdyZW07d2hpdGUtc3BhY2U6cHJlfS5mdWxsc2NyZWVuLWNvZGUgcHJlIHByZSAuYXBpe21hcmdpbi1yaWdodDouMzVyZW07cGFkZGluZzouMTVyZW0gLjVyZW0gLjI1cmVtO2JvcmRlci1yYWRpdXM6MnB4O2NvbG9yOiNmZmY7Zm9udC1mYW1pbHk6XCJJQk0gUGxleCBNb25vXCIsbW9ub3NwYWNlO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zaXplOjFyZW19LmZ1bGxzY3JlZW4tY29kZSBwcmUgcHJlIC5hcGkuZ2V0e2JhY2tncm91bmQ6IzAwOUY1Rn0uZnVsbHNjcmVlbi1jb2RlIHByZSBwcmUgLmFwaS5wb3N0e2JhY2tncm91bmQ6IzA2NkZDNX0uZnVsbHNjcmVlbi1jb2RlIHByZSBwcmUgLmFwaS5wYXRjaHtiYWNrZ3JvdW5kOiNFODVCMUN9LmZ1bGxzY3JlZW4tY29kZSBwcmUgcHJlIC5hcGkuZGVsZXRle2JhY2tncm91bmQ6I0JGM0Q1RX0uZnVsbHNjcmVlbi1jb2RlIHByZSBwcmUgLmFwaS5wdXR7YmFja2dyb3VuZDojNTEzQ0M2fS5mdWxsc2NyZWVuLWNvZGUgcHJlIHByZS5hcGktZW5kcG9pbnQgYXtwb3NpdGlvbjpyZWxhdGl2ZTtjb2xvcjojMDBBM0ZGO3RleHQtZGVjb3JhdGlvbjpub25lfS5mdWxsc2NyZWVuLWNvZGUgcHJlIHByZS5hcGktZW5kcG9pbnQgYTphZnRlcntjb250ZW50OlwiXFxlOTBkXCI7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6LTEuNDVyZW07dG9wOjAuNjVyZW07Zm9udC1mYW1pbHk6XCJpY29tb29uLXY0XCI7Y29sb3I6I2ZmZjtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MS4xcmVtO2xpbmUtaGVpZ2h0OjA7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuMnN9LmZ1bGxzY3JlZW4tY29kZSBwcmUgcHJlLmFwaS1lbmRwb2ludCBhOmhvdmVye2NvbG9yOiNmZmZ9LmZ1bGxzY3JlZW4tY29kZSBwcmUgcHJlLmFwaS1lbmRwb2ludCBhOmhvdmVyOmFmdGVye29wYWNpdHk6LjZ9LmZ1bGxzY3JlZW4tY29kZSBwcmUgc3Bhbi5jb2RlLWNhbGxvdXQsLmZ1bGxzY3JlZW4tY29kZSBwcmUgLmNvZGUtcGxhY2Vob2xkZXJ7Zm9udC13ZWlnaHQ6Ym9sZDttYXJnaW46MCAuMTVyZW19LmZ1bGxzY3JlZW4tY29kZSBwcmUgc3Bhbi5jb2RlLWNhbGxvdXQuZ3JlZW4sLmZ1bGxzY3JlZW4tY29kZSBwcmUgLmNvZGUtcGxhY2Vob2xkZXIuZ3JlZW57Y29sb3I6IzAwOUY1Rn0uZnVsbHNjcmVlbi1jb2RlIHByZSBzcGFuLmNvZGUtY2FsbG91dC5tYWdlbnRhLC5mdWxsc2NyZWVuLWNvZGUgcHJlIC5jb2RlLXBsYWNlaG9sZGVyLm1hZ2VudGF7Y29sb3I6I2QzMDk3MX0uZnVsbHNjcmVlbi1jb2RlIHByZSBzcGFuLmNvZGUtY2FsbG91dC5vcmFuZ2UsLmZ1bGxzY3JlZW4tY29kZSBwcmUgLmNvZGUtcGxhY2Vob2xkZXIub3Jhbmdle2NvbG9yOiNGOTVGNTN9LmZ1bGxzY3JlZW4tY29kZSBwcmUgc3Bhbi5jb2RlLWNhbGxvdXQuZGVsZXRlLC5mdWxsc2NyZWVuLWNvZGUgcHJlIHNwYW4uY29kZS1jYWxsb3V0LnN0cmlrZSwuZnVsbHNjcmVlbi1jb2RlIHByZSAuY29kZS1wbGFjZWhvbGRlci5kZWxldGUsLmZ1bGxzY3JlZW4tY29kZSBwcmUgLmNvZGUtcGxhY2Vob2xkZXIuc3RyaWtle3RleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91Z2h9LmZ1bGxzY3JlZW4tY29kZSBwcmUgLmNvZGUtcGxhY2Vob2xkZXItd3JhcHBlcntkaXNwbGF5OmlubGluZTtwb3NpdGlvbjpyZWxhdGl2ZX0uZnVsbHNjcmVlbi1jb2RlIHByZSAuY29kZS1wbGFjZWhvbGRlci13cmFwcGVyIC5jb2RlLXBsYWNlaG9sZGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjowIC4xNXJlbTtwYWRkaW5nOjA7bGluZS1oZWlnaHQ6MS40ZW07Y29sb3I6I2U2NTlhMjtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTpub3JtYWw7Ym9yZGVyLWJvdHRvbToxcHggZG90dGVkO3RyYW5zaXRpb246Y29sb3IgLjJzO2N1cnNvcjpwb2ludGVyfS5mdWxsc2NyZWVuLWNvZGUgcHJlIC5jb2RlLXBsYWNlaG9sZGVyLXdyYXBwZXIgLmNvZGUtcGxhY2Vob2xkZXIgLmNvZGUtcGxhY2Vob2xkZXItZWRpdC1pY29ue2ZvbnQtc3R5bGU6bm9ybWFsfS5mdWxsc2NyZWVuLWNvZGUgcHJlIC5jb2RlLXBsYWNlaG9sZGVyLXdyYXBwZXIgLmNvZGUtcGxhY2Vob2xkZXIgLmNvZGUtcGxhY2Vob2xkZXItZWRpdC1pY29uOjpiZWZvcmV7bWFyZ2luLWxlZnQ6LjJyZW07Zm9udC1zaXplOi44ZW07dHJhbnNpdGlvbjpvcGFjaXR5IC4ycztvcGFjaXR5Oi42NTt6LWluZGV4Oi0xfS5mdWxsc2NyZWVuLWNvZGUgcHJlIC5jb2RlLXBsYWNlaG9sZGVyLXdyYXBwZXIgLmNvZGUtcGxhY2Vob2xkZXI6aG92ZXJ7Y29sb3I6IzVlZTRlNH0uZnVsbHNjcmVlbi1jb2RlIHByZSAuY29kZS1wbGFjZWhvbGRlci13cmFwcGVyIC5jb2RlLXBsYWNlaG9sZGVyOmhvdmVyIC5jb2RlLXBsYWNlaG9sZGVyLWVkaXQtaWNvbjo6YmVmb3Jle29wYWNpdHk6MX0uZnVsbHNjcmVlbi1jb2RlIHByZSAuY29kZS1wbGFjZWhvbGRlci13cmFwcGVyIC5jb2RlLWlucHV0LXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOi0zcHg7bGVmdDotNC41cHg7ei1pbmRleDoxO2NvbG9yOmluaGVyaXR9LmZ1bGxzY3JlZW4tY29kZSBwcmUgLmNvZGUtcGxhY2Vob2xkZXItd3JhcHBlciAuY29kZS1pbnB1dC13cmFwcGVyIGlucHV0LnBsYWNlaG9sZGVyLWVkaXR7d2lkdGg6MTAwJTttYXgtd2lkdGg6MTAwJTtib3JkZXI6MXB4IHNvbGlkICMxQTFBMkE7Ym9yZGVyLXJhZGl1czo0cHg7YmFja2dyb3VuZC1jb2xvcjojMUExQTJBO3BhZGRpbmc6MnB4IDIwcHggMnB4IDZweDtjb2xvcjojNWVlNGU0O2ZvbnQtd2VpZ2h0Om5vcm1hbH0uZnVsbHNjcmVlbi1jb2RlIHByZSAuY29kZS1wbGFjZWhvbGRlci13cmFwcGVyIC5jb2RlLWlucHV0LXdyYXBwZXIgaW5wdXQucGxhY2Vob2xkZXItZWRpdDpmb2N1c3tvdXRsaW5lOm5vbmU7Ym9yZGVyLWNvbG9yOnJnYmEoOTQsMjI4LDIyOCwwLjc1KTtib3gtc2hhZG93OjFweCAxcHggOHB4IHJnYmEoOTQsMjI4LDIyOCwwLjUpO2JvcmRlci1yYWRpdXM6MnB4fS5mdWxsc2NyZWVuLWNvZGUgcHJlIC5jb2RlLXBsYWNlaG9sZGVyLXdyYXBwZXIgLmNvZGUtaW5wdXQtd3JhcHBlcjpob3ZlcntjdXJzb3I6cG9pbnRlcn0uZnVsbHNjcmVlbi1jb2RlIHByZSAuY29kZS1wbGFjZWhvbGRlci13cmFwcGVyIC5jb2RlLWlucHV0LXdyYXBwZXI6YWZ0ZXJ7Y29udGVudDpcIlxcZTkzN1wiO2NvbG9yOiM1ZWU0ZTQ7Zm9udC1mYW1pbHk6J2ljb21vb24tdjQnO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6M3B4fS5mdWxsc2NyZWVuLWNvZGUgcHJlIC5jb2RlLXBsYWNlaG9sZGVyLWtleSBjb2Rle2NvbG9yOiNlNjU5YTIgIWltcG9ydGFudH0uZnVsbHNjcmVlbi1jb2RlIHByZSBwcmUgc3Bhbi50Yy1keW5hbWljLXZhbHVle2JvcmRlcjoxcHggc29saWQ7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzowIC4yNXJlbTstLXBhcmFtLWNvbG9yOiAjZmY3OWM2Oy0tcGFyYW0tYmc6ICNmZjc5YzYzMzstLWVudi1jb2xvcjogIzAwOTJiODstLWVudi1iZzogIzAwOTJiODMzOy0tc2VjcmV0LWNvbG9yOiAjOWEwOWZmOy0tc2VjcmV0LWJnOiAjOTgwOWZmMzN9LmZ1bGxzY3JlZW4tY29kZSBwcmUgcHJlIHNwYW4udGMtZHluYW1pYy12YWx1ZS5wYXJhbXtjb2xvcjp2YXIoLS1wYXJhbS1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1wYXJhbS1iZyk7Ym9yZGVyLWNvbG9yOnZhcigtLXBhcmFtLWNvbG9yKX0uZnVsbHNjcmVlbi1jb2RlIHByZSBwcmUgc3Bhbi50Yy1keW5hbWljLXZhbHVlLmVudntjb2xvcjp2YXIoLS1lbnYtY29sb3IpO2JhY2tncm91bmQ6dmFyKC0tZW52LWJnKTtib3JkZXItY29sb3I6dmFyKC0tZW52LWNvbG9yKX0uZnVsbHNjcmVlbi1jb2RlIHByZSBwcmUgc3Bhbi50Yy1keW5hbWljLXZhbHVlLnNlY3JldHtjb2xvcjp2YXIoLS1zZWNyZXQtY29sb3IpO2JhY2tncm91bmQ6dmFyKC0tc2VjcmV0LWJnKTtib3JkZXItY29sb3I6dmFyKC0tc2VjcmV0LWNvbG9yKX1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpey5mdWxsc2NyZWVuLWNvZGUgcHJlIHByZXtwYWRkaW5nOjEuMmVtIDEuMmVtIC43NXJlbX19I3YzLXdheWZpbmRpbmctbW9kYWx7ZGlzcGxheTpmbGV4O3dpZHRoOjEwMCU7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7cG9zaXRpb246Zml4ZWQ7dG9wOi0xMDB2aDtwYWRkaW5nOjJyZW07ei1pbmRleDoyMDA7YmFja2Ryb3AtZmlsdGVyOmJsdXIoMTVweCk7dHJhbnNpdGlvbjp0b3AgLjc1cyBlYXNlLWluLW91dH0jdjMtd2F5ZmluZGluZy1tb2RhbC5vcGVue3RvcDowfSN2My13YXlmaW5kaW5nLW1vZGFsIC53YXlmaW5kaW5nLXdyYXBwZXJ7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNDVkZWcsICNkMzA5NzEsIzliMmFmZik7cG9zaXRpb246cmVsYXRpdmU7bWF4LXdpZHRoOjgwMHB4O3BvaW50ZXItZXZlbnRzOmFsbDtib3JkZXItcmFkaXVzOjRweH0jdjMtd2F5ZmluZGluZy1tb2RhbCAud2F5ZmluZGluZy1jb250ZW50e3BhZGRpbmc6MS41cmVtO2NvbG9yOiNmZmZ9I3YzLXdheWZpbmRpbmctbW9kYWwgLndheWZpbmRpbmctY29udGVudCBoNHtmb250LXNpemU6MS4yNXJlbTttYXJnaW46MH0jdjMtd2F5ZmluZGluZy1tb2RhbCAud2F5ZmluZGluZy1jb250ZW50LWluZm97ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvd30jdjMtd2F5ZmluZGluZy1tb2RhbCAud2F5ZmluZGluZy1jb250ZW50LWluZm8gcHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuODUpO2xpbmUtaGVpZ2h0OjEuNjVyZW19I3YzLXdheWZpbmRpbmctbW9kYWwgLndheWZpbmRpbmctY29udGVudC1pbmZvIHAgc3Ryb25ne2NvbG9yOiNmZmZ9I3YzLXdheWZpbmRpbmctbW9kYWwgLndheWZpbmRpbmctY29udGVudC1pbmZvIGEjZmluZC1vdXQtdG9nZ2xle3Bvc2l0aW9uOnJlbGF0aXZlO2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOi45NXJlbTt0ZXh0LWRlY29yYXRpb246bm9uZTt3aGl0ZS1zcGFjZTpub3dyYXB9I3YzLXdheWZpbmRpbmctbW9kYWwgLndheWZpbmRpbmctY29udGVudC1pbmZvIGEjZmluZC1vdXQtdG9nZ2xlOmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6YmxvY2s7Y29udGVudDpcIlwiO2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym90dG9tOi0uMXJlbTtsZWZ0OjA7aGVpZ2h0OjFweDt3aWR0aDowJTt0cmFuc2l0aW9uOndpZHRoIC4yc30jdjMtd2F5ZmluZGluZy1tb2RhbCAud2F5ZmluZGluZy1jb250ZW50LWluZm8gYSNmaW5kLW91dC10b2dnbGU6aG92ZXJ7Y29sb3I6I2ZmZn0jdjMtd2F5ZmluZGluZy1tb2RhbCAud2F5ZmluZGluZy1jb250ZW50LWluZm8gYSNmaW5kLW91dC10b2dnbGU6aG92ZXI6YWZ0ZXJ7d2lkdGg6MTAwJX0jdjMtd2F5ZmluZGluZy1tb2RhbCAud2F5ZmluZGluZy1jb250ZW50LWluZm8gI2ZpbmQtb3V0LWluc3RydWN0aW9uc3t0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoxcmVtO3RyYW5zaXRpb246aGVpZ2h0IC4ycyBlYXNlLW91dCwgb3BhY2l0eSAuMnM7b3BhY2l0eTowO2hlaWdodDowO292ZXJmbG93OmhpZGRlbn0jdjMtd2F5ZmluZGluZy1tb2RhbCAud2F5ZmluZGluZy1jb250ZW50LWluZm8gI2ZpbmQtb3V0LWluc3RydWN0aW9ucyBwe21hcmdpbi10b3A6MDtmb250LXNpemU6Ljk1cmVtO2ZvbnQtc3R5bGU6aXRhbGljO2xpbmUtaGVpZ2h0OjEuM3JlbX0jdjMtd2F5ZmluZGluZy1tb2RhbCAud2F5ZmluZGluZy1jb250ZW50LWluZm8gI2ZpbmQtb3V0LWluc3RydWN0aW9ucyBhe3Bvc2l0aW9uOnJlbGF0aXZlO2NvbG9yOiNmZmY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Zm9udC13ZWlnaHQ6Ym9sZH0jdjMtd2F5ZmluZGluZy1tb2RhbCAud2F5ZmluZGluZy1jb250ZW50LWluZm8gI2ZpbmQtb3V0LWluc3RydWN0aW9ucyBhOmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6YmxvY2s7Y29udGVudDpcIlwiO2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym90dG9tOi0uMnJlbTtsZWZ0OjA7aGVpZ2h0OjFweDt3aWR0aDowJTt0cmFuc2l0aW9uOndpZHRoIC4yc30jdjMtd2F5ZmluZGluZy1tb2RhbCAud2F5ZmluZGluZy1jb250ZW50LWluZm8gI2ZpbmQtb3V0LWluc3RydWN0aW9ucyBhOmhvdmVyOmFmdGVye3dpZHRoOjEwMCV9I3YzLXdheWZpbmRpbmctbW9kYWwgLndheWZpbmRpbmctY29udGVudC1pbmZvIC5wb3dlcmVkLWJ5LWV4YW1wbGV7cGFkZGluZzoxcmVtIDEuMjVyZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czoycHg7YmFja2dyb3VuZDojMEYwRTE1O2NvbG9yOiMyQUEzRkY7Zm9udC1zaXplOi45NXJlbTtmb250LXdlaWdodDpib2xkO3RleHQtYWxpZ246Y2VudGVyfSN2My13YXlmaW5kaW5nLW1vZGFsIC53YXlmaW5kaW5nLWNvbnRlbnQtaW5mbyAucG93ZXJlZC1ieS1leGFtcGxlIHNwYW4uc3RvcmFnZS1kZXNjcmlwdGlvbntkaXNwbGF5OmJsb2NrO2NvbG9yOiM4MjgyOTQ7Zm9udC13ZWlnaHQ6bm9ybWFsO2xpbmUtaGVpZ2h0OjEuMXJlbX0jdjMtd2F5ZmluZGluZy1tb2RhbCAud2F5ZmluZGluZy1jb250ZW50LWluZm8gLnBvd2VyZWQtYnktZXhhbXBsZSBzcGFuLnN0b3JhZ2UtZGVzY3JpcHRpb24uZ2l0LWhlYWQ6OmFmdGVye2NvbnRlbnQ6XCIoeHh4eHh4KVwiO2ZvbnQtZmFtaWx5OlwiSUJNIFBsZXggTW9ub1wiLG1vbm9zcGFjZTttYXJnaW4tbGVmdDouMnJlbX0jdjMtd2F5ZmluZGluZy1tb2RhbCAud2F5ZmluZGluZy1hY3Rpb25ze21pbi13aWR0aDozMyU7bWFyZ2luLWxlZnQ6MnJlbTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24tY29udGVudDpjZW50ZXJ9I3YzLXdheWZpbmRpbmctbW9kYWwgLnYzLXdheWZpbmRpbmctYnRue2Rpc3BsYXk6YmxvY2s7cGFkZGluZzoxcmVtO21hcmdpbi1ib3R0b206LjVyZW07Ym9yZGVyLXJhZGl1czoycHg7YmFja2dyb3VuZC1jb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiM5YjJhZmY7Ym94LXNoYWRvdzowcHggMHB4IDEwcHggcmdiYSgyNTUsMjU1LDI1NSwwKTt0cmFuc2l0aW9uOmNvbG9yIC4ycywgYm94LXNoYWRvdyAuMnN9I3YzLXdheWZpbmRpbmctbW9kYWwgLnYzLXdheWZpbmRpbmctYnRuOmhvdmVye2NvbG9yOiM1QzEwQTA7Ym94LXNoYWRvdzowIDAgMTBweCByZ2JhKDI1NSwyNTUsMjU1LDAuOSl9I3YzLXdheWZpbmRpbmctbW9kYWwgLnYzLXdheWZpbmRpbmctYnRuIC5zbWFsbHtmb250LXNpemU6MXJlbX0jdjMtd2F5ZmluZGluZy1tb2RhbCAjdjMtd2F5ZmluZGluZy1jbG9zZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Ljc1cmVtO3JpZ2h0Oi43NXJlbTtjb2xvcjojZmZmO2ZvbnQtc2l6ZToycmVtO29wYWNpdHk6LjY1O3RyYW5zaXRpb246b3BhY2l0eSAuMnN9I3YzLXdheWZpbmRpbmctbW9kYWwgI3YzLXdheWZpbmRpbmctY2xvc2U6aG92ZXJ7b3BhY2l0eToxO2N1cnNvcjpwb2ludGVyfSN2My13YXlmaW5kaW5nLW1vZGFsIGxhYmVse21hcmdpbi10b3A6LjVyZW07ZGlzcGxheTpibG9jazt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6Ljk1cmVtO2ZvbnQtc3R5bGU6aXRhbGljO3Bvc2l0aW9uOnJlbGF0aXZlO2N1cnNvcjpwb2ludGVyO3VzZXItc2VsZWN0Om5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lfSN2My13YXlmaW5kaW5nLW1vZGFsIGxhYmVsIC5jaGVja2JveHtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxNXB4O2hlaWdodDoxNXB4O2JvcmRlcjoxLjVweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuODUpO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtib3JkZXItcmFkaXVzOjJweDtwb3NpdGlvbjpyZWxhdGl2ZX0jdjMtd2F5ZmluZGluZy1tb2RhbCBsYWJlbCAuY2hlY2tib3g6YmVmb3Jle2NvbnRlbnQ6Jyc7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6M3B4O2hlaWdodDo3cHg7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuODUpO2JvcmRlci1ib3R0b206MnB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC44NSk7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo1MCU7dG9wOjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsIC01MCUpIHJvdGF0ZSg0NWRlZykgc2NhbGUoMCk7dHJhbnNpdGlvbjphbGwgMC4yc30jdjMtd2F5ZmluZGluZy1tb2RhbCBsYWJlbCBpbnB1dHtwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7dmlzaWJpbGl0eTpoaWRkZW59I3YzLXdheWZpbmRpbmctbW9kYWwgbGFiZWwgaW5wdXQ6Y2hlY2tlZCsuY2hlY2tib3h7Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMC44NSl9I3YzLXdheWZpbmRpbmctbW9kYWwgbGFiZWwgaW5wdXQ6Y2hlY2tlZCsuY2hlY2tib3g6YmVmb3Jle3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgLTYwJSkgcm90YXRlKDQ1ZGVnKSBzY2FsZSgxKX0jdjMtd2F5ZmluZGluZy1tb2RhbCBsYWJlbCAuY2hlY2tib3gtdGV4dHttYXJnaW4tbGVmdDo0cHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlfUBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCl7I3YzLXdheWZpbmRpbmctbW9kYWwgLndheWZpbmRpbmctY29udGVudC1pbmZve2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0jdjMtd2F5ZmluZGluZy1tb2RhbCAjZmluZC1vdXQtaW5zdHJ1Y3Rpb25ze3BhZGRpbmctYm90dG9tOjEuNXJlbX0jdjMtd2F5ZmluZGluZy1tb2RhbCAud2F5ZmluZGluZy1hY3Rpb25ze21hcmdpbi1sZWZ0OjB9fS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yey0tdHJhbnNpdGlvbi1mYXN0OiAwLjJzIGVhc2U7LS10cmFuc2l0aW9uLW5vcm1hbDogMC4zcyBlYXNlOy0tc3BhY2luZy1zbTogMC42MjVyZW07LS1zcGFjaW5nLW1kOiAxLjI1cmVtO21hcmdpbjoycmVtIGF1dG99LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmRldGVjdG9yLXRpdGxle2NvbG9yOiNmZmY7bWFyZ2luLWJvdHRvbTowLjYyNXJlbTtmb250LXNpemU6MS44ZW07Zm9udC13ZWlnaHQ6NjAwfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5kZXRlY3Rvci1zdWJ0aXRsZXtjb2xvcjojRDREN0REO21hcmdpbi1ib3R0b206MS44NzVyZW07Zm9udC1zaXplOjAuOTVlbTtvcGFjaXR5OjAuOH0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAucHJvZ3Jlc3N7bWFyZ2luLWJvdHRvbToxLjU2MjVyZW07aGVpZ2h0OjZweDtiYWNrZ3JvdW5kOiMzODM4NDY7Ym9yZGVyLXJhZGl1czozcHg7b3ZlcmZsb3c6aGlkZGVufS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5wcm9ncmVzcyAucHJvZ3Jlc3MtYmFye2hlaWdodDoxMDAlO2JhY2tncm91bmQ6IzAwQTNGRjt0cmFuc2l0aW9uOndpZHRoIHZhcigtLXRyYW5zaXRpb24tbm9ybWFsKX0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAucXVlc3Rpb24tY29udGFpbmVye21pbi1oZWlnaHQ6MTUwcHh9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnF1ZXN0aW9uLWNvbnRhaW5lciAucXVlc3Rpb257ZGlzcGxheTpub25lO2FuaW1hdGlvbjpmYWRlSW4gdmFyKC0tdHJhbnNpdGlvbi1ub3JtYWwpfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5xdWVzdGlvbi1jb250YWluZXIgLnF1ZXN0aW9uLmFjdGl2ZXtkaXNwbGF5OmJsb2NrfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5xdWVzdGlvbi1jb250YWluZXIgLnF1ZXN0aW9uIC5xdWVzdGlvbi10ZXh0e2ZvbnQtc2l6ZToxLjFlbTtjb2xvcjojZmZmO21hcmdpbi1ib3R0b206MS4yNXJlbTtmb250LXdlaWdodDo1MDB9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnVybC1zdWdnZXN0aW9ucyAuc3VnZ2VzdGlvbi1idXR0b24sLmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmJhY2stYnV0dG9uLC5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5yZXN0YXJ0LWJ1dHRvbiwuaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuc3VibWl0LWJ1dHRvbiwuaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAub3B0aW9uLWJ1dHRvbntib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOnZhcigtLWJvcmRlci1yYWRpdXMpO2N1cnNvcjpwb2ludGVyO3RyYW5zaXRpb246YWxsIHZhcigtLXRyYW5zaXRpb24tZmFzdCk7Zm9udC1mYW1pbHk6aW5oZXJpdH0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAudXJsLXN1Z2dlc3Rpb25zIC5zdWdnZXN0aW9uLWJ1dHRvbjpmb2N1cywuaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuYmFjay1idXR0b246Zm9jdXMsLmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnJlc3RhcnQtYnV0dG9uOmZvY3VzLC5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5zdWJtaXQtYnV0dG9uOmZvY3VzLC5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5vcHRpb24tYnV0dG9uOmZvY3Vze291dGxpbmU6MnB4IHNvbGlkICMwMEEzRkY7b3V0bGluZS1vZmZzZXQ6MnB4fS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5vcHRpb24tYnV0dG9ue2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmxlZnQ7bWFyZ2luLWJvdHRvbTowLjc1cmVtO3BhZGRpbmc6MC44NzVyZW0gMS4xMjVyZW07YmFja2dyb3VuZDojMTQxNDFGO2NvbG9yOiNENEQ3REQ7Ym9yZGVyOjJweCBzb2xpZCAjMzgzODQ2O2ZvbnQtc2l6ZToxNXB4fS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5vcHRpb24tYnV0dG9uOmhvdmVye2JvcmRlci1jb2xvcjojMDBBM0ZGO2JhY2tncm91bmQ6IzE0MTQxRjt0cmFuc2Zvcm06dHJhbnNsYXRlWCgzcHgpfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5vcHRpb24tYnV0dG9uOmFjdGl2ZXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxcHgpfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5zdWJtaXQtYnV0dG9ue2JhY2tncm91bmQ6IzAwQTNGRjtjb2xvcjojZmZmO3BhZGRpbmc6MC43NXJlbSAxLjVyZW07Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NTAwfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5zdWJtaXQtYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6IzA2NkZDNTtjb2xvcjojZmZmfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5zdWJtaXQtYnV0dG9uOmRpc2FibGVke2JhY2tncm91bmQ6IzY3Njk3ODtjdXJzb3I6bm90LWFsbG93ZWR9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmJhY2stYnV0dG9uLC5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5yZXN0YXJ0LWJ1dHRvbntiYWNrZ3JvdW5kOiM2NzY5Nzg7Y29sb3I6I2ZmZjtwYWRkaW5nOnZhcigtLXNwYWNpbmctc20pIHZhcigtLXNwYWNpbmctbWQpO2ZvbnQtc2l6ZToxNHB4O21hcmdpbi1yaWdodDp2YXIoLS1zcGFjaW5nLXNtKX0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuYmFjay1idXR0b246aG92ZXIsLmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnJlc3RhcnQtYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6Izc1Nzg4OH0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAucmVzdGFydC1idXR0b257bWFyZ2luLXRvcDp2YXIoLS1zcGFjaW5nLW1kKTttYXJnaW4tcmlnaHQ6MH0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciB0ZXh0YXJlYSwuaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuaW5wdXQtZ3JvdXAgaW5wdXR7d2lkdGg6MTAwJTtib3JkZXI6MnB4IHNvbGlkICMzODM4NDY7Ym9yZGVyLXJhZGl1czp2YXIoLS1ib3JkZXItcmFkaXVzKTt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciB2YXIoLS10cmFuc2l0aW9uLWZhc3QpO2JhY2tncm91bmQ6IzE0MTQxRjtjb2xvcjojRDREN0REfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIHRleHRhcmVhOmZvY3VzLC5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5pbnB1dC1ncm91cCBpbnB1dDpmb2N1c3tvdXRsaW5lOm5vbmU7Ym9yZGVyLWNvbG9yOiMwMEEzRkZ9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmlucHV0LWdyb3Vwe21hcmdpbi1ib3R0b206dmFyKC0tc3BhY2luZy1tZCl9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmlucHV0LWdyb3VwIGxhYmVse2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTowLjVyZW07Y29sb3I6I0Q0RDdERDtmb250LXdlaWdodDo1MDB9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmlucHV0LWdyb3VwIGlucHV0e3BhZGRpbmc6MC43NXJlbTtmb250LXNpemU6MTRweH0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciB0ZXh0YXJlYXtwYWRkaW5nOnZhcigtLXNwYWNpbmctc20pO2ZvbnQtZmFtaWx5OnZhcigtLWZvbnQtbW9ubywgXCJDb3VyaWVyIE5ld1wiLCBtb25vc3BhY2UpO2ZvbnQtc2l6ZToxMnB4O3Jlc2l6ZTp2ZXJ0aWNhbDttaW4taGVpZ2h0OjEyMHB4fS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIHRleHRhcmVhOjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDIxMiwyMTUsMjIxLDAuNik7b3BhY2l0eToxfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMjEyLDIxNSwyMjEsMC42KX0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDIxMiwyMTUsMjIxLDAuNik7b3BhY2l0eToxfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIHRleHRhcmVhOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDIxMiwyMTUsMjIxLDAuNil9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmNvZGUtYmxvY2t7YmFja2dyb3VuZDojMDcwNzBFO2NvbG9yOiNCN0I4RkY7cGFkZGluZzoxLjc1cmVtIDEuNzVyZW0gMS4yNXJlbTtib3JkZXItcmFkaXVzOjJweDtmb250LWZhbWlseTpcIklCTSBQbGV4IE1vbm9cIixtb25vc3BhY2U7Zm9udC1zaXplOjFyZW07bWFyZ2luOjJyZW0gMCAyLjI1cmVtO292ZXJmbG93LXg6c2Nyb2xsO292ZXJmbG93LXk6aGlkZGVuO2xpbmUtaGVpZ2h0OjEuN3JlbTt3aGl0ZS1zcGFjZTpwcmV9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnVybC1wYXR0ZXJuLWhpbnR7bWFyZ2luLWJvdHRvbTp2YXIoLS1zcGFjaW5nLXNtKTtwYWRkaW5nOnZhcigtLXNwYWNpbmctc20pO2JhY2tncm91bmQ6IzAwQTNGRjtib3JkZXI6MXB4IHNvbGlkICMwMEEzRkY7Ym9yZGVyLXJhZGl1czp2YXIoLS1ib3JkZXItcmFkaXVzKTtjb2xvcjojQkVGMEZGO2ZvbnQtc2l6ZToxM3B4fS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC51cmwtc3VnZ2VzdGlvbnN7bWFyZ2luLWJvdHRvbTp2YXIoLS1zcGFjaW5nLW1kKX0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAudXJsLXN1Z2dlc3Rpb25zIC5zdWdnZXN0aW9ucy1oZWFkZXJ7Y29sb3I6I2ZmZjttYXJnaW4tYm90dG9tOnZhcigtLXNwYWNpbmctc20pO2ZvbnQtc2l6ZToxNHB4fS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC51cmwtc3VnZ2VzdGlvbnMgLnN1Z2dlc3Rpb24tYnV0dG9ue2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmxlZnQ7bWFyZ2luLWJvdHRvbTp2YXIoLS1zcGFjaW5nLXNtKTtwYWRkaW5nOnZhcigtLXNwYWNpbmctc20pO2JhY2tncm91bmQ6IzE0MTQxRjtib3JkZXI6MXB4IHNvbGlkICMzODM4NDZ9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnVybC1zdWdnZXN0aW9ucyAuc3VnZ2VzdGlvbi1idXR0b246aG92ZXJ7Ym9yZGVyLWNvbG9yOiMwMEEzRkY7YmFja2dyb3VuZDojMTQxNDFGfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC51cmwtc3VnZ2VzdGlvbnMgLnN1Z2dlc3Rpb24tYnV0dG9uIC5zdWdnZXN0aW9uLXVybHtmb250LWZhbWlseTp2YXIoLS1mb250LW1vbm8sIFwiQ291cmllciBOZXdcIiwgbW9ub3NwYWNlKTtmb250LXNpemU6MTNweDtjb2xvcjojMDBBM0ZGO21hcmdpbi1ib3R0b206MnB4fS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC51cmwtc3VnZ2VzdGlvbnMgLnN1Z2dlc3Rpb24tYnV0dG9uIC5zdWdnZXN0aW9uLXByb2R1Y3R7Zm9udC1zaXplOjEycHg7Y29sb3I6I0Q0RDdERDtvcGFjaXR5OjAuOH0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAudXJsLXN1Z2dlc3Rpb25zIC5zdWdnZXN0aW9uLWJ1dHRvbiAuc3VnZ2VzdGlvbi1wYXR0ZXJue2ZvbnQtc2l6ZToxMXB4O2NvbG9yOiMwMEEzRkY7Zm9udC1zdHlsZTppdGFsaWM7bWFyZ2luLXRvcDoycHh9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnJlc3VsdHtkaXNwbGF5Om5vbmU7bWFyZ2luLXRvcDp2YXIoLS1zcGFjaW5nLXNtKTtwYWRkaW5nOnZhcigtLXNwYWNpbmctbWQpO2JvcmRlci1yYWRpdXM6dmFyKC0tYm9yZGVyLXJhZGl1cyk7YW5pbWF0aW9uOmZhZGVJbiB2YXIoLS10cmFuc2l0aW9uLW5vcm1hbCl9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnJlc3VsdC5zaG93e2Rpc3BsYXk6YmxvY2t9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnJlc3VsdC5zdWNjZXNze2JhY2tncm91bmQ6IzE0MTQxRjtib3JkZXItbGVmdDozcHggc29saWQgIzAwQTNGRjtjb2xvcjojRDREN0REfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5yZXN1bHQuZXJyb3J7YmFja2dyb3VuZDojRkZGN0Y0O2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjZDMwOTcxO2NvbG9yOiMyRjFGMjl9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnJlc3VsdC5pbmZve2JhY2tncm91bmQ6IzAwQTNGRjtib3JkZXItbGVmdDozcHggc29saWQgIzAwQTNGRjtjb2xvcjojQkVGMEZGfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5yZXN1bHQud2FybmluZ3tiYWNrZ3JvdW5kOnJnYmEoMjU1LDk3LDEzMywwLjEwMTk2MSk7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICNGRjg1NjQ7Y29sb3I6I0ZGQjZBMH0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuZGV0ZWN0ZWQtdmVyc2lvbntmb250LXNpemU6MS4zZW07Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojMDBBM0ZGO21hcmdpbi1ib3R0b206dmFyKC0tc3BhY2luZy1zbSk7cGFkZGluZzp2YXIoLS1zcGFjaW5nLXNtKTtiYWNrZ3JvdW5kOnJnYmEoMCwxNjMsMjU1LDAuMSk7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLWxlZnQ6NHB4IHNvbGlkICMwMEEzRkZ9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnVybC1wcmVmaWxsZWQtaW5kaWNhdG9ye2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6I0JFRjBGRjttYXJnaW4tYm90dG9tOjhweDtwYWRkaW5nOjRweCA4cHg7YmFja2dyb3VuZDpyZ2JhKDAsMTYzLDI1NSwwLjEpO2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjMDBBM0ZGfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5sb2FkaW5ne2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1sZWZ0OnZhcigtLXNwYWNpbmctc20pfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5sb2FkaW5nOmFmdGVye2NvbnRlbnQ6Jy4uLic7YW5pbWF0aW9uOmRvdHMgMS41cyBzdGVwcyg0LCBlbmQpIGluZmluaXRlfUBrZXlmcmFtZXMgZG90c3swJSwyMCV7Y29udGVudDonLid9NDAle2NvbnRlbnQ6Jy4uJ302MCUsMTAwJXtjb250ZW50OicuLi4nfX1Aa2V5ZnJhbWVzIGZhZGVJbntmcm9te29wYWNpdHk6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxMHB4KX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9fUBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCl7LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3J7cGFkZGluZzoxLjVyZW19LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmRldGVjdG9yLXRpdGxle2ZvbnQtc2l6ZToxLjVlbX0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAub3B0aW9uLWJ1dHRvbntwYWRkaW5nOjAuNzVyZW0gMXJlbTtmb250LXNpemU6MTRweH0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuc3VibWl0LWJ1dHRvbiwuaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuYmFjay1idXR0b24sLmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnJlc3RhcnQtYnV0dG9ue3BhZGRpbmc6dmFyKC0tc3BhY2luZy1zbSkgdmFyKC0tc3BhY2luZy1tZCk7Zm9udC1zaXplOjE0cHh9fUBtZWRpYSAobWF4LXdpZHRoOiA0ODBweCl7LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3J7cGFkZGluZzoxcmVtfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5kZXRlY3Rvci10aXRsZXtmb250LXNpemU6MS4zZW19LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmRldGVjdG9yLXN1YnRpdGxle2ZvbnQtc2l6ZTowLjllbX0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAucXVlc3Rpb24tdGV4dHtmb250LXNpemU6MWVtfX0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAucHJvZHVjdC1yYW5raW5ne21hcmdpbi1ib3R0b206dmFyKC0tc3BhY2luZy1zbSk7cGFkZGluZzowLjc1cmVtO2JvcmRlci1yYWRpdXM6dmFyKC0tYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLWxlZnQ6NHB4IHNvbGlkICMzODM4NDY7YmFja2dyb3VuZDojMTQxNDFGfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5wcm9kdWN0LXJhbmtpbmcudG9wLXJlc3VsdHtiYWNrZ3JvdW5kOnJnYmEoMCwxNjMsMjU1LDAuMSk7Ym9yZGVyLWNvbG9yOiMwMEEzRkZ9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnByb2R1Y3QtcmFua2luZyAucHJvZHVjdC10aXRsZXtmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTowLjI1cmVtfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5wcm9kdWN0LXJhbmtpbmcgLm1vc3QtbGlrZWx5LWxhYmVse2NvbG9yOiMwMEEzRkY7Zm9udC1zaXplOjAuOWVtO21hcmdpbi1sZWZ0OnZhcigtLXNwYWNpbmctc20pfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5wcm9kdWN0LXJhbmtpbmcgLnByb2R1Y3QtZGV0YWlsc3tjb2xvcjojRDREN0REO2ZvbnQtc2l6ZTowLjllbTttYXJnaW4tdG9wOjAuMjVyZW07b3BhY2l0eTowLjh9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmdyYWZhbmEtdGlwc3ttYXJnaW4tdG9wOnZhcigtLXNwYWNpbmctbWQpO3BhZGRpbmc6MXJlbTtiYWNrZ3JvdW5kOnJnYmEoMCwxNjMsMjU1LDAuMSk7Ym9yZGVyLWxlZnQ6NHB4IHNvbGlkICMwMEEzRkY7Ym9yZGVyLXJhZGl1czp2YXIoLS1ib3JkZXItcmFkaXVzKX0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuZ3JhZmFuYS10aXBzIC50aXBzLXRpdGxle21hcmdpbjowIDAgdmFyKC0tc3BhY2luZy1zbSkgMDtjb2xvcjojMDBBM0ZGO2ZvbnQtc2l6ZToxLjFlbX0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuZ3JhZmFuYS10aXBzIC50aXBzLWRlc2NyaXB0aW9ue21hcmdpbjowIDAgdmFyKC0tc3BhY2luZy1zbSkgMDtmb250LXNpemU6MC45ZW19LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmdyYWZhbmEtdGlwcyAudGlwcy1saXN0e21hcmdpbjowO3BhZGRpbmctbGVmdDoxLjI1cmVtO2ZvbnQtc2l6ZTowLjg1ZW19LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmdyYWZhbmEtdGlwcyAudGlwcy1saXN0IGxpe21hcmdpbi1ib3R0b206MC4yNXJlbX0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuZ3JhZmFuYS10aXBzIC50aXBzLWxpc3QgY29kZXtiYWNrZ3JvdW5kOnJnYmEoMCwxNjMsMjU1LDAuMTUpO3BhZGRpbmc6MC4xMjVyZW0gMC4yNXJlbTtib3JkZXItcmFkaXVzOjNweDtmb250LXNpemU6MC45ZW19LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmdyYWZhbmEtdGlwcyAudGlwcy1saW5re21hcmdpbjp2YXIoLS1zcGFjaW5nLXNtKSAwIDAgMDtmb250LXNpemU6MC44NWVtfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5leHBlY3RlZC1yZXN1bHRze21hcmdpbjoxcmVtIDB9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmV4cGVjdGVkLXJlc3VsdHMgLnJlc3VsdHMtdGl0bGV7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206MC41cmVtfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5leHBlY3RlZC1yZXN1bHRzIC5yZXN1bHRzLWxpc3R7bWFyZ2luOjA7cGFkZGluZy1sZWZ0OjFyZW07Zm9udC1zaXplOjAuOWVtfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5leHBlY3RlZC1yZXN1bHRzIC5yZXN1bHRzLWxpc3QgbGl7bWFyZ2luLWJvdHRvbTowLjI1cmVtfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5xdWVzdGlvbi10ZXh0LXNwYWNlZHttYXJnaW4tdG9wOjFyZW07Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZTowLjk1ZW19LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnF1ZXN0aW9uLW9wdGlvbnN7bWFyZ2luLXRvcDoxcmVtfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5jb21tYW5kLWhlbHB7bWFyZ2luLXRvcDp2YXIoLS1zcGFjaW5nLW1kKX0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuZG9jLWxpbmssLmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmFzay1haS1vcGVue2NvbG9yOiMwMEEzRkY7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtkaXNwbGF5OmlubGluZS1ibG9ja30uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuZG9jLWxpbms6aG92ZXIsLmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmFzay1haS1vcGVuOmhvdmVye2NvbG9yOiNmZmZ9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmFzay1haS1vcGVue21hcmdpbi1sZWZ0OjAuNXJlbX0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAubWFudWFsLW91dHB1dHttYXJnaW46MXJlbSAwO3BhZGRpbmc6dmFyKC0tc3BhY2luZy1zbSk7YmFja2dyb3VuZDojMTQxNDFGO2JvcmRlci1sZWZ0OjRweCBzb2xpZCAjMDBBM0ZGO2JvcmRlci1yYWRpdXM6dmFyKC0tYm9yZGVyLXJhZGl1cyl9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmFjdGlvbi1zZWN0aW9ue21hcmdpbi10b3A6dmFyKC0tc3BhY2luZy1tZCl9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnF1aWNrLXJlZmVyZW5jZXttYXJnaW4tdG9wOjJyZW19LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnF1aWNrLXJlZmVyZW5jZSBkZXRhaWxze2JvcmRlcjoxcHggc29saWQgIzM4Mzg0Njtib3JkZXItcmFkaXVzOnZhcigtLWJvcmRlci1yYWRpdXMpO3BhZGRpbmc6MC41cmVtfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5xdWljay1yZWZlcmVuY2UgLnJlZmVyZW5jZS1zdW1tYXJ5e2N1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtwYWRkaW5nOjAuNXJlbSAwO3VzZXItc2VsZWN0Om5vbmU7Y29sb3I6IzAwQTNGRn0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAucXVpY2stcmVmZXJlbmNlIC5yZWZlcmVuY2Utc3VtbWFyeTpob3Zlcntjb2xvcjojZmZmfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5leHBhbmRhYmxlLXN1bW1hcnl7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO3BhZGRpbmc6MC41cmVtIDA7dXNlci1zZWxlY3Q6bm9uZTtjb2xvcjojMDBBM0ZGO3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmctbGVmdDoxLjVyZW19LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmV4cGFuZGFibGUtc3VtbWFyeTpob3Zlcntjb2xvcjojZmZmfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5leHBhbmRhYmxlLXN1bW1hcnk6Om1hcmtlciwuaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuZXhwYW5kYWJsZS1zdW1tYXJ5Ojotd2Via2l0LWRldGFpbHMtbWFya2Vye2Rpc3BsYXk6bm9uZX0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAuZXhwYW5kYWJsZS1zdW1tYXJ5OjpiZWZvcmV7Y29udGVudDonKyc7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSk7d2lkdGg6MXJlbTtoZWlnaHQ6MXJlbTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojMDBBM0ZGO2JvcmRlcjoxcHggc29saWQgIzAwQTNGRjtib3JkZXItcmFkaXVzOjNweDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fWRldGFpbHNbb3Blbl0gLmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmV4cGFuZGFibGUtc3VtbWFyeTo6YmVmb3Jle2NvbnRlbnQ6J+KIkid9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLmV4cGFuZGFibGUtc3VtbWFyeTpob3Zlcjo6YmVmb3Jle2NvbG9yOiNmZmY7Ym9yZGVyLWNvbG9yOiNmZmZ9LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnF1aWNrLXJlZmVyZW5jZXttYXJnaW4tdG9wOjJyZW19LmluZmx1eGRiLXZlcnNpb24tZGV0ZWN0b3IgLnF1aWNrLXJlZmVyZW5jZSBkZXRhaWxze2JvcmRlcjoxcHggc29saWQgIzM4Mzg0Njtib3JkZXItcmFkaXVzOnZhcigtLWJvcmRlci1yYWRpdXMpO3BhZGRpbmc6MC41cmVtfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5xdWljay1yZWZlcmVuY2UgLnJlZmVyZW5jZS10YWJsZXttYXJnaW4tdG9wOjFyZW07d2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Zm9udC1zaXplOjAuOWVtfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5xdWljay1yZWZlcmVuY2UgLnJlZmVyZW5jZS10YWJsZSB0aCwuaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAucXVpY2stcmVmZXJlbmNlIC5yZWZlcmVuY2UtdGFibGUgdGR7cGFkZGluZzowLjVyZW07dGV4dC1hbGlnbjpsZWZ0O2JvcmRlcjoxcHggc29saWQgIzM4Mzg0Nn0uaW5mbHV4ZGItdmVyc2lvbi1kZXRlY3RvciAucXVpY2stcmVmZXJlbmNlIC5yZWZlcmVuY2UtdGFibGUgdGh7cGFkZGluZzowLjc1cmVtIDAuNXJlbTtiYWNrZ3JvdW5kOnJnYmEoMCwxNjMsMjU1LDAuMSk7Zm9udC13ZWlnaHQ6NjAwfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5xdWljay1yZWZlcmVuY2UgLnJlZmVyZW5jZS10YWJsZSB0Ym9keSB0cjpudGgtY2hpbGQoZXZlbil7YmFja2dyb3VuZDpyZ2JhKDIxMiwyMTUsMjIxLDAuMDIpfS5pbmZsdXhkYi12ZXJzaW9uLWRldGVjdG9yIC5xdWljay1yZWZlcmVuY2UgLnJlZmVyZW5jZS10YWJsZSAucHJvZHVjdC1uYW1le2ZvbnQtd2VpZ2h0OjYwMH0uZm9ybWF0LXNlbGVjdG9ye3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXRvcDowLjVyZW19LnRpdGxlIC5mb3JtYXQtc2VsZWN0b3J7bWFyZ2luLWxlZnQ6YXV0b30uZm9ybWF0LXNlbGVjdG9yX19idXR0b257ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjAuNXJlbTtwYWRkaW5nOjAuNXJlbSAwLjc1cmVtO2JhY2tncm91bmQ6IzFBMUEyQTtjb2xvcjojRDREN0REO2JvcmRlcjoxcHggc29saWQgIzMzMzM0Njtib3JkZXItcmFkaXVzOjJweDtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDA7bGluZS1oZWlnaHQ6MTtjdXJzb3I6cG9pbnRlcjt0cmFuc2l0aW9uOmFsbCAwLjJzIGVhc2U7d2hpdGUtc3BhY2U6bm93cmFwO2JveC1zaGFkb3c6MnB4IDJweCA2cHggcmdiYSgxNSwxNCwyMSwwLjUpfS5mb3JtYXQtc2VsZWN0b3JfX2J1dHRvbjpob3Zlcntib3JkZXItY29sb3I6IzAwQTNGRjtib3gtc2hhZG93OjFweCAxcHggMTBweCByZ2JhKDAsMTYzLDI1NSwwLjUpfS5mb3JtYXQtc2VsZWN0b3JfX2J1dHRvbjpmb2N1c3tvdXRsaW5lOjJweCBzb2xpZCAjMDBBM0ZGO291dGxpbmUtb2Zmc2V0OjJweH0uZm9ybWF0LXNlbGVjdG9yX19idXR0b25bYXJpYS1leHBhbmRlZD0ndHJ1ZSdde2JvcmRlci1jb2xvcjojMDBBM0ZGfS5mb3JtYXQtc2VsZWN0b3JfX2J1dHRvblthcmlhLWV4cGFuZGVkPSd0cnVlJ10gLmZvcm1hdC1zZWxlY3Rvcl9fYnV0dG9uLWFycm93IHN2Z3t0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9LmZvcm1hdC1zZWxlY3Rvcl9fYnV0dG9uLWljb257ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoxNnB4O2hlaWdodDoxNnB4fS5mb3JtYXQtc2VsZWN0b3JfX2J1dHRvbi1pY29uIHN2Z3t3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2NvbG9yOiNENEQ3RER9LmZvcm1hdC1zZWxlY3Rvcl9fYnV0dG9uLXRleHR7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5mb3JtYXQtc2VsZWN0b3JfX2J1dHRvbi1hcnJvd3tkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7bWFyZ2luLWxlZnQ6MC4yNXJlbX0uZm9ybWF0LXNlbGVjdG9yX19idXR0b24tYXJyb3cgc3Zne3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMC4ycyBlYXNlfS5mb3JtYXQtc2VsZWN0b3JfX2Ryb3Bkb3due3Bvc2l0aW9uOmZpeGVkO21pbi13aWR0aDoyODBweDttYXgtd2lkdGg6MzIwcHg7YmFja2dyb3VuZDojMTQxNDFGO2JvcmRlcjoxcHggc29saWQgIzMzMzM0Njtib3JkZXItcmFkaXVzOjhweDtib3gtc2hhZG93OjJweCAycHggNnB4ICMwNzA3MEU7cGFkZGluZzowLjVyZW07ei1pbmRleDoxMDAwMDtvcGFjaXR5OjA7dmlzaWJpbGl0eTpoaWRkZW47dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLThweCk7dHJhbnNpdGlvbjphbGwgMC4ycyBlYXNlO3BvaW50ZXItZXZlbnRzOm5vbmV9LmZvcm1hdC1zZWxlY3Rvcl9fZHJvcGRvd24uaXMtb3BlbntvcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApO3BvaW50ZXItZXZlbnRzOmF1dG99LmZvcm1hdC1zZWxlY3Rvcl9fb3B0aW9ue2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2dhcDowLjc1cmVtO3dpZHRoOjEwMCU7cGFkZGluZzowLjc1cmVtO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6I0Q0RDdERDtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjJweDt0ZXh0LWFsaWduOmxlZnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDAuMTVzIGVhc2V9LmZvcm1hdC1zZWxlY3Rvcl9fb3B0aW9uOmhvdmVye2JhY2tncm91bmQ6IzFBMUEyQTtjb2xvcjojMDBBM0ZGfS5mb3JtYXQtc2VsZWN0b3JfX29wdGlvbjpmb2N1c3tvdXRsaW5lOjJweCBzb2xpZCAjMDBBM0ZGO291dGxpbmUtb2Zmc2V0Oi0ycHh9LmZvcm1hdC1zZWxlY3Rvcl9fb3B0aW9uOm5vdCg6bGFzdC1jaGlsZCl7bWFyZ2luLWJvdHRvbTowLjI1cmVtfS5mb3JtYXQtc2VsZWN0b3JfX2ljb257ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2ZsZXgtc2hyaW5rOjA7bWFyZ2luLXRvcDoycHh9LmZvcm1hdC1zZWxlY3Rvcl9faWNvbiBzdmd7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtzdHJva2U6I0Q0RDdERH0uZm9ybWF0LXNlbGVjdG9yX19pY29uIHN2ZyBbZmlsbF06bm90KFtmaWxsPVwibm9uZVwiXSk6bm90KFtmaWxsPVwid2hpdGVcIl0pe2ZpbGw6I0Q0RDdERH0uZm9ybWF0LXNlbGVjdG9yX19sYWJlbC1ncm91cHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDowLjI1cmVtO2ZsZXg6MTttaW4td2lkdGg6MH0uZm9ybWF0LXNlbGVjdG9yX19sYWJlbHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDowLjVyZW07Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwO2xpbmUtaGVpZ2h0OjEuMztjb2xvcjojRDREN0REfS5mb3JtYXQtc2VsZWN0b3JfX2V4dGVybmFse2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZToxMnB4O2NvbG9yOiNENEQ3REQ7bWFyZ2luLWxlZnQ6MC4yNXJlbTtvcGFjaXR5OjAuN30uZm9ybWF0LXNlbGVjdG9yX19zdWJsYWJlbHtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjQ7Y29sb3I6I0Q0RDdERH1AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpey5mb3JtYXQtc2VsZWN0b3J7bWFyZ2luLWxlZnQ6MDttYXJnaW4tdG9wOjFyZW19LmZvcm1hdC1zZWxlY3Rvcl9fZHJvcGRvd257cmlnaHQ6YXV0bztsZWZ0OjA7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOjEwMCV9fS5mb3JtYXQtc2VsZWN0b3JfX2Ryb3Bkb3due2lzb2xhdGlvbjppc29sYXRlfUBrZXlmcmFtZXMgc2xpZGVJblVwe2Zyb217dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSk7b3BhY2l0eTowfXRve3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApO29wYWNpdHk6MX19Kntib3gtc2l6aW5nOmJvcmRlci1ib3h9XG5cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhcmstdGhlbWUuY3NzLm1hcCAqLyJdfQ== */ \ No newline at end of file diff --git a/pr-preview/pr-6948/dark-theme.56ede7c71d3385876a1c762e207372a1699e829612d789f952885f820d50394a.css b/pr-preview/pr-6948/dark-theme.56ede7c71d3385876a1c762e207372a1699e829612d789f952885f820d50394a.css new file mode 100644 index 000000000..e058229c4 --- /dev/null +++ b/pr-preview/pr-6948/dark-theme.56ede7c71d3385876a1c762e207372a1699e829612d789f952885f820d50394a.css @@ -0,0 +1,2 @@ +.sidebar{transition:all .2s}.sidebar .search-and-nav-toggle,.sidebar #nav-tree{opacity:1;transition:all .3s;transition-delay:.1s}.search-btn{opacity:0;width:0;overflow:visible;transition:opacity .2s, width .2s .2s !important} +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFNBQVMsa0JBQWtCLENBQUMsbURBQW1ELFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLFNBQVMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsZ0RBQWdEIiwiZmlsZSI6InN0ZGluIiwic291cmNlc0NvbnRlbnQiOlsiLnNpZGViYXJ7dHJhbnNpdGlvbjphbGwgLjJzfS5zaWRlYmFyIC5zZWFyY2gtYW5kLW5hdi10b2dnbGUsLnNpZGViYXIgI25hdi10cmVle29wYWNpdHk6MTt0cmFuc2l0aW9uOmFsbCAuM3M7dHJhbnNpdGlvbi1kZWxheTouMXN9LnNlYXJjaC1idG57b3BhY2l0eTowO3dpZHRoOjA7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzLCB3aWR0aCAuMnMgLjJzICFpbXBvcnRhbnR9XG5cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhcmstdGhlbWUuY3NzLm1hcCAqLyJdfQ== */ \ No newline at end of file diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/administration/manage/clusters/rebalance/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/administration/manage/clusters/rebalance/index.html new file mode 100644 index 000000000..d7bdec698 --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/administration/manage/clusters/rebalance/index.html @@ -0,0 +1,3350 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Rebalance InfluxDB Enterprise v1 clusters | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Rebalance InfluxDB Enterprise v1 clusters

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Introduction

+

This guide describes how to manually rebalance an InfluxDB Enterprise cluster. +Rebalancing a cluster involves two primary goals:

+
    +
  • Evenly distribute +shards across all data nodes in the +cluster
  • +
  • Ensure that every +shard is on n number of nodes, where n is determined by the retention policy’s +replication factor
  • +
+

Rebalancing a cluster is essential for cluster health. +Perform a rebalance if you add a new data node to your cluster. +The proper rebalance path depends on the purpose of the new data node. +If you added a data node to expand the disk size of the cluster or increase +write throughput, follow the steps in +Rebalance Procedure 1. +If you added a data node to increase data availability for queries and query +throughput, follow the steps in +Rebalance Procedure 2.

+

Requirements

+

The following sections assume that you already added a new data node to the +cluster, and they use the +influxd-ctl tool available on +all meta nodes.

+ +
+ + +

Stop writing data before rebalancing

+

Before you begin, stop writing historical data to InfluxDB. +Historical data have timestamps that occur at anytime in the past. +Performing a rebalance while writing historical data can lead to data loss.

+
+ +
+ + +

Risks of rebalancing with future data

+

Truncating shards that contain data with future timestamps (such as forecast or prediction data) +can lead to overlapping shards and data duplication. +For more information, see truncate-shards and future data +or contact InfluxData support.

+
+

Rebalance Procedure 1: Rebalance a cluster to create space

+

For demonstration purposes, the next steps assume that you added a third +data node to a previously two-data-node cluster that has a +replication factor of +two. +This rebalance procedure is applicable for different cluster sizes and +replication factors, but some of the specific, user-provided values will depend +on that cluster size.

+

Rebalance Procedure 1 focuses on how to rebalance a cluster after adding a +data node to expand the total disk capacity of the cluster. +In the next steps, you will safely move shards from one of the two original data +nodes to the new data node.

+

Step 1: Truncate hot shards

+

Hot shards are shards that currently receive writes. +Performing any action on a hot shard can lead to data inconsistency within the +cluster which requires manual intervention from the user.

+ +
+ + +

Risks of rebalancing with future data

+

Truncating shards that contain data with future timestamps (such as forecast or prediction data) +can lead to overlapping shards and data duplication. +For more information, see truncate-shards and future data +or contact InfluxData support.

+
+

To prevent data inconsistency, truncate shards before moving any shards +across data nodes. +The following command truncates all hot shards and creates new shards to write data to:

+ + +
influxd-ctl truncate-shards
+

The expected output of this command is:

+ + +
Truncated shards.
+

New shards are automatically distributed across all data nodes, and InfluxDB writes new points to them. +Previous writes are stored in cold shards.

+

After truncating shards, you can redistribute cold shards without data inconsistency. +Hot and new shards are evenly distributed and require no further intervention.

+

Step 2: Identify Cold Shards

+

In this step, you identify the cold shards that you will copy to the new data node +and remove from one of the original two data nodes.

+

The following command lists every shard in our cluster:

+ + +
influxd-ctl show-shards
+

The output is similar to the following:

+ + +
Shards
+==========
+ID   Database    Retention Policy   Desired Replicas   [...]   End                               Owners
+21   telegraf    autogen            2                  [...]   2017-01-26T18:00:00Z              [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088}]
+22   telegraf    autogen            2                  [...]   2017-01-26T18:05:36.418734949Z*   [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088}]
+24   telegraf    autogen            2                  [...]   2017-01-26T19:00:00Z              [{5 enterprise-data-02:8088} {6 enterprise-data-03:8088}]
+

The sample output includes three shards. +The first two shards are cold shards. +The timestamp in the End column occurs in the past (assume that the current +time is just after 2017-01-26T18:05:36.418734949Z), and the shards’ owners +are the two original data nodes: enterprise-data-01:8088 and +enterprise-data-02:8088. +The second shard is the truncated shard; truncated shards have an asterix (*) +on the timestamp in the End column.

+

The third shard is the newly-created hot shard; the timestamp in the End +column is in the future (again, assume that the current time is just after +2017-01-26T18:05:36.418734949Z), and the shard’s owners include one of the +original data nodes (enterprise-data-02:8088) and the new data node +(enterprise-data-03:8088). +That hot shard and any subsequent shards require no attention during +the rebalance process.

+

Identify the cold shards that you’d like to move from one of the original two +data nodes to the new data node. +Take note of the cold shard’s ID (for example: 22) and the TCP address of +one of its owners in the Owners column (for example: +enterprise-data-01:8088).

+ +
+ + +

To determine the size of shards in +your cluster, enter the following command:

+ + +
find /var/lib/influxdb/data/ -mindepth 3 -type d -exec du -h {} \;
+
+

In general, we recommend moving larger shards to the new data node to increase the +available disk space on the original data nodes.

+

Moving shards will impact network traffic.

+

Step 3: Copy Cold Shards

+

Next, copy the relevant cold shards to the new data node with the syntax below. +Repeat this command for every cold shard that you’d like to move to the +new data node.

+ + +
influxd-ctl copy-shard <source_TCP_address> <destination_TCP_address> <shard_ID>
+

Where source_TCP_address is the address that you noted in step 2, +destination_TCP_address is the TCP address of the new data node, and shard_ID +is the ID of the shard that you noted in step 2.

+

The expected output of the command is:

+ + +
Copied shard <shard_ID> from <source_TCP_address> to <destination_TCP_address>
+

Step 4: Confirm the Copied Shards

+

Confirm that the TCP address of the new data node appears in the Owners column +for every copied shard:

+ + +
influxd-ctl show-shards
+

The expected output shows that the copied shard now has three owners:

+ + +
Shards
+==========
+ID   Database    Retention Policy   Desired Replicas   [...]   End                               Owners
+22   telegraf    autogen            2                  [...]   2017-01-26T18:05:36.418734949Z*   [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088} {6 enterprise-data-03:8088}]
+

In addition, verify that the copied shards appear in the new data node’s shard +directory and match the shards in the source data node’s shard directory. +Shards are located in +/var/lib/influxdb/data/<database>/<retention_policy>/<shard_ID>.

+

Here’s an example of the correct output for shard 22:

+ + +
# On the source data node (enterprise-data-01)
+
+~# ls /var/lib/influxdb/data/telegraf/autogen/22
+000000001-000000001.tsm # 👍
+
+# On the new data node (enterprise-data-03)
+
+~# ls /var/lib/influxdb/data/telegraf/autogen/22
+000000001-000000001.tsm # 👍
+

It is essential that every copied shard appears on the new data node both +in the influxd-ctl show-shards output and in the shard directory. +If a shard does not pass both of the tests above, please repeat step 3.

+

Step 5: Remove Unnecessary Cold Shards

+

Next, remove the copied shard from the original data node with the command below. +Repeat this command for every cold shard that you’d like to remove from one of +the original data nodes. +Removing a shard is an irrecoverable, destructive action; please be +cautious with this command.

+ + +
influxd-ctl remove-shard <source_TCP_address> <shard_ID>
+

Where source_TCP_address is the TCP address of the original data node and +shard_ID is the ID of the shard that you noted in step 2.

+

The expected output of the command is:

+ + +
Removed shard <shard_ID> from <source_TCP_address>
+

Step 6: Confirm the Rebalance

+

For every relevant shard, confirm that the TCP address of the new data node and +only one of the original data nodes appears in the Owners column:

+ + +
influxd-ctl show-shards
+

The expected output shows that the copied shard now has only two owners:

+ + +
Shards
+==========
+ID   Database    Retention Policy   Desired Replicas   [...]   End                               Owners
+22   telegraf    autogen            2                  [...]   2017-01-26T18:05:36.418734949Z*   [{5 enterprise-data-02:8088} {6 enterprise-data-03:8088}]
+

That’s it. +You’ve successfully rebalanced your cluster; you expanded the available disk +size on the original data nodes and increased the cluster’s write throughput.

+

Rebalance Procedure 2: Rebalance a cluster to increase availability

+

For demonstration purposes, the next steps assume that you added a third +data node to a previously two-data-node cluster that has a +replication factor of +two. +This rebalance procedure is applicable for different cluster sizes and +replication factors, but some of the specific, user-provided values will depend +on that cluster size.

+

Rebalance Procedure 2 focuses on how to rebalance a cluster to improve availability +and query throughput. +In the next steps, you will increase the retention policy’s replication factor and +safely copy shards from one of the two original data nodes to the new data node.

+

Step 1: Update the Retention Policy

+

Update +every retention policy to have a replication factor of three. +This step ensures that the system automatically distributes all newly-created +shards across the three data nodes in the cluster.

+

The following query increases the replication factor to three. +Run the query on any data node for each retention policy and database. +Here, we use InfluxDB’s CLI to execute the query:

+ + +
ALTER RETENTION POLICY "<retention_policy_name>" ON "<database_name>" REPLICATION 3
+

A successful ALTER RETENTION POLICY query returns no results. +Use the +SHOW RETENTION POLICIES query +to verify the new replication factor.

+

Example:

+ + +
> SHOW RETENTION POLICIES ON "telegraf"
+
+name     duration  shardGroupDuration  replicaN  default
+----     --------  ------------------  --------  -------
+autogen  0s        1h0m0s              3 #👍     true
+

Step 2: Truncate hot shards

+

Hot shards are shards that currently receive writes. +Performing any action on a hot shard can lead to data inconsistency within the +cluster which requires manual intervention from the user.

+ +
+ + +

Risks of rebalancing with future data

+

Truncating shards that contain data with future timestamps (such as forecast or prediction data) +can lead to overlapping shards and data duplication. +For more information, see truncate-shards and future data +or contact InfluxData support.

+
+

To prevent data inconsistency, truncate shards before copying any shards +to the new data node. +The following command truncates all hot shards and creates new shards to write data to:

+ + +
influxd-ctl truncate-shards
+

The expected output of this command is:

+ + +
Truncated shards.
+

New shards are automatically distributed across all data nodes, and InfluxDB writes new points to them. +Previous writes are stored in cold shards.

+

After truncating shards, you can redistribute cold shards without data inconsistency. +Hot and new shards are evenly distributed and require no further intervention.

+

Step 3: Identify Cold Shards

+

In this step, you identify the cold shards that you will copy to the new data node.

+

The following command lists every shard in your cluster:

+ + +
influxd-ctl show-shards
+

The expected output is similar to the items in the codeblock below:

+ + +
Shards
+==========
+ID   Database    Retention Policy   Desired Replicas   [...]   End                               Owners
+21   telegraf    autogen            3                  [...]   2017-01-26T18:00:00Z              [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088}]
+22   telegraf    autogen            3                  [...]   2017-01-26T18:05:36.418734949Z*   [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088}]
+24   telegraf    autogen            3                  [...]   2017-01-26T19:00:00Z              [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088} {6 enterprise-data-03:8088}]
+

The sample output includes three shards. +The first two shards are cold shards. +The timestamp in the End column occurs in the past (assume that the current +time is just after 2017-01-26T18:05:36.418734949Z), and the shards’ owners +are the two original data nodes: enterprise-data-01:8088 and +enterprise-data-02:8088. +The second shard is the truncated shard; truncated shards have an asterix (*) +on the timestamp in the End column.

+

The third shard is the newly-created hot shard; the timestamp in the End +column is in the future (again, assume that the current time is just after +2017-01-26T18:05:36.418734949Z), and the shard’s owners include all three +data nodes: enterprise-data-01:8088, enterprise-data-02:8088, and +enterprise-data-03:8088. +That hot shard and any subsequent shards require no attention during +the rebalance process.

+

Identify the cold shards that you’d like to copy from one of the original two +data nodes to the new data node. +Take note of the cold shard’s ID (for example: 22) and the TCP address of +one of its owners in the Owners column (for example: +enterprise-data-01:8088).

+

Step 4: Copy Cold Shards

+

Next, copy the relevant cold shards to the new data node with the syntax below. +Repeat this command for every cold shard that you’d like to move to the +new data node.

+ + +
influxd-ctl copy-shard <source_TCP_address> <destination_TCP_address> <shard_ID>
+

Where source_TCP_address is the address that you noted in step 3, +destination_TCP_address is the TCP address of the new data node, and shard_ID +is the ID of the shard that you noted in step 3.

+

The expected output of the command is:

+ + +
Copied shard <shard_ID> from <source_TCP_address> to <destination_TCP_address>
+

Step 5: Confirm the Rebalance

+

Confirm that the TCP address of the new data node appears in the Owners column +for every copied shard:

+ + +
influxd-ctl show-shards
+

The expected output shows that the copied shard now has three owners:

+ + +
Shards
+==========
+ID   Database    Retention Policy   Desired Replicas   [...]   End                               Owners
+22   telegraf    autogen            3                  [...]   2017-01-26T18:05:36.418734949Z*   [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088} {6 enterprise-data-03:8088}]
+

In addition, verify that the copied shards appear in the new data node’s shard +directory and match the shards in the source data node’s shard directory. +Shards are located in +/var/lib/influxdb/data/<database>/<retention_policy>/<shard_ID>.

+

Here’s an example of the correct output for shard 22:

+ + +
# On the source data node (enterprise-data-01)
+
+~# ls /var/lib/influxdb/data/telegraf/autogen/22
+000000001-000000001.tsm # 👍
+
+# On the new data node (enterprise-data-03)
+
+~# ls /var/lib/influxdb/data/telegraf/autogen/22
+000000001-000000001.tsm # 👍
+

That’s it. +You’ve successfully rebalanced your cluster and increased data availability for +queries and query throughput.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/administration/manage/users-and-permissions/authorization-influxql/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/administration/manage/users-and-permissions/authorization-influxql/index.html new file mode 100644 index 000000000..c60492878 --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/administration/manage/users-and-permissions/authorization-influxql/index.html @@ -0,0 +1,3261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Manage authorization with InfluxQL | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Manage authorization with InfluxQL

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Important
+Authentication must be enabled before authorization can be managed. +If authentication is not enabled, permissions will not be enforced. +See “Enable authentication”.

+
+ +
+

We recommend using Chronograf +and/or the Enterprise meta API +to manage InfluxDB Enterprise users and roles.

+ +
+ + +
+

Outside of creating users, +we recommend operators do not mix and match InfluxQL +with other authorization management methods (Chronograf and the API). +Doing so may lead to inconsistencies in user permissions.

+ +
+ +

This page shows examples of basic user and permission management using InfluxQL statements. +However, only a subset of Enterprise permissions can be managed with InfluxQL. +Using InfluxQL, you can perform the following actions:

+
    +
  • Create new users and assign them either the admin role (or no role).
  • +
  • grant READ and/or WRITE permissions to users. (READ, WRITE, ALL)
  • +
  • REVOKE permissions from users.
  • +
  • GRANT or REVOKE specific database access to individual users.
  • +
+

However, InfluxDB Enterprise offers an expanded set of permissions. +You can use the Meta API and Chronograf to access and assign these more granular permissions to individual users.

+

The InfluxDB Enterprise meta API +provides the most comprehensive way to manage users, roles, permission +and other fine grained authorization (FGA) capabilities.

+

Non-admin users

+

When authentication is enabled, +a new non-admin user has no access to any database +until they are specifically granted privileges to a database +by an admin user.

+

Non-admin users can SHOW +the databases for which they have ReadData or WriteData permissions.

+

User management commands

+

User management commands apply to either +admin users, +non-admin users, +or both.

+

For more information about these commands, +see Database management and +Continuous queries.

+

Manage admin users

+

Create an admin user with:

+ + +
CREATE USER admin WITH PASSWORD '<password>' WITH ALL PRIVILEGES
+ +
+

Repeating the exact CREATE USER statement is idempotent. +If any values change the database will return a duplicate user error.

+ + +
> CREATE USER todd WITH PASSWORD '123456' WITH ALL PRIVILEGES
+> CREATE USER todd WITH PASSWORD '123456' WITH ALL PRIVILEGES
+> CREATE USER todd WITH PASSWORD '123' WITH ALL PRIVILEGES
+ERR: user already exists
+> CREATE USER todd WITH PASSWORD '123456'
+ERR: user already exists
+> CREATE USER todd WITH PASSWORD '123456' WITH ALL PRIVILEGES
+>
+ +
+ +
GRANT administrative privileges to an existing user
+ + +
GRANT ALL PRIVILEGES TO <username>
+
REVOKE administrative privileges from an admin user
+ + +
REVOKE ALL PRIVILEGES FROM <username>
+
SHOW all existing users and their admin status
+ + +
SHOW USERS
+
CLI Example
+ + +
> SHOW USERS
+user 	   admin
+todd     false
+paul     true
+hermione false
+dobby    false
+

Manage non-admin users

+
CREATE a new non-admin user
+ + +
CREATE USER <username> WITH PASSWORD '<password>'
+
CLI example
+ + +
CREATE USER todd WITH PASSWORD 'influxdb41yf3'
+CREATE USER alice WITH PASSWORD 'wonder\'land'
+CREATE USER "rachel_smith" WITH PASSWORD 'asdf1234!'
+CREATE USER "monitoring-robot" WITH PASSWORD 'XXXXX'
+CREATE USER "$savyadmin" WITH PASSWORD 'm3tr1cL0v3r'
+ +
+
Important notes about providing user credentials
+
    +
  • The user value must be wrapped in double quotes if +it starts with a digit, is an InfluxQL keyword, contains a hyphen, +or includes any special characters (for example: !@#$%^&*()-).
  • +
  • The password string must be wrapped in single quotes. +Do not include the single quotes when authenticating requests. +We recommend avoiding the single quote (') and backslash (\) characters in passwords. +For passwords that include these characters, escape the special character with a backslash +(e.g. (\') when creating the password and when submitting authentication requests.
  • +
  • Repeating the exact CREATE USER statement is idempotent. +If any values change the database will return a duplicate user error.
  • +
+
CLI example
+ + +
> CREATE USER "todd" WITH PASSWORD '123456'
+> CREATE USER "todd" WITH PASSWORD '123456'
+> CREATE USER "todd" WITH PASSWORD '123'
+ERR: user already exists
+> CREATE USER "todd" WITH PASSWORD '123456'
+> CREATE USER "todd" WITH PASSWORD '123456' WITH ALL PRIVILEGES
+ERR: user already exists
+> CREATE USER "todd" WITH PASSWORD '123456'
+>
+ +
+ +
GRANT READ, WRITE or ALL database privileges to an existing user
+ + +
GRANT [READ,WRITE,ALL] ON <database_name> TO <username>
+

CLI examples:

+

GRANT READ access to todd on the NOAA_water_database database:

+ + +
GRANT READ ON "NOAA_water_database" TO "todd"
+

GRANT ALL access to todd on the NOAA_water_database database:

+ + +
GRANT ALL ON "NOAA_water_database" TO "todd"
+
REVOKE READ, WRITE, or ALL database privileges from an existing user
+ + +
REVOKE [READ,WRITE,ALL] ON <database_name> FROM <username>
+

CLI examples:

+

REVOKE ALL privileges from todd on the NOAA_water_database database:

+ + +
REVOKE ALL ON "NOAA_water_database" FROM "todd"
+

REVOKE WRITE privileges from todd on the NOAA_water_database database:

+ + +
REVOKE WRITE ON "NOAA_water_database" FROM "todd"
+ +
+

If a user with ALL privileges has WRITE privileges revoked, they are left with READ privileges, and vice versa.

+ +
+ +
SHOW a user’s database privileges
+ + +
SHOW GRANTS FOR <user_name>
+

CLI example:

+ + +
> SHOW GRANTS FOR "todd"
+database		            privilege
+NOAA_water_database	        WRITE
+another_database_name	    READ
+yet_another_database_name   ALL PRIVILEGES
+one_more_database_name      NO PRIVILEGES
+

Manage admin and non-admin users

+
Reset a user’s password
+ + +
SET PASSWORD FOR <username> = '<password>'
+

CLI example:

+ + +
SET PASSWORD FOR "todd" = 'password4todd'
+ +
+

The password string must be wrapped in single quotes. +Do not include the single quotes when authenticating requests.

+

We recommend avoiding the single quote (') and backslash (\) characters in passwords +For passwords that include these characters, escape the special character with a backslash (e.g. (\') when creating the password and when submitting authentication requests.

+ +
+ +
DROP a user
+ + +
DROP USER <username>
+

CLI example:

+ + +
DROP USER "todd"
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/flux/get-started/syntax-basics/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/flux/get-started/syntax-basics/index.html new file mode 100644 index 000000000..013f71a50 --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/flux/get-started/syntax-basics/index.html @@ -0,0 +1,3181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Flux syntax basics | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Flux syntax basics

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Flux, at its core, is a scripting language designed specifically for working with data. +This guide walks through a handful of simple expressions and how they are handled in Flux.

+

Simple expressions

+

Flux is a scripting language that supports basic expressions. +For example, simple addition:

+ + +
> 1 + 1
+2
+

Variables

+

Assign an expression to a variable using the assignment operator, =.

+ + +
s = "this is a string"
+i = 1 // an integer
+f = 2.0 // a floating point number
+
+

Type the name of a variable to print its value:

+ + +
> s
+this is a string
+> i
+1
+> f
+2
+

Records

+

Flux also supports records. Each value in a record can be a different data type.

+ + +
o = {name:"Jim", age: 42, "favorite color": "red"}
+

Use dot notation to access a properties of a record:

+ + +
> o.name
+Jim
+> o.age
+42
+

Or bracket notation:

+ + +
> o["name"]
+Jim
+> o["age"]
+42
+> o["favorite color"]
+red
+ +
+

Use bracket notation to reference record properties with special or +white space characters in the property key.

+ +
+ +

Lists

+

Flux supports lists. List values must be the same type.

+ + +
> n = 4
+> l = [1,2,3,n]
+> l
+[1, 2, 3, 4]
+

Functions

+

Flux uses functions for most of its heavy lifting. +Below is a simple function that squares a number, n.

+ + +
> square = (n) => n * n
+> square(n:3)
+9
+ +
+

Flux does not support positional arguments or parameters. +Parameters must always be named when calling a function.

+ +
+

Pipe-forward operator

+

Flux uses the pipe-forward operator (|>) extensively to chain operations together. +After each function or operation, Flux returns a table or collection of tables containing data. +The pipe-forward operator pipes those tables into the next function where they are further processed or manipulated.

+ + +
data |> someFunction() |> anotherFunction()
+

Real-world application of basic syntax

+

This likely seems familiar if you’ve already been through through the other getting started guides. +Flux’s syntax is inspired by JavaScript and other functional scripting languages. +As you begin to apply these basic principles in real-world use cases such as creating data stream variables, +custom functions, etc., the power of Flux and its ability to query and process data will become apparent.

+

The examples below provide both multi-line and single-line versions of each input command. +Carriage returns in Flux aren’t necessary, but do help with readability. +Both single- and multi-line commands can be copied and pasted into the influx CLI running in Flux mode.

+ +
+ + + + + + + + +
+

Define data stream variables

+

A common use case for variable assignments in Flux is creating variables for one +or more input data streams.

+ + +
timeRange = -1h
+
+cpuUsageUser = from(bucket: "telegraf/autogen")
+    |> range(start: timeRange)
+    |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_user" and r.cpu == "cpu-total")
+
+memUsagePercent = from(bucket: "telegraf/autogen")
+    |> range(start: timeRange)
+    |> filter(fn: (r) => r._measurement == "mem" and r._field == "used_percent")
+

These variables can be used in other functions, such as join(), while keeping the syntax minimal and flexible.

+

Define custom functions

+

Create a function that returns the N number rows in the input stream with the highest _values. +To do this, pass the input stream (tables) and the number of results to return (n) into a custom function. +Then using Flux’s sort() and limit() functions to find the top n results in the data set.

+ + +
topN = (tables=<-, n) => tables
+    |> sort(desc: true)
+    |> limit(n: n)
+

More information about creating custom functions is available in the Custom functions documentation.

+

Using this new custom function topN and the cpuUsageUser data stream variable defined above, +find the top five data points and yield the results.

+ + +
cpuUsageUser
+    |> topN(n: 5)
+    |> yield()
+ +
+ + + +
+

Define data stream variables

+

A common use case for variable assignments in Flux is creating variables for multiple filtered input data streams.

+ + +
timeRange = -1h
+
+cpuUsageUser = from(bucket: "telegraf/autogen")
+    |> range(start: timeRange)
+    |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_user" and r.cpu == "cpu-total")
+
+memUsagePercent = from(bucket: "telegraf/autogen")
+    |> range(start: timeRange)
+    |> filter(fn: (r) => r._measurement == "mem" and r._field == "used_percent")
+

These variables can be used in other functions, such as join(), while keeping the syntax minimal and flexible.

+

Define custom functions

+

Let’s create a function that returns the N number rows in the input data stream with the highest _values. +To do this, pass the input stream (tables) and the number of results to return (n) into a custom function. +Then using Flux’s sort() and limit() functions to find the top n results in the data set.

+ + +
topN = (tables=<-, n) => tables |> sort(desc: true) |> limit(n: n)
+

More information about creating custom functions is available in the Custom functions documentation.

+

Using the cpuUsageUser data stream variable defined above, +find the top five data points with the custom topN function and yield the results.

+ + +
cpuUsageUser |> topN(n:5) |> yield()
+ +
+ + +
+ +

This query will return the five data points with the highest user CPU usage over the last hour.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/guides/downsample_and_retain/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/guides/downsample_and_retain/index.html new file mode 100644 index 000000000..d867cbb93 --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/guides/downsample_and_retain/index.html @@ -0,0 +1,3198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Downsample and retain data | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Downsample and retain data

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxDB can handle hundreds of thousands of data points per second. Working with that much data over a long period of time can create storage concerns. +A natural solution is to downsample the data; keep the high precision raw data for only a limited time, and store the lower precision, summarized data longer. +This guide describes how to automate the process of downsampling data and expiring old data using InfluxQL. To downsample and retain data using Flux and InfluxDB 2.0, +see Process data with InfluxDB tasks.

+

Definitions

+
    +
  • +

    Continuous query (CQ) is an InfluxQL query that runs automatically and periodically within a database. +CQs require a function in the SELECT clause and must include a GROUP BY time() clause.

    +
  • +
  • +

    Retention policy (RP) is the part of InfluxDB data structure that describes for how long InfluxDB keeps data. +InfluxDB compares your local server’s timestamp to the timestamps on your data and deletes data older than the RP’s DURATION. +A single database can have several RPs and RPs are unique per database.

    +
  • +
+

This guide doesn’t go into detail about the syntax for creating and managing CQs and RPs or tasks. +If you’re new to these concepts, we recommend reviewing the following:

+ +

Sample data

+

This section uses fictional real-time data to track the number of food orders +to a restaurant via phone and via website at ten second intervals. +We store this data in a database or bucket called food_data, in +the measurement orders, and +in the fields phone and website.

+

Sample:

+ + +
name: orders
+------------
+time                   phone   website
+2016-05-10T23:18:00Z   10      30
+2016-05-10T23:18:10Z   12      39
+2016-05-10T23:18:20Z   11      56
+

Goal

+

Assume that, in the long run, we’re only interested in the average number of orders by phone +and by website at 30 minute intervals. +In the next steps, we use RPs and CQs to:

+
    +
  • Automatically aggregate the ten-second resolution data to 30-minute resolution data
  • +
  • Automatically delete the raw, ten-second resolution data that are older than two hours
  • +
  • Automatically delete the 30-minute resolution data that are older than 52 weeks
  • +
+

Database preparation

+

We perform the following steps before writing the data to the database +food_data. +We do this before inserting any data because CQs only run against recent +data; that is, data with timestamps that are no older than now() minus +the FOR clause of the CQ, or now() minus the GROUP BY time() interval if +the CQ has no FOR clause.

+

1. Create the database

+ + +
CREATE DATABASE "food_data"
+

2. Create a two-hour DEFAULT retention policy

+

InfluxDB writes to the DEFAULT retention policy if we do not supply an explicit RP when +writing a point to the database. +We make the DEFAULT RP keep data for two hours, because we want InfluxDB to +automatically write the incoming ten-second resolution data to that RP.

+

Use the +CREATE RETENTION POLICY +statement to create a DEFAULT RP:

+ + +
CREATE RETENTION POLICY "two_hours" ON "food_data" DURATION 2h REPLICATION 1 DEFAULT
+

That query creates an RP called two_hours that exists in the database +food_data. +two_hours keeps data for a DURATION of two hours (2h) and it’s the DEFAULT +RP for the database food_data.

+ +
+

The replication factor (REPLICATION 1) is a required parameter but must always +be set to 1 for single node instances.

+ +
+ + +
+

Note: When we created the food_data database in step 1, InfluxDB +automatically generated an RP named autogen and set it as the DEFAULT +RP for the database. +The autogen RP has an infinite retention period. +With the query above, the RP two_hours replaces autogen as the DEFAULT RP +for the food_data database.

+ +
+

3. Create a 52-week retention policy

+

Next we want to create another retention policy that keeps data for 52 weeks and is not the +DEFAULT retention policy (RP) for the database. +Ultimately, the 30-minute rollup data will be stored in this RP.

+

Use the +CREATE RETENTION POLICY +statement to create a non-DEFAULT retention policy:

+ + +
CREATE RETENTION POLICY "a_year" ON "food_data" DURATION 52w REPLICATION 1
+

That query creates a retention policy (RP) called a_year that exists in the database +food_data. +The a_year setting keeps data for a DURATION of 52 weeks (52w). +Leaving out the DEFAULT argument ensures that a_year is not the DEFAULT +RP for the database food_data. +That is, write and read operations against food_data that do not specify an +RP will still go to the two_hours RP (the DEFAULT RP).

+

4. Create the continuous query

+

Now that we’ve set up our RPs, we want to create a continuous query (CQ) that will automatically +and periodically downsample the ten-second resolution data to the 30-minute +resolution, and then store those results in a different measurement with a different +retention policy.

+

Use the +CREATE CONTINUOUS QUERY +statement to generate a CQ:

+ + +
> CREATE CONTINUOUS QUERY "cq_30m" ON "food_data" BEGIN
+  SELECT mean("website") AS "mean_website",mean("phone") AS "mean_phone"
+  INTO "a_year"."downsampled_orders"
+  FROM "orders"
+  GROUP BY time(30m)
+END
+

That query creates a CQ called cq_30m in the database food_data. +cq_30m tells InfluxDB to calculate the 30-minute average of the two fields +website and phone in the measurement orders and in the DEFAULT RP +two_hours. +It also tells InfluxDB to write those results to the measurement +downsampled_orders in the retention policy a_year with the field keys +mean_website and mean_phone. +InfluxDB will run this query every 30 minutes for the previous 30 minutes.

+ +
+

Note: Notice that we fully qualify (that is, we use the syntax +"<retention_policy>"."<measurement>") the measurement in the INTO +clause. +InfluxDB requires that syntax to write data to an RP other than the DEFAULT +RP.

+ +
+

Results

+

With the new CQ and two new RPs, food_data is ready to start receiving data. +After writing data to our database and letting things run for a bit, we see +two measurements: orders and downsampled_orders.

+ + +
> SELECT * FROM "orders" LIMIT 5
+name: orders
+---------
+time                    phone  website
+2016-05-13T23:00:00Z    10     30
+2016-05-13T23:00:10Z    12     39
+2016-05-13T23:00:20Z    11     56
+2016-05-13T23:00:30Z    8      34
+2016-05-13T23:00:40Z    17     32
+
+> SELECT * FROM "a_year"."downsampled_orders" LIMIT 5
+name: downsampled_orders
+---------------------
+time                    mean_phone  mean_website
+2016-05-13T15:00:00Z    12          23
+2016-05-13T15:30:00Z    13          32
+2016-05-13T16:00:00Z    19          21
+2016-05-13T16:30:00Z    3           26
+2016-05-13T17:00:00Z    4           23
+

The data in orders are the raw, ten-second resolution data that reside in the +two-hour RP. +The data in downsampled_orders are the aggregated, 30-minute resolution data +that are subject to the 52-week RP.

+

Notice that the first timestamps in downsampled_orders are older than the first +timestamps in orders. +This is because InfluxDB has already deleted data from orders with timestamps +that are older than our local server’s timestamp minus two hours (assume we +executed the SELECT queries at 2016-05-14T00:59:59Z). +InfluxDB will only start dropping data from downsampled_orders after 52 weeks.

+ +
+

Notes:

+ +
+
    +
  • Notice that we fully qualify (that is, we use the syntax +"<retention_policy>"."<measurement>") downsampled_orders in +the second SELECT statement. We must specify the RP in that query to SELECT +data that reside in an RP other than the DEFAULT RP.
  • +
+ +
+ +
+
    +
  • By default, InfluxDB checks to enforce an RP every 30 minutes. +Between checks, orders may have data that are older than two hours. +The rate at which InfluxDB checks to enforce an RP is a configurable setting, +see +Database Configuration.
  • +
+

Using a combination of RPs and CQs, we’ve successfully set up our database to +automatically keep the high precision raw data for a limited time, create lower +precision data, and store that lower precision data for a longer period of time. +Now that you have a general understanding of how these features can work +together, check out the detailed documentation on CQs and RPs +to see all that they can do for you.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/continuous_queries/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/continuous_queries/index.html new file mode 100644 index 000000000..02db40764 --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/continuous_queries/index.html @@ -0,0 +1,3797 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxQL Continuous Queries | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxQL Continuous Queries

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Introduction

+

Continuous queries (CQ) are InfluxQL queries that run automatically and +periodically on realtime data and store query results in a +specified measurement.

+ + + + + + + + + + + + + + + + +
Basic SyntaxAdvanced SyntaxCQ Management
Examples of Basic SyntaxExamples of Advanced SyntaxCQ Use Cases
Common Issues with Basic SyntaxCommon Issues with Advanced SyntaxFurther information
+

Syntax

+

Basic syntax

+ + +
CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
+BEGIN
+  <cq_query>
+END
+

Description of basic syntax

+
The cq_query
+

The cq_query requires a +function, +an INTO clause, +and a GROUP BY time() clause:

+ + +
SELECT <function[s]> INTO <destination_measurement> FROM <measurement> [WHERE <stuff>] GROUP BY time(<interval>)[,<tag_key[s]>]
+ +
+

Note: Notice that the cq_query does not require a time range in a WHERE clause. +InfluxDB automatically generates a time range for the cq_query when it executes the CQ. +Any user-specified time ranges in the cq_query’s WHERE clause will be ignored +by the system.

+ +
+
Schedule and coverage
+

Continuous queries operate on real-time data. +They use the local server’s timestamp, the GROUP BY time() interval, and +InfluxDB database’s preset time boundaries to determine when to execute and what time +range to cover in the query.

+

CQs execute at the same interval as the cq_query’s GROUP BY time() interval, +and they run at the start of the InfluxDB database’s preset time boundaries. +If the GROUP BY time() interval is one hour, the CQ executes at the start of +every hour.

+

When the CQ executes, it runs a single query for the time range between +now() and now() minus the +GROUP BY time() interval. +If the GROUP BY time() interval is one hour and the current time is 17:00, +the query’s time range is between 16:00 and 16:59.999999999.

+

Examples of basic syntax

+

The examples below use the following sample data in the transportation +database. +The measurement bus_data stores 15-minute resolution data on the number of bus +passengers and complaints:

+ + +
name: bus_data
+--------------
+time                   passengers   complaints
+2016-08-28T07:00:00Z   5            9
+2016-08-28T07:15:00Z   8            9
+2016-08-28T07:30:00Z   8            9
+2016-08-28T07:45:00Z   7            9
+2016-08-28T08:00:00Z   8            9
+2016-08-28T08:15:00Z   15           7
+2016-08-28T08:30:00Z   15           7
+2016-08-28T08:45:00Z   17           7
+2016-08-28T09:00:00Z   20           7
+
Automatically downsampling data
+

Use a simple CQ to automatically downsample data from a single field +and write the results to another measurement in the same database.

+ + +
CREATE CONTINUOUS QUERY "cq_basic" ON "transportation"
+BEGIN
+  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h)
+END
+

cq_basic calculates the average hourly number of passengers from the +bus_data measurement and stores the results in the average_passengers +measurement in the transportation database.

+

cq_basic executes at one-hour intervals, the same interval as the +GROUP BY time() interval. +Every hour, cq_basic runs a single query that covers the time range between +now() and now() minus the GROUP BY time() interval, that is, the time +range between now() and one hour prior to now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **8:00** `cq_basic` executes a query with the time range `time >= '7:00' AND time < '08:00'`.
+`cq_basic` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:00:00Z   7
+>
+At **9:00** `cq_basic` executes a query with the time range `time >= '8:00' AND time < '9:00'`.
+`cq_basic` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T08:00:00Z   13.75
+

Here are the results:

+ + +
> SELECT * FROM "average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T07:00:00Z   7
+2016-08-28T08:00:00Z   13.75
+
Automatically downsampling data into another retention policy
+

Fully qualify +the destination measurement to store the downsampled data in a non-DEFAULT +retention policy (RP).

+ + +
CREATE CONTINUOUS QUERY "cq_basic_rp" ON "transportation"
+BEGIN
+  SELECT mean("passengers") INTO "transportation"."three_weeks"."average_passengers" FROM "bus_data" GROUP BY time(1h)
+END
+

cq_basic_rp calculates the average hourly number of passengers from the +bus_data measurement and stores the results in the transportation database, +the three_weeks RP, and the average_passengers measurement.

+

cq_basic_rp executes at one-hour intervals, the same interval as the +GROUP BY time() interval. +Every hour, cq_basic_rp runs a single query that covers the time range between +now() and now() minus the GROUP BY time() interval, that is, the time +range between now() and one hour prior to now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **8:00** `cq_basic_rp` executes a query with the time range `time >= '7:00' AND time < '8:00'`.
+`cq_basic_rp` writes one point to the `three_weeks` RP and the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:00:00Z   7
+>
+At **9:00** `cq_basic_rp` executes a query with the time range
+`time >= '8:00' AND time < '9:00'`.
+`cq_basic_rp` writes one point to the `three_weeks` RP and the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T08:00:00Z   13.75
+

Here are the results:

+ + +
> SELECT * FROM "transportation"."three_weeks"."average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T07:00:00Z   7
+2016-08-28T08:00:00Z   13.75
+

cq_basic_rp uses CQs and retention policies to automatically downsample data +and keep those downsampled data for an alternative length of time. +See the Downsampling and Data Retention +guide for an in-depth discussion about this CQ use case.

+
Automatically downsampling a database with backreferencing
+

Use a function with a wildcard (*) and INTO query’s +backreferencing syntax +to automatically downsample data from all measurements and numerical fields in +a database.

+ + +
CREATE CONTINUOUS QUERY "cq_basic_br" ON "transportation"
+BEGIN
+  SELECT mean(*) INTO "downsampled_transportation"."autogen".:MEASUREMENT FROM /.*/ GROUP BY time(30m),*
+END
+

cq_basic_br calculates the 30-minute average of passengers and complaints +from every measurement in the transportation database (in this case, there’s only the +bus_data measurement). +It stores the results in the downsampled_transportation database.

+

cq_basic_br executes at 30 minutes intervals, the same interval as the +GROUP BY time() interval. +Every 30 minutes, cq_basic_br runs a single query that covers the time range +between now() and now() minus the GROUP BY time() interval, that is, +the time range between now() and 30 minutes prior to now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **7:30**, `cq_basic_br` executes a query with the time range `time >= '7:00' AND time < '7:30'`.
+`cq_basic_br` writes two points to the `bus_data` measurement in the `downsampled_transportation` database:
+>
+    name: bus_data
+    --------------
+    time                   mean_complaints   mean_passengers
+    2016-08-28T07:00:00Z   9                 6.5
+>
+At **8:00**, `cq_basic_br` executes a query with the time range `time >= '7:30' AND time < '8:00'`.
+`cq_basic_br` writes two points to the `bus_data` measurement in the `downsampled_transportation` database:
+>
+    name: bus_data
+    --------------
+    time                   mean_complaints   mean_passengers
+    2016-08-28T07:30:00Z   9                 7.5
+>
+[...]
+>
+At **9:00**, `cq_basic_br` executes a query with the time range `time >= '8:30' AND time < '9:00'`.
+`cq_basic_br` writes two points to the `bus_data` measurement in the `downsampled_transportation` database:
+>
+    name: bus_data
+    --------------
+    time                   mean_complaints   mean_passengers
+    2016-08-28T08:30:00Z   7                 16
+

Here are the results:

+ + +
> SELECT * FROM "downsampled_transportation."autogen"."bus_data"
+name: bus_data
+--------------
+time                   mean_complaints   mean_passengers
+2016-08-28T07:00:00Z   9                 6.5
+2016-08-28T07:30:00Z   9                 7.5
+2016-08-28T08:00:00Z   8                 11.5
+2016-08-28T08:30:00Z   7                 16
+
Automatically downsampling data and configuring CQ time boundaries
+

Use an +offset interval +in the GROUP BY time() clause to alter both the CQ’s default execution time and +preset time boundaries.

+ + +
CREATE CONTINUOUS QUERY "cq_basic_offset" ON "transportation"
+BEGIN
+  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h,15m)
+END
+

cq_basic_offsetcalculates the average hourly number of passengers from the +bus_data measurement and stores the results in the average_passengers +measurement.

+

cq_basic_offset executes at one-hour intervals, the same interval as the +GROUP BY time() interval. +The 15 minute offset interval forces the CQ to execute 15 minutes after the +default execution time; cq_basic_offset executes at 8:15 instead of 8:00.

+

Every hour, cq_basic_offset runs a single query that covers the time range +between now() and now() minus the GROUP BY time() interval, that is, the +time range between now() and one hour prior to now(). +The 15 minute offset interval shifts forward the generated preset time boundaries in the +CQ’s WHERE clause; cq_basic_offset queries between 7:15 and 8:14.999999999 instead of 7:00 and 7:59.999999999.

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **8:15** `cq_basic_offset` executes a query with the time range `time >= '7:15' AND time < '8:15'`.
+`cq_basic_offset` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:15:00Z   7.75
+>
+At **9:15** `cq_basic_offset` executes a query with the time range `time >= '8:15' AND time < '9:15'`.
+`cq_basic_offset` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T08:15:00Z   16.75
+

Here are the results:

+ + +
> SELECT * FROM "average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T07:15:00Z   7.75
+2016-08-28T08:15:00Z   16.75
+

Notice that the timestamps are for 7:15 and 8:15 instead of 7:00 and 8:00.

+

Common issues with basic syntax

+
Handling time intervals with no data
+

CQs do not write any results for a time interval if no data fall within that +time range.

+

Note that the basic syntax does not support using +fill() +to change the value reported for intervals with no data. +Basic syntax CQs ignore fill() if it’s included in the CQ query. +A possible workaround is to use the +advanced CQ syntax.

+
Resampling previous time intervals
+

The basic CQ runs a single query that covers the time range between now() +and now() minus the GROUP BY time() interval. +See the advanced syntax for how to configure the query’s +time range.

+
Backfilling results for older data
+

CQs operate on realtime data, that is, data with timestamps that occur +relative to now(). +Use a basic +INTO query +to backfill results for data with older timestamps.

+
Missing tags in the CQ results
+

By default, all +INTO queries +convert any tags in the source measurement to fields in the destination +measurement.

+

Include GROUP BY * in the CQ to preserve tags in the destination measurement.

+

Advanced syntax

+ + +
CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
+RESAMPLE EVERY <interval> FOR <interval>
+BEGIN
+  <cq_query>
+END
+

Description of advanced syntax

+
The cq_query
+

See Description of Basic Syntax.

+
Scheduling and coverage
+

CQs operate on real-time data. With the advanced syntax, CQs use the local +server’s timestamp, the information in the RESAMPLE clause, and the InfluxDB +server’s preset time boundaries to determine when to execute and what time range to +cover in the query.

+

CQs execute at the same interval as the EVERY interval in the RESAMPLE +clause, and they run at the start of InfluxDB’s preset time boundaries. +If the EVERY interval is two hours, InfluxDB executes the CQ at the top of +every other hour.

+

When the CQ executes, it runs a single query for the time range between +now() and now() minus the FOR interval in the RESAMPLE clause. +If the FOR interval is two hours and the current time is 17:00, the query’s +time range is between 15:00 and 16:59.999999999.

+

Both the EVERY interval and the FOR interval accept +duration literals. +The RESAMPLE clause works with either or both of the EVERY and FOR intervals +configured. +CQs default to the relevant +basic syntax behavior +if the EVERY interval or FOR interval is not provided (see the first issue in +Common Issues with Advanced Syntax +for an anomalous case).

+

Examples of advanced syntax

+

The examples below use the following sample data in the transportation database. +The measurement bus_data stores 15-minute resolution data on the number of bus +passengers:

+ + +
name: bus_data
+--------------
+time                   passengers
+2016-08-28T06:30:00Z   2
+2016-08-28T06:45:00Z   4
+2016-08-28T07:00:00Z   5
+2016-08-28T07:15:00Z   8
+2016-08-28T07:30:00Z   8
+2016-08-28T07:45:00Z   7
+2016-08-28T08:00:00Z   8
+2016-08-28T08:15:00Z   15
+2016-08-28T08:30:00Z   15
+2016-08-28T08:45:00Z   17
+2016-08-28T09:00:00Z   20
+
Configuring execution intervals
+

Use an EVERY interval in the RESAMPLE clause to specify the CQ’s execution +interval.

+ + +
CREATE CONTINUOUS QUERY "cq_advanced_every" ON "transportation"
+RESAMPLE EVERY 30m
+BEGIN
+  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h)
+END
+

cq_advanced_every calculates the one-hour average of passengers +from the bus_data measurement and stores the results in the +average_passengers measurement in the transportation database.

+

cq_advanced_every executes at 30-minute intervals, the same interval as the +EVERY interval. +Every 30 minutes, cq_advanced_every runs a single query that covers the time +range for the current time bucket, that is, the one-hour time bucket that +intersects with now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **8:00**, `cq_advanced_every` executes a query with the time range `WHERE time >= '7:00' AND time < '8:00'`.
+`cq_advanced_every` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:00:00Z   7
+>
+At **8:30**, `cq_advanced_every` executes a query with the time range `WHERE time >= '8:00' AND time < '9:00'`.
+`cq_advanced_every` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T08:00:00Z   12.6667
+>
+At **9:00**, `cq_advanced_every` executes a query with the time range `WHERE time >= '8:00' AND time < '9:00'`.
+`cq_advanced_every` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T08:00:00Z   13.75
+

Here are the results:

+ + +
> SELECT * FROM "average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T07:00:00Z   7
+2016-08-28T08:00:00Z   13.75
+

Notice that cq_advanced_every calculates the result for the 8:00 time interval +twice. +First, it runs at 8:30 and calculates the average for every available data point +between 8:00 and 9:00 (8,15, and 15). +Second, it runs at 9:00 and calculates the average for every available data +point between 8:00 and 9:00 (8, 15, 15, and 17). +Because of the way InfluxDB +handles duplicate points +, the second result simply overwrites the first result.

+
Configuring time ranges for resampling
+

Use a FOR interval in the RESAMPLE clause to specify the length of the CQ’s +time range.

+ + +
CREATE CONTINUOUS QUERY "cq_advanced_for" ON "transportation"
+RESAMPLE FOR 1h
+BEGIN
+  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(30m)
+END
+

cq_advanced_for calculates the 30-minute average of passengers +from the bus_data measurement and stores the results in the average_passengers +measurement in the transportation database.

+

cq_advanced_for executes at 30-minute intervals, the same interval as the +GROUP BY time() interval. +Every 30 minutes, cq_advanced_for runs a single query that covers the time +range between now() and now() minus the FOR interval, that is, the time +range between now() and one hour prior to now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **8:00** `cq_advanced_for` executes a query with the time range `WHERE time >= '7:00' AND time < '8:00'`.
+`cq_advanced_for` writes two points to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:00:00Z   6.5
+    2016-08-28T07:30:00Z   7.5
+>
+At **8:30** `cq_advanced_for` executes a query with the time range  `WHERE time >= '7:30' AND time < '8:30'`.
+`cq_advanced_for` writes two points to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:30:00Z   7.5
+    2016-08-28T08:00:00Z   11.5
+>
+At **9:00** `cq_advanced_for` executes a query with the time range `WHERE time >= '8:00' AND time < '9:00'`.
+`cq_advanced_for` writes two points to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T08:00:00Z   11.5
+    2016-08-28T08:30:00Z   16
+

Notice that cq_advanced_for will calculate the result for every time interval +twice. +The CQ calculates the average for the 7:30 time interval at 8:00 and at 8:30, +and it calculates the average for the 8:00 time interval at 8:30 and 9:00.

+

Here are the results:

+ + +
> SELECT * FROM "average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T07:00:00Z   6.5
+2016-08-28T07:30:00Z   7.5
+2016-08-28T08:00:00Z   11.5
+2016-08-28T08:30:00Z   16
+
Configuring execution intervals and CQ time ranges
+

Use an EVERY interval and FOR interval in the RESAMPLE clause to specify +the CQ’s execution interval and the length of the CQ’s time range.

+ + +
CREATE CONTINUOUS QUERY "cq_advanced_every_for" ON "transportation"
+RESAMPLE EVERY 1h FOR 90m
+BEGIN
+  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(30m)
+END
+

cq_advanced_every_for calculates the 30-minute average of +passengers from the bus_data measurement and stores the results in the +average_passengers measurement in the transportation database.

+

cq_advanced_every_for executes at one-hour intervals, the same interval as the +EVERY interval. +Every hour, cq_advanced_every_for runs a single query that covers the time +range between now() and now() minus the FOR interval, that is, the time +range between now() and 90 minutes prior to now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **8:00** `cq_advanced_every_for` executes a query with the time range `WHERE time >= '6:30' AND time < '8:00'`.
+`cq_advanced_every_for` writes three points to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T06:30:00Z   3
+    2016-08-28T07:00:00Z   6.5
+    2016-08-28T07:30:00Z   7.5
+>
+At **9:00** `cq_advanced_every_for` executes a query with the time range `WHERE time >= '7:30' AND time < '9:00'`.
+`cq_advanced_every_for` writes three points to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:30:00Z   7.5
+    2016-08-28T08:00:00Z   11.5
+    2016-08-28T08:30:00Z   16
+

Notice that cq_advanced_every_for will calculate the result for every time +interval twice. +The CQ calculates the average for the 7:30 interval at 8:00 and 9:00.

+

Here are the results:

+ + +
> SELECT * FROM "average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T06:30:00Z   3
+2016-08-28T07:00:00Z   6.5
+2016-08-28T07:30:00Z   7.5
+2016-08-28T08:00:00Z   11.5
+2016-08-28T08:30:00Z   16
+
Configuring CQ time ranges and filling empty results
+

Use a FOR interval and fill() to change the value reported for time +intervals with no data. +Note that at least one data point must fall within the FOR interval for fill() +to operate. +If no data fall within the FOR interval the CQ writes no points to the +destination measurement.

+ + +
CREATE CONTINUOUS QUERY "cq_advanced_for_fill" ON "transportation"
+RESAMPLE FOR 2h
+BEGIN
+  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h) fill(1000)
+END
+

cq_advanced_for_fill calculates the one-hour average of passengers from the +bus_data measurement and stores the results in the average_passengers +measurement in the transportation database. +Where possible, it writes the value 1000 for time intervals with no results.

+

cq_advanced_for_fill executes at one-hour intervals, the same interval as the +GROUP BY time() interval. +Every hour, cq_advanced_for_fill runs a single query that covers the time +range between now() and now() minus the FOR interval, that is, the time +range between now() and two hours prior to now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **6:00**, `cq_advanced_for_fill` executes a query with the time range `WHERE time >= '4:00' AND time < '6:00'`.
+`cq_advanced_for_fill` writes nothing to `average_passengers`; `bus_data` has no data
+that fall within that time range.
+>
+At **7:00**, `cq_advanced_for_fill` executes a query with the time range `WHERE time >= '5:00' AND time < '7:00'`.
+`cq_advanced_for_fill` writes two points to `average_passengers`:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T05:00:00Z   1000          <------ fill(1000)
+    2016-08-28T06:00:00Z   3             <------ average of 2 and 4
+>
+[...]
+>
+At **11:00**, `cq_advanced_for_fill` executes a query with the time range `WHERE time >= '9:00' AND time < '11:00'`.
+`cq_advanced_for_fill` writes two points to `average_passengers`:
+>
+    name: average_passengers
+    ------------------------
+    2016-08-28T09:00:00Z   20            <------ average of 20
+    2016-08-28T10:00:00Z   1000          <------ fill(1000)
+>
+

At 12:00, cq_advanced_for_fill executes a query with the time range WHERE time >= '10:00' AND time < '12:00'. +cq_advanced_for_fill writes nothing to average_passengers; bus_data has no data +that fall within that time range.

+

Here are the results:

+ + +
> SELECT * FROM "average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T05:00:00Z   1000
+2016-08-28T06:00:00Z   3
+2016-08-28T07:00:00Z   7
+2016-08-28T08:00:00Z   13.75
+2016-08-28T09:00:00Z   20
+2016-08-28T10:00:00Z   1000
+ +
+

Note: fill(previous) doesn’t fill the result for a time interval if the +previous value is outside the query’s time range. +See Frequently Asked Questions +for more information.

+ +
+

Common issues with advanced syntax

+
If the EVERY interval is greater than the GROUP BY time() interval
+

If the EVERY interval is greater than the GROUP BY time() interval, the CQ +executes at the same interval as the EVERY interval and runs a single query +that covers the time range between now() and now() minus the EVERY +interval (not between now() and now() minus the GROUP BY time() interval).

+

For example, if the GROUP BY time() interval is 5m and the EVERY interval +is 10m, the CQ executes every ten minutes. +Every ten minutes, the CQ runs a single query that covers the time range +between now() and now() minus the EVERY interval, that is, the time +range between now() and ten minutes prior to now().

+

This behavior is intentional and prevents the CQ from missing data between +execution times.

+
If the FOR interval is less than the execution interval
+

If the FOR interval is less than the GROUP BY time() interval or, if +specified, the EVERY interval, InfluxDB returns the following error:

+ + +
error parsing query: FOR duration must be >= GROUP BY time duration: must be a minimum of <minimum-allowable-interval> got <user-specified-interval>
+

To avoid missing data between execution times, the FOR interval must be equal +to or greater than the GROUP BY time() interval or, if specified, the EVERY +interval.

+

Currently, this is the intended behavior. +GitHub Issue #6963 +outlines a feature request for CQs to support gaps in data coverage.

+

Continuous query management

+

Only admin users are allowed to work with CQs. For more on user privileges, see Authentication and Authorization.

+

Listing continuous queries

+

List every CQ on an InfluxDB instance with:

+ + +
SHOW CONTINUOUS QUERIES
+

SHOW CONTINUOUS QUERIES groups results by database.

+
Examples
+

The output shows that the telegraf and mydb databases have CQs:

+ + +
> SHOW CONTINUOUS QUERIES
+name: _internal
+---------------
+name   query
+
+
+name: telegraf
+--------------
+name           query
+idle_hands     CREATE CONTINUOUS QUERY idle_hands ON telegraf BEGIN SELECT min(usage_idle) INTO telegraf.autogen.min_hourly_cpu FROM telegraf.autogen.cpu GROUP BY time(1h) END
+feeling_used   CREATE CONTINUOUS QUERY feeling_used ON telegraf BEGIN SELECT mean(used) INTO downsampled_telegraf.autogen.:MEASUREMENT FROM telegraf.autogen./.*/ GROUP BY time(1h) END
+
+
+name: downsampled_telegraf
+--------------------------
+name   query
+
+
+name: mydb
+----------
+name      query
+vampire   CREATE CONTINUOUS QUERY vampire ON mydb BEGIN SELECT count(dracula) INTO mydb.autogen.all_of_them FROM mydb.autogen.one GROUP BY time(5m) END
+

Deleting continuous queries

+

Delete a CQ from a specific database with:

+ + +
DROP CONTINUOUS QUERY <cq_name> ON <database_name>
+

DROP CONTINUOUS QUERY returns an empty result.

+
Examples
+

Drop the idle_hands CQ from the telegraf database:

+ + +
DROP CONTINUOUS QUERY "idle_hands" ON "telegraf"
+

Altering continuous queries

+

CQs cannot be altered once they’re created. +To change a CQ, you must DROP and reCREATE it with the updated settings.

+

Continuous query statistics

+

If query-stats-enabled is set to true in your influxdb.conf or using the INFLUXDB_CONTINUOUS_QUERIES_QUERY_STATS_ENABLED environment variable, data will be written to _internal with information about when continuous queries ran and their duration. +Information about CQ configuration settings is available in the Configuration documentation.

+ +
+

Note: _internal houses internal system data and is meant for internal use. +The structure of and data stored in _internal can change at any time. +Use of this data falls outside the scope of official InfluxData support.

+ +
+

Continuous query use cases

+

Downsampling and Data Retention

+

Use CQs with InfluxDB database +retention policies +(RPs) to mitigate storage concerns. +Combine CQs and RPs to automatically downsample high precision data to a lower +precision and remove the dispensable, high precision data from the database.

+

See the +Downsampling and data retention +guide for a detailed walkthrough of this common use case.

+

Precalculating expensive queries

+

Shorten query runtimes by pre-calculating expensive queries with CQs. +Use a CQ to automatically downsample commonly queried, high precision data to a +lower precision. +Queries on lower precision data require fewer resources and return faster.

+

Tip: Pre-calculate queries for your preferred graphing tool to accelerate +the population of graphs and dashboards.

+

Substituting for a HAVING clause

+

InfluxQL does not support HAVING clauses. +Get the same functionality by creating a CQ to aggregate the data and querying +the CQ results to apply the HAVING clause.

+ +
+

Note: InfluxQL supports subqueries which also offer similar functionality to HAVING clauses. +See Data Exploration for more information.

+ +
+
Example
+

InfluxDB does not accept the following query with a HAVING clause. +The query calculates the average number of bees at 30 minute intervals and +requests averages that are greater than 20.

+ + +
SELECT mean("bees") FROM "farm" GROUP BY time(30m) HAVING mean("bees") > 20
+

To get the same results:

+

1. Create a CQ

+

This step performs the mean("bees") part of the query above. +Because this step creates CQ you only need to execute it once.

+

The following CQ automatically calculates the average number of bees at +30 minutes intervals and writes those averages to the mean_bees field in the +aggregate_bees measurement.

+ + +
CREATE CONTINUOUS QUERY "bee_cq" ON "mydb" BEGIN SELECT mean("bees") AS "mean_bees" INTO "aggregate_bees" FROM "farm" GROUP BY time(30m) END
+

2. Query the CQ results

+

This step performs the HAVING mean("bees") > 20 part of the query above.

+

Query the data in the measurement aggregate_bees and request values of the mean_bees field that are greater than 20 in the WHERE clause:

+ + +
SELECT "mean_bees" FROM "aggregate_bees" WHERE "mean_bees" > 20
+

Substituting for nested functions

+

Some InfluxQL functions +support nesting +of other functions. +Most do not. +If your function does not support nesting, you can get the same functionality using a CQ to calculate +the inner-most function. +Then simply query the CQ results to calculate the outer-most function.

+ +
+

Note: InfluxQL supports subqueries which also offer the same functionality as nested functions. +See Data Exploration for more information.

+ +
+
Example
+

InfluxDB does not accept the following query with a nested function. +The query calculates the number of non-null values +of bees at 30 minute intervals and the average of those counts:

+ + +
SELECT mean(count("bees")) FROM "farm" GROUP BY time(30m)
+

To get the same results:

+

1. Create a CQ

+

This step performs the count("bees") part of the nested function above. +Because this step creates a CQ you only need to execute it once.

+

The following CQ automatically calculates the number of non-null values of bees at 30 minute intervals +and writes those counts to the count_bees field in the aggregate_bees measurement.

+ + +
CREATE CONTINUOUS QUERY "bee_cq" ON "mydb" BEGIN SELECT count("bees") AS "count_bees" INTO "aggregate_bees" FROM "farm" GROUP BY time(30m) END
+

2. Query the CQ results

+

This step performs the mean([...]) part of the nested function above.

+

Query the data in the measurement aggregate_bees to calculate the average of the +count_bees field:

+ + +
SELECT mean("count_bees") FROM "aggregate_bees" WHERE time >= <start_time> AND time <= <end_time>
+

Further information

+

To see how to combine two InfluxDB features, CQs, and retention policies, +to periodically downsample data and automatically expire the dispensable high +precision data, see Downsampling and data retention.

+

Kapacitor, InfluxData’s data processing engine, can do the same work as +continuous queries in InfluxDB databases.

+

To learn when to use Kapacitor instead of InfluxDB and how to perform the same CQ +functionality with a TICKscript, see examples of continuous queries in Kapacitor.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/explore-data/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/explore-data/index.html new file mode 100644 index 000000000..e6e29fee0 --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/explore-data/index.html @@ -0,0 +1,6130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Explore data using InfluxQL | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Explore data using InfluxQL

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL is an SQL-like query language for interacting with data in InfluxDB. +The following sections detail InfluxQL’s SELECT statement and useful query syntax +for exploring your data.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
The Basics:Configure Query Results:General Tips on Query Syntax:
The SELECT statementORDER BY time DESCTime Syntax
The WHERE clauseThe LIMIT and SLIMIT clausesRegular Expressions
The GROUP BY clauseThe OFFSET and SOFFSET clausesData types and cast operations
The INTO clauseThe Time Zone clauseMerge behavior
Multiple statements
Subqueries
+

Sample data

+

This document uses publicly available data from the +National Oceanic and Atmospheric Administration’s (NOAA) Center for Operational Oceanographic Products and Services. +See the Sample Data page to download +the data and follow along with the example queries in the sections below.

+

Start by logging into the Influx CLI:

+ + +
$ influx -precision rfc3339 -database NOAA_water_database
+Connected to http://localhost:8086 version 1.12.2
+InfluxDB shell 1.12.2
+>
+

Next, get acquainted with this subsample of the data in the h2o_feet measurement:

+

name: h2o_feet

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
timelevel descriptionlocationwater_level
2015-08-18T00:00:00Zbetween 6 and 9 feetcoyote_creek8.12
2015-08-18T00:00:00Zbelow 3 feetsanta_monica2.064
2015-08-18T00:06:00Zbetween 6 and 9 feetcoyote_creek8.005
2015-08-18T00:06:00Zbelow 3 feetsanta_monica2.116
2015-08-18T00:12:00Zbetween 6 and 9 feetcoyote_creek7.887
2015-08-18T00:12:00Zbelow 3 feetsanta_monica2.028
+

The data in the h2o_feet measurement +occur at six-minute time intervals. +The measurement has one tag key +(location) which has two tag values: +coyote_creek and santa_monica. +The measurement also has two fields: +level description stores string field values +and water_level stores float field values. +All of these data is in the NOAA_water_database database.

+ +
+

Disclaimer: The level description field isn’t part of the original NOAA data - we snuck it in there for the sake of having a field key with a special character and string field values.

+ +
+

The basic SELECT statement

+

The SELECT statement queries data from a particular measurement or measurements.

+

Syntax

+ + +
SELECT <field_key>[,<field_key>,<tag_key>] FROM <measurement_name>[,<measurement_name>]
+

The SELECT statement requires a SELECT clause and a FROM clause.

+

SELECT clause

+

The SELECT clause supports several formats for specifying data:

+

SELECT * +          Returns all fields and tags.

+

SELECT "<field_key>" +          Returns a specific field.

+

SELECT "<field_key>","<field_key>" +          Returns more than one field.

+

SELECT "<field_key>","<tag_key>" +          Returns a specific field and tag. +The SELECT clause must specify at least one field when it includes a tag.

+

SELECT "<field_key>"::field,"<tag_key>"::tag +          Returns a specific field and tag. +The ::[field | tag] syntax specifies the identifier’s type. +Use this syntax to differentiate between field keys and tag keys that have the same name.

+

Other supported features: +Arithmetic operations, +Functions, +Basic cast operations, +Regular expressions

+ +
+

Note: The SELECT statement cannot include an aggregate function and a non-aggregate function, field key, or tag key. For more information, see error about mixing aggregate and non-aggregate queries.

+ +
+

FROM clause

+

The FROM clause supports several formats for specifying a measurement(s):

+

FROM <measurement_name> +           +Returns data from a single measurement. +If you’re using the CLI InfluxDB queries the measurement in the +USEd +database and the DEFAULT retention policy. +If you’re using the InfluxDB API InfluxDB queries the +measurement in the database specified in the db query string parameter +and the DEFAULT retention policy.

+

FROM <measurement_name>,<measurement_name> +           +Returns data from more than one measurement.

+

FROM <database_name>.<retention_policy_name>.<measurement_name> +           +Returns data from a fully qualified measurement. +Fully qualify a measurement by specifying its database and retention policy.

+

FROM <database_name>..<measurement_name> +           +Returns data from a measurement in a user-specified database and the DEFAULT +retention policy.

+

Other supported features: +Regular Expressions

+

Quoting

+

Identifiers must be double quoted if they contain characters other than [A-z,0-9,_], if they +begin with a digit, or if they are an InfluxQL keyword. +While not always necessary, we recommend that you double quote identifiers.

+ +
+

Note: The quoting syntax for queries differs from the line protocol. +Please review the rules for single and double-quoting in queries.

+ +
+

Examples

+

Select all fields and tags from a single measurement

+ + +
> SELECT * FROM "h2o_feet"
+
+name: h2o_feet
+--------------
+time                   level description      location       water_level
+2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938
+

The query selects all fields and +tags from the h2o_feet +measurement.

+

If you’re using the CLI be sure to enter +USE NOAA_water_database before you run the query. +The CLI queries the data in the USEd database and the +DEFAULT retention policy. +If you’re using the InfluxDB API be sure to set the +db query string parameter +to NOAA_water_database. +If you do not set the rp query string parameter, the InfluxDB API automatically +queries the database’s DEFAULT retention policy.

+

Select specific tags and fields from a single measurement

+ + +
> SELECT "level description","location","water_level" FROM "h2o_feet"
+
+name: h2o_feet
+--------------
+time                   level description      location       water_level
+2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938
+

The query selects the level description field, the location tag, and the +water_level field. +Note that the SELECT clause must specify at least one field when it includes +a tag.

+

Select specific tags and fields from a single measurement, and provide their identifier type

+ + +
> SELECT "level description"::field,"location"::tag,"water_level"::field FROM "h2o_feet"
+
+name: h2o_feet
+--------------
+time                   level description      location       water_level
+2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938
+

The query selects the level description field, the location tag, and the +water_level field from the h2o_feet measurement. +The ::[field | tag] syntax specifies if the +identifier is a field or tag. +Use ::[field | tag] to differentiate between an identical field key and tag key . +That syntax is not required for most use cases.

+

Select all fields from a single measurement

+ + +
> SELECT *::field FROM "h2o_feet"
+
+name: h2o_feet
+--------------
+time                   level description      water_level
+2015-08-18T00:00:00Z   below 3 feet           2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   4.938
+

The query selects all fields from the h2o_feet measurement. +The SELECT clause supports combining the * syntax with the :: syntax.

+

Select a specific field from a measurement and perform basic arithmetic

+ + +
> SELECT ("water_level" * 2) + 4 FROM "h2o_feet"
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   20.24
+2015-08-18T00:00:00Z   8.128
+[...]
+2015-09-18T21:36:00Z   14.132
+2015-09-18T21:42:00Z   13.876
+

The query multiplies water_level’s field values by two and adds four to those +values. +Note that InfluxDB follows the standard order of operations. +See Mathematical Operators +for more on supported operators.

+

Select all data from more than one measurement

+ + +
> SELECT * FROM "h2o_feet","h2o_pH"
+
+name: h2o_feet
+--------------
+time                   level description      location       pH   water_level
+2015-08-18T00:00:00Z   below 3 feet           santa_monica        2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek        8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica        5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica        4.938
+
+name: h2o_pH
+------------
+time                   level description   location       pH   water_level
+2015-08-18T00:00:00Z                       santa_monica   6
+2015-08-18T00:00:00Z                       coyote_creek   7
+[...]
+2015-09-18T21:36:00Z                       santa_monica   8
+2015-09-18T21:42:00Z                       santa_monica   7
+

The query selects all fields and tags from two measurements: h2o_feet and +h2o_pH. +Separate multiple measurements with a comma (,).

+

Select all data from a fully qualified measurement

+ + +
> SELECT * FROM "NOAA_water_database"."autogen"."h2o_feet"
+
+name: h2o_feet
+--------------
+time                   level description      location       water_level
+2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938
+

The query selects data in the NOAA_water_database, the autogen retention +policy, and the measurement h2o_feet.

+

In the CLI, fully qualify a measurement to query data in a database other +than the USEd database and in a retention policy other than the +DEFAULT retention policy. +In the InfluxDB API, fully qualify a measurement in place of using the db +and rp query string parameters if desired.

+

Select all data from a measurement in a particular database

+ + +
> SELECT * FROM "NOAA_water_database".."h2o_feet"
+
+name: h2o_feet
+--------------
+time                   level description      location       water_level
+2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938
+

The query selects data in the NOAA_water_database, the DEFAULT retention +policy, and the h2o_feet measurement. +The .. indicates the DEFAULT retention policy for the specified database.

+

In the CLI, specify the database to query data in a database other than the +USEd database. +In the InfluxDB API, specify the database in place of using the db query +string parameter if desired.

+

Common issues with the SELECT statement

+

Selecting tag keys in the SELECT clause

+

A query requires at least one field key +in the SELECT clause to return data. +If the SELECT clause only includes a single tag key or several tag keys, the +query returns an empty response. +This behavior is a result of how the system stores data.

+
Example
+

The following query returns no data because it specifies a single tag key (location) in +the SELECT clause:

+ + +
SELECT "location" FROM "h2o_feet"
+

To return any data associated with the location tag key, the query’s SELECT +clause must include at least one field key (water_level):

+ + +
> SELECT "water_level","location" FROM "h2o_feet"
+name: h2o_feet
+time                   water_level  location
+----                   -----------  --------
+2015-08-18T00:00:00Z   8.12         coyote_creek
+2015-08-18T00:00:00Z   2.064        santa_monica
+[...]
+2015-09-18T21:36:00Z   5.066        santa_monica
+2015-09-18T21:42:00Z   4.938        santa_monica
+

The WHERE clause

+

The WHERE filters data based on +fields, +tags, and/or +timestamps.

+

Tired of reading? Check out this InfluxQL Short: +
+

+ +

Syntax

+ + +
SELECT_clause FROM_clause WHERE <conditional_expression> [(AND|OR) <conditional_expression> [...]]
+

The WHERE clause supports conditional_expressions on fields, tags, and +timestamps.

+ +
+

Note InfluxDB does not support using OR in the WHERE clause to specify multiple time ranges. For example, InfluxDB returns an empty response for the following query:

+ +
+

> SELECT * FROM "absolutismus" WHERE time = '2016-07-31T20:07:00Z' OR time = '2016-07-31T23:07:17Z'

+

Fields

+ + +
field_key <operator> ['string' | boolean | float | integer]
+

The WHERE clause supports comparisons against string, boolean, float, +and integer field values.

+

Single quote string field values in the WHERE clause. +Queries with unquoted string field values or double quoted string field values +will not return any data and, in most cases, +will not return an error.

+
Supported operators
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorMeaning
=equal to
<>not equal to
!=not equal to
>greater than
>=greater than or equal to
<less than
<=less than or equal to
+

Other supported features: +Arithmetic Operations, +Regular Expressions

+

Tags

+ + +
tag_key <operator> ['tag_value']
+

Single quote tag values in +the WHERE clause. +Queries with unquoted tag values or double quoted tag values will not return +any data and, in most cases, +will not return an error.

+
Supported operators
+ + + + + + + + + + + + + + + + + + + + + +
OperatorMeaning
=equal to
<>not equal to
!=not equal to
+

Other supported features: +Regular Expressions

+

Timestamps

+

For most SELECT statements, the default time range is between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC. +For SELECT statements with a GROUP BY time() clause, the default time +range is between 1677-09-21 00:12:43.145224194 UTC and now().

+

The Time Syntax section on this page +details how to specify alternative time ranges in the WHERE clause.

+

Examples

+

Select data that have specific field key-values

+ + +
> SELECT * FROM "h2o_feet" WHERE "water_level" > 8
+
+name: h2o_feet
+--------------
+time                   level description      location       water_level
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+2015-08-18T00:06:00Z   between 6 and 9 feet   coyote_creek   8.005
+[...]
+2015-09-18T00:12:00Z   between 6 and 9 feet   coyote_creek   8.189
+2015-09-18T00:18:00Z   between 6 and 9 feet   coyote_creek   8.084
+

The query returns data from the h2o_feet +measurement with +field values of water_level +that are greater than eight.

+

Select data that have a specific string field key-value

+ + +
> SELECT * FROM "h2o_feet" WHERE "level description" = 'below 3 feet'
+
+name: h2o_feet
+--------------
+time                   level description   location       water_level
+2015-08-18T00:00:00Z   below 3 feet        santa_monica   2.064
+2015-08-18T00:06:00Z   below 3 feet        santa_monica   2.116
+[...]
+2015-09-18T14:06:00Z   below 3 feet        santa_monica   2.999
+2015-09-18T14:36:00Z   below 3 feet        santa_monica   2.907
+

The query returns data from the h2o_feet measurement with field values of +level description that equal the below 3 feet string. +InfluxQL requires single quotes around string field values in the WHERE +clause.

+

Select data that have a specific field key-value and perform basic arithmetic

+ + +
> SELECT * FROM "h2o_feet" WHERE "water_level" + 2 > 11.10
+
+name: h2o_feet
+--------------
+time                   level description           location       water_level
+2015-08-29T07:06:00Z   at or greater than 9 feet   coyote_creek   9.902
+2015-08-29T07:12:00Z   at or greater than 9 feet   coyote_creek   9.938
+2015-08-29T07:18:00Z   at or greater than 9 feet   coyote_creek   9.957
+2015-08-29T07:24:00Z   at or greater than 9 feet   coyote_creek   9.964
+2015-08-29T07:30:00Z   at or greater than 9 feet   coyote_creek   9.954
+2015-08-29T07:36:00Z   at or greater than 9 feet   coyote_creek   9.941
+2015-08-29T07:42:00Z   at or greater than 9 feet   coyote_creek   9.925
+2015-08-29T07:48:00Z   at or greater than 9 feet   coyote_creek   9.902
+2015-09-02T23:30:00Z   at or greater than 9 feet   coyote_creek   9.902
+

The query returns data from the h2o_feet measurement with field values of +water_level plus two that are greater than 11.10. +Note that InfluxDB follows the standard order of operations +See Mathematical Operators +for more on supported operators.

+

Select data that have a specific tag key-value

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica'
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+[...]
+2015-09-18T21:36:00Z   5.066
+2015-09-18T21:42:00Z   4.938
+

The query returns data from the h2o_feet measurement where the +tag key location is set to santa_monica. +InfluxQL requires single quotes around tag values in the WHERE clause.

+

Select data that have specific field key-values and tag key-values

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" <> 'santa_monica' AND (water_level < -0.59 OR water_level > 9.95)
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-29T07:18:00Z   9.957
+2015-08-29T07:24:00Z   9.964
+2015-08-29T07:30:00Z   9.954
+2015-08-29T14:30:00Z   -0.61
+2015-08-29T14:36:00Z   -0.591
+2015-08-30T15:18:00Z   -0.594
+

The query returns data from the h2o_feet measurement where the tag key +location is not set to santa_monica and where the field values of +water_level are either less than -0.59 or greater than 9.95. +The WHERE clause supports the operators AND and OR, and supports +separating logic with parentheses.

+

Select data that have specific timestamps

+ + +
SELECT * FROM "h2o_feet" WHERE time > now() - 7d
+

The query returns data from the h2o_feet measurement that have timestamps +within the past seven days. +The Time Syntax section on this page +offers in-depth information on supported time syntax in the WHERE clause.

+

Common issues with the WHERE clause

+

A WHERE clause query unexpectedly returns no data

+

In most cases, this issue is the result of missing single quotes around +tag values +or string field values. +Queries with unquoted or double quoted tag values or string field values will +not return any data and, in most cases, will not return an error.

+

The first two queries in the code block below attempt to specify the tag value +santa_monica without any quotes and with double quotes. +Those queries return no results. +The third query single quotes santa_monica (this is the supported syntax) +and returns the expected results.

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = santa_monica
+
+> SELECT "water_level" FROM "h2o_feet" WHERE "location" = "santa_monica"
+
+> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica'
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   2.064
+[...]
+2015-09-18T21:42:00Z   4.938
+

The first two queries in the code block below attempt to specify the string +field value at or greater than 9 feet without any quotes and with double +quotes. +The first query returns an error because the string field value includes +white spaces. +The second query returns no results. +The third query single quotes at or greater than 9 feet (this is the +supported syntax) and returns the expected results.

+ + +
> SELECT "level description" FROM "h2o_feet" WHERE "level description" = at or greater than 9 feet
+
+ERR: error parsing query: found than, expected ; at line 1, char 86
+
+> SELECT "level description" FROM "h2o_feet" WHERE "level description" = "at or greater than 9 feet"
+
+> SELECT "level description" FROM "h2o_feet" WHERE "level description" = 'at or greater than 9 feet'
+
+name: h2o_feet
+--------------
+time                   level description
+2015-08-26T04:00:00Z   at or greater than 9 feet
+[...]
+2015-09-15T22:42:00Z   at or greater than 9 feet
+

The GROUP BY clause

+

The GROUP BY clause groups query results by:

+
    +
  • one or more specified tags
  • +
  • specified time interval
  • +
+ +
+

Note: You cannot use GROUP BY to group fields.

+ +
+ + + + + + + + + + + + + +
GROUP BY tags +
GROUP BY time intervals: + Basic SyntaxAdvanced SyntaxGROUP BY time intervals and fill()
+

GROUP BY tags

+

GROUP BY <tag> groups query results by one or more specified tags.

+

Watch InfluxQL short about GROUP BY with tags: +
+

+ +

Syntax

+ + +
SELECT_clause FROM_clause [WHERE_clause] GROUP BY [* | <tag_key>[,<tag_key]]
+

GROUP BY * +   Groups results by all tags

+

GROUP BY <tag_key> +   Groups results by a specific tag

+

GROUP BY <tag_key>,<tag_key> +   Groups results by more than one tag. +The order of the tag keys is irrelevant.

+

If the query includes a WHERE clause the GROUP BY +clause must appear after the WHERE clause.

+

Other supported features: Regular Expressions

+

Examples

+
Group query results by a single tag
+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" GROUP BY "location"
+
+name: h2o_feet
+tags: location=coyote_creek
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 5.359342451341401
+
+
+name: h2o_feet
+tags: location=santa_monica
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 3.530863470081006
+

The query uses an InfluxQL function +to calculate the average water_level for each +tag value of location in +the h2o_feet measurement. +InfluxDB returns results in two series: one for each tag value of location.

+ +
+

Note: In InfluxDB, epoch 0 (1970-01-01T00:00:00Z) is often used as a null timestamp equivalent. +If you request a query that has no timestamp to return, such as an aggregation function with an unbounded time range, InfluxDB returns epoch 0 as the timestamp.

+ +
+
Group query results by more than one tag
+ + +
> SELECT MEAN("index") FROM "h2o_quality" GROUP BY "location","randtag"
+
+name: h2o_quality
+tags: location=coyote_creek, randtag=1
+time                  mean
+----                  ----
+1970-01-01T00:00:00Z  50.69033760186263
+
+name: h2o_quality
+tags: location=coyote_creek, randtag=2
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   49.661867544220485
+
+name: h2o_quality
+tags: location=coyote_creek, randtag=3
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   49.360939907550076
+
+name: h2o_quality
+tags: location=santa_monica, randtag=1
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   49.132712456344585
+
+name: h2o_quality
+tags: location=santa_monica, randtag=2
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   50.2937984496124
+
+name: h2o_quality
+tags: location=santa_monica, randtag=3
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   49.99919903884662
+

The query uses an InfluxQL function to calculate the average index for +each combination of the location tag and the randtag tag in the +h2o_quality measurement. +Separate multiple tags with a comma in the GROUP BY clause.

+
Group query results by all tags
+ + +
> SELECT MEAN("index") FROM "h2o_quality" GROUP BY *
+
+name: h2o_quality
+tags: location=coyote_creek, randtag=1
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 50.55405446521169
+
+
+name: h2o_quality
+tags: location=coyote_creek, randtag=2
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 50.49958856271162
+
+
+name: h2o_quality
+tags: location=coyote_creek, randtag=3
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 49.5164137518956
+
+
+name: h2o_quality
+tags: location=santa_monica, randtag=1
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 50.43829082296367
+
+
+name: h2o_quality
+tags: location=santa_monica, randtag=2
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 52.0688508894012
+
+
+name: h2o_quality
+tags: location=santa_monica, randtag=3
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 49.29386362086556
+

The query uses an InfluxQL function +to calculate the average index for every possible +tag combination in the h2o_quality +measurement.

+

Note that the query results are identical to the results of the query in Example 2 +where we explicitly specified the location and randtag tag keys. +This is because the h2o_quality measurement only has two tag keys.

+

GROUP BY time intervals

+

GROUP BY time() queries group query results by a user-specified time interval.

+

Basic GROUP BY time() syntax

+

Syntax

+ + +
SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(<time_interval>),[tag_key] [fill(<fill_option>)]
+

Basic GROUP BY time() queries require an InfluxQL function +in the SELECT clause and a time range in the +WHERE clause. +Note that the GROUP BY clause must come after the WHERE clause.

+
time(time_interval)
+

The time_interval in the GROUP BY time() clause is a +duration literal. +It determines how InfluxDB groups query results over time. +For example, a time_interval of 5m groups query results into five-minute +time groups across the time range specified in the WHERE clause.

+
fill(<fill_option>)
+

fill(<fill_option>) is optional. +It changes the value reported for time intervals that have no data. +See GROUP BY time intervals and fill() +for more information.

+

Coverage:

+

Basic GROUP BY time() queries rely on the time_interval and on the InfluxDB database’s +preset time boundaries to determine the raw data included in each time interval +and the timestamps returned by the query.

+

Examples of basic syntax

+

The examples below use the following subsample of the sample data:

+ + +
> SELECT "water_level","location" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'
+
+name: h2o_feet
+--------------
+time                   water_level   location
+2015-08-18T00:00:00Z   8.12          coyote_creek
+2015-08-18T00:00:00Z   2.064         santa_monica
+2015-08-18T00:06:00Z   8.005         coyote_creek
+2015-08-18T00:06:00Z   2.116         santa_monica
+2015-08-18T00:12:00Z   7.887         coyote_creek
+2015-08-18T00:12:00Z   2.028         santa_monica
+2015-08-18T00:18:00Z   7.762         coyote_creek
+2015-08-18T00:18:00Z   2.126         santa_monica
+2015-08-18T00:24:00Z   7.635         coyote_creek
+2015-08-18T00:24:00Z   2.041         santa_monica
+2015-08-18T00:30:00Z   7.5           coyote_creek
+2015-08-18T00:30:00Z   2.051         santa_monica
+
Group query results into 12 minute intervals
+ + +
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+--------------
+time                   count
+2015-08-18T00:00:00Z   2
+2015-08-18T00:12:00Z   2
+2015-08-18T00:24:00Z   2
+

The query uses an InfluxQL function +to count the number of water_level points with the tag +location = coyote_creek and it group results into 12 minute intervals.

+

The result for each timestamp +represents a single 12 minute interval. +The count for the first timestamp covers the raw data between 2015-08-18T00:00:00Z +and up to, but not including, 2015-08-18T00:12:00Z. +The count for the second timestamp covers the raw data between 2015-08-18T00:12:00Z +and up to, but not including, 2015-08-18T00:24:00Z.

+
Group query results into 12 minutes intervals and by a tag key
+ + +
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),"location"
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   count
+----                   -----
+2015-08-18T00:00:00Z   2
+2015-08-18T00:12:00Z   2
+2015-08-18T00:24:00Z   2
+
+name: h2o_feet
+tags: location=santa_monica
+time                   count
+----                   -----
+2015-08-18T00:00:00Z   2
+2015-08-18T00:12:00Z   2
+2015-08-18T00:24:00Z   2
+

The query uses an InfluxQL function +to count the number of water_level points. +It groups results by the location tag and into 12 minute intervals. +Note that the time interval and the tag key are separated by a comma in the +GROUP BY clause.

+

The query returns two series of results: one for each +tag value of the location tag. +The result for each timestamp represents a single 12 minute interval. +The count for the first timestamp covers the raw data between 2015-08-18T00:00:00Z +and up to, but not including, 2015-08-18T00:12:00Z. +The count for the second timestamp covers the raw data between 2015-08-18T00:12:00Z +and up to, but not including, 2015-08-18T00:24:00Z.

+

Common issues with basic syntax

+
Unexpected timestamps and values in query results
+

With the basic syntax, InfluxDB relies on the GROUP BY time() interval +and on the system’s preset time boundaries to determine the raw data included +in each time interval and the timestamps returned by the query. +In some cases, this can lead to unexpected results.

+

Example

+

Raw data:

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:18:00Z'
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   8.12
+2015-08-18T00:06:00Z   8.005
+2015-08-18T00:12:00Z   7.887
+2015-08-18T00:18:00Z   7.762
+

Query and results:

+

The following query covers a 12-minute time range and groups results into 12-minute time intervals, but it returns two results:

+ + +
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time < '2015-08-18T00:18:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+time                   count
+----                   -----
+2015-08-18T00:00:00Z   1        <----- Note that this timestamp occurs before the start of the query's time range
+2015-08-18T00:12:00Z   1
+

Explanation:

+

InfluxDB uses preset round-number time boundaries for GROUP BY intervals that are +independent of any time conditions in the WHERE clause. +When it calculates the results, all returned data must occur within the query’s +explicit time range but the GROUP BY intervals will be based on the preset +time boundaries.

+

The table below shows the preset time boundary, the relevant GROUP BY time() interval, the +points included, and the returned timestamp for each GROUP BY time() +interval in the results.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberPreset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-18T00:00:00Z AND time < 2015-08-18T00:12:00Ztime >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:12:00Z8.0052015-08-18T00:00:00Z
2time >= 2015-08-12T00:12:00Z AND time < 2015-08-18T00:24:00Ztime >= 2015-08-12T00:12:00Z AND time < 2015-08-18T00:18:00Z7.8872015-08-18T00:12:00Z
+

The first preset 12-minute time boundary begins at 00:00 and ends just before +00:12. +Only one raw point (8.005) falls both within the query’s first GROUP BY time() interval and in that +first time boundary. +Note that while the returned timestamp occurs before the start of the query’s time range, +the query result excludes data that occur before the query’s time range.

+

The second preset 12-minute time boundary begins at 00:12 and ends just before +00:24. +Only one raw point (7.887) falls both within the query’s second GROUP BY time() interval and in that +second time boundary.

+

The advanced GROUP BY time() syntax allows users to shift +the start time of the InfluxDB database’s preset time boundaries. +Example 3 +in the Advanced Syntax section continues with the query shown here; +it shifts forward the preset time boundaries by six minutes such that +InfluxDB returns:

+ + +
name: h2o_feet
+time                   count
+----                   -----
+2015-08-18T00:06:00Z   2
+

Advanced GROUP BY time() syntax

+

Syntax

+ + +
SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(<time_interval>,<offset_interval>),[tag_key] [fill(<fill_option>)]
+

Advanced GROUP BY time() queries require an InfluxQL function +in the SELECT clause and a time range in the +WHERE clause. +Note that the GROUP BY clause must come after the WHERE clause.

+
time(time_interval,offset_interval)
+

See the Basic GROUP BY time() Syntax +for details on the time_interval.

+

The offset_interval is a +duration literal. +It shifts forward or back the InfluxDB database’s preset time boundaries. +The offset_interval can be positive or negative.

+
fill(<fill_option>)
+

fill(<fill_option>) is optional. +It changes the value reported for time intervals that have no data. +See GROUP BY time intervals and fill() +for more information.

+

Coverage:

+

Advanced GROUP BY time() queries rely on the time_interval, the offset_interval +, and on the InfluxDB database’s preset time boundaries to determine the raw data included in each time interval +and the timestamps returned by the query.

+

Examples of advanced syntax

+

The examples below use the following subsample of the sample data:

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:54:00Z'
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   8.12
+2015-08-18T00:06:00Z   8.005
+2015-08-18T00:12:00Z   7.887
+2015-08-18T00:18:00Z   7.762
+2015-08-18T00:24:00Z   7.635
+2015-08-18T00:30:00Z   7.5
+2015-08-18T00:36:00Z   7.372
+2015-08-18T00:42:00Z   7.234
+2015-08-18T00:48:00Z   7.11
+2015-08-18T00:54:00Z   6.982
+
Group query results into 18 minute intervals and shift the preset time boundaries forward
+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time <= '2015-08-18T00:54:00Z' GROUP BY time(18m,6m)
+
+name: h2o_feet
+time                   mean
+----                   ----
+2015-08-18T00:06:00Z   7.884666666666667
+2015-08-18T00:24:00Z   7.502333333333333
+2015-08-18T00:42:00Z   7.108666666666667
+

The query uses an InfluxQL function +to calculate the average water_level, grouping results into 18 minute +time intervals, and offsetting the preset time boundaries by six minutes.

+

The time boundaries and returned timestamps for the query without the offset_interval adhere to the InfluxDB database’s preset time boundaries. Let’s first examine the results without the offset:

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time <= '2015-08-18T00:54:00Z' GROUP BY time(18m)
+
+name: h2o_feet
+time                   mean
+----                   ----
+2015-08-18T00:00:00Z   7.946
+2015-08-18T00:18:00Z   7.6323333333333325
+2015-08-18T00:36:00Z   7.238666666666667
+2015-08-18T00:54:00Z   6.982
+

The time boundaries and returned timestamps for the query without the +offset_interval adhere to the InfluxDB database’s preset time boundaries:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberPreset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-18T00:00:00Z AND time < 2015-08-18T00:18:00Ztime >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:18:00Z8.005,7.8872015-08-18T00:00:00Z
2time >= 2015-08-18T00:18:00Z AND time < 2015-08-18T00:36:00Z<— same7.762,7.635,7.52015-08-18T00:18:00Z
3time >= 2015-08-18T00:36:00Z AND time < 2015-08-18T00:54:00Z<— same7.372,7.234,7.112015-08-18T00:36:00Z
4time >= 2015-08-18T00:54:00Z AND time < 2015-08-18T01:12:00Ztime = 2015-08-18T00:54:00Z6.9822015-08-18T00:54:00Z
+

The first preset 18-minute time boundary begins at 00:00 and ends just before +00:18. +Two raw points (8.005 and 7.887) fall both within the first GROUP BY time() interval and in that +first time boundary. +Note that while the returned timestamp occurs before the start of the query’s time range, +the query result excludes data that occur before the query’s time range.

+

The second preset 18-minute time boundary begins at 00:18 and ends just before +00:36. +Three raw points (7.762 and 7.635 and 7.5) fall both within the second GROUP BY time() interval and in that +second time boundary. In this case, the boundary time range and the interval’s time range are the same.

+

The fourth preset 18-minute time boundary begins at 00:54 and ends just before +1:12:00. +One raw point (6.982) falls both within the fourth GROUP BY time() interval and in that +fourth time boundary.

+

The time boundaries and returned timestamps for the query with the +offset_interval adhere to the offset time boundaries:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberOffset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:24:00Z<— same8.005,7.887,7.7622015-08-18T00:06:00Z
2time >= 2015-08-18T00:24:00Z AND time < 2015-08-18T00:42:00Z<— same7.635,7.5,7.3722015-08-18T00:24:00Z
3time >= 2015-08-18T00:42:00Z AND time < 2015-08-18T01:00:00Z<— same7.234,7.11,6.9822015-08-18T00:42:00Z
4time >= 2015-08-18T01:00:00Z AND time < 2015-08-18T01:18:00ZNANANA
+

The six-minute offset interval shifts forward the preset boundary’s time range +such that the boundary time ranges and the relevant GROUP BY time() interval time ranges are +always the same. +With the offset, each interval performs the calculation on three points, and +the timestamp returned matches both the start of the boundary time range and the +start of the GROUP BY time() interval time range.

+

Note that offset_interval forces the fourth time boundary to be outside +the query’s time range so the query returns no results for that last interval.

+
Group query results into 12 minute intervals and shift the preset time boundaries back
+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time <= '2015-08-18T00:54:00Z' GROUP BY time(18m,-12m)
+
+name: h2o_feet
+time                   mean
+----                   ----
+2015-08-18T00:06:00Z   7.884666666666667
+2015-08-18T00:24:00Z   7.502333333333333
+2015-08-18T00:42:00Z   7.108666666666667
+

The query uses an InfluxQL function +to calculate the average water_level, grouping results into 18 minute +time intervals, and offsetting the preset time boundaries by -12 minutes.

+ +
+

Note: The query in Example 2 returns the same results as the query in Example 1, but +the query in Example 2 uses a negative offset_interval instead of a positive +offset_interval. +There are no performance differences between the two queries; feel free to choose the most +intuitive option when deciding between a positive and negative offset_interval.

+ +
+

The time boundaries and returned timestamps for the query without the offset_interval adhere to InfluxDB database’s preset time boundaries. Let’s first examine the results without the offset:

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time <= '2015-08-18T00:54:00Z' GROUP BY time(18m)
+
+name: h2o_feet
+time                    mean
+----                    ----
+2015-08-18T00:00:00Z    7.946
+2015-08-18T00:18:00Z    7.6323333333333325
+2015-08-18T00:36:00Z    7.238666666666667
+2015-08-18T00:54:00Z    6.982
+

The time boundaries and returned timestamps for the query without the +offset_interval adhere to the InfluxDB database’s preset time boundaries:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberPreset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-18T00:00:00Z AND time < 2015-08-18T00:18:00Ztime >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:18:00Z8.005,7.8872015-08-18T00:00:00Z
2time >= 2015-08-18T00:18:00Z AND time < 2015-08-18T00:36:00Z<— same7.762,7.635,7.52015-08-18T00:18:00Z
3time >= 2015-08-18T00:36:00Z AND time < 2015-08-18T00:54:00Z<— same7.372,7.234,7.112015-08-18T00:36:00Z
4time >= 2015-08-18T00:54:00Z AND time < 2015-08-18T01:12:00Ztime = 2015-08-18T00:54:00Z6.9822015-08-18T00:54:00Z
+

The first preset 18-minute time boundary begins at 00:00 and ends just before +00:18. +Two raw points (8.005 and 7.887) fall both within the first GROUP BY time() interval and in that +first time boundary. +Note that while the returned timestamp occurs before the start of the query’s time range, +the query result excludes data that occur before the query’s time range.

+

The second preset 18-minute time boundary begins at 00:18 and ends just before +00:36. +Three raw points (7.762 and 7.635 and 7.5) fall both within the second GROUP BY time() interval and in that +second time boundary. In this case, the boundary time range and the interval’s time range are the same.

+

The fourth preset 18-minute time boundary begins at 00:54 and ends just before +1:12:00. +One raw point (6.982) falls both within the fourth GROUP BY time() interval and in that +fourth time boundary.

+

The time boundaries and returned timestamps for the query with the +offset_interval adhere to the offset time boundaries:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberOffset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-17T23:48:00Z AND time < 2015-08-18T00:06:00ZNANANA
2time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:24:00Z<— same8.005,7.887,7.7622015-08-18T00:06:00Z
3time >= 2015-08-18T00:24:00Z AND time < 2015-08-18T00:42:00Z<— same7.635,7.5,7.3722015-08-18T00:24:00Z
4time >= 2015-08-18T00:42:00Z AND time < 2015-08-18T01:00:00Z<— same7.234,7.11,6.9822015-08-18T00:42:00Z
+

The negative 12-minute offset interval shifts back the preset boundary’s time range +such that the boundary time ranges and the relevant GROUP BY time() interval time ranges are always the +same. +With the offset, each interval performs the calculation on three points, and +the timestamp returned matches both the start of the boundary time range and the +start of the GROUP BY time() interval time range.

+

Note that offset_interval forces the first time boundary to be outside +the query’s time range so the query returns no results for that first interval.

+
Group query results into 12 minute intervals and shift the preset time boundaries forward
+

This example is a continuation of the scenario outlined in Common Issues with Basic Syntax.

+ + +
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time < '2015-08-18T00:18:00Z' GROUP BY time(12m,6m)
+
+name: h2o_feet
+time                   count
+----                   -----
+2015-08-18T00:06:00Z   2
+

The query uses an InfluxQL function +to count the number of water_level points, grouping results into 12 minute +time intervals, and offsetting the preset time boundaries by six minutes.

+

The time boundaries and returned timestamps for the query without the offset_interval adhere to InfluxDB database’s preset time boundaries. Let’s first examine the results without the offset:

+ + +
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time < '2015-08-18T00:18:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+time                   count
+----                   -----
+2015-08-18T00:00:00Z   1
+2015-08-18T00:12:00Z   1
+

The time boundaries and returned timestamps for the query without the +offset_interval adhere to InfluxDB database’s preset time boundaries:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberPreset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-18T00:00:00Z AND time < 2015-08-18T00:12:00Ztime >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:12:00Z8.0052015-08-18T00:00:00Z
2time >= 2015-08-12T00:12:00Z AND time < 2015-08-18T00:24:00Ztime >= 2015-08-12T00:12:00Z AND time < 2015-08-18T00:18:00Z7.8872015-08-18T00:12:00Z
+

The first preset 12-minute time boundary begins at 00:00 and ends just before +00:12. +Only one raw point (8.005) falls both within the query’s first GROUP BY time() interval and in that +first time boundary. +Note that while the returned timestamp occurs before the start of the query’s time range, +the query result excludes data that occur before the query’s time range.

+

The second preset 12-minute time boundary begins at 00:12 and ends just before +00:24. +Only one raw point (7.887) falls both within the query’s second GROUP BY time() interval and in that +second time boundary.

+

The time boundaries and returned timestamps for the query with the +offset_interval adhere to the offset time boundaries:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberOffset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:18:00Z<— same8.005,7.8872015-08-18T00:06:00Z
2time >= 2015-08-18T00:18:00Z AND time < 2015-08-18T00:30:00ZNANANA
+

The six-minute offset interval shifts forward the preset boundary’s time range +such that the preset boundary time range and the relevant GROUP BY time() interval time range are the +same. +With the offset, the query returns a single result, and the timestamp returned +matches both the start of the boundary time range and the start of the GROUP BY time() interval +time range.

+

Note that offset_interval forces the second time boundary to be outside +the query’s time range so the query returns no results for that second interval.

+

GROUP BY time intervals and fill()

+

fill() changes the value reported for time intervals that have no data.

+

Syntax

+ + +
SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(time_interval,[<offset_interval])[,tag_key] [fill(<fill_option>)]
+

By default, a GROUP BY time() interval with no data reports null as its +value in the output column. +fill() changes the value reported for time intervals that have no data. +Note that fill() must go at the end of the GROUP BY clause if you’re +GROUP(ing) BY several things (for example, both tags and a time interval).

+
fill_option
+

Any numerical value +              +Reports the given numerical value for time intervals with no data.

+

linear +              +Reports the results of linear interpolation for time intervals with no data.

+

none +              +              +           +Reports no timestamp and no value for time intervals with no data.

+

null +              +              +           +Reports null for time intervals with no data but returns a timestamp. This is the same as the default behavior.

+

previous +              +              +    +Reports the value from the previous time interval for time intervals with no data.

+

Examples

+ +
+ + + + + + + + +
+

Without fill(100):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z
+

With fill(100):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) fill(100)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z   100
+

fill(100) changes the value reported for the time interval with no data to 100.

+ +
+ + + +
+

Without fill(linear):

+ + +
> SELECT MEAN("tadpoles") FROM "pond" WHERE time >= '2016-11-11T21:00:00Z' AND time <= '2016-11-11T22:06:00Z' GROUP BY time(12m)
+
+name: pond
+time                   mean
+----                   ----
+2016-11-11T21:00:00Z   1
+2016-11-11T21:12:00Z
+2016-11-11T21:24:00Z   3
+2016-11-11T21:36:00Z
+2016-11-11T21:48:00Z
+2016-11-11T22:00:00Z   6
+

With fill(linear):

+ + +
> SELECT MEAN("tadpoles") FROM "pond" WHERE time >= '2016-11-11T21:00:00Z' AND time <= '2016-11-11T22:06:00Z' GROUP BY time(12m) fill(linear)
+
+name: pond
+time                   mean
+----                   ----
+2016-11-11T21:00:00Z   1
+2016-11-11T21:12:00Z   2
+2016-11-11T21:24:00Z   3
+2016-11-11T21:36:00Z   4
+2016-11-11T21:48:00Z   5
+2016-11-11T22:00:00Z   6
+

fill(linear) changes the value reported for the time interval with no data +to the results of linear interpolation.

+ +
+

Note: The data in Example 2 are not in NOAA_water_database. +We had to create a dataset with less regular data to work with fill(linear).

+ +
+ +
+ + + +
+

Without fill(none):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z
+

With fill(none):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) fill(none)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+

fill(none) reports no value and no timestamp for the time interval with no data.

+ +
+ + + +
+

Without fill(null):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z
+

With fill(null):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) fill(null)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z
+

fill(null) reports null as the value for the time interval with no data. +That result matches the result of the query without fill(null).

+ +
+ + + +
+

Without fill(previous):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z
+

With fill(previous):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) fill(previous)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z   3.235
+

fill(previous) changes the value reported for the time interval with no data to 3.235, +the value from the previous time interval.

+ +
+ + +
+ +

Common issues with fill()

+
Queries with fill() when no data fall within the query’s time range
+

Currently, queries ignore fill() if no data fall within the query’s time range. +This is the expected behavior. An open +feature request on GitHub +proposes that fill() should force a return of values even if the query’s time +range covers no data.

+

Example

+

The following query returns no data because water_level has no points within +the query’s time range. +Note that fill(800) has no effect on the query results.

+ + +
SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location" = 'coyote_creek' AND time >= '2015-09-18T22:00:00Z' AND time <= '2015-09-18T22:18:00Z' GROUP BY time(12m) fill(800)
+
Queries with fill(previous) when the previous result falls outside the query’s time range
+

fill(previous) doesn’t fill the result for a time interval if the previous +value is outside the query’s time range.

+

Example

+

The following query covers the time range between 2015-09-18T16:24:00Z and 2015-09-18T16:54:00Z. +Note that fill(previous) fills the result for 2015-09-18T16:36:00Z with the +result from 2015-09-18T16:24:00Z.

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE location = 'coyote_creek' AND time >= '2015-09-18T16:24:00Z' AND time <= '2015-09-18T16:54:00Z' GROUP BY time(12m) fill(previous)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z   3.235
+2015-09-18T16:48:00Z   4
+

The next query shortens the time range in the previous query. +It now covers the time between 2015-09-18T16:36:00Z and 2015-09-18T16:54:00Z. +Note that fill(previous) doesn’t fill the result for 2015-09-18T16:36:00Z with the +result from 2015-09-18T16:24:00Z; the result for 2015-09-18T16:24:00Z is outside the query’s +shorter time range.

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE location = 'coyote_creek' AND time >= '2015-09-18T16:36:00Z' AND time <= '2015-09-18T16:54:00Z' GROUP BY time(12m) fill(previous)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:36:00Z
+2015-09-18T16:48:00Z   4
+
fill(linear) when the previous or following result falls outside the query’s time range
+

fill(linear) doesn’t fill the result for a time interval with no data if the +previous result or the following result is outside the query’s time range.

+

Example

+

The following query covers the time range between 2016-11-11T21:24:00Z and +2016-11-11T22:06:00Z. Note that fill(linear) fills the results for the +2016-11-11T21:36:00Z time interval and the 2016-11-11T21:48:00Z time interval +using the values from the 2016-11-11T21:24:00Z time interval and the +2016-11-11T22:00:00Z time interval.

+ + +
> SELECT MEAN("tadpoles") FROM "pond" WHERE time > '2016-11-11T21:24:00Z' AND time <= '2016-11-11T22:06:00Z' GROUP BY time(12m) fill(linear)
+
+name: pond
+time                   mean
+----                   ----
+2016-11-11T21:24:00Z   3
+2016-11-11T21:36:00Z   4
+2016-11-11T21:48:00Z   5
+2016-11-11T22:00:00Z   6
+

The next query shortens the time range in the previous query. +It now covers the time between 2016-11-11T21:36:00Z and 2016-11-11T22:06:00Z. +Note that fill() previous doesn’t fill the results for the 2016-11-11T21:36:00Z +time interval and the 2016-11-11T21:48:00Z time interval; the result for +2016-11-11T21:24:00Z is outside the query’s shorter time range and InfluxDB +cannot perform the linear interpolation.

+ + +
> SELECT MEAN("tadpoles") FROM "pond" WHERE time >= '2016-11-11T21:36:00Z' AND time <= '2016-11-11T22:06:00Z' GROUP BY time(12m) fill(linear)
+name: pond
+time                   mean
+----                   ----
+2016-11-11T21:36:00Z
+2016-11-11T21:48:00Z
+2016-11-11T22:00:00Z   6
+ +
+

Note: The data in Issue 3 are not in NOAA_water_database. +We had to create a dataset with less regular data to work with fill(linear).

+ +
+

The INTO clause

+

The INTO clause writes query results to a user-specified measurement.

+

Syntax

+ + +
SELECT_clause INTO <measurement_name> FROM_clause [WHERE_clause] [GROUP_BY_clause]
+

The INTO clause supports several formats for specifying a measurement:

+

INTO <measurement_name> +           +Writes data to the specified measurement. +If you’re using the CLI InfluxDB writes the data to the measurement in the +USEd +database and the DEFAULT retention policy. +If you’re using the InfluxDB API InfluxDB writes the data to the +measurement in the database specified in the db query string parameter +and the DEFAULT retention policy.

+

INTO <database_name>.<retention_policy_name>.<measurement_name> +           +Writes data to a fully qualified measurement. +Fully qualify a measurement by specifying its database and retention policy.

+

INTO <database_name>..<measurement_name> +           +Writes data to a measurement in a user-specified database and the DEFAULT +retention policy.

+

INTO <database_name>.<retention_policy_name>.:MEASUREMENT FROM /<regular_expression>/ +           +Writes data to all measurements in the user-specified database and +retention policy that match the regular expression in the FROM clause. +:MEASUREMENT is a backreference to each measurement matched in the FROM clause.

+

Examples

+

Rename a database

+ + +
> SELECT * INTO "copy_NOAA_water_database"."autogen".:MEASUREMENT FROM "NOAA_water_database"."autogen"./.*/ GROUP BY *
+
+name: result
+time written
+---- -------
+0    76290
+

Directly renaming a database in InfluxDB is not possible, so a common use for the INTO clause is to move data from one database to another. +The query above writes all data in the NOAA_water_database and autogen retention policy to the copy_NOAA_water_database database and the autogen retention policy.

+

The backreference syntax (:MEASUREMENT) maintains the source measurement names in the destination database. +Note that both the copy_NOAA_water_database database and its autogen retention policy must exist prior to running the INTO query. +See Database Management +for how to manage databases and retention policies.

+

The GROUP BY * clause preserves tags in the source database as tags in the destination database. +The following query does not maintain the series context for tags; tags will be stored as fields in the destination database (copy_NOAA_water_database):

+ + +
SELECT * INTO "copy_NOAA_water_database"."autogen".:MEASUREMENT FROM "NOAA_water_database"."autogen"./.*/
+

When moving large amounts of data, we recommend sequentially running INTO queries for different measurements and using time boundaries in the WHERE clause. +This prevents your system from running out of memory. +The codeblock below provides sample syntax for those queries:

+ + +
SELECT *
+INTO <destination_database>.<retention_policy_name>.<measurement_name>
+FROM <source_database>.<retention_policy_name>.<measurement_name>
+WHERE time > now() - 100w AND time < now() - 90w GROUP BY *
+
+SELECT *
+INTO <destination_database>.<retention_policy_name>.<measurement_name>
+FROM <source_database>.<retention_policy_name>.<measurement_name>}
+WHERE time > now() - 90w AND < now() - 80w GROUP BY *
+
+SELECT *
+INTO <destination_database>.<retention_policy_name>.<measurement_name>
+FROM <source_database>.<retention_policy_name>.<measurement_name>
+WHERE time > now() - 80w AND time < now() - 70w GROUP BY *
+

Write the results of a query to a measurement

+ + +
> SELECT "water_level" INTO "h2o_feet_copy_1" FROM "h2o_feet" WHERE "location" = 'coyote_creek'
+
+name: result
+------------
+time                   written
+1970-01-01T00:00:00Z   7604
+
+> SELECT * FROM "h2o_feet_copy_1"
+
+name: h2o_feet_copy_1
+---------------------
+time                   water_level
+2015-08-18T00:00:00Z   8.12
+[...]
+2015-09-18T16:48:00Z   4
+

The query writes its results a new measurement: h2o_feet_copy_1. +If you’re using the CLI, InfluxDB writes the data to +the USEd database and the DEFAULT retention policy. +If you’re using the InfluxDB API, InfluxDB writes the +data to the database and retention policy specified in the db and rp +query string parameters. +If you do not set the rp query string parameter, the InfluxDB API automatically +writes the data to the database’s DEFAULT retention policy.

+

The response shows the number of points (7605) that InfluxDB writes to h2o_feet_copy_1. +The timestamp in the response is meaningless; InfluxDB uses epoch 0 +(1970-01-01T00:00:00Z) as a null timestamp equivalent.

+

Write the results of a query to a fully qualified measurement

+ + +
> SELECT "water_level" INTO "where_else"."autogen"."h2o_feet_copy_2" FROM "h2o_feet" WHERE "location" = 'coyote_creek'
+
+name: result
+------------
+time                   written
+1970-01-01T00:00:00Z   7604
+
+> SELECT * FROM "where_else"."autogen"."h2o_feet_copy_2"
+
+name: h2o_feet_copy_2
+---------------------
+time                   water_level
+2015-08-18T00:00:00Z   8.12
+[...]
+2015-09-18T16:48:00Z   4
+

The query writes its results to a new measurement: h2o_feet_copy_2. +InfluxDB writes the data to the where_else database and to the autogen +retention policy. +Note that both where_else and autogen must exist prior to running the INTO +query. +See Database Management +for how to manage databases and retention policies.

+

The response shows the number of points (7605) that InfluxDB writes to h2o_feet_copy_2. +The timestamp in the response is meaningless; InfluxDB uses epoch 0 +(1970-01-01T00:00:00Z) as a null timestamp equivalent.

+

Write aggregated results to a measurement (downsampling)

+ + +
> SELECT MEAN("water_level") INTO "all_my_averages" FROM "h2o_feet" WHERE "location" = 'coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m)
+
+name: result
+------------
+time                   written
+1970-01-01T00:00:00Z   3
+
+> SELECT * FROM "all_my_averages"
+
+name: all_my_averages
+---------------------
+time                   mean
+2015-08-18T00:00:00Z   8.0625
+2015-08-18T00:12:00Z   7.8245
+2015-08-18T00:24:00Z   7.5675
+

The query aggregates data using an +InfluxQL function and a GROUP BY time() clause. +It also writes its results to the all_my_averages measurement.

+

The response shows the number of points (3) that InfluxDB writes to all_my_averages. +The timestamp in the response is meaningless; InfluxDB uses epoch 0 +(1970-01-01T00:00:00Z) as a null timestamp equivalent.

+

The query is an example of downsampling: taking higher precision data, +aggregating those data to a lower precision, and storing the lower precision +data in the database. +Downsampling is a common use case for the INTO clause.

+

Write aggregated results for more than one measurement to a different database (downsampling with backreferencing)

+ + +
> SELECT MEAN(*) INTO "where_else"."autogen".:MEASUREMENT FROM /.*/ WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:06:00Z' GROUP BY time(12m)
+
+name: result
+time                   written
+----                   -------
+1970-01-01T00:00:00Z   5
+
+> SELECT * FROM "where_else"."autogen"./.*/
+
+name: average_temperature
+time                   mean_degrees   mean_index   mean_pH   mean_water_level
+----                   ------------   ----------   -------   ----------------
+2015-08-18T00:00:00Z   78.5
+
+name: h2o_feet
+time                   mean_degrees   mean_index   mean_pH   mean_water_level
+----                   ------------   ----------   -------   ----------------
+2015-08-18T00:00:00Z                                         5.07625
+
+name: h2o_pH
+time                   mean_degrees   mean_index   mean_pH   mean_water_level
+----                   ------------   ----------   -------   ----------------
+2015-08-18T00:00:00Z                               6.75
+
+name: h2o_quality
+time                   mean_degrees   mean_index   mean_pH   mean_water_level
+----                   ------------   ----------   -------   ----------------
+2015-08-18T00:00:00Z                  51.75
+
+name: h2o_temperature
+time                   mean_degrees   mean_index   mean_pH   mean_water_level
+----                   ------------   ----------   -------   ----------------
+2015-08-18T00:00:00Z   63.75
+

The query aggregates data using an +InfluxQL function and a GROUP BY time() clause. +It aggregates data in every measurement that matches the regular expression +in the FROM clause and writes the results to measurements with the same name in the +where_else database and the autogen retention policy. +Note that both where_else and autogen must exist prior to running the INTO +query. +See Database management +for how to manage databases and retention policies.

+

The response shows the number of points (5) that InfluxDB writes to the where_else +database and the autogen retention policy. +The timestamp in the response is meaningless; InfluxDB uses epoch 0 +(1970-01-01T00:00:00Z) as a null timestamp equivalent.

+

The query is an example of downsampling with backreferencing. +It takes higher precision data from more than one measurement, +aggregates those data to a lower precision, and stores the lower precision +data in the database. +Downsampling with backreferencing is a common use case for the INTO clause.

+

Common issues with the INTO clause

+

Missing data

+

If an INTO query includes a tag key in the SELECT clause, the query converts tags in the current +measurement to fields in the destination measurement. +This can cause InfluxDB to overwrite points that were previously differentiated +by a tag value. +Note that this behavior does not apply to queries that use the TOP() or BOTTOM() functions. +The +Frequently Asked Questions +document describes that behavior in detail.

+

To preserve tags in the current measurement as tags in the destination measurement, +GROUP BY the relevant tag key or GROUP BY * in the INTO query.

+

Automating queries with the INTO clause

+

The INTO clause section in this document shows how to manually implement +queries with an INTO clause. +See the Continuous Queries +documentation for how to automate INTO clause queries on realtime data. +Among other uses, +Continuous Queries automate the downsampling process.

+

ORDER BY time DESC

+

By default, InfluxDB returns results in ascending time order; the first point +returned has the oldest timestamp and +the last point returned has the most recent timestamp. +ORDER BY time DESC reverses that order such that InfluxDB returns the points +with the most recent timestamps first.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] ORDER BY time DESC
+

ORDER by time DESC must appear after the GROUP BY clause +if the query includes a GROUP BY clause. +ORDER by time DESC must appear after the WHERE clause +if the query includes a WHERE clause and no GROUP BY clause.

+

Examples

+

Return the newest points first

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' ORDER BY time DESC
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-09-18T21:42:00Z   4.938
+2015-09-18T21:36:00Z   5.066
+[...]
+2015-08-18T00:06:00Z   2.116
+2015-08-18T00:00:00Z   2.064
+

The query returns the points with the most recent timestamps from the +h2o_feet measurement first. +Without ORDER by time DESC, the query would return 2015-08-18T00:00:00Z +first and 2015-09-18T21:42:00Z last.

+

Return the newest points first and include a GROUP BY time() clause

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY time(12m) ORDER BY time DESC
+
+name: h2o_feet
+time                   mean
+----                   ----
+2015-08-18T00:36:00Z   4.6825
+2015-08-18T00:24:00Z   4.80675
+2015-08-18T00:12:00Z   4.950749999999999
+2015-08-18T00:00:00Z   5.07625
+

The query uses an InfluxQL function +and a time interval in the GROUP BY clause +to calculate the average water_level for each twelve-minute +interval in the query’s time range. +ORDER BY time DESC returns the most recent 12-minute time intervals +first.

+

Without ORDER BY time DESC, the query would return +2015-08-18T00:00:00Z first and 2015-08-18T00:36:00Z last.

+

The LIMIT and SLIMIT clauses

+

LIMIT and SLIMIT limit the number of +points and the number of +series returned per query.

+

The LIMIT clause

+

LIMIT <N> returns the first N points from the specified measurement.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] LIMIT <N>
+

N specifies the number of points to return from the specified measurement. +If N is greater than the number of points in a measurement, InfluxDB returns +all points from that series.

+

Note that the LIMIT clause must appear in the order outlined in the syntax above.

+

Examples

+

Limit the number of points returned

+ + +
> SELECT "water_level","location" FROM "h2o_feet" LIMIT 3
+
+name: h2o_feet
+time                   water_level   location
+----                   -----------   --------
+2015-08-18T00:00:00Z   8.12          coyote_creek
+2015-08-18T00:00:00Z   2.064         santa_monica
+2015-08-18T00:06:00Z   8.005         coyote_creek
+

The query returns the three oldest points (determined by timestamp) from the h2o_feet measurement.

+

Limit the number points returned and include a GROUP BY clause

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) LIMIT 2
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+2015-08-18T00:00:00Z   8.0625
+2015-08-18T00:12:00Z   7.8245
+
+name: h2o_feet
+tags: location=santa_monica
+time                   mean
+----                   ----
+2015-08-18T00:00:00Z   2.09
+2015-08-18T00:12:00Z   2.077
+

The query uses an InfluxQL function +and a GROUP BY clause +to calculate the average water_level for each tag and for each twelve-minute +interval in the query’s time range. +LIMIT 2 requests the two oldest twelve-minute averages (determined by timestamp).

+

Note that without LIMIT 2, the query would return four points per series; +one for each twelve-minute interval in the query’s time range.

+

The SLIMIT clause

+

SLIMIT <N> returns every point from <N> series in the specified measurement.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(<time_interval>)] [ORDER_BY_clause] SLIMIT <N>
+

N specifies the number of series to return from the specified measurement. +If N is greater than the number of series in a measurement, InfluxDB returns +all series from that measurement.

+

There is an ongoing issue that requires queries with SLIMIT to include GROUP BY *. +Note that the SLIMIT clause must appear in the order outlined in the syntax above.

+

Examples

+

Limit the number of series returned

+ + +
> SELECT "water_level" FROM "h2o_feet" GROUP BY * SLIMIT 1
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   water_level
+----                   -----
+2015-08-18T00:00:00Z   8.12
+2015-08-18T00:06:00Z   8.005
+2015-08-18T00:12:00Z   7.887
+[...]
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:18:00Z   3.314
+2015-09-18T16:24:00Z   3.235
+

The query returns all water_level points from one of the series associated +with the h2o_feet measurement.

+

Limit the number of series returned and include a GROUP BY time() clause

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) SLIMIT 1
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+2015-08-18T00:00:00Z   8.0625
+2015-08-18T00:12:00Z   7.8245
+2015-08-18T00:24:00Z   7.5675
+2015-08-18T00:36:00Z   7.303
+

The query uses an InfluxQL function +and a time interval in the GROUP BY clause +to calculate the average water_level for each twelve-minute +interval in the query’s time range. +SLIMIT 1 requests a single series associated with the h2o_feet measurement.

+

Note that without SLIMIT 1, the query would return results for the two series +associated with the h2o_feet measurement: location=coyote_creek and +location=santa_monica.

+

LIMIT and SLIMIT

+

LIMIT <N> followed by SLIMIT <N> returns the first <N> points from <N> series in the specified measurement.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(<time_interval>)] [ORDER_BY_clause] LIMIT <N1> SLIMIT <N2>
+

N1 specifies the number of points to return per measurement. +If N1 is greater than the number of points in a measurement, InfluxDB returns all points from that measurement.

+

N2 specifies the number of series to return from the specified measurement. +If N2 is greater than the number of series in a measurement, InfluxDB returns all series from that measurement.

+

There is an ongoing issue that requires queries with LIMIT and SLIMIT to include GROUP BY *. +Note that the LIMIT and SLIMIT clauses must appear in the order outlined in the syntax above.

+

Examples

+

Limit the number of points and series returned

+ + +
> SELECT "water_level" FROM "h2o_feet" GROUP BY * LIMIT 3 SLIMIT 1
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   8.12
+2015-08-18T00:06:00Z   8.005
+2015-08-18T00:12:00Z   7.887
+

The query returns the three oldest points (determined by timestamp) from one +of the series associated with the +measurement h2o_feet.

+

Limit the number of points and series returned and include a GROUP BY time() clause

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) LIMIT 2 SLIMIT 1
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+2015-08-18T00:00:00Z   8.0625
+2015-08-18T00:12:00Z   7.8245
+

The query uses an InfluxQL function +and a time interval in the GROUP BY clause +to calculate the average water_level for each twelve-minute +interval in the query’s time range. +LIMIT 2 requests the two oldest twelve-minute averages (determined by +timestamp) and SLIMIT 1 requests a single series +associated with the h2o_feet measurement.

+

Note that without LIMIT 2 SLIMIT 1, the query would return four points +for each of the two series associated with the h2o_feet measurement.

+

The OFFSET and SOFFSET clauses

+

OFFSET and SOFFSET paginates points and series returned.

+ + + + + +
The OFFSET clauseThe SOFFSET clause
+

The OFFSET clause

+

OFFSET <N> paginates N points in the query results.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] LIMIT_clause OFFSET <N> [SLIMIT_clause]
+

N specifies the number of points to paginate. +The OFFSET clause requires a LIMIT clause. +Using the OFFSET clause without a LIMIT clause can cause inconsistent +query results.

+ +
+

Note: InfluxDB returns no results if the WHERE clause includes a time +range and the OFFSET clause would cause InfluxDB to return points with +timestamps outside of that time range.

+ +
+

Examples

+

Paginate points

+ + +
> SELECT "water_level","location" FROM "h2o_feet" LIMIT 3 OFFSET 3
+
+name: h2o_feet
+time                   water_level   location
+----                   -----------   --------
+2015-08-18T00:06:00Z   2.116         santa_monica
+2015-08-18T00:12:00Z   7.887         coyote_creek
+2015-08-18T00:12:00Z   2.028         santa_monica
+

The query returns the fourth, fifth, and sixth points from the h2o_feet measurement. +If the query did not include OFFSET 3, it would return the first, second, +and third points from that measurement.

+

Paginate points and include several clauses

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) ORDER BY time DESC LIMIT 2 OFFSET 2 SLIMIT 1
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+2015-08-18T00:12:00Z   7.8245
+2015-08-18T00:00:00Z   8.0625
+

This example is pretty involved, so here’s the clause-by-clause breakdown:

+

The SELECT clause specifies an InfluxQL function. +The FROM clause specifies a single measurement. +The WHERE clause specifies the time range for the query. +The GROUP BY clause groups results by all tags (*) and into 12-minute intervals. +The ORDER BY time DESC clause returns results in descending timestamp order. +The LIMIT 2 clause limits the number of points returned to two. +The OFFSET 2 clause excludes the first two averages from the query results. +The SLIMIT 1 clause limits the number of series returned to one.

+

Without OFFSET 2, the query would return the first two averages of the query results:

+ + +
name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+2015-08-18T00:36:00Z   7.303
+2015-08-18T00:24:00Z   7.5675
+

The SOFFSET clause

+

SOFFSET <N> paginates N series in the query results.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(time_interval)] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] SLIMIT_clause SOFFSET <N>
+

N specifies the number of series to paginate. +The SOFFSET clause requires an SLIMIT clause. +Using the SOFFSET clause without an SLIMIT clause can cause inconsistent +query results. +There is an ongoing issue that requires queries with SLIMIT to include GROUP BY *.

+ +
+

Note: InfluxDB returns no results if the SOFFSET clause paginates +through more than the total number of series.

+ +
+

Examples

+

Paginate series

+ + +
> SELECT "water_level" FROM "h2o_feet" GROUP BY * SLIMIT 1 SOFFSET 1
+
+name: h2o_feet
+tags: location=santa_monica
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+[...]
+2015-09-18T21:36:00Z   5.066
+2015-09-18T21:42:00Z   4.938
+

The query returns data for the series associated with the h2o_feet +measurement and the location = santa_monica tag. +Without SOFFSET 1, the query returns data for the series associated with the +h2o_feet measurement and the location = coyote_creek tag.

+

Paginate series and include all clauses

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) ORDER BY time DESC LIMIT 2 OFFSET 2 SLIMIT 1 SOFFSET 1
+
+name: h2o_feet
+tags: location=santa_monica
+time                   mean
+----                   ----
+2015-08-18T00:12:00Z   2.077
+2015-08-18T00:00:00Z   2.09
+

This example is pretty involved, so here’s the clause-by-clause breakdown:

+

The SELECT clause specifies an InfluxQL function. +The FROM clause specifies a single measurement. +The WHERE clause specifies the time range for the query. +The GROUP BY clause groups results by all tags (*) and into 12-minute intervals. +The ORDER BY time DESC clause returns results in descending timestamp order. +The LIMIT 2 clause limits the number of points returned to two. +The OFFSET 2 clause excludes the first two averages from the query results. +The SLIMIT 1 clause limits the number of series returned to one. +The SOFFSET 1 clause paginates the series returned.

+

Without SOFFSET 1, the query would return the results for a different series:

+ + +
name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+2015-08-18T00:12:00Z   7.8245
+2015-08-18T00:00:00Z   8.0625
+

The Time Zone clause

+

The tz() clause returns the UTC offset for the specified timezone.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause] tz('<time_zone>')
+

By default, InfluxDB stores and returns timestamps in UTC. +The tz() clause includes the UTC offset or, if applicable, the UTC Daylight Savings Time (DST) offset to the query’s returned timestamps. +The returned timestamps must be in RFC3339 format for the UTC offset or UTC DST to appear. +The time_zone parameter follows the TZ syntax in the Internet Assigned Numbers Authority time zone database and it requires single quotes.

+

Examples

+

Return the UTC offset for Chicago’s time zone

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:18:00Z' tz('America/Chicago')
+
+name: h2o_feet
+time                       water_level
+----                       -----------
+2015-08-17T19:00:00-05:00  2.064
+2015-08-17T19:06:00-05:00  2.116
+2015-08-17T19:12:00-05:00  2.028
+2015-08-17T19:18:00-05:00  2.126
+

The query results include the UTC offset (-05:00) for the America/Chicago time zone in the timestamps.

+

Time syntax

+

For most SELECT statements, the default time range is between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC. +For SELECT statements with a GROUP BY time() clause, +the default time range is between 1677-09-21 00:12:43.145224194 UTC and now(). +The following sections detail how to specify alternative time ranges in the SELECT +statement’s WHERE clause.

+ + + + + + +
Absolute timeRelative timeCommon issues with time syntax
+

Tired of reading? Check out this InfluxQL Short: +
+

+ +

Absolute time

+

Specify absolute time with date-time strings and epoch time.

+

Syntax

+ + +
SELECT_clause FROM_clause WHERE time <operator> ['<rfc3339_date_time_string>' | '<rfc3339_like_date_time_string>' | <epoch_time>] [AND ['<rfc3339_date_time_string>' | '<rfc3339_like_date_time_string>' | <epoch_time>] [...]]
+

Supported operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorMeaning
=equal to
<>not equal to
!=not equal to
>greater than
>=greater than or equal to
<less than
<=less than or equal to
+

Currently, InfluxDB does not support using OR with absolute time in the WHERE +clause. See the Frequently Asked Questions +document and the GitHub Issue +for more information.

+

rfc3339_date_time_string

+ + +
'YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ'
+

.nnnnnnnnn is optional and is set to .000000000 if not included. +The RFC3339 date-time string requires single quotes.

+

rfc3339_like_date_time_string

+ + +
'YYYY-MM-DD HH:MM:SS.nnnnnnnnn'
+

HH:MM:SS.nnnnnnnnn.nnnnnnnnn is optional and is set to 00:00:00.000000000 if not included. +The RFC3339-like date-time string requires single quotes.

+

epoch_time

+

Epoch time is the amount of time that has elapsed since 00:00:00 +Coordinated Universal Time (UTC), Thursday, 1 January 1970.

+

By default, InfluxDB assumes that all epoch timestamps are in nanoseconds. +Include a duration literal +at the end of the epoch timestamp to indicate a precision other than nanoseconds.

+

Basic arithmetic

+

All timestamp formats support basic arithmetic. +Add (+) or subtract (-) a time from a timestamp with a duration literal. +Note that InfluxQL requires a whitespace between the + or - and the +duration literal.

+

Examples

+

Specify a time range with RFC3339 date-time strings

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00.000000000Z' AND time <= '2015-08-18T00:12:00Z'
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+2015-08-18T00:12:00Z   2.028
+

The query returns data with timestamps between August 18, 2015 at 00:00:00.000000000 and +August 18, 2015 at 00:12:00. +The nanosecond specification in the first timestamp (.000000000) +is optional.

+

Note that the single quotes around the RFC3339 date-time strings are required.

+

Specify a time range with RFC3339-like date-time strings

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18' AND time <= '2015-08-18 00:12:00'
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+2015-08-18T00:12:00Z   2.028
+

The query returns data with timestamps between August 18, 2015 at 00:00:00 and August 18, 2015 +at 00:12:00. +The first date-time string does not include a time; InfluxDB assumes the time +is 00:00:00.

+

Note that the single quotes around the RFC3339-like date-time strings are +required.

+

Specify a time range with epoch timestamps

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= 1439856000000000000 AND time <= 1439856720000000000
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+2015-08-18T00:12:00Z   2.028
+

The query returns data with timestamps that occur between August 18, 2015 +at 00:00:00 and August 18, 2015 at 00:12:00. +By default InfluxDB assumes epoch timestamps are in nanoseconds.

+

Specify a time range with second-precision epoch timestamps

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= 1439856000s AND time <= 1439856720s
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+2015-08-18T00:12:00Z   2.028
+

The query returns data with timestamps that occur between August 18, 2015 +at 00:00:00 and August 18, 2015 at 00:12:00. +The s duration literal at the +end of the epoch timestamps indicate that the epoch timestamps are in seconds.

+

Perform basic arithmetic on an RFC3339-like date-time string

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE time > '2015-09-18T21:24:00Z' + 6m
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-09-18T21:36:00Z   5.066
+2015-09-18T21:42:00Z   4.938
+

The query returns data with timestamps that occur at least six minutes after +September 18, 2015 at 21:24:00. +Note that the whitespace between the + and 6m is required.

+

Perform basic arithmetic on an epoch timestamp

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE time > 24043524m - 6m
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-09-18T21:24:00Z   5.013
+2015-09-18T21:30:00Z   5.01
+2015-09-18T21:36:00Z   5.066
+2015-09-18T21:42:00Z   4.938
+

The query returns data with timestamps that occur at least six minutes before +September 18, 2015 at 21:24:00. +Note that the whitespace between the - and 6m is required.

+

Relative time

+

Use now() to query data with timestamps relative to the server’s current timestamp.

+

Syntax

+ + +
SELECT_clause FROM_clause WHERE time <operator> now() [[ - | + ] <duration_literal>] [(AND|OR) now() [...]]
+

now() is the Unix time of the server at the time the query is executed on that server. +The whitespace between - or + and the duration literal is required.

+

Supported operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorMeaning
=equal to
<>not equal to
!=not equal to
>greater than
>=greater than or equal to
<less than
<=less than or equal to
+

duration_literal

+
    +
  • microseconds: u or µ
  • +
  • milliseconds: ms
  • +
  • secondss
  • +
  • minutesm
  • +
  • hours:h
  • +
  • days:d
  • +
  • weeks:w
  • +
+

Examples

+

Specify a time range with relative time

+ + +
SELECT "water_level" FROM "h2o_feet" WHERE time > now() - 1h
+

The query returns data with timestamps that occur within the past hour. +The whitespace between - and 1h is required.

+

Specify a time range with absolute time and relative time

+ + +
> SELECT "level description" FROM "h2o_feet" WHERE time > '2015-09-18T21:18:00Z' AND time < now() + 1000d
+
+name: h2o_feet
+time                   level description
+----                   -----------------
+2015-09-18T21:24:00Z   between 3 and 6 feet
+2015-09-18T21:30:00Z   between 3 and 6 feet
+2015-09-18T21:36:00Z   between 3 and 6 feet
+2015-09-18T21:42:00Z   between 3 and 6 feet
+

The query returns data with timestamps that occur between September 18, 2015 +at 21:18:00 and 1000 days from now(). +The whitespace between + and 1000d is required.

+

Common issues with time syntax

+

Using OR to select time multiple time intervals

+

InfluxDB does not support using the OR operator in the WHERE clause to specify multiple time intervals.

+

For more information, see Frequently asked questions.

+

Querying data that occur after now() with a GROUP BY time() clause

+

Most SELECT statements have a default time range between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC. +For SELECT statements with a GROUP BY time() clause, +the default time range is between 1677-09-21 00:12:43.145224194 UTC and now().

+

To query data with timestamps that occur after now(), SELECT statements with +a GROUP BY time() clause must provide an alternative upper bound in the +WHERE clause.

+

Example

+

Use the CLI to write a point to the NOAA_water_database that occurs after now():

+ + +
INSERT h2o_feet,location=santa_monica water_level=3.1 1587074400000000000
+

Run a GROUP BY time() query that covers data with timestamps between +2015-09-18T21:30:00Z and now():

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='santa_monica' AND time >= '2015-09-18T21:30:00Z' GROUP BY time(12m) fill(none)
+
+name: h2o_feet
+time                   mean
+----                   ----
+2015-09-18T21:24:00Z   5.01
+2015-09-18T21:36:00Z   5.002
+

Run a GROUP BY time() query that covers data with timestamps between +2015-09-18T21:30:00Z and 180 weeks from now():

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='santa_monica' AND time >= '2015-09-18T21:30:00Z' AND time <= now() + 180w GROUP BY time(12m) fill(none)
+
+name: h2o_feet
+time                   mean
+----                   ----
+2015-09-18T21:24:00Z   5.01
+2015-09-18T21:36:00Z   5.002
+2020-04-16T22:00:00Z   3.1
+

Note that the WHERE clause must provide an alternative upper bound to +override the default now() upper bound. The following query merely resets +the lower bound to now() such that the query’s time range is between +now() and now():

+ + +
SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='santa_monica' AND time >= now() GROUP BY time(12m) fill(none)
+

Configuring the returned timestamps

+

The CLI returns timestamps in +nanosecond epoch format by default. +Specify alternative formats with the +precision <format> command. +The InfluxDB API returns timestamps +in RFC3339 format by default. +Specify alternative formats with the +epoch query string parameter.

+

Regular expressions

+

InfluxQL supports using regular expressions when specifying:

+ +

Currently, InfluxQL does not support using regular expressions to match +non-string field values in the +WHERE clause, +databases, and +retention polices.

+ +
+

Note: Regular expression comparisons are more computationally intensive than exact +string comparisons; queries with regular expressions are not as performant +as those without.

+ +
+

Syntax

+ + +
SELECT /<regular_expression_field_key>/ FROM /<regular_expression_measurement>/ WHERE [<tag_key> <operator> /<regular_expression_tag_value>/ | <field_key> <operator> /<regular_expression_field_value>/] GROUP BY /<regular_expression_tag_key>/
+

Regular expressions are surrounded by / characters and use +Golang’s regular expression syntax.

+

Supported operators

+

=~ matches against +!~ doesn’t match against

+

Examples

+

Use a regular expression to specify field keys and tag keys in the SELECT clause

+ + +
> SELECT /l/ FROM "h2o_feet" LIMIT 1
+
+name: h2o_feet
+time                   level description      location       water_level
+----                   -----------------      --------       -----------
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+

The query selects all field keys +and tag keys that include an l. +Note that the regular expression in the SELECT clause must match at least one +field key in order to return results for a tag key that matches the regular +expression.

+

Currently, there is no syntax to distinguish between regular expressions for +field keys and regular expressions for tag keys in the SELECT clause. +The syntax /<regular_expression>/::[field | tag] is not supported.

+

Use a regular expression to specify measurements in the FROM clause

+ + +
> SELECT MEAN("degrees") FROM /temperature/
+
+name: average_temperature
+time			mean
+----			----
+1970-01-01T00:00:00Z   79.98472932232272
+
+name: h2o_temperature
+time			mean
+----			----
+1970-01-01T00:00:00Z   64.98872722506226
+

The query uses an InfluxQL function +to calculate the average degrees for every measurement in the NOAA_water_database +database that contains the word temperature.

+

Use a regular expression to specify tag values in the WHERE clause

+ + +
> SELECT MEAN(water_level) FROM "h2o_feet" WHERE "location" =~ /[m]/ AND "water_level" > 3
+
+name: h2o_feet
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   4.47155532049926
+

The query uses an InfluxQL function +to calculate the average water_level where the tag value of location +includes an m and water_level is greater than three.

+

Use a regular expression to specify a tag with no value in the WHERE clause

+ + +
SELECT * FROM "h2o_feet" WHERE "location" !~ /./
+

The query selects all data from the h2o_feet measurement where the location +tag has no value. +Every data point in the NOAA_water_database has a tag value for location.

+

It’s possible to perform this same query without a regular expression. +See the +Frequently Asked Questions +document for more information.

+

Use a regular expression to specify a tag with a value in the WHERE clause

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location" =~ /./
+
+name: h2o_feet
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   4.442107025822523
+

The query uses an InfluxQL function +to calculate the average water_level across all data that have a tag value for +location.

+

Use a regular expression to specify a field value in the WHERE clause

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location" = 'santa_monica' AND "level description" =~ /between/
+
+name: h2o_feet
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   4.47155532049926
+

The query uses an InfluxQL function +to calculate the average water_level for all data where the field value of +level description includes the word between.

+

Use a regular expression to specify tag keys in the GROUP BY clause

+ + +
> SELECT FIRST("index") FROM "h2o_quality" GROUP BY /l/
+
+name: h2o_quality
+tags: location=coyote_creek
+time                   first
+----                   -----
+2015-08-18T00:00:00Z   41
+
+name: h2o_quality
+tags: location=santa_monica
+time                   first
+----                   -----
+2015-08-18T00:00:00Z   99
+

The query uses an InfluxQL function +to select the first value of index for every tag that includes the letter l +in its tag key.

+

Data types and cast operations

+

The SELECT clause supports specifying a field’s type and basic cast +operations with the :: syntax.

+ + + + + +
Data TypesCast Operations
+

Data types

+

Field values can be floats, integers, strings, or booleans. +The :: syntax allows users to specify the field’s type in a query.

+ +
+

Note: Generally, it is not necessary to specify the field value +type in the SELECT clause. +In most cases, InfluxDB rejects any writes that attempt to write a field value +to a field that previously accepted field values of a different type.

+ +
+

It is possible for field value types to differ across shard groups. +In these cases, it may be necessary to specify the field value type in the +SELECT clause. +Please see the +Frequently Asked Questions +document for more information on how InfluxDB handles field value type discrepancies.

+

Syntax

+ + +
SELECT_clause <field_key>::<type> FROM_clause
+

type can be float, integer, string, or boolean. +In most cases, InfluxDB returns no data if the field_key does not store data of the specified +type. See Cast Operations for more information.

+

Example

+ + +
> SELECT "water_level"::float FROM "h2o_feet" LIMIT 4
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   8.12
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   8.005
+2015-08-18T00:06:00Z   2.116
+

The query returns values of the water_level field key that are floats.

+

Cast operations

+

The :: syntax allows users to perform basic cast operations in queries. +Currently, InfluxDB supports casting field values from integers to +floats or from floats to integers.

+

Syntax

+ + +
SELECT_clause <field_key>::<type> FROM_clause
+

type can be float or integer.

+

InfluxDB returns no data if the query attempts to cast an integer or float to a +string or boolean.

+

Examples

+

Cast float field values to integers

+ + +
> SELECT "water_level"::integer FROM "h2o_feet" LIMIT 4
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   8
+2015-08-18T00:00:00Z   2
+2015-08-18T00:06:00Z   8
+2015-08-18T00:06:00Z   2
+

The query returns the integer form of water_level’s float field values.

+

Cast float field values to strings (this functionality is not supported)

+ + +
SELECT "water_level"::string FROM "h2o_feet" LIMIT 4
+

The query returns no data as casting a float field value to a string is not +yet supported.

+

Merge behavior

+

In InfluxDB, queries merge series +automatically.

+

Example

+

The h2o_feet measurement in the NOAA_water_database is part of two series. +The first series is made up of the h2o_feet measurement and the location = coyote_creek tag. +The second series is made of up the h2o_feet measurement and the location = santa_monica tag.

+

The following query automatically merges those two series when it calculates the average water_level:

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet"
+
+name: h2o_feet
+--------------
+time                   mean
+1970-01-01T00:00:00Z   4.442107025822521
+

If you want the average water_level for the first series only, specify the relevant tag in the WHERE clause:

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location" = 'coyote_creek'
+
+name: h2o_feet
+--------------
+time                   mean
+1970-01-01T00:00:00Z   5.359342451341401
+

If you want the average water_level for each individual series, include a GROUP BY clause:

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" GROUP BY "location"
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   5.359342451341401
+
+name: h2o_feet
+tags: location=santa_monica
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   3.530863470081006
+

Multiple statements

+

Separate multiple SELECT statements in a query with a semicolon (;).

+

Examples

+ +
+ + + + + + + + + +
+

In the InfluxDB CLI:

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet"; SELECT "water_level" FROM "h2o_feet" LIMIT 2
+
+name: h2o_feet
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   4.442107025822522
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   8.12
+2015-08-18T00:00:00Z   2.064
+ +
+ + + +
+

With the InfluxDB API:

+ + +
{
+    "results": [
+        {
+            "statement_id": 0,
+            "series": [
+                {
+                    "name": "h2o_feet",
+                    "columns": [
+                        "time",
+                        "mean"
+                    ],
+                    "values": [
+                        [
+                            "1970-01-01T00:00:00Z",
+                            4.442107025822522
+                        ]
+                    ]
+                }
+            ]
+        },
+        {
+            "statement_id": 1,
+            "series": [
+                {
+                    "name": "h2o_feet",
+                    "columns": [
+                        "time",
+                        "water_level"
+                    ],
+                    "values": [
+                        [
+                            "2015-08-18T00:00:00Z",
+                            8.12
+                        ],
+                        [
+                            "2015-08-18T00:00:00Z",
+                            2.064
+                        ]
+                    ]
+                }
+            ]
+        }
+    ]
+}
+ +
+ + +
+ +

Subqueries

+

A subquery is a query that is nested in the FROM clause of another query. +Use a subquery to apply a query as a condition in the enclosing query. +Subqueries offer functionality similar to nested functions and SQL +HAVING clauses.

+

Syntax

+ + +
SELECT_clause FROM ( SELECT_statement ) [...]
+

InfluxDB performs the subquery first and the main query second.

+

The main query surrounds the subquery and requires at least the SELECT clause and the FROM clause. +The main query supports all clauses listed in this document.

+

The subquery appears in the main query’s FROM clause, and it requires surrounding parentheses. +The subquery supports all clauses listed in this document.

+

InfluxQL supports multiple nested subqueries per main query. +Sample syntax for multiple subqueries:

+ + +
SELECT_clause FROM ( SELECT_clause FROM ( SELECT_statement ) [...] ) [...]
+ +
+

Improve performance of time-bound subqueries

+

To improve the performance of InfluxQL queries with time-bound subqueries, +apply the WHERE time clause to the outer query instead of the inner query. +For example, the following queries return the same results, but the query with +time bounds on the outer query is more performant than the query with time +bounds on the inner query:

+ + + +
SELECT inner_value AS value FROM (SELECT raw_value as inner_value)
+WHERE time >= '2020-07-19T21:00:00Z'
+AND time <= '2020-07-20T22:00:00Z'
+
Time bounds on the inner query
+ + +
SELECT inner_value AS value FROM (
+  SELECT raw_value as inner_value
+  WHERE time >= '2020-07-19T21:00:00Z'
+  AND time <= '2020-07-20T22:00:00Z'
+)
+ +
+ +

Examples

+

Calculate the SUM() of several MAX() values

+ + +
> SELECT SUM("max") FROM (SELECT MAX("water_level") FROM "h2o_feet" GROUP BY "location")
+
+name: h2o_feet
+time                   sum
+----                   ---
+1970-01-01T00:00:00Z   17.169
+

The query returns the sum of the maximum water_level values across every tag value of location.

+

InfluxDB first performs the subquery; it calculates the maximum value of water_level for each tag value of location:

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" GROUP BY "location"
+name: h2o_feet
+
+tags: location=coyote_creek
+time                   max
+----                   ---
+2015-08-29T07:24:00Z   9.964
+
+name: h2o_feet
+tags: location=santa_monica
+time                   max
+----                   ---
+2015-08-29T03:54:00Z   7.205
+

Next, InfluxDB performs the main query and calculates the sum of those maximum values: 9.964 + 7.205 = 17.169. +Notice that the main query specifies max, not water_level, as the field key in the SUM() function.

+

Calculate the MEAN() difference between two fields

+ + +
> SELECT MEAN("difference") FROM (SELECT "cats" - "dogs" AS "difference" FROM "pet_daycare")
+
+name: pet_daycare
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   1.75
+

The query returns the average of the differences between the number of cats and dogs in the pet_daycare measurement.

+

InfluxDB first performs the subquery. +The subquery calculates the difference between the values in the cats field and the values in the dogs field, +and it names the output column difference:

+ + +
> SELECT "cats" - "dogs" AS "difference" FROM "pet_daycare"
+
+name: pet_daycare
+time                   difference
+----                   ----------
+2017-01-20T00:55:56Z   -1
+2017-01-21T00:55:56Z   -49
+2017-01-22T00:55:56Z   66
+2017-01-23T00:55:56Z   -9
+

Next, InfluxDB performs the main query and calculates the average of those differences. +Notice that the main query specifies difference as the field key in the MEAN() function.

+

Calculate several MEAN() values and place a condition on those mean values

+ + +
> SELECT "all_the_means" FROM (SELECT MEAN("water_level") AS "all_the_means" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m) ) WHERE "all_the_means" > 5
+
+name: h2o_feet
+time                   all_the_means
+----                   -------------
+2015-08-18T00:00:00Z   5.07625
+

The query returns all mean values of the water_level field that are greater than five.

+

InfluxDB first performs the subquery. +The subquery calculates MEAN() values of water_level from 2015-08-18T00:00:00Z through 2015-08-18T00:30:00Z and groups the results into 12-minute intervals. +It also names the output column all_the_means:

+ + +
> SELECT MEAN("water_level") AS "all_the_means" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+time                   all_the_means
+----                   -------------
+2015-08-18T00:00:00Z   5.07625
+2015-08-18T00:12:00Z   4.950749999999999
+2015-08-18T00:24:00Z   4.80675
+

Next, InfluxDB performs the main query and returns only those mean values that are greater than five. +Notice that the main query specifies all_the_means as the field key in the SELECT clause.

+

Calculate the SUM() of several DERIVATIVE() values

+ + +
> SELECT SUM("water_level_derivative") AS "sum_derivative" FROM (SELECT DERIVATIVE(MEAN("water_level")) AS "water_level_derivative" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),"location") GROUP BY "location"
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   sum_derivative
+----                   --------------
+1970-01-01T00:00:00Z   -0.4950000000000001
+
+name: h2o_feet
+tags: location=santa_monica
+time                   sum_derivative
+----                   --------------
+1970-01-01T00:00:00Z   -0.043999999999999595
+

The query returns the sum of the derivative of average water_level values for each tag value of location.

+

InfluxDB first performs the subquery. +The subquery calculates the derivative of average water_level values taken at 12-minute intervals. +It performs that calculation for each tag value of location and names the output column water_level_derivative:

+ + +
> SELECT DERIVATIVE(MEAN("water_level")) AS "water_level_derivative" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),"location"
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   water_level_derivative
+----                   ----------------------
+2015-08-18T00:12:00Z   -0.23800000000000043
+2015-08-18T00:24:00Z   -0.2569999999999997
+
+name: h2o_feet
+tags: location=santa_monica
+time                   water_level_derivative
+----                   ----------------------
+2015-08-18T00:12:00Z   -0.0129999999999999
+2015-08-18T00:24:00Z   -0.030999999999999694
+

Next, InfluxDB performs the main query and calculates the sum of the water_level_derivative values for each tag value of location. +Notice that the main query specifies water_level_derivative, not water_level or derivative, as the field key in the SUM() function.

+

Common issues with subqueries

+

Multiple SELECT statements in a subquery

+

InfluxQL supports multiple nested subqueries per main query:

+ + +
SELECT_clause FROM ( SELECT_clause FROM ( SELECT_statement ) [...] ) [...]
+                     ------------------   ----------------
+                         Subquery 1          Subquery 2
+

InfluxQL does not support multiple SELECT statements per subquery:

+ + +
SELECT_clause FROM (SELECT_statement; SELECT_statement) [...]
+

The system returns a parsing error if a subquery includes multiple SELECT statements.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/manage-database/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/manage-database/index.html new file mode 100644 index 000000000..37ef65ef4 --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/manage-database/index.html @@ -0,0 +1,3344 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Manage your database using InfluxQL | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Manage your database using InfluxQL

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL offers a full suite of administrative commands.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data Management:Retention Policy Management:
CREATE DATABASECREATE RETENTION POLICY
DROP DATABASEALTER RETENTION POLICY
DROP SERIESDROP RETENTION POLICY
DELETE
DROP MEASUREMENT
DROP SHARD
+

If you’re looking for SHOW queries (for example, SHOW DATABASES or SHOW RETENTION POLICIES), see Schema Exploration.

+

The examples in the sections below use the InfluxDB Command Line Interface (CLI). +You can also execute the commands using the InfluxDB API; simply send a GET request to the /query endpoint and include the command in the URL parameter q. +For more on using the InfluxDB API, see Querying data.

+ +
+

Note: When authentication is enabled, only admin users can execute most of the commands listed on this page. +See the documentation on authentication and authorization for more information.

+ +
+

Data management

+

CREATE DATABASE

+

Creates a new database.

+

Syntax

+ + +
CREATE DATABASE <database_name> [WITH [DURATION <duration>] [REPLICATION <n>] [SHARD DURATION <duration>] [PAST LIMIT <duration>] [FUTURE LIMIT <duration>] [NAME <retention-policy-name>]]
+

Description of syntax

+

CREATE DATABASE requires a database name.

+

The WITH, DURATION, REPLICATION, SHARD DURATION, PAST LIMIT, +FUTURE LIMIT, and NAMEclauses are optional and create a single [retention policy](/enterprise_influxdb/v1/concepts/glossary/#retention-policy-rp) associated with the created database. If you do not specify one of the clauses afterWITH, the relevant behavior defaults to the autogen` retention policy settings. +The created retention policy automatically serves as the database’s default retention policy. +For more information about those clauses, see +Retention Policy Management.

+

A successful CREATE DATABASE query returns an empty result. +If you attempt to create a database that already exists, InfluxDB does nothing and does not return an error.

+

Examples

+
Create a database
+ + +
CREATE DATABASE "NOAA_water_database"
+

The query creates a database called NOAA_water_database. +By default, InfluxDB also creates the autogen retention policy and associates it with the NOAA_water_database.

+
Create a database with a specific retention policy
+ + +
CREATE DATABASE "NOAA_water_database" WITH DURATION 3d REPLICATION 1 SHARD DURATION 1h NAME "liquid"
+

The query creates a database called NOAA_water_database. +It also creates a default retention policy for NOAA_water_database with a DURATION of three days, a replication factor of one, a shard group duration of one hour, and with the name liquid.

+

Delete a database with DROP DATABASE

+

The DROP DATABASE query deletes all of the data, measurements, series, continuous queries, and retention policies from the specified database. +The query takes the following form:

+ + +
DROP DATABASE <database_name>
+

Drop the database NOAA_water_database:

+ + +
DROP DATABASE "NOAA_water_database"
+

A successful DROP DATABASE query returns an empty result. +If you attempt to drop a database that does not exist, InfluxDB does not return an error.

+

Drop series from the index with DROP SERIES

+

The DROP SERIES query deletes all points from a series in a database, +and it drops the series from the index.

+

The query takes the following form, where you must specify either the FROM clause or the WHERE clause:

+ + +
DROP SERIES FROM <measurement_name[,measurement_name]> WHERE <tag_key>='<tag_value>'
+

Drop all series from a single measurement:

+ + +
DROP SERIES FROM "h2o_feet"
+

Drop series with a specific tag pair from a single measurement:

+ + +
DROP SERIES FROM "h2o_feet" WHERE "location" = 'santa_monica'
+

Drop all points in the series that have a specific tag pair from all measurements in the database:

+ + +
DROP SERIES WHERE "location" = 'santa_monica'
+

A successful DROP SERIES query returns an empty result.

+

Delete series with DELETE

+

The DELETE query deletes all points from a +series in a database. +Unlike +DROP SERIES, DELETE does not drop the series from the index.

+

You must include either the FROM clause, the WHERE clause, or both:

+ + +
DELETE FROM <measurement_name> WHERE [<tag_key>='<tag_value>'] | [<time interval>]
+

Delete all data associated with the measurement h2o_feet:

+ + +
DELETE FROM "h2o_feet"
+

Delete all data associated with the measurement h2o_quality and where the tag randtag equals 3:

+ + +
DELETE FROM "h2o_quality" WHERE "randtag" = '3'
+

Delete all data in the database that occur before January 01, 2020:

+ + +
DELETE WHERE time < '2020-01-01'
+

Delete all data associated with the measurement h2o_feet in retention policy one_day:

+ + +
DELETE FROM "one_day"."h2o_feet"
+

A successful DELETE query returns an empty result.

+

Things to note about DELETE:

+
    +
  • DELETE supports regular expressions +in the FROM clause when specifying measurement names and in the WHERE clause +when specifying tag values. It does not support regular expressions for the +retention policy in the FROM clause. +If deleting a series in a retention policy, DELETE requires that you define +only one retention policy in the FROM clause.
  • +
  • DELETE does not support fields +in the WHERE clause.
  • +
  • If you need to delete points in the future, you must specify that time period +as DELETE SERIES runs for time < now() by default.
  • +
+

Delete measurements with DROP MEASUREMENT

+

The DROP MEASUREMENT query deletes all data and series from the specified measurement and deletes the +measurement from the index.

+

The query takes the following form:

+ + +
DROP MEASUREMENT <measurement_name>
+

Delete the measurement h2o_feet:

+ + +
DROP MEASUREMENT "h2o_feet"
+ +
+

Note: DROP MEASUREMENT drops all data and series in the measurement. +It does not drop the associated continuous queries.

+ +
+

A successful DROP MEASUREMENT query returns an empty result.

+ +
+

Currently, InfluxDB does not support regular expressions with DROP MEASUREMENTS. +See GitHub Issue #4275 for more information.

+ +
+ +

Delete a shard with DROP SHARD

+

The DROP SHARD query deletes a shard. It also drops the shard from the +metastore. +The query takes the following form:

+ + +
DROP SHARD <shard_id_number>
+

Delete the shard with the id 1:

+ + +
DROP SHARD 1
+

A successful DROP SHARD query returns an empty result. +InfluxDB does not return an error if you attempt to drop a shard that does not +exist.

+

Retention policy management

+

The following sections cover how to create, alter, and delete retention policies. +Note that when you create a database, InfluxDB automatically creates a retention policy named autogen which has infinite retention. +You may disable its auto-creation in the configuration file.

+

Create retention policies with CREATE RETENTION POLICY

+

Syntax

+ + +
CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [PAST LIMIT <duration>] [FUTURE LIMIT <duration>] [DEFAULT]
+

Description of syntax

+
DURATION
+
    +
  • The DURATION clause determines how long InfluxDB keeps the data. +The <duration> is a duration literal +or INF (infinite). +The minimum duration for a retention policy is one hour and the maximum +duration is INF.
  • +
+
REPLICATION
+
    +
  • +

    The REPLICATION clause determines how many independent copies of each point +are stored in the cluster.

    +
  • +
  • +

    By default, the replication factor n usually equals the number of data nodes. However, if you have four or more data nodes, the default replication factor n is 3.

    +
  • +
  • +

    To ensure data is immediately available for queries, set the replication factor n to less than or equal to the number of data nodes in the cluster.

    +
  • +
+ +
+

Important: If you have four or more data nodes, verify that the database replication factor is correct.

+ +
+
    +
  • Replication factors do not serve a purpose with single node instances.
  • +
+
SHARD DURATION
+
    +
  • Optional. The SHARD DURATION clause determines the time range covered by a shard group.
  • +
  • The <duration> is a duration literal +and does not support an INF (infinite) duration.
  • +
  • By default, the shard group duration is determined by the retention policy’s +DURATION:
  • +
+ + + + + + + + + + + + + + + + + + + + + +
Retention Policy’s DURATIONShard Group Duration
< 2 days1 hour
>= 2 days and <= 6 months1 day
> 6 months7 days
+

The minimum allowable SHARD GROUP DURATION is 1h. +If the CREATE RETENTION POLICY query attempts to set the SHARD GROUP DURATION to less than 1h and greater than 0s, InfluxDB automatically sets the SHARD GROUP DURATION to 1h. +If the CREATE RETENTION POLICY query attempts to set the SHARD GROUP DURATION to 0s, InfluxDB automatically sets the SHARD GROUP DURATION according to the default settings listed above.

+

See +Shard group duration management +for recommended configurations.

+
PAST LIMIT
+

The PAST LIMIT clause defines a time boundary before and relative to now +in which points written to the retention policy are accepted. If a point has a +timestamp before the specified boundary, the point is rejected and the write +request returns a partial write error.

+

For example, if a write request tries to write data to a retention policy with a +PAST LIMIT 6h and there are points in the request with timestamps older than +6 hours, those points are rejected.

+ +
+ + +

PAST LIMIT cannot be changed after it is set. +This will be fixed in a future release.

+
+
FUTURE LIMIT
+

The FUTURE LIMIT clause defines a time boundary after and relative to now +in which points written to the retention policy are accepted. If a point has a +timestamp after the specified boundary, the point is rejected and the write +request returns a partial write error.

+

For example, if a write request tries to write data to a retention policy with a +FUTURE LIMIT 6h and there are points in the request with future timestamps +greater than 6 hours from now, those points are rejected.

+ +
+ + +

FUTURE LIMIT cannot be changed after it is set. +This will be fixed in a future release.

+
+
DEFAULT
+

Sets the new retention policy as the default retention policy for the database. +This setting is optional.

+

Examples

+
Create a retention policy
+ + +
CREATE RETENTION POLICY "one_day_only" ON "NOAA_water_database" DURATION 1d REPLICATION 1
+

The query creates a retention policy called one_day_only for the database +NOAA_water_database with a one day duration and a replication factor of one.

+
Create a DEFAULT retention policy
+ + +
CREATE RETENTION POLICY "one_day_only" ON "NOAA_water_database" DURATION 23h60m REPLICATION 1 DEFAULT
+

The query creates the same retention policy as the one in the example above, but +sets it as the default retention policy for the database.

+

A successful CREATE RETENTION POLICY query returns an empty response. +If you attempt to create a retention policy identical to one that already exists, InfluxDB does not return an error. +If you attempt to create a retention policy with the same name as an existing retention policy but with differing attributes, InfluxDB returns an error.

+ +
+

Note: You can also specify a new retention policy in the CREATE DATABASE query. +See Create a database with CREATE DATABASE.

+ +
+

Modify retention policies with ALTER RETENTION POLICY

+

The ALTER RETENTION POLICY query takes the following form, where you must declare at least one of the retention policy attributes DURATION, REPLICATION, SHARD DURATION, or DEFAULT:

+ + +
ALTER RETENTION POLICY <retention_policy_name> ON <database_name> [DURATION <duration>] [REPLICATION <n>] [SHARD DURATION <duration>] [DEFAULT]
+ +
+

Replication factors do not serve a purpose with single node instances.

+ +
+ +

First, create the retention policy what_is_time with a DURATION of two days:

+ + +
CREATE RETENTION POLICY "what_is_time" ON "NOAA_water_database" DURATION 2d REPLICATION 1
+

Modify what_is_time to have a three week DURATION, a two hour shard group duration, and make it the DEFAULT retention policy for NOAA_water_database.

+ + +
ALTER RETENTION POLICY "what_is_time" ON "NOAA_water_database" DURATION 3w SHARD DURATION 2h DEFAULT
+

In the last example, what_is_time retains its original replication factor of 1.

+

A successful ALTER RETENTION POLICY query returns an empty result.

+

Delete retention policies with DROP RETENTION POLICY

+

Delete all measurements and data in a specific retention policy:

+ +
+

Dropping a retention policy will permanently delete all measurements and data stored in the retention policy.

+ +
+ + + +
DROP RETENTION POLICY <retention_policy_name> ON <database_name>
+

Delete the retention policy what_is_time in the NOAA_water_database database:

+ + +
DROP RETENTION POLICY "what_is_time" ON "NOAA_water_database"
+

A successful DROP RETENTION POLICY query returns an empty result. +If you attempt to drop a retention policy that does not exist, InfluxDB does not return an error.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/sample-data/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/sample-data/index.html new file mode 100644 index 000000000..01143a83b --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/sample-data/index.html @@ -0,0 +1,3092 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sample data | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Sample data

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

In order to explore the query language further, these instructions help you create a database, +download and write data to that database within your InfluxDB installation. +The sample data is then used and referenced in Data Exploration, +Schema Exploration, and Functions.

+

Creating a database

+

If you’ve installed InfluxDB locally, the influx command should be available via the command line. +Executing influx will start the CLI and automatically connect to the local InfluxDB instance +(assuming you have already started the server with service influxdb start or by running influxd directly). +The output should look like this:

+ + +
$ influx -precision rfc3339
+Connected to http://localhost:8086 version 1.12.2
+InfluxDB shell 1.12.2
+>
+ +
+

Notes:

+ +
+
    +
  • The InfluxDB API runs on port 8086 by default. +Therefore, influx will connect to port 8086 and localhost by default. +If you need to alter these defaults, run influx --help.
  • +
  • The -precision argument specifies the format/precision of any returned timestamps. +In the example above, rfc3339 tells InfluxDB to return timestamps in RFC3339 format (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ).
  • +
+

The command line is now ready to take input in the form of the Influx Query Language (a.k.a InfluxQL) statements. +To exit the InfluxQL shell, type exit and hit return.

+

A fresh install of InfluxDB has no databases (apart from the system _internal), +so creating one is our first task. +You can create a database with the CREATE DATABASE <db-name> InfluxQL statement, +where <db-name> is the name of the database you wish to create. +Names of databases can contain any unicode character as long as the string is double-quoted. +Names can also be left unquoted if they contain only ASCII letters, +digits, or underscores and do not begin with a digit.

+

Throughout the query language exploration, we’ll use the database name NOAA_water_database:

+ + +
CREATE DATABASE NOAA_water_database
+exit
+

Download and write the data to InfluxDB

+

From your terminal, download the text file that contains the data in line protocol format:

+ + +
curl https://s3.amazonaws.com/noaa.water-database/NOAA_data.txt -o NOAA_data.txt
+

Write the data to InfluxDB via the influx CLI:

+ + +
influx -import -path=NOAA_data.txt -precision=s -database=NOAA_water_database
+

Test queries

+ + +
$ influx -precision rfc3339 -database NOAA_water_database
+Connected to http://localhost:8086 version 1.12.2
+InfluxDB shell 1.12.2
+>
+

See all five measurements:

+ + +
> SHOW measurements
+name: measurements
+------------------
+name
+average_temperature
+h2o_feet
+h2o_pH
+h2o_quality
+h2o_temperature
+

Count the number of non-null values of water_level in h2o_feet:

+ + +
> SELECT COUNT("water_level") FROM h2o_feet
+name: h2o_feet
+--------------
+time			               count
+1970-01-01T00:00:00Z	 15258
+

Select the first five observations in the measurement h2o_feet:

+ + +
> SELECT * FROM h2o_feet LIMIT 5
+name: h2o_feet
+--------------
+time			                 level description	      location	       water_level
+2015-08-18T00:00:00Z	   below 3 feet		          santa_monica	   2.064
+2015-08-18T00:00:00Z	   between 6 and 9 feet	   coyote_creek	   8.12
+2015-08-18T00:06:00Z	   between 6 and 9 feet	   coyote_creek	   8.005
+2015-08-18T00:06:00Z	   below 3 feet		          santa_monica	   2.116
+2015-08-18T00:12:00Z	   between 6 and 9 feet	   coyote_creek	   7.887
+

Data sources and things to note

+

The sample data is publicly available data from the National Oceanic and Atmospheric Administration’s (NOAA) Center for Operational Oceanographic Products and Services. +The data include 15,258 observations of water levels (ft) collected every six minutes at two stations (Santa Monica, CA (ID 9410840) and Coyote Creek, CA (ID 9414575)) over the period from August 18, 2015 through September 18, 2015.

+

Note that the measurements average_temperature, h2o_pH, h2o_quality, and h2o_temperature contain fictional data. +Those measurements serve to illuminate query functionality in Schema Exploration.

+

The h2o_feet measurement is the only measurement that contains the NOAA data. +Please note that the level description field isn’t part of the original NOAA data - we snuck it in there for the sake of having a field key with a special character and string field values.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/spec/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/spec/index.html new file mode 100644 index 000000000..04ea289c2 --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/query_language/spec/index.html @@ -0,0 +1,4160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Influx Query Language (InfluxQL) reference | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Influx Query Language (InfluxQL) reference

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Introduction

+

InfluxQL is a SQL-like query language for interacting with InfluxDB +and providing features specific to storing and analyzing time series data.

+

Find Influx Query Language (InfluxQL) definitions and details, including:

+ +

To learn more about InfluxQL, browse the following topics:

+ +

Notation

+

The syntax is specified using Extended Backus-Naur Form (“EBNF”). +EBNF is the same notation used in the Go programming language specification, +which can be found here.

+ + +
Production  = production_name "=" [ Expression ] "." .
+Expression  = Alternative { "|" Alternative } .
+Alternative = Term { Term } .
+Term        = production_name | token [ "…" token ] | Group | Option | Repetition .
+Group       = "(" Expression ")" .
+Option      = "[" Expression "]" .
+Repetition  = "{" Expression "}" .
+

Notation operators in order of increasing precedence:

+ + +
|   alternation
+()  grouping
+[]  option (0 or 1 times)
+{}  repetition (0 to n times)
+

Query representation

+

Characters

+

InfluxQL is Unicode text encoded in UTF-8.

+ + +
newline             = /* the Unicode code point U+000A */ .
+unicode_char        = /* an arbitrary Unicode code point except newline */ .
+

Letters and digits

+

Letters are the set of ASCII characters plus the underscore character _ (U+005F) is considered a letter.

+

Only decimal digits are supported.

+ + +
letter              = ascii_letter | "_" .
+ascii_letter        = "A" … "Z" | "a" … "z" .
+digit               = "0" … "9" .
+

Identifiers

+

Identifiers are tokens which refer to database names, retention policy names, user names, measurement names, tag keys, and field keys.

+

The rules:

+
    +
  • double quoted identifiers can contain any unicode character other than a new line
  • +
  • double quoted identifiers can contain escaped " characters (i.e., \")
  • +
  • double quoted identifiers can contain InfluxQL keywords
  • +
  • unquoted identifiers must start with an upper or lowercase ASCII character or “_”
  • +
  • unquoted identifiers may contain only ASCII letters, decimal digits, and “_”
  • +
+ + +
identifier          = unquoted_identifier | quoted_identifier .
+unquoted_identifier = ( letter ) { letter | digit } .
+quoted_identifier   = `"` unicode_char { unicode_char } `"` .
+

Examples

+ + +
cpu
+_cpu_stats
+"1h"
+"anything really"
+"1_Crazy-1337.identifier>NAME👍"
+

Keywords

+ + +
ALL           ALTER         ANY           AS            ASC           BEGIN
+BY            CREATE        CONTINUOUS    DATABASE      DATABASES     DEFAULT
+DELETE        DESC          DESTINATIONS  DIAGNOSTICS   DISTINCT      DROP
+DURATION      END           EVERY         EXPLAIN       FIELD         FOR
+FROM          FUTURE        GRANT         GRANTS        GROUP         GROUPS
+IN            INF           INSERT        INTO          KEY           KEYS
+KILL          LIMIT         SHOW          MEASUREMENT   MEASUREMENTS  NAME
+OFFSET        ON            ORDER         PASSWORD      PAST          POLICY
+POLICIES      PRIVILEGES    QUERIES       QUERY         READ          REPLICATION
+RESAMPLE      RETENTION     REVOKE        SELECT        SERIES        SET
+SHARD         SHARDS        SLIMIT        SOFFSET       STATS         SUBSCRIPTION
+SUBSCRIPTIONS TAG           TO            USER          USERS         VALUES
+WHERE         WITH          WRITE
+

If you use an InfluxQL keywords as an +identifier you will need to +double quote that identifier in every query.

+

The keyword time is a special case. +time can be a +continuous query name, +database name, +measurement name, +retention policy name, +subscription name, and +user name. +In those cases, time does not require double quotes in queries. +time cannot be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error. +See Frequently Asked Questions for more information.

+

Literals

+

Integers

+

InfluxQL supports decimal integer literals. +Hexadecimal and octal literals are not currently supported.

+ + +
int_lit             = ( "1" … "9" ) { digit } .
+

Floats

+

InfluxQL supports floating-point literals. +Exponents are not currently supported.

+ + +
float_lit           = int_lit "." int_lit .
+

Strings

+

String literals must be surrounded by single quotes. +Strings may contain ' characters as long as they are escaped (i.e., \').

+ + +
string_lit          = `'` { unicode_char } `'` .
+

Durations

+

Duration literals specify a length of time. +An integer literal followed immediately (with no spaces) by a duration unit listed below is interpreted as a duration literal. +Durations can be specified with mixed units.

+
Duration units
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UnitsMeaning
nsnanoseconds (1 billionth of a second)
u or µmicroseconds (1 millionth of a second)
msmilliseconds (1 thousandth of a second)
ssecond
mminute
hhour
dday
wweek
+ + +
duration_lit        = int_lit duration_unit .
+duration_unit       = "ns" | "u" | "µ" | "ms" | "s" | "m" | "h" | "d" | "w" .
+

Dates & Times

+

The date and time literal format is not specified in EBNF like the rest of this document. +It is specified using Go’s date / time parsing format, which is a reference date written in the format required by InfluxQL. +The reference date time is:

+

InfluxQL reference date time: January 2nd, 2006 at 3:04:05 PM

+ + +
time_lit            = "2006-01-02 15:04:05.999999" | "2006-01-02" .
+

Booleans

+ + +
bool_lit            = TRUE | FALSE .
+

Regular Expressions

+ + +
regex_lit           = "/" { unicode_char } "/" .
+

Comparators: +=~ matches against +!~ doesn’t match against

+ +
+

Note: InfluxQL supports using regular expressions when specifying:

+ +
+ + +
+

Currently, InfluxQL does not support using regular expressions to match +non-string field values in the +WHERE clause, +databases, and +retention polices.

+ +
+

Queries

+

A query is composed of one or more statements separated by a semicolon.

+ + +
query               = statement { ";" statement } .
+
+statement           = alter_retention_policy_stmt |
+                      create_continuous_query_stmt |
+                      create_database_stmt |
+                      create_retention_policy_stmt |
+                      create_subscription_stmt |
+                      create_user_stmt |
+                      delete_stmt |
+                      drop_continuous_query_stmt |
+                      drop_database_stmt |
+                      drop_measurement_stmt |
+                      drop_retention_policy_stmt |
+                      drop_series_stmt |
+                      drop_shard_stmt |
+                      drop_subscription_stmt |
+                      drop_user_stmt |
+                      explain_stmt |
+                      explain_analyze_stmt |
+                      grant_stmt |
+                      kill_query_statement |
+                      revoke_stmt |
+                      select_stmt |
+                      show_continuous_queries_stmt |
+                      show_databases_stmt |
+                      show_diagnostics_stmt |
+                      show_field_key_cardinality_stmt |
+                      show_field_keys_stmt |
+                      show_grants_stmt |
+                      show_measurement_cardinality_stmt |
+                      show_measurement_exact_cardinality_stmt |
+                      show_measurements_stmt |
+                      show_queries_stmt |
+                      show_retention_policies_stmt |
+                      show_series_cardinality_stmt |
+                      show_series_exact_cardinality_stmt |
+                      show_series_stmt |
+                      show_shard_groups_stmt |
+                      show_shards_stmt |
+                      show_stats_stmt |
+                      show_subscriptions_stmt |
+                      show_tag_key_cardinality_stmt |
+                      show_tag_key_exact_cardinality_stmt |
+                      show_tag_keys_stmt |
+                      show_tag_values_stmt |
+                      show_tag_values_cardinality_stmt |
+                      show_users_stmt .
+

Statements

+

ALTER RETENTION POLICY

+ + +
alter_retention_policy_stmt  = "ALTER RETENTION POLICY" policy_name on_clause
+                               retention_policy_option
+                               [ retention_policy_option ]
+                               [ retention_policy_option ]
+                               [ retention_policy_option ] .
+

Examples

+ + +
-- Set default retention policy for mydb to 1h.cpu.
+ALTER RETENTION POLICY "1h.cpu" ON "mydb" DEFAULT
+
+-- Change duration and replication factor.
+-- REPLICATION (replication factor) not valid for OSS instances.
+ALTER RETENTION POLICY "policy1" ON "somedb" DURATION 1h REPLICATION 4
+

CREATE CONTINUOUS QUERY

+ + +
create_continuous_query_stmt = "CREATE CONTINUOUS QUERY" query_name on_clause
+                               [ "RESAMPLE" resample_opts ]
+                               "BEGIN" select_stmt "END" .
+
+query_name                   = identifier .
+
+resample_opts                = (every_stmt for_stmt | every_stmt | for_stmt) .
+every_stmt                   = "EVERY" duration_lit
+for_stmt                     = "FOR" duration_lit
+

Examples

+ + +
-- selects from DEFAULT retention policy and writes into 6_months retention policy
+CREATE CONTINUOUS QUERY "10m_event_count"
+ON "db_name"
+BEGIN
+  SELECT count("value")
+  INTO "6_months"."events"
+  FROM "events"
+  GROUP (10m)
+END;
+
+-- this selects from the output of one continuous query in one retention policy and outputs to another series in another retention policy
+CREATE CONTINUOUS QUERY "1h_event_count"
+ON "db_name"
+BEGIN
+  SELECT sum("count") as "count"
+  INTO "2_years"."events"
+  FROM "6_months"."events"
+  GROUP BY time(1h)
+END;
+
+-- this customizes the resample interval so the interval is queried every 10s and intervals are resampled until 2m after their start time
+-- when resample is used, at least one of "EVERY" or "FOR" must be used
+CREATE CONTINUOUS QUERY "cpu_mean"
+ON "db_name"
+RESAMPLE EVERY 10s FOR 2m
+BEGIN
+  SELECT mean("value")
+  INTO "cpu_mean"
+  FROM "cpu"
+  GROUP BY time(1m)
+END;
+

CREATE DATABASE

+ + +
create_database_stmt = "CREATE DATABASE" db_name
+                       [ WITH
+                           [ retention_policy_duration ]
+                           [ retention_policy_replication ]
+                           [ retention_past_limit ]
+                           [ retention_future_limit ]
+                           [ retention_policy_shard_group_duration ]
+                           [ retention_policy_name ]
+                       ] .
+ +
+ + +

Replication factors do not serve a purpose with single node instances.

+
+

Examples

+ + +
-- Create a database called foo
+CREATE DATABASE "foo"
+
+-- Create a database called bar with a new DEFAULT retention policy and specify
+-- the duration, replication, shard group duration, and name of that retention policy
+CREATE DATABASE "bar" WITH DURATION 1d REPLICATION 1 SHARD DURATION 30m NAME "myrp"
+
+-- Create a database called mydb with a new DEFAULT retention policy and specify
+-- the name of that retention policy
+CREATE DATABASE "mydb" WITH NAME "myrp"
+
+-- Create a database called bar with a new retention policy named "myrp", and
+-- specify the duration, past and future limits, and name of that retention policy
+CREATE DATABASE "bar" WITH DURATION 1d PAST LIMIT 6h FUTURE LIMIT 6h NAME "myrp"
+

CREATE RETENTION POLICY

+ + +
create_retention_policy_stmt = "CREATE RETENTION POLICY" policy_name on_clause
+                               retention_policy_duration
+                               retention_policy_replication
+                               [ retention_policy_shard_group_duration ]
+                               [ retention_past_limit ]
+                               [ retention_future_limit ]
+                               [ "DEFAULT" ] .
+ +
+ + +

Replication factors do not serve a purpose with single node instances.

+
+

Examples

+ + +
-- Create a retention policy.
+CREATE RETENTION POLICY "10m.events" ON "somedb" DURATION 60m REPLICATION 2
+
+-- Create a retention policy and set it as the DEFAULT.
+CREATE RETENTION POLICY "10m.events" ON "somedb" DURATION 60m REPLICATION 2 DEFAULT
+
+-- Create a retention policy and specify the shard group duration.
+CREATE RETENTION POLICY "10m.events" ON "somedb" DURATION 60m REPLICATION 2 SHARD DURATION 30m
+
+-- Create a retention policy and specify past and future limits.
+CREATE RETENTION POLICY "10m.events" ON "somedb" DURATION 12h PAST LIMIT 6h FUTURE LIMIT 6h
+

CREATE SUBSCRIPTION

+

Subscriptions tell InfluxDB to send all the data it receives to Kapacitor.

+ + +
create_subscription_stmt = "CREATE SUBSCRIPTION" subscription_name "ON" db_name "." retention_policy "DESTINATIONS" ("ANY"|"ALL") host { "," host} .
+

Examples

+ + +
-- Create a SUBSCRIPTION on database 'mydb' and retention policy 'autogen' that send data to 'example.com:9090' via UDP.
+CREATE SUBSCRIPTION "sub0" ON "mydb"."autogen" DESTINATIONS ALL 'udp://example.com:9090'
+
+-- Create a SUBSCRIPTION on database 'mydb' and retention policy 'autogen' that round robins the data to 'h1.example.com:9090' and 'h2.example.com:9090'.
+CREATE SUBSCRIPTION "sub0" ON "mydb"."autogen" DESTINATIONS ANY 'udp://h1.example.com:9090', 'udp://h2.example.com:9090'
+

CREATE USER

+ + +
create_user_stmt = "CREATE USER" user_name "WITH PASSWORD" password
+                   [ "WITH ALL PRIVILEGES" ] .
+

Examples

+ + +
-- Create a normal database user.
+CREATE USER "jdoe" WITH PASSWORD '1337password'
+
+-- Create an admin user.
+-- Note: Unlike the GRANT statement, the "PRIVILEGES" keyword is required here.
+CREATE USER "jdoe" WITH PASSWORD '1337password' WITH ALL PRIVILEGES
+ +
+

Note: The password string must be wrapped in single quotes.

+ +
+

DELETE

+ + +
delete_stmt = "DELETE" ( from_clause | where_clause | from_clause where_clause ) .
+

Examples

+ + +
DELETE FROM "cpu"
+DELETE FROM "cpu" WHERE time < '2000-01-01T00:00:00Z'
+DELETE WHERE time < '2000-01-01T00:00:00Z'
+

DROP CONTINUOUS QUERY

+ + +
drop_continuous_query_stmt = "DROP CONTINUOUS QUERY" query_name on_clause .
+

Example

+ + +
DROP CONTINUOUS QUERY "myquery" ON "mydb"
+

DROP DATABASE

+ + +
drop_database_stmt = "DROP DATABASE" db_name .
+

Example

+ + +
DROP DATABASE "mydb"
+

DROP MEASUREMENT

+ + +
drop_measurement_stmt = "DROP MEASUREMENT" measurement .
+

Examples

+ + +
-- drop the cpu measurement
+DROP MEASUREMENT "cpu"
+

DROP RETENTION POLICY

+ + +
drop_retention_policy_stmt = "DROP RETENTION POLICY" policy_name on_clause .
+

Example

+ + +
-- drop the retention policy named 1h.cpu from mydb
+DROP RETENTION POLICY "1h.cpu" ON "mydb"
+

DROP SERIES

+ + +
drop_series_stmt = "DROP SERIES" ( from_clause | where_clause | from_clause where_clause ) .
+ +
+

Note: Filtering by time is not supported in the WHERE clause.

+ +
+

Example

+ + +
DROP SERIES FROM "telegraf"."autogen"."cpu" WHERE cpu = 'cpu8'
+

DROP SHARD

+ + +
drop_shard_stmt = "DROP SHARD" ( shard_id ) .
+

Example

+ + +
DROP SHARD 1
+

DROP SUBSCRIPTION

+ + +
drop_subscription_stmt = "DROP SUBSCRIPTION" subscription_name "ON" db_name "." retention_policy .
+

Example

+ + +
DROP SUBSCRIPTION "sub0" ON "mydb"."autogen"
+

DROP USER

+ + +
drop_user_stmt = "DROP USER" user_name .
+

Example

+ + +
DROP USER "jdoe"
+

EXPLAIN

+

Parses and plans the query, and then prints a summary of estimated costs.

+

Many SQL engines use the EXPLAIN statement to show join order, join algorithms, and predicate and expression pushdown. +Since InfluxQL does not support joins, the cost of a InfluxQL query is typically a function of the total series accessed, the number of iterator accesses to a TSM file, and the number of TSM blocks that need to be scanned.

+

The elements of EXPLAIN query plan include:

+
    +
  • expression
  • +
  • auxiliary fields
  • +
  • number of shards
  • +
  • number of series
  • +
  • cached values
  • +
  • number of files
  • +
  • number of blocks
  • +
  • size of blocks
  • +
+ + +
explain_stmt = "EXPLAIN" select_stmt .
+

Example

+ + +
> explain select sum(pointReq) from "_internal"."monitor"."write" group by hostname;
+> QUERY PLAN
+------
+EXPRESSION: sum(pointReq::integer)
+NUMBER OF SHARDS: 2
+NUMBER OF SERIES: 2
+CACHED VALUES: 110
+NUMBER OF FILES: 1
+NUMBER OF BLOCKS: 1
+SIZE OF BLOCKS: 931
+

EXPLAIN ANALYZE

+

Executes the specified SELECT statement and returns data on the query performance and storage during runtime, visualized as a tree. Use this statement to analyze query performance and storage, including execution time and planning time, and the iterator type and cursor type.

+

For example, executing the following statement:

+ + +
explain analyze select mean(usage_steal) from cpu where time >= '2018-02-22T00:00:00Z' and time < '2018-02-22T12:00:00Z'
+

May produce an output similar to the following:

+ + +
EXPLAIN ANALYZE
+---------------
+.
+└── select
+    ├── execution_time: 2.25823ms
+    ├── planning_time: 18.381616ms
+    ├── total_time: 20.639846ms
+    └── field_iterators
+        ├── labels
+           └── statement: SELECT mean(usage_steal::float) FROM telegraf."default".cpu
+        └── expression
+            ├── labels
+               └── expr: mean(usage_steal::float)
+            └── create_iterator
+                ├── labels
+                   ├── measurement: cpu
+                   └── shard_id: 608
+                ├── cursors_ref: 779
+                ├── cursors_aux: 0
+                ├── cursors_cond: 0
+                ├── float_blocks_decoded: 431
+                ├── float_blocks_size_bytes: 1003552
+                ├── integer_blocks_decoded: 0
+                ├── integer_blocks_size_bytes: 0
+                ├── unsigned_blocks_decoded: 0
+                ├── unsigned_blocks_size_bytes: 0
+                ├── string_blocks_decoded: 0
+                ├── string_blocks_size_bytes: 0
+                ├── boolean_blocks_decoded: 0
+                ├── boolean_blocks_size_bytes: 0
+                └── planning_time: 14.805277ms```
+ +
+

Note: EXPLAIN ANALYZE ignores query output, so the cost of serialization to JSON or CSV is not accounted for.

+ +
+
execution_time
+

Shows the amount of time the query took to execute, including reading the time series data, performing operations as data flows through iterators, and draining processed data from iterators. Execution time doesn’t include the time taken to serialize the output into JSON or other formats.

+
planning_time
+

Shows the amount of time the query took to plan. +Planning a query in InfluxDB requires a number of steps. Depending on the complexity of the query, planning can require more work and consume more CPU and memory resources than the executing the query. For example, the number of series keys required to execute a query affects how quickly the query is planned and the required memory.

+

First, InfluxDB determines the effective time range of the query and selects the shards to access (in InfluxDB Enterprise, shards may be on remote nodes). +Next, for each shard and each measurement, InfluxDB performs the following steps:

+
    +
  1. Select matching series keys from the index, filtered by tag predicates in the WHERE clause.
  2. +
  3. Group filtered series keys into tag sets based on the GROUP BY dimensions.
  4. +
  5. Enumerate each tag set and create a cursor and iterator for each series key.
  6. +
  7. Merge iterators and return the merged result to the query executor.
  8. +
+
iterator type
+

EXPLAIN ANALYZE supports the following iterator types:

+
    +
  • create_iterator node represents work done by the local influxd instance──a complex composition of nested iterators combined and merged to produce the final query output.
  • +
  • (InfluxDB Enterprise only) remote_iterator node represents work done on remote machines.
  • +
+

For more information about iterators, see Understanding iterators.

+
cursor type
+

EXPLAIN ANALYZE distinguishes 3 cursor types. While the cursor types have the same data structures and equal CPU and I/O costs, each cursor type is constructed for a different reason and separated in the final output. Consider the following cursor types when tuning a statement:

+
    +
  • cursor_ref: Reference cursor created for SELECT projections that include a function, such as last() or mean().
  • +
  • cursor_aux: Auxiliary cursor created for simple expression projections (not selectors or an aggregation). For example, SELECT foo FROM m or SELECT foo+bar FROM m, where foo and bar are fields.
  • +
  • cursor_cond: Condition cursor created for fields referenced in a WHERE clause.
  • +
+

For more information about cursors, see Understanding cursors.

+
block types
+

EXPLAIN ANALYZE separates storage block types, and reports the total number of blocks decoded and their size (in bytes) on disk. The following block types are supported:

+

| float | 64-bit IEEE-754 floating-point number | +| integer | 64-bit signed integer | +| unsigned | 64-bit unsigned integer | +| boolean | 1-bit, LSB encoded | +| string | UTF-8 string |

+

For more information about storage blocks, see TSM files.

+

GRANT

+ +
+

NOTE: Users can be granted privileges on databases that do not yet exist.

+ +
+ + +
grant_stmt = "GRANT" privilege [ on_clause ] to_clause .
+

Examples

+ + +
-- grant admin privileges
+GRANT ALL TO "jdoe"
+
+-- grant read access to a database
+GRANT READ ON "mydb" TO "jdoe"
+

KILL QUERY

+

Stop currently-running query.

+ + +
kill_query_statement = "KILL QUERY" query_id .
+

Where query_id is the query ID, displayed in the SHOW QUERIES output as qid.

+ +
+

InfluxDB Enterprise clusters: To kill queries on a cluster, you need to specify the query ID (qid) and the TCP host (for example, myhost:8088), +available in the SHOW QUERIES output.

+ + +
+ +
+

KILL QUERY ON “

+ + +

+#### Examples
+
+```sql
+-- kill query with qid of 36 on the local host
+KILL QUERY 36
+ + +
-- kill query on InfluxDB Enterprise cluster
+KILL QUERY 53 ON "myhost:8088"
+

REVOKE

+ + +
revoke_stmt = "REVOKE" privilege [ on_clause ] "FROM" user_name .
+

Examples

+ + +
-- revoke admin privileges from jdoe
+REVOKE ALL PRIVILEGES FROM "jdoe"
+
+-- revoke read privileges from jdoe on mydb
+REVOKE READ ON "mydb" FROM "jdoe"
+

SELECT

+ + +
select_stmt = "SELECT" fields from_clause [ into_clause ] [ where_clause ]
+              [ group_by_clause ] [ order_by_clause ] [ limit_clause ]
+              [ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ timezone_clause ] .
+

Examples

+

Select from all measurements beginning with cpu into the same measurement name in the cpu_1h retention policy

+ + +
SELECT mean("value") INTO "cpu_1h".:MEASUREMENT FROM /cpu.*/
+

Select from measurements grouped by the day with a timezone

+ + +
SELECT mean("value") FROM "cpu" GROUP BY region, time(1d) fill(0) tz('America/Chicago')
+

SHOW CARDINALITY

+

Refers to the group of commands used to estimate or count exactly the cardinality of measurements, series, tag keys, tag key values, and field keys.

+

The SHOW CARDINALITY commands are available in two variations: estimated and exact. Estimated values are calculated using sketches and are a safe default for all cardinality sizes. Exact values are counts directly from TSM (Time-Structured Merge Tree) data, but are expensive to run for high cardinality data. Unless required, use the estimated variety.

+

Filtering by time is only supported when Time Series Index (TSI) is enabled on a database.

+

See the specific SHOW CARDINALITY commands for details:

+ +

SHOW CONTINUOUS QUERIES

+ + +
show_continuous_queries_stmt = "SHOW CONTINUOUS QUERIES" .
+

Example

+ + +
-- show all continuous queries
+SHOW CONTINUOUS QUERIES
+

SHOW DATABASES

+ + +
show_databases_stmt = "SHOW DATABASES" .
+

Example

+ + +
-- show all databases
+SHOW DATABASES
+

SHOW DIAGNOSTICS

+

Displays node information, such as build information, uptime, hostname, server configuration, memory usage, and Go runtime diagnostics.

+

For more information on using the SHOW DIAGNOSTICS command, see Using the SHOW DIAGNOSTICS command for monitoring InfluxDB.

+ + +
show_diagnostics_stmt = "SHOW DIAGNOSTICS"
+

SHOW FIELD KEY CARDINALITY

+

Estimates or counts exactly the cardinality of the field key set for the current database unless a database is specified using the ON <database> option.

+ +
+

Note: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when Time Series Index (TSI) is enabled and time is not supported in the WHERE clause.

+ +
+ + +
show_field_key_cardinality_stmt = "SHOW FIELD KEY CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+
+show_field_key_exact_cardinality_stmt = "SHOW FIELD KEY EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+

Examples

+ + +
-- show estimated cardinality of the field key set of current database
+SHOW FIELD KEY CARDINALITY
+-- show exact cardinality on field key set of specified database
+SHOW FIELD KEY EXACT CARDINALITY ON mydb
+

SHOW FIELD KEYS

+ + +
show_field_keys_stmt = "SHOW FIELD KEYS" [on_clause] [ from_clause ] .
+

Examples

+ + +
-- show field keys and field value data types from all measurements
+SHOW FIELD KEYS
+
+-- show field keys and field value data types from specified measurement
+SHOW FIELD KEYS FROM "cpu"
+

SHOW GRANTS

+ + +
show_grants_stmt = "SHOW GRANTS FOR" user_name .
+

Example

+ + +
-- show grants for jdoe
+SHOW GRANTS FOR "jdoe"
+

SHOW MEASUREMENT CARDINALITY

+

Estimates or counts exactly the cardinality of the measurement set for the current database unless a database is specified using the ON <database> option.

+ +
+

Note: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when TSI (Time Series Index) is enabled and time is not supported in the WHERE clause.

+ +
+ + +
show_measurement_cardinality_stmt = "SHOW MEASUREMENT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+
+show_measurement_exact_cardinality_stmt = "SHOW MEASUREMENT EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+

Example

+ + +
-- show estimated cardinality of measurement set on current database
+SHOW MEASUREMENT CARDINALITY
+-- show exact cardinality of measurement set on specified database
+SHOW MEASUREMENT EXACT CARDINALITY ON mydb
+

SHOW MEASUREMENTS

+ + +
show_measurements_stmt = "SHOW MEASUREMENTS" [on_clause] [ with_measurement_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all measurements
+SHOW MEASUREMENTS
+
+-- show measurements where region tag = 'uswest' AND host tag = 'serverA'
+SHOW MEASUREMENTS WHERE "region" = 'uswest' AND "host" = 'serverA'
+
+-- show measurements that start with 'h2o'
+SHOW MEASUREMENTS WITH MEASUREMENT =~ /h2o.*/
+

SHOW QUERIES

+ + +
show_queries_stmt = "SHOW QUERIES" .
+

Example

+ + +
-- show all currently-running queries
+SHOW QUERIES
+--
+

SHOW RETENTION POLICIES

+ + +
show_retention_policies_stmt = "SHOW RETENTION POLICIES" [on_clause] .
+

Example

+ + +
-- show all retention policies on a database
+SHOW RETENTION POLICIES ON "mydb"
+

SHOW SERIES

+ + +
show_series_stmt = "SHOW SERIES" [on_clause] [ from_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .
+

Example

+ + +
SHOW SERIES FROM "telegraf"."autogen"."cpu" WHERE cpu = 'cpu8'
+

SHOW SERIES CARDINALITY

+

Estimates or counts exactly the cardinality of the series for the current database unless a database is specified using the ON <database> option.

+

Series cardinality is the major factor that affects RAM requirements. For more information, see:

+ + +
+

Note: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is not supported in the WHERE clause.

+ +
+ + +
show_series_cardinality_stmt = "SHOW SERIES CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+
+show_series_exact_cardinality_stmt = "SHOW SERIES EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+

Examples

+ + +
-- show estimated cardinality of the series on current database
+SHOW SERIES CARDINALITY
+-- show estimated cardinality of the series on specified database
+SHOW SERIES CARDINALITY ON mydb
+-- show exact series cardinality
+SHOW SERIES EXACT CARDINALITY
+-- show series cardinality of the series on specified database
+SHOW SERIES EXACT CARDINALITY ON mydb
+

SHOW SHARD GROUPS

+ + +
show_shard_groups_stmt = "SHOW SHARD GROUPS" .
+

Example

+ + +
SHOW SHARD GROUPS
+

SHOW SHARDS

+ + +
show_shards_stmt = "SHOW SHARDS" .
+

Example

+ + +
SHOW SHARDS
+
+name: telegraf
+id  database   retention_policy shard_group start_time           end_time             expiry_time          owners
+--  --------   ---------------- ----------- ----------           --------             -----------          ------
+16  telegraf   autogen          6           2020-10-19T00:00:00Z 2020-10-26T00:00:00Z 2020-10-26T00:00:00Z 6,7,8
+17  telegraf   autogen          6           2020-10-19T00:00:00Z 2020-10-26T00:00:00Z 2020-10-26T00:00:00Z 9,4,5
+21  telegraf   autogen          8           2020-10-26T00:00:00Z 2020-11-02T00:00:00Z 2020-11-02T00:00:00Z 8,9,4
+22  telegraf   autogen          8           2020-10-26T00:00:00Z 2020-11-02T00:00:00Z 2020-11-02T00:00:00Z 5,6,7
+26  telegraf   autogen          10          2020-11-02T00:00:00Z 2020-11-09T00:00:00Z 2020-11-09T00:00:00Z 9,4,5
+27  telegraf   autogen          10          2020-11-02T00:00:00Z 2020-11-09T00:00:00Z 2020-11-09T00:00:00Z 6,7,8
+31  telegraf   autogen          12          2020-11-09T00:00:00Z 2020-11-16T00:00:00Z 2020-11-16T00:00:00Z 6,7,8
+

SHOW SHARDS outputs the following data:

+
    +
  • id column: Shard IDs that belong to the specified database and retention policy.
  • +
  • shard_group column: Group number that a shard belongs to. Shards in the same shard group have the same start_time and end_time. This interval indicates how long the shard is active, and the expiry_time columns shows when the shard group expires. No timestamps will show under expiry_time if the retention policy duration is set to infinite.
  • +
  • owners column: Shows the data nodes that own a shard. The number of nodes that own a shard is equal to the replication factor. In this example, the replication factor is 3, so 3 nodes own each shard.
  • +
+

SHOW STATS

+

Returns detailed statistics on available components of an InfluxDB node and available (enabled) components.

+

Statistics returned by SHOW STATS are stored in memory and reset to zero when the node is restarted, +but SHOW STATS is triggered every 10 seconds to populate the _internal database.

+

The SHOW STATS command does not list index memory usage – +use the SHOW STATS FOR 'indexes' command.

+

For more information on using the SHOW STATS command, see Using the SHOW STATS command to monitor InfluxDB.

+ + +
show_stats_stmt = "SHOW STATS [ FOR '<component>' | 'indexes' ]"
+

Example

+ + +
> show stats
+name: runtime
+-------------
+Alloc   Frees   HeapAlloc       HeapIdle        HeapInUse       HeapObjects     HeapReleased    HeapSys         Lookups Mallocs NumGC   NumGoroutine    PauseTotalNs    Sys             TotalAlloc
+4136056 6684537 4136056         34586624        5816320         49412           0               40402944        110     6733949 83      44              36083006        46692600        439945704
+
+name: graphite
+tags: proto=tcp
+batches_tx      bytes_rx        connections_active      connections_handled     points_rx       points_tx
+----------      --------        ------------------      -------------------     ---------       ---------
+159             3999750         0                       1                       158110          158110
+

SHOW STATS FOR <component>

+

For the specified component (<component>), the command returns available statistics. +For the runtime component, the command returns an overview of memory usage by the InfluxDB system, +using the Go runtime package.

+

SHOW STATS FOR 'indexes'

+

Returns an estimate of memory use of all indexes. +Index memory use is not reported with SHOW STATS because it is a potentially expensive operation.

+

SHOW SUBSCRIPTIONS

+ + +
show_subscriptions_stmt = "SHOW SUBSCRIPTIONS" .
+

Example

+ + +
SHOW SUBSCRIPTIONS
+

SHOW TAG KEY CARDINALITY

+

Estimates or counts exactly the cardinality of tag key set on the current database unless a database is specified using the ON <database> option.

+ +
+

Note: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when TSI (Time Series Index) is enabled and time is not supported in the WHERE clause.

+ +
+ + +
show_tag_key_cardinality_stmt = "SHOW TAG KEY CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+
+show_tag_key_exact_cardinality_stmt = "SHOW TAG KEY EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+

Examples

+ + +
-- show estimated tag key cardinality
+SHOW TAG KEY CARDINALITY
+-- show exact tag key cardinality
+SHOW TAG KEY EXACT CARDINALITY
+

SHOW TAG KEYS

+ + +
show_tag_keys_stmt = "SHOW TAG KEYS" [on_clause] [ from_clause ] [ where_clause ]
+                     [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag keys
+SHOW TAG KEYS
+
+-- show all tag keys from the cpu measurement
+SHOW TAG KEYS FROM "cpu"
+
+-- show all tag keys from the cpu measurement where the region key = 'uswest'
+SHOW TAG KEYS FROM "cpu" WHERE "region" = 'uswest'
+
+-- show all tag keys where the host key = 'serverA'
+SHOW TAG KEYS WHERE "host" = 'serverA'
+

SHOW TAG VALUES

+ + +
show_tag_values_stmt = "SHOW TAG VALUES" [on_clause] [ from_clause ] with_tag_clause [ where_clause ]
+                       [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag values across all measurements for the region tag
+SHOW TAG VALUES WITH KEY = "region"
+
+-- show tag values from the cpu measurement for the region tag
+SHOW TAG VALUES FROM "cpu" WITH KEY = "region"
+
+-- show tag values across all measurements for all tag keys that do not include the letter c
+SHOW TAG VALUES WITH KEY !~ /.*c.*/
+
+-- show tag values from the cpu measurement for region & host tag keys where service = 'redis'
+SHOW TAG VALUES FROM "cpu" WITH KEY IN ("region", "host") WHERE "service" = 'redis'
+

SHOW TAG VALUES CARDINALITY

+

Estimates or counts exactly the cardinality of tag key values for the specified tag key on the current database unless a database is specified using the ON <database> option.

+ +
+

Note: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when TSI (Time Series Index) is enabled.

+ +
+ + +
show_tag_values_cardinality_stmt = "SHOW TAG VALUES CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ] with_key_clause
+
+show_tag_values_exact_cardinality_stmt = "SHOW TAG VALUES EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ] with_key_clause
+

Examples

+ + +
-- show estimated tag key values cardinality for a specified tag key
+SHOW TAG VALUES CARDINALITY WITH KEY = "myTagKey"
+-- show estimated tag key values cardinality for a specified tag key
+SHOW TAG VALUES CARDINALITY WITH KEY = "myTagKey"
+-- show exact tag key values cardinality for a specified tag key
+SHOW TAG VALUES EXACT CARDINALITY WITH KEY = "myTagKey"
+-- show exact tag key values cardinality for a specified tag key
+SHOW TAG VALUES EXACT CARDINALITY WITH KEY = "myTagKey"
+

SHOW USERS

+ + +
show_users_stmt = "SHOW USERS" .
+

Example

+ + +
-- show all users
+SHOW USERS
+

Clauses

+ + +
from_clause     = "FROM" measurements .
+
+group_by_clause = "GROUP BY" dimensions fill(fill_option).
+
+into_clause     = "INTO" ( measurement | back_ref ).
+
+limit_clause    = "LIMIT" int_lit .
+
+offset_clause   = "OFFSET" int_lit .
+
+slimit_clause   = "SLIMIT" int_lit .
+
+soffset_clause  = "SOFFSET" int_lit .
+
+timezone_clause = tz(string_lit) .
+
+on_clause       = "ON" db_name .
+
+order_by_clause = "ORDER BY" sort_fields .
+
+to_clause       = "TO" user_name .
+
+where_clause    = "WHERE" expr .
+
+with_measurement_clause = "WITH MEASUREMENT" ( "=" measurement | "=~" regex_lit ) .
+
+with_tag_clause = "WITH KEY" ( "=" tag_key | "!=" tag_key | "=~" regex_lit | "IN (" tag_keys ")"  ) .
+

Expressions

+ + +
binary_op        = "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | "AND" |
+                   "OR" | "=" | "!=" | "<>" | "<" | "<=" | ">" | ">=" .
+
+expr             = unary_expr { binary_op unary_expr } .
+
+unary_expr       = "(" expr ")" | var_ref | time_lit | string_lit | int_lit |
+                   float_lit | bool_lit | duration_lit | regex_lit .
+

Comments

+

Use comments with InfluxQL statements to describe your queries.

+
    +
  • A single line comment begins with two hyphens (--) and ends where InfluxDB detects a line break. +This comment type cannot span several lines.
  • +
  • A multi-line comment begins with /* and ends with */. This comment type can span several lines. +Multi-line comments do not support nested multi-line comments.
  • +
+

Other

+ + +
alias            = "AS" identifier .
+
+back_ref         = ( policy_name ".:MEASUREMENT" ) |
+                   ( db_name "." [ policy_name ] ".:MEASUREMENT" ) .
+
+db_name          = identifier .
+
+dimension        = expr .
+
+dimensions       = dimension { "," dimension } .
+
+field_key        = identifier .
+
+field            = expr [ alias ] .
+
+fields           = field { "," field } .
+
+fill_option      = "null" | "none" | "previous" | int_lit | float_lit | "linear" .
+
+host             = string_lit .
+
+measurement      = measurement_name |
+                   ( policy_name "." measurement_name ) |
+                   ( db_name "." [ policy_name ] "." measurement_name ) .
+
+measurements     = measurement { "," measurement } .
+
+measurement_name = identifier | regex_lit .
+
+password         = string_lit .
+
+policy_name      = identifier .
+
+privilege        = "ALL" [ "PRIVILEGES" ] | "READ" | "WRITE" .
+
+query_id         = int_lit .
+
+query_name       = identifier .
+
+retention_policy = identifier .
+
+retention_policy_option      = retention_policy_duration |
+                               retention_policy_replication |
+                               retention_policy_shard_group_duration |
+                               "DEFAULT" .
+
+retention_policy_duration    = "DURATION" duration_lit .
+
+retention_policy_replication = "REPLICATION" int_lit .
+
+retention_policy_shard_group_duration = "SHARD DURATION" duration_lit .
+
+retention_policy_name = "NAME" identifier .
+
+series_id        = int_lit .
+
+shard_id         = int_lit .
+
+sort_field       = field_key [ ASC | DESC ] .
+
+sort_fields      = sort_field { "," sort_field } .
+
+subscription_name = identifier .
+
+tag_key          = identifier .
+
+tag_keys         = tag_key { "," tag_key } .
+
+user_name        = identifier .
+
+var_ref          = measurement .
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/tools/influx-cli/use-influx-cli/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/tools/influx-cli/use-influx-cli/index.html new file mode 100644 index 000000000..d14a91da5 --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/tools/influx-cli/use-influx-cli/index.html @@ -0,0 +1,3348 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Use influx - InfluxDB command line interface | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Use influx - InfluxDB command line interface

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

The influx command line interface (CLI) provides an interactive shell for the HTTP API associated with influxd. +Use influx to write data (manually or from a file), query data interactively, view query output in different formats, and manage resources in InfluxDB.

+ +

Launch influx

+

The influx CLI is included when you install InfluxDB Enterprise.

+

If you install InfluxDB via a package manager, the CLI is installed at /usr/bin/influx ( on macOS).

+

To access the CLI, first launch the influxd database process and then launch influx in your terminal.

+ + +
influx
+

If successfully connected to an InfluxDB node, the output is the following:

+ + +
Connected to http://localhost:8086 version 1.12.2
+InfluxDB shell version: 1.12.2
+>
+

The versions of InfluxDB and the CLI should be identical. If not, parsing issues can occur with queries.

+

In the prompt, you can enter InfluxQL queries as well as CLI-specific commands. +Enter help to get a list of available commands. +Use Ctrl+C to cancel if you want to cancel a long-running InfluxQL query.

+

Environment Variables

+

The following environment variables can be used to configure settings used by the influx client. They can be specified in lower or upper case, however the upper case version takes precedence.

+

HTTP_PROXY

+

Defines the proxy server to use for HTTP.

+

Value format:[protocol://]<host>[:port]

+ + +
HTTP_PROXY=http://localhost:1234
+

HTTPS_PROXY

+

Defines the proxy server to use for HTTPS. Takes precedence over HTTP_PROXY for HTTPS.

+

Value format:[protocol://]<host>[:port]

+ + +
HTTPS_PROXY=https://localhost:1443
+

NO_PROXY

+

List of host names that should not go through any proxy. If set to an asterisk ‘*’ only, it matches all hosts.

+

Value format: comma-separated list of hosts

+ + +
NO_PROXY=123.45.67.89,123.45.67.90
+

influx arguments

+

Arguments specify connection, write, import, and output options for the CLI session.

+

influx provides the following arguments:

+

-h, -help +List influx arguments

+

-compressed +Set to true if the import file is compressed. +Use with -import.

+

-consistency 'any|one|quorum|all' +Set the write consistency level.

+

-database 'database name' +The database to which influx connects.

+

-execute 'command' +Execute an InfluxQL command and quit. +See -execute.

+

-format 'json|csv|column' +Specifies the format of the server responses. +See -format.

+

-host 'host name' +The host to which influx connects. +By default, InfluxDB runs on localhost.

+

-import +Import new data or exported data from a file. +See -import.

+

-password 'password' +The password influx uses to connect to the server. +influx will prompt for a password if you leave it blank (-password ''). +Alternatively, set the password for the CLI with the INFLUX_PASSWORD environment +variable.

+

-path +The path to the file to import. +Use with -import.

+

-port 'port #' +The port to which influx connects. +By default, InfluxDB runs on port 8086.

+

-pps +How many points per second the import will allow. +By default, pps is zero and influx will not throttle importing. +Use with -import.

+

-precision 'rfc3339|h|m|s|ms|u|ns' +Specifies the format/precision of the timestamp: rfc3339 (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ), h (hours), m (minutes), s (seconds), ms (milliseconds), u (microseconds), ns (nanoseconds). +Precision defaults to nanoseconds.

+ +
+

Note: Setting the precision to rfc3339 (-precision rfc3339) works with the -execute option, but it does not work with the -import option. All other precision formats (e.g., h,m,s,ms,u, and ns) work with the -execute and -import options.

+ +
+

-pretty +Turns on pretty print for the json format.

+

-ssl +Use HTTPS for requests.

+

-unsafeSsl +Disables SSL certificate verification. +Use when connecting over HTTPS with a self-signed certificate.

+

-username 'username' +The username that influx uses to connect to the server. +Alternatively, set the username for the CLI with the INFLUX_USERNAME environment variable.

+

-version +Display the InfluxDB version and exit.

+

The following sections provide detailed examples for some arguments, including -execute, -format, and -import.

+ +

Execute an InfluxQL command and quit with -execute

+

Execute queries that don’t require a database specification:

+ + +
$ influx -execute 'SHOW DATABASES'
+name: databases
+---------------
+name
+NOAA_water_database
+_internal
+telegraf
+pirates
+

Execute queries that do require a database specification, and change the timestamp precision:

+ + +
$ influx -execute 'SELECT * FROM "h2o_feet" LIMIT 3' -database="NOAA_water_database" -precision=rfc3339
+name: h2o_feet
+--------------
+time			               level description	    location	     water_level
+2015-08-18T00:00:00Z	 below 3 feet		        santa_monica	 2.064
+2015-08-18T00:00:00Z	 between 6 and 9 feet  coyote_creek  8.12
+2015-08-18T00:06:00Z	 between 6 and 9 feet  coyote_creek  8.005
+

Specify the format of the server responses with -format

+

The default format is column:

+ + +
$ influx -format=column
+[...]
+> SHOW DATABASES
+name: databases
+---------------
+name
+NOAA_water_database
+_internal
+telegraf
+pirates
+

Change the format to csv:

+ + +
$ influx -format=csv
+[...]
+> SHOW DATABASES
+name,name
+databases,NOAA_water_database
+databases,_internal
+databases,telegraf
+databases,pirates
+

Change the format to json:

+ + +
$ influx -format=json
+[...]
+> SHOW DATABASES
+{"results":[{"series":[{"name":"databases","columns":["name"],"values":[["NOAA_water_database"],["_internal"],["telegraf"],["pirates"]]}]}]}
+

Change the format to json and turn on pretty print:

+ + +
$ influx -format=json -pretty
+[...]
+> SHOW DATABASES
+{
+    "results": [
+        {
+            "series": [
+                {
+                    "name": "databases",
+                    "columns": [
+                        "name"
+                    ],
+                    "values": [
+                        [
+                            "NOAA_water_database"
+                        ],
+                        [
+                            "_internal"
+                        ],
+                        [
+                            "telegraf"
+                        ],
+                        [
+                            "pirates"
+                        ]
+                    ]
+                }
+            ]
+        }
+    ]
+}
+

Import data from a file

+

An import file has two sections:

+
    +
  • Optional: DDL (Data Definition Language): Contains the InfluxQL commands for creating the relevant database and managing the retention policy. +If your database and retention policy already exist, your file can skip this section.
  • +
  • DML (Data Manipulation Language): Context metadata that specifies the database and (if desired) retention policy for the import and contains the data in line protocol.
  • +
+

Example: import data from a file

+

The following datarrr.txt file is output using the influx_inspect export command:

+ + +
# DDL
+CREATE DATABASE pirates
+CREATE RETENTION POLICY oneday ON pirates DURATION 1d REPLICATION 1
+
+# DML
+# CONTEXT-DATABASE: pirates
+# CONTEXT-RETENTION-POLICY: oneday
+
+treasures,captain_id=dread_pirate_roberts value=801 1439856000
+treasures,captain_id=flint value=29 1439856000
+treasures,captain_id=sparrow value=38 1439856000
+treasures,captain_id=tetra value=47 1439856000
+treasures,captain_id=crunch value=109 1439858880
+

To import the file, enter the following command in your terminal:

+ + +
influx -import -path=datarrr.txt -precision=s
+

The data is imported into the database and retention policy specified in the # DML +context metadata. +The output is the following:

+ + +
2015/12/22 12:25:06 Processed 2 commands
+2015/12/22 12:25:06 Processed 5 inserts
+2015/12/22 12:25:06 Failed 0 inserts
+ +
+

Note: For large datasets, influx writes out a status message every 100,000 points. +For example:

+
2015/08/21 14:48:01 Processed 3100000 lines.
+Time elapsed: 56.740578415s.
+Points per second (PPS): 54634
+
+ +
+

Keep the following in mind when using -import:

+
    +
  • To throttle the import, use -pps to set the number of points per second to ingest. By default, pps is zero and influx does not throttle importing.
  • +
  • To import a file compressed with gzip (GNU zip), include the -compressed flag.
  • +
  • Include timestamps in the data file. +If points don’t include a timestamp, InfluxDB assigns the same timestamp to those points, which can result in unintended duplicate points or overwrites.
  • +
  • If your data file contains more than 5,000 points, consider splitting it into smaller files to write data to InfluxDB in batches. +We recommend writing points in batches of 5,000 to 10,000 for optimal performance. +Writing smaller batches increases the number of HTTP requests, which can negatively impact performance. +By default, the HTTP request times out after five seconds. Although InfluxDB continues attempting to write the points after a timeout, you won’t receive confirmation of a successful write.
  • +
+ +
+

Note: To export data from InfluxDB version 0.8.9, see Exporting from 0.8.9.

+ +
+

For more information, see exporting and importing data.

+

influx commands

+

Enter help in the CLI for a partial list of the available commands.

+

Commands

+

The list below offers a brief discussion of each command. +We provide detailed information on insert at the end of this section.

+

auth +Prompts you for your username and password. +influx uses those credentials when querying a database. +Alternatively, set the username and password for the CLI with the +INFLUX_USERNAME and INFLUX_PASSWORD environment variables.

+

chunked +Turns on chunked responses from the server when issuing queries. +This setting is enabled by default.

+

chunk size <size> +Sets the size of the chunked responses. +The default size is 10,000. +Setting it to 0 resets chunk size to its default value.

+

clear [ database | db | retention policy | rp ] +Clears the current context for the database or retention policy.

+

connect <host:port> +Connect to a different server without exiting the shell. +By default, influx connects to localhost:8086. +If you do not specify either the host or the port, influx assumes the default setting for the missing attribute.

+

consistency <level> +Sets the write consistency level: any, one, quorum, or all.

+

Ctrl+C +Terminates the currently running query. Useful when an interactive query is taking too long to respond +because it is trying to return too much data.

+

exit quit Ctrl+D +Quits the influx shell.

+

format <format> +Specifies the format of the server responses: json, csv, or column. +See the description of -format for examples of each format.

+

history +Displays your command history. +To use the history while in the shell, simply use the “up” arrow. +influx stores your last 1,000 commands in your home directory in .influx_history.

+

insert +Write data using line protocol. +See insert.

+

precision <format> +Specifies the format/precision of the timestamp: rfc3339 (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ), h (hours), m (minutes), s (seconds), ms (milliseconds), u (microseconds), ns (nanoseconds). +Precision defaults to nanoseconds.

+

pretty +Turns on pretty print for the json format.

+

settings +Outputs the current settings for the shell including the Host, Username, Database, Retention Policy, Pretty status, Chunked status, Chunk Size, Format, and Write Consistency.

+

use [ "<database_name>" | "<database_name>"."<retention policy_name>" ] +Sets the current database and/or retention policy. +Once influx sets the current database and/or retention policy, there is no need to specify that database and/or retention policy in queries. +If you do not specify the retention policy, influx automatically queries the used database’s DEFAULT retention policy.

+

Write data to InfluxDB with insert

+

Enter insert followed by the data in line protocol to write data to InfluxDB. +Use insert into <retention policy> <line protocol> to write data to a specific retention policy.

+

Write data to a single field in the measurement treasures with the tag captain_id = pirate_king. +influx automatically writes the point to the database’s DEFAULT retention policy.

+ + +
INSERT treasures,captain_id=pirate_king value=2
+

Write the same point to the already-existing retention policy oneday:

+ + +
> INSERT INTO oneday treasures,captain_id=pirate_king value=2
+Using retention policy oneday
+>
+

Queries

+

Execute all InfluxQL queries in influx.

+

See Data exploration, Schema exploration, Database management, Authentication and authorization for InfluxQL documentation.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/troubleshooting/errors/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/troubleshooting/errors/index.html new file mode 100644 index 000000000..fe7728670 --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/troubleshooting/errors/index.html @@ -0,0 +1,3292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxDB error messages | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxDB error messages

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

This page documents errors, their descriptions, and, where applicable, +common resolutions.

+ +
+

Disclaimer: This document does not contain an exhaustive list of all possible InfluxDB errors.

+ +
+ +

error: database name required

+

The database name required error occurs when certain SHOW queries do +not specify a database. +Specify a database with an ON clause in the SHOW query, with USE <database_name> in the +CLI, or with the db query string parameter in +the InfluxDB API request.

+

The relevant SHOW queries include SHOW RETENTION POLICIES, SHOW SERIES, +SHOW MEASUREMENTS, SHOW TAG KEYS, SHOW TAG VALUES, and SHOW FIELD KEYS.

+

Resources: +Schema exploration, +InfluxQL reference

+

error: max series per database exceeded: < >

+

The max series per database exceeded error occurs when a write causes the +number of series in a database to +exceed the maximum allowable series per database. +The maximum allowable series per database is controlled by the +max-series-per-database +setting in the [data] section of the configuration +file.

+

The information in the < > shows the measurement and the tag set of the series +that exceeded max-series-per-database.

+

By default max-series-per-database is set to one million. +Changing the setting to 0 allows an unlimited number of series per database.

+

error parsing query: found < >, expected identifier at line < >, char < >

+

InfluxQL syntax

+

The expected identifier error occurs when InfluxDB anticipates an identifier +in a query but doesn’t find it. +Identifiers are tokens that refer to continuous query names, database names, +field keys, measurement names, retention policy names, subscription names, +tag keys, and user names. +The error is often a gentle reminder to double-check your query’s syntax.

+

Examples

+

Query 1:

+ + +
> CREATE CONTINUOUS QUERY ON "telegraf" BEGIN SELECT mean("usage_idle") INTO "average_cpu" FROM "cpu" GROUP BY time(1h),"cpu" END
+ERR: error parsing query: found ON, expected identifier at line 1, char 25
+

Query 1 is missing a continuous query name between CREATE CONTINUOUS QUERY and +ON.

+

Query 2:

+ + +
> SELECT * FROM WHERE "blue" = true
+ERR: error parsing query: found WHERE, expected identifier at line 1, char 15
+

Query 2 is missing a measurement name between FROM and WHERE.

+

InfluxQL keywords

+

In some cases the expected identifier error occurs when one of the +identifiers in the query is an +InfluxQL Keyword. +To successfully query an identifier that’s also a keyword, enclose that +identifier in double quotes.

+

Examples

+

Query 1:

+ + +
> SELECT duration FROM runs
+ERR: error parsing query: found DURATION, expected identifier, string, number, bool at line 1, char 8
+

In Query 1, the field key duration is an InfluxQL Keyword. +Double quote duration to avoid the error:

+ + +
SELECT "duration" FROM runs
+

Query 2:

+ + +
> CREATE RETENTION POLICY limit ON telegraf DURATION 1d REPLICATION 1
+ERR: error parsing query: found LIMIT, expected identifier at line 1, char 25
+

In Query 2, the retention policy name limit is an InfluxQL Keyword. +Double quote limit to avoid the error:

+ + +
CREATE RETENTION POLICY "limit" ON telegraf DURATION 1d REPLICATION 1
+

While using double quotes is an acceptable workaround, we recommend that you avoid using InfluxQL keywords as identifiers for simplicity’s sake.

+

Resources: +InfluxQL Keywords, +Query Language Documentation

+

error parsing query: found < >, expected string at line < >, char < >

+

The expected string error occurs when InfluxDB anticipates a string +but doesn’t find it. +In most cases, the error is a result of forgetting to quote the password +string in the CREATE USER statement.

+

Example

+ + +
> CREATE USER penelope WITH PASSWORD timeseries4dayz
+ERR: error parsing query: found timeseries4dayz, expected string at line 1, char 36
+

The CREATE USER statement requires single quotation marks around the password +string:

+ + +
CREATE USER penelope WITH PASSWORD 'timeseries4dayz'
+

Note that you should not include the single quotes when authenticating requests.

+

Resources: +Authentication and Authorization

+

error parsing query: mixing aggregate and non-aggregate queries is not supported

+

The mixing aggregate and non-aggregate error occurs when a SELECT statement +includes both an aggregate function +and a standalone field key or +tag key.

+

Aggregate functions return a single calculated value and there is no obvious +single value to return for any unaggregated fields or tags.

+

Example

+

Raw data:

+

The peg measurement has two fields (square and round) and one tag +(force):

+ + +
name: peg
+---------
+time                   square   round   force
+2016-10-07T18:50:00Z   2        8       1
+2016-10-07T18:50:10Z   4        12      2
+2016-10-07T18:50:20Z   6        14      4
+2016-10-07T18:50:30Z   7        15      3
+

Query 1:

+ + +
> SELECT mean("square"),"round" FROM "peg"
+ERR: error parsing query: mixing aggregate and non-aggregate queries is not supported
+

Query 1 includes an aggregate function and a standalone field.

+

mean("square") returns a single aggregated value calculated from the four values +of square in the peg measurement, and there is no obvious single field value +to return from the four unaggregated values of the round field.

+

Query 2:

+ + +
> SELECT mean("square"),"force" FROM "peg"
+ERR: error parsing query: mixing aggregate and non-aggregate queries is not supported
+

Query 2 includes an aggregate function and a standalone tag.

+

mean("square") returns a single aggregated value calculated from the four values +of square in the peg measurement, and there is no obvious single tag value +to return from the four unaggregated values of the force tag.

+

Resources: +Functions

+

invalid operation: time and \*influxql.VarRef are not compatible

+

The time and \*influxql.VarRef are not compatible error occurs when +date-time strings are double quoted in queries. +Date-time strings require single quotes.

+

Examples

+

Double quoted date-time strings:

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= "2015-08-18T00:00:00Z" AND time <= "2015-08-18T00:12:00Z"
+ERR: invalid operation: time and *influxql.VarRef are not compatible
+

Single quoted date-time strings:

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:12:00Z'
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+2015-08-18T00:12:00Z   2.028
+

Resources: +Data Exploration

+

unable to parse < >: bad timestamp

+

Timestamp syntax

+

The bad timestamp error occurs when the +line protocol includes a +timestamp in a format other than a UNIX timestamp.

+

Example

+ + +
> INSERT pineapple value=1 '2015-08-18T23:00:00Z'
+ERR: {"error":"unable to parse 'pineapple value=1 '2015-08-18T23:00:00Z'': bad timestamp"}
+

The line protocol above uses an RFC3339 +timestamp. +Replace the timestamp with a UNIX timestamp to avoid the error and successfully +write the point to InfluxDB:

+ + +
INSERT pineapple,fresh=true value=1 1439938800000000000
+

InfluxDB line protocol syntax

+

In some cases, the bad timestamp error occurs with more general syntax errors +in the InfluxDB line protocol. +Line protocol is whitespace sensitive; misplaced spaces can cause InfluxDB +to assume that a field or tag is an invalid timestamp.

+

Example

+

Write 1

+ + +
> INSERT hens location=2 value=9
+ERR: {"error":"unable to parse 'hens location=2 value=9': bad timestamp"}
+

The line protocol in Write 1 separates the hen measurement from the location=2 +tag with a space instead of a comma. +InfluxDB assumes that the value=9 field is the timestamp and returns an error.

+

Use a comma instead of a space between the measurement and tag to avoid the error:

+ + +
INSERT hens,location=2 value=9
+

Write 2

+ + +
> INSERT cows,name=daisy milk_prod=3 happy=3
+ERR: {"error":"unable to parse 'cows,name=daisy milk_prod=3 happy=3': bad timestamp"}
+

The line protocol in Write 2 separates the milk_prod=3 field and the +happy=3 field with a space instead of a comma. +InfluxDB assumes that the happy=3 field is the timestamp and returns an error.

+

Use a comma instead of a space between the two fields to avoid the error:

+ + +
INSERT cows,name=daisy milk_prod=3,happy=3
+

Resources: +InfluxDB line protocol tutorial, +InfluxDB line protocol reference

+

unable to parse < >: time outside range

+

The time outside range error occurs when the timestamp in the +InfluxDB line protocol +falls outside the valid time range for InfluxDB.

+

The minimum valid timestamp is -9223372036854775806 or 1677-09-21T00:12:43.145224194Z. +The maximum valid timestamp is 9223372036854775806 or 2262-04-11T23:47:16.854775806Z.

+

Resources: +InfluxDB line protocol tutorial, +InfluxDB line protocol reference

+

write failed for shard < >: engine: cache maximum memory size exceeded

+

The cache maximum memory size exceeded error occurs when the cached +memory size increases beyond the +cache-max-memory-size setting +in the configuration file.

+

By default, cache-max-memory-size is set to 512mb. +This value is fine for most workloads, but is too small for larger write volumes +or for datasets with higher series cardinality. +If you have lots of RAM you could set it to 0 to disable the cached memory +limit and never get this error. +You can also examine the memBytes field in thecache measurement in the +_internal database +to get a sense of how big the caches are in memory.

+

already killed

+

The already killed error occurs when a query has already been killed, but +there are subsequent kill attempts before the query has exited. +When a query is killed, it may not exit immediately. +It will be in the killed state, which means the signal has been sent, but the +query itself has not hit an interrupt point.

+

Resources: +Query management

+

Common -import errors

+

Find common errors that occur when importing data in the command line interface (CLI).

+
    +
  1. (Optional) Customize how to view -import errors and output by running any of the following commands:
  2. +
+
    +
  • Send errors and output to a new file: influx -import -path={import-file}.gz -compressed {new-file} 2>&1
  • +
  • Send errors and output to separate files: influx -import -path={import-file}.gz -compressed > {output-file} 2> {error-file}
  • +
  • Send errors to a new file: influx -import -path={import-file}.gz -compressed 2> {new-file}
  • +
  • Send output to a new file: influx -import -path={import-file}.gz -compressed {new-file}
  • +
+
    +
  1. Review import errors for possible causes to resolve:
  2. +
+ + +
+

Note: To learn how to use the -import command, see Import data from a file with -import.

+ +
+

Inconsistent data types

+

Error: partial write: field type conflict:

+

This error occurs when fields in an imported measurement have inconsistent data types. Make sure all fields in a measurement have the same data type, such as float64, int64, and so on.

+

Data points older than retention policy

+

Error: partial write: points beyond retention policy dropped={number-of-points-dropped}

+

This error occurs when an imported data point is older than the specified retention policy and dropped. Verify the correct retention policy is specified in the import file.

+

Unnamed import file

+

Error: reading standard input: /path/to/directory: is a directory

+

This error occurs when the -import command doesn’t include the name of an import file. Specify the file to import, for example: $ influx -import -path={filename}.txt -precision=s

+

Docker container cannot read host files

+

Error: open /path/to/file: no such file or directory

+

This error occurs when the Docker container cannot read files on the host machine. To make host machine files readable, complete the following procedure.

+

Make host machine files readable to Docker

+
    +
  1. +

    Create a directory, and then copy files to import into InfluxDB to this directory.

    +
  2. +
  3. +

    When you launch the Docker container, mount the new directory on the InfluxDB container by running the following command:

    +

    docker run -v /dir/path/on/host:/dir/path/in/container

    +
  4. +
  5. +

    Verify the Docker container can read host machine files by running the following command:

    +

    influx -import -path=/path/in/container

    +
  6. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/troubleshooting/frequently-asked-questions/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/troubleshooting/frequently-asked-questions/index.html new file mode 100644 index 000000000..602ef7b3a --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/troubleshooting/frequently-asked-questions/index.html @@ -0,0 +1,4159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxDB Enterprise v1 frequently asked questions | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxDB Enterprise v1 frequently asked questions

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

This page addresses frequent sources of confusion and places where InfluxDB +behaves in an unexpected way relative to other database systems. +Where applicable, it links to outstanding issues on GitHub.

+

Administration

+ +

Command line interface (CLI)

+ +

Data types

+ +

InfluxQL functions

+ +

Querying data

+ +

Series and series cardinality

+ +

Writing data

+ +

Log errors

+ +
+

How do I include a single quote in a password?

+

Escape the single quote with a backslash (\) both when creating the password +and when sending authentication requests.

+

How can I identify my version of InfluxDB?

+

There a number of ways to identify the version of InfluxDB that you’re using:

+

Run influxd version in your terminal:

+ + +
$ influxd version
+
+InfluxDB v1.12.2 (git: master b7bb7e8359642b6e071735b50ae41f5eb343fd42)
+

curl the /ping endpoint:

+ + +
$ curl -i 'http://localhost:8086/ping'
+
+HTTP/1.1 204 No Content
+Content-Type: application/json
+Request-Id: 1e08aeb6-fec0-11e6-8486-000000000000
+X-Influxdb-Version: 1.12.2
+Date: Wed, 01 Mar 2017 20:46:17 GMT
+

Launch the InfluxDB command line interface:

+ + +
$ influx
+
+Connected to http://localhost:8086 version 1.12.2
+InfluxDB shell version: 1.12.2
+

Check the HTTP response in your logs:

+ + +
$ journalctl -u influxdb.service
+
+Mar 01 20:49:45 rk-api influxd[29560]: [httpd] 127.0.0.1 - - [01/Mar/2017:20:49:45 +0000] "POST /query?db=&epoch=ns&q=SHOW+DATABASES HTTP/1.1" 200 151 "-" "InfluxDBShell/1.12.2" 9a4371a1-fec0-11e6-84b6-000000000000 1709
+

Where can I find InfluxDB logs?

+

On System V operating systems logs are stored under /var/log/influxdb/.

+

On systemd operating systems you can access the logs using journalctl. +Use journalctl -u influxdb to view the logs in the journal or journalctl -u influxdb > influxd.log to print the logs to a text file. With systemd, log retention depends on your system’s journald settings.

+

What is the relationship between shard group durations and retention policies?

+

InfluxDB stores data in shard groups. +A single shard group covers a specific time interval; InfluxDB determines that time interval by looking at the DURATION of the relevant retention policy (RP). +The table below outlines the default relationship between the DURATION of an RP and the time interval of a shard group:

+ + + + + + + + + + + + + + + + + + + + + +
RP durationShard group interval
< 2 days1 hour
>= 2 days and <= 6 months1 day
> 6 months7 days
+

Users can also configure the shard group duration with the +CREATE RETENTION POLICY +and +ALTER RETENTION POLICY +statements. +Check your retention policy’s shard group duration with the +SHOW RETENTION POLICIES +statement.

+

Why aren’t data dropped after I’ve altered a retention policy?

+

Several factors explain why data may not be immediately dropped after a +retention policy (RP) change.

+

The first and most likely cause is that, by default, InfluxDB checks to enforce +an RP every 30 minutes. +You may need to wait for the next RP check for InfluxDB to drop data that are +outside the RP’s new DURATION setting. +The 30 minute interval is +configurable.

+

Second, altering both the DURATION and SHARD DURATION of an RP can result in +unexpected data retention. +InfluxDB stores data in shard groups which cover a specific RP and time +interval. +When InfluxDB enforces an RP it drops entire shard groups, not individual data +points. +InfluxDB cannot divide shard groups.

+

If the RP’s new DURATION is less than the old SHARD DURATION and InfluxDB is +currently writing data to one of the old, longer shard groups, the system is +forced to keep all of the data in that shard group. +This occurs even if some of the data in that shard group are outside of the new +DURATION. +InfluxDB will drop that shard group once all of its data is outside the new +DURATION. +The system will then begin writing data to shard groups that have the new, +shorter SHARD DURATION preventing any further unexpected data retention.

+

Why does InfluxDB fail to parse microsecond units in the configuration file?

+

The syntax for specifying microsecond duration units differs for +configuration +settings, writes, queries, and setting the precision in the InfluxDB +Command Line Interface (CLI). +The table below shows the supported syntax for each category:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Configuration FileInfluxDB API WritesAll QueriesCLI Precision Command
u👍👍👍
us👍
µ👍
µs👍
+

If a configuration option specifies the u or µ syntax, InfluxDB fails to start and reports the following error in the logs:

+ + +
run: parse config: time: unknown unit [µ|u] in duration [<integer>µ|<integer>u]
+

Does InfluxDB have a file system size limit?

+

InfluxDB works within file system size restrictions for Linux and Windows POSIX. Some storage providers and distributions have size restrictions; for example:

+
    +
  • Amazon EBS volume limits size to ~16TB
  • +
  • Linux ext3 file system limits size ~16TB
  • +
  • Linux ext4 file system limits size to ~1EB (with file size limit ~16TB)
  • +
+

If you anticipate growing over 16TB per volume/file system, we recommend finding a provider and distribution that supports your storage requirements.

+

How do I use the InfluxDB CLI to return human readable timestamps?

+

When you first connect to the CLI, specify the rfc3339 precision:

+ + +
influx -precision rfc3339
+

Alternatively, specify the precision once you’ve already connected to the CLI:

+ + +
$ influx
+Connected to http://localhost:8086 version 0.xx.x
+InfluxDB shell 0.xx.x
+> precision rfc3339
+>
+

Check out CLI/Shell for more useful CLI options.

+

How can a non-admin user USE a database in the InfluxDB CLI?

+

In versions prior to v1.3, non-admin users could not execute a USE <database_name> query in the CLI even if they had READ and/or WRITE permissions on that database.

+

Starting with version 1.3, non-admin users can execute the USE <database_name> query for databases on which they have READ and/or WRITE permissions. +If a non-admin user attempts to USE a database on which the user doesn’t have READ and/or WRITE permissions, the system returns an error:

+ + +
ERR: Database <database_name> doesn't exist. Run SHOW DATABASES for a list of existing databases.
+ +
+

Note that the SHOW DATABASES query returns only those databases on which the non-admin user has READ and/or WRITE permissions.

+ +
+

How do I write to a non-DEFAULT retention policy with the InfluxDB CLI?

+

Use the syntax INSERT INTO [<database>.]<retention_policy> <line_protocol> to write data to a non-DEFAULT retention policy using the CLI. +(Specifying the database and retention policy this way is only allowed with the CLI. +Writes over HTTP must specify the database and optionally the retention policy with the db and rp query parameters.)

+

For example:

+ + +
> INSERT INTO one_day mortality bool=true
+Using retention policy one_day
+> SELECT * FROM "mydb"."one_day"."mortality"
+name: mortality
+---------------
+time                             bool
+2016-09-13T22:29:43.229530864Z   true
+

Note that you will need to fully qualify the measurement to query data in the non-DEFAULT retention policy. Fully qualify the measurement with the syntax:

+ + +
"<database>"."<retention_policy>"."<measurement>"
+

How do I cancel a long-running query?

+

You can cancel a long-running interactive query from the CLI using Ctrl+C. To stop other long-running query that you see when using the SHOW QUERIES command, +you can use the KILL QUERY command to stop it.

+

Why can’t I query Boolean field values?

+

Acceptable Boolean syntax differs for data writes and data queries.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Boolean syntaxWritesQueries
t,f👍
T,F👍
true,false👍👍
True,False👍👍
TRUE,FALSE👍👍
+

For example, SELECT * FROM "hamlet" WHERE "bool"=True returns all points with bool set to TRUE, but SELECT * FROM "hamlet" WHERE "bool"=T returns nothing.

+ + +

How does InfluxDB handle field type discrepancies across shards?

+

Field values can be floats, integers, strings, or Booleans. +Field value types cannot differ within a +shard, but they can differ across shards.

+

The SELECT statement

+

The +SELECT statement +returns all field values if all values have the same type. +If field value types differ across shards, InfluxDB first performs any +applicable cast +operations and then returns all values with the type that occurs first in the +following list: float, integer, string, Boolean.

+

If your data have field value type discrepancies, use the syntax +<field_key>::<type> to query the different data types.

+

Example

+

The measurement just_my_type has a single field called my_field. +my_field has four field values across four different shards, and each value has +a different data type (float, integer, string, and Boolean).

+

SELECT * returns only the float and integer field values. +Note that InfluxDB casts the integer value to a float in the response.

+ + +
SELECT * FROM just_my_type
+
+name: just_my_type
+------------------
+time		                	my_field
+2016-06-03T15:45:00Z	  9.87034
+2016-06-03T16:45:00Z	  7
+

SELECT <field_key>::<type> [...] returns all value types. +InfluxDB outputs each value type in its own column with incremented column names. +Where possible, InfluxDB casts field values to another type; +it casts the integer 7 to a float in the first column, and it +casts the float 9.879034 to an integer in the second column. +InfluxDB cannot cast floats or integers to strings or Booleans.

+ + +
SELECT "my_field"::float,"my_field"::integer,"my_field"::string,"my_field"::boolean FROM just_my_type
+
+name: just_my_type
+------------------
+time			               my_field	 my_field_1	 my_field_2		 my_field_3
+2016-06-03T15:45:00Z	 9.87034	  9
+2016-06-03T16:45:00Z	 7	        7
+2016-06-03T17:45:00Z			                     a string
+2016-06-03T18:45:00Z					                                true
+

The SHOW FIELD KEYS query

+

SHOW FIELD KEYS returns every data type, across every shard, associated with +the field key.

+

Example

+

The measurement just_my_type has a single field called my_field. +my_field has four field values across four different shards, and each value has +a different data type (float, integer, string, and Boolean). +SHOW FIELD KEYS returns all four data types:

+ + +
> SHOW FIELD KEYS
+
+name: just_my_type
+fieldKey   fieldType
+--------   ---------
+my_field   float
+my_field   string
+my_field   integer
+my_field   boolean
+

What are the minimum and maximum integers that InfluxDB can store?

+

InfluxDB stores all integers as signed int64 data types. +The minimum and maximum valid values for int64 are -9223372036854775808 and 9223372036854775807. +See Go builtins for more information.

+

Values close to but within those limits may lead to unexpected results; some functions and operators convert the int64 data type to float64 during calculation which can cause overflow issues.

+

What are the minimum and maximum timestamps that InfluxDB can store?

+

The minimum timestamp is -9223372036854775806 or 1677-09-21T00:12:43.145224194Z. +The maximum timestamp is 9223372036854775806 or 2262-04-11T23:47:16.854775806Z.

+

Timestamps outside that range return a parsing error.

+

How can I tell what type of data is stored in a field?

+

The SHOW FIELD KEYS query also returns the field’s type.

+

Example

+ + +
> SHOW FIELD KEYS FROM all_the_types
+name: all_the_types
+-------------------
+fieldKey  fieldType
+blue      string
+green     boolean
+orange    integer
+yellow    float
+

Can I change a field’s data type?

+

Currently, InfluxDB offers very limited support for changing a field’s data type.

+

The <field_key>::<type> syntax supports casting field values from integers to +floats or from floats to integers. +See Cast Operations +for an example. +There is no way to cast a float or integer to a string or Boolean (or vice versa).

+

We list possible workarounds for changing a field’s data type below. +Note that these workarounds will not update data that have already been +written to the database.

+

Write the data to a different field

+

The simplest workaround is to begin writing the new data type to a different field in the same +series.

+

Work the shard system

+

Field value types cannot differ within a +shard but they can differ across +shards.

+

Users looking to change a field’s data type can use the SHOW SHARDS query +to identify the end_time of the current shard. +InfluxDB will accept writes with a different data type to an existing field if the point has a timestamp +that occurs after that end_time.

+

Note that this will not change the field’s data type on prior shards. +For how this will affect your queries, please see +How does InfluxDB handle field type discrepancies across shards.

+

How do I perform mathematical operations within a function?

+

Currently, InfluxDB does not support mathematical operations within functions. +We recommend using InfluxQL’s subqueries +as a workaround.

+

Example

+

InfluxQL does not support the following syntax:

+ + +
SELECT MEAN("dogs" - "cats") from "pet_daycare"
+

Instead, use a subquery to get the same result:

+ + +
SELECT MEAN("difference") FROM (SELECT "dogs" - "cat" AS "difference" FROM "pet_daycare")
+

See the +Data Exploration +page for more information.

+

Why does my query return epoch 0 as the timestamp?

+

In InfluxDB, epoch 0 (1970-01-01T00:00:00Z) is often used as a null timestamp equivalent. +If you request a query that has no timestamp to return, such as an aggregation function with an unbounded time range, InfluxDB returns epoch 0 as the timestamp.

+

Which InfluxQL functions support nesting?

+

The following InfluxQL functions support nesting:

+ +

For information on how to use a subquery as a substitute for nested functions, see +Data exploration.

+

What determines the time intervals returned by GROUP BY time() queries?

+

The time intervals returned by GROUP BY time() queries conform to the InfluxDB database’s preset time +buckets or to the user-specified offset interval.

+

Example

+
Preset time buckets
+

The following query calculates the average value of sunflowers between +6:15pm and 7:45pm and groups those averages into one hour intervals:

+ + +
SELECT mean("sunflowers")
+FROM "flower_orders"
+WHERE time >= '2016-08-29T18:15:00Z' AND time <= '2016-08-29T19:45:00Z' GROUP BY time(1h)
+

The results below show how InfluxDB maintains its preset time buckets.

+

In this example, the 6pm hour is a preset bucket and the 7pm hour is a preset bucket. +The average for the 6pm time bucket does not include data prior to 6:15pm because of the WHERE time clause, +but any data included in the average for the 6pm time bucket must occur in the 6pm hour. +The same goes for the 7pm time bucket; any data included in the average for the 7pm +time bucket must occur in the 7pm hour. +The dotted lines show the points that make up each average.

+

Note that while the first timestamp in the results is 2016-08-29T18:00:00Z, +the query results in that bucket do not include data with timestamps that occur before the start of the +WHERE time clause (2016-08-29T18:15:00Z).

+

Raw data: +              +              +              +              +              +         

+

Results:

+ + +
name: flower_orders                                name: flower_orders
+—————————                                          -------------------
+time                    sunflowers                 time                  mean
+2016-08-29T18:00:00Z    34                         2016-08-29T18:00:00Z  22.332
+                       |--|                        2016-08-29T19:00:00Z  62.75
+2016-08-29T18:15:00Z   |28|
+2016-08-29T18:30:00Z   |19|
+2016-08-29T18:45:00Z   |20|
+                       |--|
+                       |--|
+2016-08-29T19:00:00Z   |56|
+2016-08-29T19:15:00Z   |76|
+2016-08-29T19:30:00Z   |29|
+2016-08-29T19:45:00Z   |90|
+                       |--|
+2016-08-29T20:00:00Z    70
+
Offset interval
+

The following query calculates the average value of sunflowers between +6:15pm and 7:45pm and groups those averages into one hour intervals. +It also offsets the InfluxDB database’s preset time buckets by 15 minutes.

+ + +
SELECT mean("sunflowers")
+FROM "flower_orders"
+WHERE time >= '2016-08-29T18:15:00Z' AND time <= '2016-08-29T19:45:00Z' GROUP BY time(1h,15m)
+                                                                                         ---
+                                                                                          |
+                                                                                   offset interval
+

In this example, the user-specified +offset interval +shifts the InfluxDB database’s preset time buckets forward by 15 minutes. +The average for the 6pm time bucket now includes data between 6:15pm and 7pm, and +the average for the 7pm time bucket includes data between 7:15pm and 8pm. +The dotted lines show the points that make up each average.

+

Note that the first timestamp in the result is 2016-08-29T18:15:00Z +instead of 2016-08-29T18:00:00Z.

+

Raw data: +              +              +              +              +              +         

+

Results:

+ + +
name: flower_orders                                name: flower_orders
+—————————                                          -------------------
+time                    sunflowers                 time                  mean
+2016-08-29T18:00:00Z    34                         2016-08-29T18:15:00Z  30.75
+                       |--|                        2016-08-29T19:15:00Z  65
+2016-08-29T18:15:00Z   |28|
+2016-08-29T18:30:00Z   |19|
+2016-08-29T18:45:00Z   |20|
+2016-08-29T19:00:00Z   |56|
+                       |--|
+                       |--|
+2016-08-29T19:15:00Z   |76|
+2016-08-29T19:30:00Z   |29|
+2016-08-29T19:45:00Z   |90|
+2016-08-29T20:00:00Z   |70|
+                       |--|
+

Why do my queries return no data or partial data?

+

The most common reasons why your query returns no data or partial data:

+ +

Querying the wrong retention policy

+

InfluxDB automatically queries data in a database’s default retention policy (RP). If your data is stored in another RP, you must specify the RP in your query to get results.

+

No field key in the SELECT clause

+

A query requires at least one field key in the SELECT clause. If the SELECT clause includes only tag keys, the query returns an empty response. For more information, see Data exploration.

+

SELECT query includes GROUP BY time()

+

If your SELECT query includes a GROUP BY time() clause, only data points between 1677-09-21 00:12:43.145224194 and now() are returned. Therefore, if any of your data points occur after now(), specify an alternative upper bound in your time interval.

+

(By default, most SELECT queries query data with timestamps between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC.)

+

Tag and field key with the same name

+

Avoid using the same name for a tag and field key. If you inadvertently add the same name for a tag and field key, and then query both keys together, the query results show the second key queried (tag or field) appended with _1 (also visible as the column header in Chronograf). To query a tag or field key appended with _1, you must drop the appended _1 and include the syntax ::tag or ::field.

+

Example

+
    +
  1. +

    Launch influx.

    +
  2. +
  3. +

    Write the following points to create both a field and tag key with the same name leaves:

    + + +
    # create the `leaves` tag key
    +INSERT grape,leaves=species leaves=6
    +
    +#create the `leaves` field key
    +INSERT grape leaves=5
    +
  4. +
  5. +

    If you view both keys, you’ll notice that neither key includes _1:

    + + +
    # show the `leaves` tag key
    +SHOW TAG KEYS
    +
    +name: grape
    +tagKey
    +------
    +leaves
    +
    +# create the `leaves` field key
    +SHOW FIELD KEYS
    +
    +name: grape
    +fieldKey   fieldType
    +------     ---------
    +leaves     float
    +
  6. +
  7. +

    If you query the grape measurement, you’ll see the leaves tag key has an appended _1:

    + + +
    # query the `grape` measurement
    +SELECT * FROM <database_name>.<retention_policy>."grape"
    +
    +name: grape
    +time                leaves      leaves_1
    +----                --------    ----------
    +1574128162128468000 6.00        species
    +1574128238044155000 5.00
    +
  8. +
  9. +

    To query a duplicate key name, you must drop _1 and include ::tag or ::field after the key:

    + + +
    # query duplicate keys using the correct syntax
    +SELECT "leaves"::tag, "leaves"::field FROM <database_name>.<retention_policy>."grape"
    +
    +name: grape
    +time                leaves     leaves_1
    +----                --------   ----------
    +1574128162128468000 species    6.00
    +1574128238044155000            5.00
    +

    Therefore, queries that reference leaves_1 don’t return values.

    +
  10. +
+ +
+

Warning: If you inadvertently add a duplicate key name, follow the steps +below to remove a duplicate key. Because of memory +requirements, if you have large amounts of data, we recommend chunking your data +(while selecting it) by a specified interval (for example, date range) to fit +the allotted memory.

+ +
+ +

Remove a duplicate key

+
    +
  1. +

    Launch influx.

    +
  2. +
  3. +

    Use the following queries to remove a duplicate key:

    + + +
    /* select each field key to keep in the original measurement and send to a temporary
    +   measurement; then, group by the tag keys to keep (leave out the duplicate key) */
    +SELECT "field_key","field_key2","field_key3"
    +INTO <temporary_measurement> FROM <original_measurement>
    +WHERE <date range> GROUP BY "tag_key","tag_key2","tag_key3"
    +
    +/* verify the field keys and tags keys were successfully moved to the temporary
    +measurement */
    +SELECT * FROM "temporary_measurement"
    +
    +/* drop original measurement (with the duplicate key) */
    +DROP MEASUREMENT "original_measurement"
    +
    +/* move data from temporary measurement back to original measurement you just dropped */
    +SELECT * INTO "original_measurement" FROM "temporary_measurement" GROUP BY *
    +
    +/* verify the field keys and tags keys were successfully moved back to the original
    + measurement */
    +SELECT * FROM "original_measurement"
    +
    +/* drop temporary measurement */
    +DROP MEASUREMENT "temporary_measurement"
    +
  4. +
+

Why don’t my GROUP BY time() queries return timestamps that occur after now()?

+

Most SELECT statements have a default time range between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC. +For SELECT statements with a GROUP BY time() clause, the default time +range is between 1677-09-21 00:12:43.145224194 UTC and now().

+

To query data with timestamps that occur after now(), SELECT statements with +a GROUP BY time() clause must provide an alternative upper bound in the +WHERE clause.

+

In the following example, the first query covers data with timestamps between +2015-09-18T21:30:00Z and now(). +The second query covers data with timestamps between 2015-09-18T21:30:00Z and 180 weeks from now().

+ + +
SELECT MEAN("boards") FROM "hillvalley" WHERE time >= '2015-09-18T21:30:00Z' GROUP BY time(12m) fill(none)
+
+
+SELECT MEAN("boards") FROM "hillvalley" WHERE time >= '2015-09-18T21:30:00Z' AND time <= now() + 180w GROUP BY time(12m) fill(none)
+

Note that the WHERE clause must provide an alternative upper bound to +override the default now() upper bound. The following query merely resets +the lower bound to now() such that the query’s time range is between +now() and now():

+ + +
SELECT MEAN("boards") FROM "hillvalley" WHERE time >= now() GROUP BY time(12m) fill(none)
+

For for more on time syntax in queries, see Data Exploration.

+

Can I perform mathematical operations against timestamps?

+

Currently, it is not possible to execute mathematical operators against timestamp values in InfluxDB. +Most time calculations must be carried out by the client receiving the query results.

+

There is limited support for using InfluxQL functions against timestamp values. +The function ELAPSED() +returns the difference between subsequent timestamps in a single field.

+

Can I identify write precision from returned timestamps?

+

InfluxDB stores all timestamps as nanosecond values, regardless of the write precision supplied. +It is important to note that when returning query results, the database silently drops trailing zeros from timestamps which obscures the initial write precision.

+

In the example below, the tags precision_supplied and timestamp_supplied show the time precision and timestamp that the user provided at the write. +Because InfluxDB silently drops trailing zeros on returned timestamps, the write precision is not recognizable in the returned timestamps.

+ + +
name: trails
+-------------
+time                  value	 precision_supplied  timestamp_supplied
+1970-01-01T01:00:00Z  3      n                   3600000000000
+1970-01-01T01:00:00Z  5      h                   1
+1970-01-01T02:00:00Z  4      n                   7200000000000
+1970-01-01T02:00:00Z  6      h                   2
+ + +

When should I single quote and when should I double quote in queries?

+

Single quote string values (for example, tag values) but do not single quote identifiers (database names, retention policy names, user names, measurement names, tag keys, and field keys).

+

Double quote identifiers if they start with a digit, contain characters other than [A-z,0-9,_], or if they are an InfluxQL keyword. +Double quotes are not required for identifiers if they don’t fall into one of +those categories but we recommend double quoting them anyway.

+

Examples:

+

Yes: SELECT bikes_available FROM bikes WHERE station_id='9'

+

Yes: SELECT "bikes_available" FROM "bikes" WHERE "station_id"='9'

+

Yes: SELECT MIN("avgrq-sz") AS "min_avgrq-sz" FROM telegraf

+

Yes: SELECT * from "cr@zy" where "p^e"='2'

+

No: SELECT 'bikes_available' FROM 'bikes' WHERE 'station_id'="9"

+

No: SELECT * from cr@zy where p^e='2'

+

Single quote date time strings. InfluxDB returns an error (ERR: invalid operation: time and *influxql.VarRef are not compatible) if you double quote +a date time string.

+

Examples:

+

Yes: SELECT "water_level" FROM "h2o_feet" WHERE time > '2015-08-18T23:00:01.232000000Z' AND time < '2015-09-19'

+

No: SELECT "water_level" FROM "h2o_feet" WHERE time > "2015-08-18T23:00:01.232000000Z" AND time < "2015-09-19"

+

See Data Exploration for more on time syntax in queries.

+

Why am I missing data after creating a new DEFAULT retention policy?

+

When you create a new DEFAULT retention policy (RP) on a database, the data written to the old DEFAULT RP remain in the old RP. +Queries that do not specify an RP automatically query the new DEFAULT RP so the old data may appear to be missing. +To query the old data you must fully qualify the relevant data in the query.

+

Example:

+

All of the data in the measurement fleeting fall under the DEFAULT RP called one_hour:

+ + +
> SELECT count(flounders) FROM fleeting
+name: fleeting
+--------------
+time			               count
+1970-01-01T00:00:00Z	 8
+

We create a new DEFAULT RP (two_hour) and perform the same query:

+ + +
SELECT count(flounders) FROM fleeting
+

To query the old data, we must specify the old DEFAULT RP by fully qualifying fleeting:

+ + +
> SELECT count(flounders) FROM fish.one_hour.fleeting
+name: fleeting
+--------------
+time			               count
+1970-01-01T00:00:00Z	 8
+

Why is my query with a WHERE OR time clause returning empty results?

+

Currently, InfluxDB does not support using OR in the WHERE clause to specify multiple time ranges. +InfluxDB returns an empty response if the query’s WHERE clause uses OR +with time intervals.

+

Example:

+ + +
SELECT * FROM "absolutismus" WHERE time = '2016-07-31T20:07:00Z' OR time = '2016-07-31T23:07:17Z'
+ + + +

Why does fill(previous) return empty results?

+

fill(previous) doesn’t fill the result for a time bucket if the previous value is outside the query’s time range.

+

In the following example, InfluxDB doesn’t fill the 2016-07-12T16:50:20Z-2016-07-12T16:50:30Z time bucket with the results from the 2016-07-12T16:50:00Z-2016-07-12T16:50:10Z time bucket because the query’s time range does not include the earlier time bucket.

+

Raw data:

+ + +
> SELECT * FROM "cupcakes"
+name: cupcakes
+--------------
+time                   chocolate
+2016-07-12T16:50:00Z   3
+2016-07-12T16:50:10Z   2
+2016-07-12T16:50:40Z   12
+2016-07-12T16:50:50Z   11
+

GROUP BY time() query:

+ + +
> SELECT max("chocolate") FROM "cupcakes" WHERE time >= '2016-07-12T16:50:20Z' AND time <= '2016-07-12T16:51:10Z' GROUP BY time(20s) fill(previous)
+name: cupcakes
+--------------
+time                   max
+2016-07-12T16:50:20Z
+2016-07-12T16:50:40Z   12
+2016-07-12T16:51:00Z   12
+

While this is the expected behavior of fill(previous), an open feature request on GitHub proposes that fill(previous) should fill results even when previous values fall outside the query’s time range.

+

Why are my INTO queries missing data?

+

By default, INTO queries convert any tags in the initial data to fields in +the newly written data. +This can cause InfluxDB to overwrite points that were previously differentiated by a tag. +Include GROUP BY * in all INTO queries to preserve tags in the newly written data.

+

Note that this behavior does not apply to queries that use the TOP() or BOTTOM() functions. +See the TOP() and BOTTOM() documentation for more information.

+

Example

+
Initial data
+

The french_bulldogs measurement includes the color tag and the name field.

+ + +
> SELECT * FROM "french_bulldogs"
+name: french_bulldogs
+---------------------
+time                  color  name
+2016-05-25T00:05:00Z  peach  nugget
+2016-05-25T00:05:00Z  grey   rumple
+2016-05-25T00:10:00Z  black  prince
+
INTO query without GROUP BY *
+

An INTO query without a GROUP BY * clause turns the color tag into +a field in the newly written data. +In the initial data the nugget point and the rumple points are differentiated only by the color tag. +Once color becomes a field, InfluxDB assumes that the nugget point and the +rumple point are duplicate points and it overwrites the nugget point with +the rumple point.

+ + +
> SELECT * INTO "all_dogs" FROM "french_bulldogs"
+name: result
+------------
+time                  written
+1970-01-01T00:00:00Z  3
+
+> SELECT * FROM "all_dogs"
+name: all_dogs
+--------------
+time                  color  name
+2016-05-25T00:05:00Z  grey   rumple                <---- no more nugget 🐶
+2016-05-25T00:10:00Z  black  prince
+
INTO query with GROUP BY *
+

An INTO query with a GROUP BY * clause preserves color as a tag in the newly written data. +In this case, the nugget point and the rumple point remain unique points and InfluxDB does not overwrite any data.

+ + +
> SELECT "name" INTO "all_dogs" FROM "french_bulldogs" GROUP BY *
+name: result
+------------
+time                  written
+1970-01-01T00:00:00Z  3
+
+> SELECT * FROM "all_dogs"
+name: all_dogs
+--------------
+time                  color  name
+2016-05-25T00:05:00Z  peach  nugget
+2016-05-25T00:05:00Z  grey   rumple
+2016-05-25T00:10:00Z  black  prince
+

How do I query data with an identical tag key and field key?

+

Use the :: syntax to specify if the key is a field key or tag key.

+

Examples

+
Sample data
+ + +
> INSERT candied,almonds=true almonds=50,half_almonds=51 1465317610000000000
+> INSERT candied,almonds=true almonds=55,half_almonds=56 1465317620000000000
+
+> SELECT * FROM "candied"
+name: candied
+-------------
+time                   almonds  almonds_1  half_almonds
+2016-06-07T16:40:10Z   50       true       51
+2016-06-07T16:40:20Z   55       true       56
+
Specify that the key is a field:
+ + +
> SELECT * FROM "candied" WHERE "almonds"::field > 51
+name: candied
+-------------
+time                   almonds  almonds_1  half_almonds
+2016-06-07T16:40:20Z   55       true       56
+
Specify that the key is a tag:
+ + +
> SELECT * FROM "candied" WHERE "almonds"::tag='true'
+name: candied
+-------------
+time                   almonds  almonds_1  half_almonds
+2016-06-07T16:40:10Z   50       true       51
+2016-06-07T16:40:20Z   55       true       56
+

How do I query data across measurements?

+

Currently, there is no way to perform cross-measurement math or grouping. +All data must be under a single measurement to query it together. +InfluxDB is not a relational database and mapping data across measurements is not currently a recommended schema. +See GitHub Issue #3552 for a discussion of implementing JOIN in InfluxDB.

+

Does the order of the timestamps matter?

+

No. +Our tests indicate that there is a only a negligible difference between the times +it takes InfluxDB to complete the following queries:

+ + +
SELECT ... FROM ... WHERE time > 'timestamp1' AND time < 'timestamp2'
+SELECT ... FROM ... WHERE time < 'timestamp2' AND time > 'timestamp1'
+

How do I SELECT data with a tag that has no value?

+

Specify an empty tag value with ''. For example:

+ + +
> SELECT * FROM "vases" WHERE priceless=''
+name: vases
+-----------
+time                   origin   priceless
+2016-07-20T18:42:00Z   8
+

Why does series cardinality matter?

+

InfluxDB maintains an in-memory index of every series in the system. As the number of unique series grows, so does the RAM usage. High series cardinality can lead to the operating system killing the InfluxDB process with an out of memory (OOM) exception. See SHOW CARDINALITY to learn about the InfluxSQL commands for series cardinality.

+

How can I remove series from the index?

+

To reduce series cardinality, series must be dropped from the index. +DROP DATABASE, +DROP MEASUREMENT, and +DROP SERIES will all remove series from the index and reduce the overall series cardinality.

+ +
+

Note: DROP commands are usually CPU-intensive, as they frequently trigger a TSM compaction. Issuing DROP queries at a high frequency may significantly impact write and other query throughput.

+ +
+

How do I write integer field values?

+

Add a trailing i to the end of the field value when writing an integer. +If you do not provide the i, InfluxDB will treat the field value as a float.

+

Writes an integer: value=100i +Writes a float: value=100

+

How does InfluxDB handle duplicate points?

+

A point is uniquely identified by the measurement name, tag set, and timestamp. +If you submit a new point with the same measurement, tag set, and timestamp as an existing point, the field set becomes the union of the old field set and the new field set, where any ties go to the new field set. +This is the intended behavior.

+

For example:

+

Old point: cpu_load,hostname=server02,az=us_west val_1=24.5,val_2=7 1234567890000000

+

New point: cpu_load,hostname=server02,az=us_west val_1=5.24 1234567890000000

+

After you submit the new point, InfluxDB overwrites val_1 with the new field value and leaves the field val_2 alone:

+ + +
> SELECT * FROM "cpu_load" WHERE time = 1234567890000000
+name: cpu_load
+--------------
+time                      az        hostname   val_1   val_2
+1970-01-15T06:56:07.89Z   us_west   server02   5.24    7
+

To store both points:

+
    +
  • +

    Introduce an arbitrary new tag to enforce uniqueness.

    +

    Old point: cpu_load,hostname=server02,az=us_west,uniq=1 val_1=24.5,val_2=7 1234567890000000

    +

    New point: cpu_load,hostname=server02,az=us_west,uniq=2 val_1=5.24 1234567890000000

    +

    After writing the new point to InfluxDB:

    +
  • +
+ + +
> SELECT * FROM "cpu_load" WHERE time = 1234567890000000
+name: cpu_load
+--------------
+time                      az        hostname   uniq   val_1   val_2
+1970-01-15T06:56:07.89Z   us_west   server02   1      24.5    7
+1970-01-15T06:56:07.89Z   us_west   server02   2      5.24
+
    +
  • +

    Increment the timestamp by a nanosecond.

    +

    Old point: cpu_load,hostname=server02,az=us_west val_1=24.5,val_2=7 1234567890000000

    +

    New point: cpu_load,hostname=server02,az=us_west val_1=5.24 1234567890000001

    +

    After writing the new point to InfluxDB:

    +
  • +
+ + +
> SELECT * FROM "cpu_load" WHERE time >= 1234567890000000 and time <= 1234567890000001
+name: cpu_load
+--------------
+time                             az        hostname   val_1   val_2
+1970-01-15T06:56:07.89Z          us_west   server02   24.5    7
+1970-01-15T06:56:07.890000001Z   us_west   server02   5.24
+

What newline character does the InfluxDB API require?

+

The InfluxDB line protocol relies on line feed (\n, which is ASCII 0x0A) to indicate the end of a line and the beginning of a new line. Files or data that use a newline character other than \n will result in the following errors: bad timestamp, unable to parse.

+

Note that Windows uses carriage return and line feed (\r\n) as the newline character.

+

What words and characters should I avoid when writing data to InfluxDB?

+

InfluxQL keywords

+

If you use an InfluxQL keyword as an identifier you will need to double quote that identifier in every query. +This can lead to non-intuitive errors. +Identifiers are continuous query names, database names, field keys, measurement names, retention policy names, subscription names, tag keys, and user names.

+

time

+

The keyword time is a special case. +time can be a +continuous query name, +database name, +measurement name, +retention policy name, +subscription name, and +user name. +In those cases, time does not require double quotes in queries. +time cannot be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error.

+

Examples

+
Write time as a measurement and query it
+ + +
> INSERT time value=1
+
+> SELECT * FROM time
+
+name: time
+time                            value
+----                            -----
+2017-02-07T18:28:27.349785384Z  1
+

time is a valid measurement name in InfluxDB.

+
Write time as a field key and attempt to query it
+ + +
> INSERT mymeas time=1
+ERR: {"error":"partial write: invalid field name: input field \"time\" on measurement \"mymeas\" is invalid dropped=1"}
+

time is not a valid field key in InfluxDB. +The system does does not write the point and returns a 400.

+
Write time as a tag key and attempt to query it
+ + +
> INSERT mymeas,time=1 value=1
+ERR: {"error":"partial write: invalid tag key: input tag \"time\" on measurement \"mymeas\" is invalid dropped=1"}
+

time is not a valid tag key in InfluxDB. +The system does does not write the point and returns a 400.

+

Characters

+

To keep regular expressions and quoting simple, avoid using the following characters in identifiers:

+

\ backslash +^ circumflex accent +$ dollar sign +' single quotation mark +" double quotation mark += equal sign +, comma

+

When should I single quote and when should I double quote when writing data?

+
    +
  • +

    Avoid single quoting and double quoting identifiers when writing data via the +line protocol; see the examples below for how writing identifiers with quotes +can complicate queries. Identifiers are database names, retention policy +names, user names, measurement names, tag keys, and field keys.

    +

    Write with a double-quoted measurement: INSERT "bikes" bikes_available=3 +Applicable query: SELECT * FROM "\"bikes\""

    +

    Write with a single-quoted measurement: INSERT 'bikes' bikes_available=3 +Applicable query: SELECT * FROM "\'bikes\'"

    +

    Write with an unquoted measurement: INSERT bikes bikes_available=3 +Applicable query: SELECT * FROM "bikes"

    +
  • +
  • +

    Double quote field values that are strings.

    +

    Write: INSERT bikes happiness="level 2" +Applicable query: SELECT * FROM "bikes" WHERE "happiness"='level 2'

    +
  • +
  • +

    Special characters should be escaped with a backslash and not placed in quotes–for example:

    +

    Write: INSERT wacky va\"ue=4 +Applicable query: SELECT "va\"ue" FROM "wacky"

    +
  • +
+

For more information , see Line protocol.

+

Does the precision of the timestamp matter?

+

Yes. +To maximize performance, use the coarsest possible timestamp precision when writing data to InfluxDB.

+

In the following two examples, the first request uses a default precision of nanoseconds while the second example sets the precision to seconds:

+ + +
curl -i -XPOST "http://localhost:8086/write?db=weather" --data-binary 'temperature,location=1 value=90 1472666050000000000'
+
+curl -i -XPOST "http://localhost:8086/write?db=weather&precision=s" --data-binary 'temperature,location=1 value=90 1472666050'
+

The tradeoff is that identical points with duplicate timestamps, more likely to occur as precision gets coarser, may overwrite other points.

+

What are the configuration recommendations and schema guidelines for writing sparse, historical data?

+

For users who want to write sparse, historical data to InfluxDB, InfluxData recommends:

+

First, lengthening your retention policy‘s shard group duration to cover several years. +The default shard group duration is one week and if your data cover several hundred years – well, that’s a lot of shards! +Having an extremely high number of shards is inefficient for InfluxDB. +Increase the shard group duration for your data’s retention policy with the ALTER RETENTION POLICY query.

+

Second, temporarily lowering the cache-snapshot-write-cold-duration configuration setting. +If you’re writing a lot of historical data, the default setting (10m) can cause the system to hold all of your data in cache for every shard. +Temporarily lowering the cache-snapshot-write-cold-duration setting to 10s while you write the historical data makes the process more efficient.

+

Where can I find InfluxDB Enterprise logs?

+

On systemd operating systems, service logs can be accessed using the journalctl command.

+

Meta: journalctl -u influxdb-meta

+

Data : journalctl -u influxdb

+

Enterprise console: journalctl -u influx-enterprise

+

The journalctl output can be redirected to print the logs to a text file. With systemd, log retention depends on the system’s journald settings.

+

Why am I seeing a 503 Service Unavailable error in my meta node logs?

+

This is the expected behavior if you haven’t joined the meta node to the +cluster. +The 503 errors should stop showing up in the logs once you +join the meta node to the cluster.

+

Why am I seeing a 409 error in some of my data node logs?

+

When you create a +Continuous Query (CQ) +on your cluster, every data node will ask for the CQ lease. +Only one data node can accept the lease. +That data node will have a 200 in its logs. +All other data nodes will be denied the lease and have a 409 in their logs. +This is the expected behavior.

+

Log output for a data node that is denied the lease:

+ + +
[meta-http] 2016/09/19 09:08:53 172.31.4.132 - - [19/Sep/2016:09:08:53 +0000] GET /lease?name=continuous_querier&node_id=5 HTTP/1.2 409 105 - InfluxDB Meta Client b00e4943-7e48-11e6-86a6-000000000000 380.542µs
+

Log output for the data node that accepts the lease:

+ + +
[meta-http] 2016/09/19 09:08:54 172.31.12.27 - - [19/Sep/2016:09:08:54 +0000] GET /lease?name=continuous_querier&node_id=0 HTTP/1.2 200 105 - InfluxDB Meta Client b05a3861-7e48-11e6-86a7-000000000000 8.87547ms
+

Why am I seeing hinted handoff queue not empty errors in my data node logs?

+ + +
[write] 2016/10/18 10:35:21 write failed for shard 2382 on node 4: hinted handoff queue not empty
+

This error is informational only and does not necessarily indicate a problem in the cluster. It indicates that the node handling the write request currently has data in its local hinted handoff queue for the destination node. Coordinating nodes will not attempt direct writes to other nodes until the hinted handoff queue for the destination node has fully drained. New data is instead appended to the hinted handoff queue. This helps data arrive in chronological order for consistency of graphs and alerts and also prevents unnecessary failed connection attempts between the data nodes. Until the hinted handoff queue is empty, this message will continue to display in the logs. Monitor the size of the hinted handoff queues with ls -lRh /var/lib/influxdb/hh to ensure that they are decreasing in size.

+

Note that for some write consistency settings, InfluxDB may return a write error (500) for the write attempt, even if the points are successfully queued in hinted handoff. Some write clients may attempt to resend those points, leading to duplicate points being added to the hinted handoff queue and lengthening the time it takes for the queue to drain. If the queues are not draining, consider temporarily downgrading the write consistency setting, or pause retries on the write clients until the hinted handoff queues fully drain.

+

Why am I seeing error writing count stats ...: partial write errors in my data node logs?

+ + +
[stats] 2016/10/18 10:35:21 error writing count stats for FOO_grafana: partial write
+

The _internal database collects per-node and also cluster-wide information about the InfluxDB Enterprise cluster. The cluster metrics are replicated to other nodes using consistency=all. For a write consistency of all, InfluxDB returns a write error (500) for the write attempt even if the points are successfully queued in hinted handoff. Thus, if there are points still in hinted handoff, the _internal writes will fail the consistency check and log the error, even though the data is in the durable hinted handoff queue and should eventually persist.

+

Why am I seeing queue is full errors in my data node logs?

+

This error indicates that the coordinating node that received the write cannot add the incoming write to the hinted handoff queue for the destination node because it would exceed the maximum size of the queue. This error typically indicates a catastrophic condition for the cluster - one data node may have been offline or unable to accept writes for an extended duration.

+

The controlling configuration settings are in the [hinted-handoff] section of the file. max-size is the total size in bytes per hinted handoff queue. When max-size is exceeded, all new writes for that node are rejected until the queue drops below max-size. max-age is the maximum length of time a point will persist in the queue. Once this limit has been reached, points expire from the queue. The age is calculated from the write time of the point, not the timestamp of the point.

+

Why am I seeing unable to determine if "hostname" is a meta node when I try to add a meta node with influxd-ctl join?

+

Meta nodes use the /status endpoint to determine the current state of another meta node. A healthy meta node that is ready to join the cluster will respond with a 200 HTTP response code and a JSON string with the following format (assuming the default ports):

+

"nodeType":"meta","leader":"","httpAddr":"<hostname>:8091","raftAddr":"<hostname>:8089","peers":null}

+

If you are getting an error message while attempting to influxd-ctl join a new meta node, it means that the JSON string returned from the /status endpoint is incorrect. This generally indicates that the meta node configuration file is incomplete or incorrect. Inspect the HTTP response with curl -v "http://<hostname>:8091/status" and make sure that the hostname, the bind-address, and the http-bind-address are correctly populated. Also check the license-key or license-path in the configuration file of the meta nodes. Finally, make sure that you specify the http-bind-address port in the join command, e.g. influxd-ctl join hostname:8091.

+

Why is InfluxDB reporting an out of memory (OOM) exception when my system has free memory?

+

mmap is a Unix system call that maps files into memory. +As the number of shards in an InfluxDB Enterprise cluster increases, the number of memory maps increase. +If the number of maps exceeds the configured maximum limit, the node reports that it is out of memory.

+

To check the current number of maps the influxd process is using:

+ + +
wc -l /proc/$(pidof influxd)/maps
+

The max_map_count file contains the maximum number of memory map areas a process may have. +The default limit is 65536. +We recommend increasing this to 262144 (four times the default) by running the following:

+ + +
echo vm.max_map_count=262144 > /etc/sysctl.d/90-vm.max_map_count.conf
+

To make the changes permanent:

+ + +
sysctl --system
+

Restart the influxd process and repeat on each node in your cluster.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/write_protocols/line_protocol_reference/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/write_protocols/line_protocol_reference/index.html new file mode 100644 index 000000000..5fcbfa579 --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/write_protocols/line_protocol_reference/index.html @@ -0,0 +1,3309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxDB line protocol reference | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxDB line protocol reference

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxDB line protocol is a text-based format for writing points to InfluxDB.

+

Line protocol syntax

+ + +
<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]
+

Line protocol accepts the newline character \n and is whitespace-sensitive.

+ +
+

Line protocol does not support the newline character \n in tag values or field values.

+ +
+ +

Syntax description

+

InfluxDB line protocol informs InfluxDB of the data’s measurement, tag set, field set, and timestamp.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementOptional/RequiredDescriptionType
(See data types for more information.)
MeasurementRequiredThe measurement name. InfluxDB accepts one measurement per point.String
Tag setOptionalAll tag key-value pairs for the point.Tag keys and tag values are both strings.
Field setRequired. Points must have at least one field.All field key-value pairs for the point.Field keys are strings. Field values can be floats, integers, strings, or Booleans.
TimestampOptional. InfluxDB uses the server’s local nanosecond timestamp in UTC if the timestamp is not included with the point.The timestamp for the data point. InfluxDB accepts one timestamp per point.Unix nanosecond timestamp. Specify alternative precisions with the InfluxDB API.
+ +
+

Performance tips:

+
    +
  • Before sending data to InfluxDB, sort by tag key to match the results from the +Go bytes.Compare function.
  • +
  • To significantly improve compression, use the coarsest precision possible for timestamps.
  • +
  • Use the Network Time Protocol (NTP) to synchronize time between hosts. InfluxDB uses a host’s local time in UTC to assign timestamps to data. If a host’s clock isn’t synchronized with NTP, the data that the host writes to InfluxDB may have inaccurate timestamps.
  • +
+ +
+ +

Data types

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DatatypeElement(s)Description
FloatField valuesDefault numerical type. IEEE-754 64-bit floating-point numbers (except NaN or +/- Inf). Examples: 1, 1.0, 1.e+78, 1.E+78.
IntegerField valuesSigned 64-bit integers (-9223372036854775808 to 9223372036854775807). Specify an integer with a trailing i on the number. Example: 1i.
StringMeasurements, tag keys, tag values, field keys, field valuesLength limit 64KB.
BooleanField valuesStores TRUE or FALSE values.

TRUE write syntax:[t, T, true, True, TRUE].

FALSE write syntax:[f, F, false, False, FALSE]
TimestampTimestampsA Unix time in nanoseconds since January 1, 1970 UTC. Specify alternative precisions with the InfluxDB API. The minimum valid timestamp is -9223372036854775806 or 1677-09-21T00:12:43.145224194Z. The maximum valid timestamp is 9223372036854775806 or 2262-04-11T23:47:16.854775806Z.
+

Boolean syntax for writes and queries

+

Acceptable Boolean syntax differs for data writes and data queries. +For more information, see +Frequently asked questions.

+

Field type discrepancies

+

In a measurement, a field’s type cannot differ in a shard, but can differ across +shards.

+

To learn how field value type discrepancies can affect SELECT * queries, see +How does InfluxDB handle field type discrepancies across shards?.

+

Examples

+

Write the field value -1.234456e+78 as a float to InfluxDB

+ + +
INSERT mymeas value=-1.234456e+78
+

InfluxDB supports field values specified in scientific notation.

+

Write a field value 1.0 as a float to InfluxDB

+ + +
INSERT mymeas value=1.0
+

Write the field value 1 as a float to InfluxDB

+ + +
INSERT mymeas value=1
+

Write the field value 1 as an integer to InfluxDB

+ + +
INSERT mymeas value=1i
+

Write the field value stringing along as a string to InfluxDB

+ + +
INSERT mymeas value="stringing along"
+

Always double quote string field values. More on quoting below.

+

Write the field value true as a Boolean to InfluxDB

+ + +
INSERT mymeas value=true
+

Do not quote Boolean field values. +The following statement writes true as a string field value to InfluxDB:

+ + +
INSERT mymeas value="true"
+

Attempt to write a string to a field that previously accepted floats

+

If the timestamps on the float and string are stored in the same shard:

+ + +
> INSERT mymeas value=3 1465934559000000000
+> INSERT mymeas value="stringing along" 1465934559000000001
+ERR: {"error":"field type conflict: input field \"value\" on measurement \"mymeas\" is type string, already exists as type float"}
+

If the timestamps on the float and string are not stored in the same shard:

+ + +
INSERT mymeas value=3 1465934559000000000
+INSERT mymeas value="stringing along" 1466625759000000000
+

Quoting, special characters, and additional naming guidelines

+

Quoting

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ElementDouble quotesSingle quotes
TimestampNeverNever
Measurements, tag keys, tag values, field keysNever*Never*
Field valuesDouble quote string field values. Do not double quote floats, integers, or Booleans.Never
+

* InfluxDB line protocol allows users to double and single quote measurement names, tag +keys, tag values, and field keys. +It will, however, assume that the double or single quotes are part of the name, +key, or value. +This can complicate query syntax (see the example below).

+

Examples

+
Invalid line protocol - Double quote the timestamp
+ + +
> INSERT mymeas value=9 "1466625759000000000"
+ERR: {"error":"unable to parse 'mymeas value=9 \"1466625759000000000\"': bad timestamp"}
+

Double quoting (or single quoting) the timestamp yields a bad timestamp +error.

+
Semantic error - Double quote a Boolean field value
+ + +
> INSERT mymeas value="true"
+> SHOW FIELD KEYS FROM "mymeas"
+name: mymeas
+------------
+fieldKey	 fieldType
+value		   string
+

InfluxDB assumes that all double quoted field values are strings.

+
Semantic error - Double quote a measurement name
+ + +
> INSERT "mymeas" value=200
+> SHOW MEASUREMENTS
+name: measurements
+------------------
+name
+"mymeas"
+> SELECT * FROM mymeas
+> SELECT * FROM "mymeas"
+> SELECT * FROM "\"mymeas\""
+name: "mymeas"
+--------------
+time				                        value
+2016-06-14T20:36:21.836131014Z	 200
+

If you double quote a measurement in line protocol, any queries on that +measurement require both double quotes and escaped (\) double quotes in the +FROM clause.

+

Special characters

+

You must use a backslash character \ to escape the following special characters:

+
    +
  • +

    In string field values, you must escape:

    +
      +
    • +

      double quotes: \" escapes double quote.

      +
    • +
    • +

      backslash character: If you use multiple backslashes, they must be escaped. +InfluxDB interprets backslashes as follows:

      +
        +
      • \ or \\ interpreted as \
      • +
      • \\\ or \\\\ interpreted as \\
      • +
      • \\\\\ or \\\\\\ interpreted as \\\, and so on
      • +
      +
    • +
    +
  • +
  • +

    In tag keys, tag values, and field keys, you must escape:

    +
      +
    • commas
    • +
    • equal signs
    • +
    • spaces
    • +
    +
  • +
+

For example, \, escapes a comma.

+
    +
  • In measurements, you must escape: +
      +
    • commas
    • +
    • spaces
    • +
    +
  • +
+

You do not need to escape other special characters.

+

Examples

+
Write a point with special characters
+ + +
INSERT "measurement\ with\ quo⚡️es\ and\ emoji",tag\ key\ with\ sp🚀ces=tag\,value\,with"commas" field_k\ey="string field value, only \" need be esc🍭ped"
+

The system writes a point where the measurement is "measurement with quo⚡️es and emoji", the tag key is tag key with sp🚀ces, the +tag value is tag,value,with"commas", the field key is field_k\ey and the field value is string field value, only " need be esc🍭ped.

+

Additional naming guidelines

+

# at the beginning of the line is a valid comment character for line protocol. +InfluxDB will ignore all subsequent characters until the next newline \n.

+

Measurement names, tag keys, tag values, field keys, and field values are +case sensitive.

+

InfluxDB line protocol accepts +InfluxQL keywords +as identifier names. +In general, we recommend avoiding using InfluxQL keywords in your schema as +it can cause +confusion when querying the data.

+ +
+

Note: Avoid using the reserved keys _field and _measurement. If these keys are included as a tag or field key, the associated point is discarded.

+ +
+

The keyword time is a special case. +time can be a +continuous query name, +database name, +measurement name, +retention policy name, +subscription name, and +user name. +In those cases, time does not require double quotes in queries. +time cannot be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error. +See Frequently Asked Questions for more information.

+

InfluxDB line protocol in practice

+

To learn how to write line protocol to the database, see Tools.

+

Duplicate points

+

A point is uniquely identified by the measurement name, tag set, field set, and timestamp

+

If you write a point to a series with a timestamp that matches an existing point, the field set becomes a union of the old and new field set, and conflicts favor the new field set.

+

For a complete example of this behavior and how to avoid it, see +How does InfluxDB handle duplicate points?

+

Duplicate keys

+

If you have a tag key and field key with the same name in a measurement, one of the keys will return appended with a _1 in query results (and as a column header in Chronograf). For example, location and location_1. To query a duplicate key, drop the _1 and use the InfluxQL ::tag or ::field syntax in your query, for example:

+ + +
  SELECT "location"::tag, "location"::field FROM "database_name"."retention_policy"."measurement"
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/enterprise_influxdb/v1/write_protocols/line_protocol_tutorial/index.html b/pr-preview/pr-6948/enterprise_influxdb/v1/write_protocols/line_protocol_tutorial/index.html new file mode 100644 index 000000000..49a8ef162 --- /dev/null +++ b/pr-preview/pr-6948/enterprise_influxdb/v1/write_protocols/line_protocol_tutorial/index.html @@ -0,0 +1,3414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxDB line protocol tutorial | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxDB line protocol tutorial

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

The InfluxDB line protocol is a text-based format for writing points to the +database. +Points must be in line protocol format for InfluxDB to successfully parse and +write points (unless you’re using a service plugin).

+

Using fictional temperature data, this page introduces InfluxDB line protocol. +It covers:

+ +

The final section, Writing data to InfluxDB, +describes how to get data into InfluxDB and how InfluxDB handles Line +Protocol duplicates.

+

Syntax

+

A single line of text in line protocol format represents one data point in InfluxDB. +It informs InfluxDB of the point’s measurement, tag set, field set, and +timestamp.

+
+

+ myMeasurement,tag1=val1,tag2=val2 + field1="v1",field2=1i 0000000000000000000 +

+
+

Moving across each element in the diagram:

+

Measurement

+

The name of the measurement +that you want to write your data to. +The measurement is required in line protocol.

+

In the example, the measurement name is weather.

+

Tag set

+

The tag(s) that you want to include +with your data point. +Tags are optional in line protocol.

+ +
+

Avoid using the reserved keys _field, _measurement, and time. +If reserved keys are included as a tag or field key, the associated point is discarded.

+ +
+ +

Notice that the measurement and tag set are separated by a comma and no spaces.

+

Separate tag key-value pairs with an equals sign = and no spaces:

+ + +
<tag_key>=<tag_value>
+

Separate multiple tag-value pairs with a comma and no spaces:

+ + +
<tag_key>=<tag_value>,<tag_key>=<tag_value>
+

In the example, the tag set consists of one tag: location=us-midwest. +Adding another tag (season=summer) to the example looks like this:

+ + +
weather,location=us-midwest,season=summer temperature=82 1465839830100400200
+

For best performance you should sort tags by key before sending them to the +database. +The sort should match the results from the +Go bytes.Compare function.

+

First whitespace

+

Separate the measurement and the field set or, if you’re including a tag set +with your data point, separate the tag set and the field set with a whitespace. +The whitespace is required in line protocol.

+

Valid line protocol with no tag set:

+ + +
weather temperature=82 1465839830100400200
+

Field set

+

The field(s) for your data point. +Every data point requires at least one field in line protocol.

+

Separate field key-value pairs with an equals sign = and no spaces:

+ + +
<field_key>=<field_value>
+

Separate multiple field-value pairs with a comma and no spaces:

+ + +
<field_key>=<field_value>,<field_key>=<field_value>
+

In the example, the field set consists of one field: temperature=82. +Adding another field (humidity=71) to the example looks like this:

+ + +
weather,location=us-midwest temperature=82,humidity=71 1465839830100400200
+

Second whitespace

+

Separate the field set and the optional timestamp with a whitespace. +The whitespace is required in line protocol if you’re including a timestamp.

+

Timestamp

+

The timestamp for your data +point in nanosecond-precision Unix time. +The timestamp is optional in line protocol. +If you do not specify a timestamp for your data point InfluxDB uses the server’s +local nanosecond timestamp in UTC.

+

In the example, the timestamp is 1465839830100400200 (that’s +2016-06-13T17:43:50.1004002Z in RFC3339 format). +The line protocol below is the same data point but without the timestamp. +When InfluxDB writes it to the database it uses your server’s +local timestamp instead of 2016-06-13T17:43:50.1004002Z.

+ + +
weather,location=us-midwest temperature=82
+

Use the InfluxDB API to specify timestamps with a precision other than nanoseconds, +such as microseconds, milliseconds, or seconds. +We recommend using the coarsest precision possible as this can result in +significant improvements in compression. +See the API Reference for more information.

+ +
+

Use NTP to synchronize time between hosts

+

Use the Network Time Protocol (NTP) to synchronize time between hosts. +InfluxDB uses a host’s local time in UTC to assign timestamps to data; if +hosts’ clocks aren’t synchronized with NTP, the timestamps on the data written +to InfluxDB can be inaccurate.

+ +
+ +

Data types

+

This section covers the data types of line protocol’s major components: +measurements, +tag keys, +tag values, +field keys, +field values, and +timestamps.

+

Measurements, tag keys, tag values, and field keys are always strings.

+ +
+

Because InfluxDB stores tag values as strings, InfluxDB cannot perform math on +tag values. +In addition, InfluxQL functions +do not accept a tag value as a primary argument. +It’s a good idea to take into account that information when designing your +schema.

+ +
+ +

Timestamps are Unix timestamps. +The minimum valid timestamp is -9223372036854775806 or 1677-09-21T00:12:43.145224194Z. +The maximum valid timestamp is 9223372036854775806 or 2262-04-11T23:47:16.854775806Z. +As mentioned above, by default, InfluxDB assumes that timestamps have +nanosecond precision. +See the API Reference for how to specify +alternative precisions.

+

Field values can be floats, integers, strings, or Booleans:

+
    +
  • +

    Floats: by default, InfluxDB assumes all numeric field values are floats.

    +

    Store the field value 82 as a float:

    + + +
    weather,location=us-midwest temperature=82 1465839830100400200
    +
  • +
  • +

    Integers: append an i to the field value to tell InfluxDB to store the +number as an integer.

    +

    Store the field value 82 as an integer:

    + + +
    weather,location=us-midwest temperature=82i 1465839830100400200
    +
  • +
  • +

    Strings: double quote string field values (more on quoting in line +protocol below).

    +

    Store the field value too warm as a string:

    + + +
    weather,location=us-midwest temperature="too warm" 1465839830100400200
    +
  • +
  • +

    Booleans: specify TRUE with t, T, true, True, or TRUE. Specify +FALSE with f, F, false, False, or FALSE.

    +

    Store the field value true as a Boolean:

    + + +
    weather,location=us-midwest too_hot=true 1465839830100400200
    + +
    +

    Acceptable Boolean syntax differs for data writes and data +queries. See Frequently Asked Questions +for more information.

    + +
    + +
  • +
+

Within a measurement, a field’s type cannot differ within a +shard, but it can differ across +shards. For example, writing an integer to a field that previously accepted +floats fails if InfluxDB attempts to store the integer in the same shard as the +floats:

+ + +
> INSERT weather,location=us-midwest temperature=82 1465839830100400200
+> INSERT weather,location=us-midwest temperature=81i 1465839830100400300
+ERR: {"error":"field type conflict: input field \"temperature\" on measurement \"weather\" is type int64, already exists as type float"}
+

But, writing an integer to a field that previously accepted floats succeeds if +InfluxDB stores the integer in a new shard:

+ + +
INSERT weather,location=us-midwest temperature=82 1465839830100400200
+INSERT weather,location=us-midwest temperature=81i 1467154750000000000
+

See +Frequently Asked Questions +for how field value type discrepancies can affect SELECT * queries.

+

Quoting

+

This section covers when not to and when to double (") or single (') +quote in line protocol. +Moving from never quote to please do quote:

+
    +
  • +

    Never double or single quote the timestamp–for example:

    + + +
    > INSERT weather,location=us-midwest temperature=82 "1465839830100400200"
    +ERR: {"error":"unable to parse 'weather,location=us-midwest temperature=82 \"1465839830100400200\"': bad timestamp"}
    +
  • +
  • +

    Never single quote field values, even if they’re strings–for example:

    + + +
    > INSERT weather,location=us-midwest temperature='too warm'
    +ERR: {"error":"unable to parse 'weather,location=us-midwest temperature='too warm'': invalid boolean"}
    +
  • +
  • +

    Do not double or single quote measurement names, tag keys, tag values, and field +keys unless the quotes are part of the name–for example:

    + + +
    > INSERT weather,location=us-midwest temperature=82 1465839830100400200
    +> INSERT "weather",location=us-midwest temperature=87 1465839830100400200
    + + +
    > SHOW MEASUREMENTS
    +name: measurements
    +------------------
    +name
    +"weather"
    +weather
    +

    To query data in "weather" you need to double quote the measurement name and +escape the measurement’s double quotes:

    + + +
    > SELECT * FROM "\"weather\""
    +
    +name: "weather"
    +---------------
    +time				            location	 temperature
    +2016-06-13T17:43:50.1004002Z	us-midwest	 87
    +
  • +
  • +

    Do not double quote field values that are floats, integers, or Booleans. +InfluxDB parses quoted field values as strings–for example:

    + + +
    > INSERT weather,location=us-midwest temperature="82"
    +> SELECT * FROM weather WHERE temperature >= 70
    +>
    +
  • +
  • +

    Do double quote field values that are strings–for example:

    + + +
    > INSERT weather,location=us-midwest temperature="too warm"
    +> SELECT * FROM weather
    +name: weather
    +-------------
    +time				            location	 temperature
    +2016-06-13T19:10:09.995766248Z	us-midwest	 too warm
    +
  • +
+

Special characters and keywords

+

Special characters

+

For tag keys, tag values, and field keys always use a backslash character \ +to escape:

+
    +
  • +

    commas (,)

    + + +
    weather,location=us\,midwest temperature=82 1465839830100400200
    +
  • +
  • +

    equal signs (=)

    + + +
    weather,location=us-midwest temp\=rature=82 1465839830100400200
    +
  • +
  • +

    spaces

    + + +
    weather,location\ place=us-midwest temperature=82 1465839830100400200
    +
  • +
+

For measurements always use a backslash character \ to escape:

+
    +
  • +

    commas (,)

    + + +
    wea\,ther,location=us-midwest temperature=82 1465839830100400200
    +
  • +
  • +

    spaces

    + + +
    wea\ ther,location=us-midwest temperature=82 1465839830100400200
    +
  • +
+

For string field values use a backslash character \ to escape:

+
    +
  • +

    double quotes (")

    + + +
    weather,location=us-midwest temperature="too\"hot\"" 1465839830100400200
    +
  • +
+

Line protocol does not require you to escape the backslash character \ but +you can if you want to–for example:

+ + +
weather,location=us-midwest temperature_str="too hot/cold" 1465839830100400201
+weather,location=us-midwest temperature_str="too hot\cold" 1465839830100400202
+weather,location=us-midwest temperature_str="too hot\\cold" 1465839830100400203
+weather,location=us-midwest temperature_str="too hot\\\cold" 1465839830100400204
+weather,location=us-midwest temperature_str="too hot\\\\cold" 1465839830100400205
+weather,location=us-midwest temperature_str="too hot\\\\\cold" 1465839830100400206
+

Is interpreted as:

+ + +
time                location   temperature_str
+----                --------   ---------------
+1465839830100400201 us-midwest too hot/cold
+1465839830100400202 us-midwest too hot\cold
+1465839830100400203 us-midwest too hot\cold
+1465839830100400204 us-midwest too hot\\cold
+1465839830100400205 us-midwest too hot\\cold
+1465839830100400206 us-midwest too hot\\\cold
+ +
+

Notice that a single and double backslash produce the same record.

+ +
+ +

All other special characters also do not require escaping. +For example, line protocol handles emojis with no problem:

+ + +
> INSERT we⛅️ther,location=us-midwest temper🔥ture=82 1465839830100400200
+> SELECT * FROM "we⛅️ther"
+name: we⛅️ther
+------------------
+time			              location	   temper🔥ture
+1465839830100400200	 us-midwest	 82
+

Keywords

+

Line protocol accepts +InfluxQL keywords +as identifier names. +In general, we recommend avoiding using InfluxQL keywords in your schema as +it can cause +confusion when querying the data.

+

The keyword time is a special case. +time can be a +continuous query name, +database name, +measurement name, +retention policy name, +subscription name, and +user name. +In those cases, time does not require double quotes in queries. +time cannot be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error. +See Frequently Asked Questions for more information.

+

Writing data to InfluxDB

+

Getting data in the database

+

Now that you know all about the InfluxDB line protocol, how do you actually get the +line protocol to InfluxDB? +Here, we’ll give two quick examples and then point you to the +Tools sections for further +information.

+

InfluxDB API

+

Write data to InfluxDB using the InfluxDB API. +Send a POST request to the /write endpoint and provide your line protocol in +the request body:

+ + +
curl -i -XPOST "http://localhost:8086/write?db=science_is_cool" --data-binary 'weather,location=us-midwest temperature=82 1465839830100400200'
+

For in-depth descriptions of query string parameters, status codes, responses, +and more examples, see the API Reference.

+

CLI

+

Write data to InfluxDB using the InfluxDB command line interface (CLI). +Launch the CLI, use the relevant +database, and put INSERT in +front of your line protocol:

+ + +
INSERT weather,location=us-midwest temperature=82 1465839830100400200
+

You can also use the CLI to +import Line +Protocol from a file.

+

There are several ways to write data to InfluxDB. +See the Tools section for more +on the InfluxDB API, the +CLI, and the available Service Plugins ( +UDP, +Graphite, +CollectD, and +OpenTSDB).

+

Duplicate points

+

A point is uniquely identified by the measurement name, tag set, and timestamp. +If you submit line protocol with the same measurement, tag set, and timestamp, +but with a different field set, the field set becomes the union of the old +field set and the new field set, where any conflicts favor the new field set.

+

For a complete example of this behavior and how to avoid it, see +How does InfluxDB handle duplicate point?

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/fonts/alert-icons.eot b/pr-preview/pr-6948/fonts/alert-icons.eot new file mode 100644 index 000000000..13e657b52 Binary files /dev/null and b/pr-preview/pr-6948/fonts/alert-icons.eot differ diff --git a/pr-preview/pr-6948/fonts/alert-icons.svg b/pr-preview/pr-6948/fonts/alert-icons.svg new file mode 100644 index 000000000..e205465e5 --- /dev/null +++ b/pr-preview/pr-6948/fonts/alert-icons.svg @@ -0,0 +1,15 @@ + + + +Generated by IcoMoon + + + + + + + + + + + \ No newline at end of file diff --git a/pr-preview/pr-6948/fonts/alert-icons.ttf b/pr-preview/pr-6948/fonts/alert-icons.ttf new file mode 100644 index 000000000..ec4b22201 Binary files /dev/null and b/pr-preview/pr-6948/fonts/alert-icons.ttf differ diff --git a/pr-preview/pr-6948/fonts/alert-icons.woff b/pr-preview/pr-6948/fonts/alert-icons.woff new file mode 100644 index 000000000..293b00a1d Binary files /dev/null and b/pr-preview/pr-6948/fonts/alert-icons.woff differ diff --git a/pr-preview/pr-6948/fonts/icomoon-v2.eot b/pr-preview/pr-6948/fonts/icomoon-v2.eot new file mode 100644 index 000000000..6be8b6309 Binary files /dev/null and b/pr-preview/pr-6948/fonts/icomoon-v2.eot differ diff --git a/pr-preview/pr-6948/fonts/icomoon-v2.svg b/pr-preview/pr-6948/fonts/icomoon-v2.svg new file mode 100644 index 000000000..2d78cafed --- /dev/null +++ b/pr-preview/pr-6948/fonts/icomoon-v2.svg @@ -0,0 +1,86 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pr-preview/pr-6948/fonts/icomoon-v2.ttf b/pr-preview/pr-6948/fonts/icomoon-v2.ttf new file mode 100644 index 000000000..6965427e0 Binary files /dev/null and b/pr-preview/pr-6948/fonts/icomoon-v2.ttf differ diff --git a/pr-preview/pr-6948/fonts/icomoon-v2.woff b/pr-preview/pr-6948/fonts/icomoon-v2.woff new file mode 100644 index 000000000..02db64219 Binary files /dev/null and b/pr-preview/pr-6948/fonts/icomoon-v2.woff differ diff --git a/pr-preview/pr-6948/fonts/icomoon-v3.eot b/pr-preview/pr-6948/fonts/icomoon-v3.eot new file mode 100644 index 000000000..267831470 Binary files /dev/null and b/pr-preview/pr-6948/fonts/icomoon-v3.eot differ diff --git a/pr-preview/pr-6948/fonts/icomoon-v3.svg b/pr-preview/pr-6948/fonts/icomoon-v3.svg new file mode 100644 index 000000000..e9c2e887e --- /dev/null +++ b/pr-preview/pr-6948/fonts/icomoon-v3.svg @@ -0,0 +1,174 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pr-preview/pr-6948/fonts/icomoon-v3.ttf b/pr-preview/pr-6948/fonts/icomoon-v3.ttf new file mode 100644 index 000000000..7bc737a47 Binary files /dev/null and b/pr-preview/pr-6948/fonts/icomoon-v3.ttf differ diff --git a/pr-preview/pr-6948/fonts/icomoon-v3.woff b/pr-preview/pr-6948/fonts/icomoon-v3.woff new file mode 100644 index 000000000..8c37c3917 Binary files /dev/null and b/pr-preview/pr-6948/fonts/icomoon-v3.woff differ diff --git a/pr-preview/pr-6948/fonts/icomoon-v3.woff2 b/pr-preview/pr-6948/fonts/icomoon-v3.woff2 new file mode 100644 index 000000000..e7e1891bd Binary files /dev/null and b/pr-preview/pr-6948/fonts/icomoon-v3.woff2 differ diff --git a/pr-preview/pr-6948/fonts/icomoon-v4.eot b/pr-preview/pr-6948/fonts/icomoon-v4.eot new file mode 100644 index 000000000..c9a1588b7 Binary files /dev/null and b/pr-preview/pr-6948/fonts/icomoon-v4.eot differ diff --git a/pr-preview/pr-6948/fonts/icomoon-v4.ttf b/pr-preview/pr-6948/fonts/icomoon-v4.ttf new file mode 100644 index 000000000..64416d44f Binary files /dev/null and b/pr-preview/pr-6948/fonts/icomoon-v4.ttf differ diff --git a/pr-preview/pr-6948/fonts/icomoon-v4.woff b/pr-preview/pr-6948/fonts/icomoon-v4.woff new file mode 100644 index 000000000..65f3034fc Binary files /dev/null and b/pr-preview/pr-6948/fonts/icomoon-v4.woff differ diff --git a/pr-preview/pr-6948/fonts/icomoon-v4.woff2 b/pr-preview/pr-6948/fonts/icomoon-v4.woff2 new file mode 100644 index 000000000..a3ee077ab Binary files /dev/null and b/pr-preview/pr-6948/fonts/icomoon-v4.woff2 differ diff --git a/pr-preview/pr-6948/fonts/iconmoon-v4.svg b/pr-preview/pr-6948/fonts/iconmoon-v4.svg new file mode 100644 index 000000000..1b8ba5422 --- /dev/null +++ b/pr-preview/pr-6948/fonts/iconmoon-v4.svg @@ -0,0 +1,98 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pr-preview/pr-6948/fonts/proxima-nova-bold.otf b/pr-preview/pr-6948/fonts/proxima-nova-bold.otf new file mode 100644 index 000000000..b477a4656 Binary files /dev/null and b/pr-preview/pr-6948/fonts/proxima-nova-bold.otf differ diff --git a/pr-preview/pr-6948/fonts/proxima-nova-medium.otf b/pr-preview/pr-6948/fonts/proxima-nova-medium.otf new file mode 100644 index 000000000..ca1363c86 Binary files /dev/null and b/pr-preview/pr-6948/fonts/proxima-nova-medium.otf differ diff --git a/pr-preview/pr-6948/fonts/proxima-nova-semibold.otf b/pr-preview/pr-6948/fonts/proxima-nova-semibold.otf new file mode 100644 index 000000000..6cc9bf2ae Binary files /dev/null and b/pr-preview/pr-6948/fonts/proxima-nova-semibold.otf differ diff --git a/pr-preview/pr-6948/fonts/proxima-nova.otf b/pr-preview/pr-6948/fonts/proxima-nova.otf new file mode 100644 index 000000000..43132265f Binary files /dev/null and b/pr-preview/pr-6948/fonts/proxima-nova.otf differ diff --git a/pr-preview/pr-6948/img/bg-texture-new.png b/pr-preview/pr-6948/img/bg-texture-new.png new file mode 100644 index 000000000..4261860e6 Binary files /dev/null and b/pr-preview/pr-6948/img/bg-texture-new.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-admin-usermanagement-oss.png b/pr-preview/pr-6948/img/chronograf/1-6-admin-usermanagement-oss.png new file mode 100644 index 000000000..59d5df866 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-admin-usermanagement-oss.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-alerts-conditions.png b/pr-preview/pr-6948/img/chronograf/1-6-alerts-conditions.png new file mode 100644 index 000000000..b778ff7ee Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-alerts-conditions.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-annotations-example.png b/pr-preview/pr-6948/img/chronograf/1-6-annotations-example.png new file mode 100644 index 000000000..950f40dce Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-annotations-example.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-clone-cell-cell-copy.png b/pr-preview/pr-6948/img/chronograf/1-6-clone-cell-cell-copy.png new file mode 100644 index 000000000..2de1d4250 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-clone-cell-cell-copy.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-clone-cell-click-button.png b/pr-preview/pr-6948/img/chronograf/1-6-clone-cell-click-button.png new file mode 100644 index 000000000..8549b67e7 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-clone-cell-click-button.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-clone-dashboard-clone.png b/pr-preview/pr-6948/img/chronograf/1-6-clone-dashboard-clone.png new file mode 100644 index 000000000..d065c3e07 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-clone-dashboard-clone.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-clone-dashboard.png b/pr-preview/pr-6948/img/chronograf/1-6-clone-dashboard.png new file mode 100644 index 000000000..b27f752ed Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-clone-dashboard.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-cluster-de.png b/pr-preview/pr-6948/img/chronograf/1-6-cluster-de.png new file mode 100644 index 000000000..53c68ffaf Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-cluster-de.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-cluster-diagram.png b/pr-preview/pr-6948/img/chronograf/1-6-cluster-diagram.png new file mode 100644 index 000000000..ba6bb5c77 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-cluster-diagram.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-cluster-hostlist.png b/pr-preview/pr-6948/img/chronograf/1-6-cluster-hostlist.png new file mode 100644 index 000000000..9c211c008 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-cluster-hostlist.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-cluster-predash.gif b/pr-preview/pr-6948/img/chronograf/1-6-cluster-predash.gif new file mode 100644 index 000000000..257ac3e36 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-cluster-predash.gif differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-cluster-welcome.png b/pr-preview/pr-6948/img/chronograf/1-6-cluster-welcome.png new file mode 100644 index 000000000..bcc0cb1d4 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-cluster-welcome.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-connection-kapacitor.png b/pr-preview/pr-6948/img/chronograf/1-6-connection-kapacitor.png new file mode 100644 index 000000000..385b69b8d Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-connection-kapacitor.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-connection-landing-page.png b/pr-preview/pr-6948/img/chronograf/1-6-connection-landing-page.png new file mode 100644 index 000000000..b1cfe76fd Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-connection-landing-page.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-custom-meta-query-filtering.gif b/pr-preview/pr-6948/img/chronograf/1-6-custom-meta-query-filtering.gif new file mode 100644 index 000000000..758fffea7 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-custom-meta-query-filtering.gif differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-dashboard-export.png b/pr-preview/pr-6948/img/chronograf/1-6-dashboard-export.png new file mode 100644 index 000000000..5f0468e6a Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-dashboard-export.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-dashboard-import-reconcile.png b/pr-preview/pr-6948/img/chronograf/1-6-dashboard-import-reconcile.png new file mode 100644 index 000000000..d24193951 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-dashboard-import-reconcile.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-dashboard-import.gif b/pr-preview/pr-6948/img/chronograf/1-6-dashboard-import.gif new file mode 100644 index 000000000..99eae6427 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-dashboard-import.gif differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-faq-cluster-connection.png b/pr-preview/pr-6948/img/chronograf/1-6-faq-cluster-connection.png new file mode 100644 index 000000000..30ebc80ac Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-faq-cluster-connection.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-g-dashboard-builder.png b/pr-preview/pr-6948/img/chronograf/1-6-g-dashboard-builder.png new file mode 100644 index 000000000..302de6f51 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-g-dashboard-builder.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-g-dashboard-possibilities.png b/pr-preview/pr-6948/img/chronograf/1-6-g-dashboard-possibilities.png new file mode 100644 index 000000000..9308bad2c Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-g-dashboard-possibilities.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-g-dashboard-visualization.png b/pr-preview/pr-6948/img/chronograf/1-6-g-dashboard-visualization.png new file mode 100644 index 000000000..c0b2a5507 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-g-dashboard-visualization.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-intro-gs-diagram.png b/pr-preview/pr-6948/img/chronograf/1-6-intro-gs-diagram.png new file mode 100644 index 000000000..76feac07c Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-intro-gs-diagram.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-logs-log-viewer-config-options.png b/pr-preview/pr-6948/img/chronograf/1-6-logs-log-viewer-config-options.png new file mode 100644 index 000000000..6fca1c8c6 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-logs-log-viewer-config-options.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-logs-nav-log-viewer.png b/pr-preview/pr-6948/img/chronograf/1-6-logs-nav-log-viewer.png new file mode 100644 index 000000000..abb0ea031 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-logs-nav-log-viewer.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-logs-severity-fmt-dot-text.png b/pr-preview/pr-6948/img/chronograf/1-6-logs-severity-fmt-dot-text.png new file mode 100644 index 000000000..1fb23e474 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-logs-severity-fmt-dot-text.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-logs-severity-fmt-dot.png b/pr-preview/pr-6948/img/chronograf/1-6-logs-severity-fmt-dot.png new file mode 100644 index 000000000..eb17438e7 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-logs-severity-fmt-dot.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-logs-severity-fmt-text.png b/pr-preview/pr-6948/img/chronograf/1-6-logs-severity-fmt-text.png new file mode 100644 index 000000000..52286417e Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-logs-severity-fmt-text.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-presentation-mode.png b/pr-preview/pr-6948/img/chronograf/1-6-presentation-mode.png new file mode 100644 index 000000000..b53e66bcf Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-presentation-mode.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-template-vars-custom-meta-query.png b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-custom-meta-query.png new file mode 100644 index 000000000..1ad3892bd Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-custom-meta-query.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-template-vars-date-picker.png b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-date-picker.png new file mode 100644 index 000000000..78786af48 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-date-picker.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-template-vars-fieldkey.png b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-fieldkey.png new file mode 100644 index 000000000..de8566672 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-fieldkey.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-template-vars-interval-dropdown.png b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-interval-dropdown.png new file mode 100644 index 000000000..2167f1435 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-interval-dropdown.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-template-vars-map-dropdown.png b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-map-dropdown.png new file mode 100644 index 000000000..cf8d8dabc Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-map-dropdown.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-template-vars-measurement-var.png b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-measurement-var.png new file mode 100644 index 000000000..4489c4369 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-measurement-var.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-template-vars-time-dropdown.png b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-time-dropdown.png new file mode 100644 index 000000000..fe2c3976a Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-time-dropdown.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-template-vars-use.gif b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-use.gif new file mode 100644 index 000000000..b1232223f Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-template-vars-use.gif differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-bar-graph-controls.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-bar-graph-controls.png new file mode 100644 index 000000000..171c24c8b Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-bar-graph-controls.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-bar-graph-example.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-bar-graph-example.png new file mode 100644 index 000000000..8c2c5b959 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-bar-graph-example.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-bar-graph-selector.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-bar-graph-selector.png new file mode 100644 index 000000000..b80383230 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-bar-graph-selector.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-gauge-controls.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-gauge-controls.png new file mode 100644 index 000000000..e4e776a08 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-gauge-controls.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-gauge-example.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-gauge-example.png new file mode 100644 index 000000000..8bfabe64f Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-gauge-example.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-gauge-selector.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-gauge-selector.png new file mode 100644 index 000000000..aa72deaca Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-gauge-selector.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-controls.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-controls.png new file mode 100644 index 000000000..8ffa81ecd Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-controls.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-example.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-example.png new file mode 100644 index 000000000..3aef2ba0c Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-example.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-selector.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-selector.png new file mode 100644 index 000000000..3c08b8e5b Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-selector.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-single-stat-controls.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-single-stat-controls.png new file mode 100644 index 000000000..226ecfefe Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-single-stat-controls.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-single-stat-example.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-single-stat-example.png new file mode 100644 index 000000000..d10ffe67f Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-single-stat-example.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-single-stat-selector.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-single-stat-selector.png new file mode 100644 index 000000000..dd6484c88 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-line-graph-single-stat-selector.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-single-stat-selector.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-single-stat-selector.png new file mode 100644 index 000000000..3e43eeb82 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-single-stat-selector.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-stacked-graph-controls.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-stacked-graph-controls.png new file mode 100644 index 000000000..467405957 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-stacked-graph-controls.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-stacked-graph-example.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-stacked-graph-example.png new file mode 100644 index 000000000..aeb2598e2 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-stacked-graph-example.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-stacked-graph-selector.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-stacked-graph-selector.png new file mode 100644 index 000000000..bafe4eeb7 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-stacked-graph-selector.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-step-plot-graph-controls.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-step-plot-graph-controls.png new file mode 100644 index 000000000..9f5d4eace Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-step-plot-graph-controls.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-step-plot-graph-example.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-step-plot-graph-example.png new file mode 100644 index 000000000..1172a1fb4 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-step-plot-graph-example.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-step-plot-graph-selector.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-step-plot-graph-selector.png new file mode 100644 index 000000000..51bfdaa81 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-step-plot-graph-selector.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-table-controls.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-table-controls.png new file mode 100644 index 000000000..9f8ad217b Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-table-controls.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-table-example.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-table-example.png new file mode 100644 index 000000000..687e1d8a2 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-table-example.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-table-selector.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-table-selector.png new file mode 100644 index 000000000..90eeaaeb2 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-table-selector.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-6-viz-types-selector.png b/pr-preview/pr-6948/img/chronograf/1-6-viz-types-selector.png new file mode 100644 index 000000000..72f463d96 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-6-viz-types-selector.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-data-explorer-icon.png b/pr-preview/pr-6948/img/chronograf/1-7-data-explorer-icon.png new file mode 100644 index 000000000..b6583e04c Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-data-explorer-icon.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-kapacitor-connection-config.png b/pr-preview/pr-6948/img/chronograf/1-7-kapacitor-connection-config.png new file mode 100644 index 000000000..719fc9b9c Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-kapacitor-connection-config.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-log-viewer-dashboard.gif b/pr-preview/pr-6948/img/chronograf/1-7-log-viewer-dashboard.gif new file mode 100644 index 000000000..3eb0dad9d Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-log-viewer-dashboard.gif differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-log-viewer-overview.png b/pr-preview/pr-6948/img/chronograf/1-7-log-viewer-overview.png new file mode 100644 index 000000000..3a38ee0eb Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-log-viewer-overview.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-log-viewer-search-filter.gif b/pr-preview/pr-6948/img/chronograf/1-7-log-viewer-search-filter.gif new file mode 100644 index 000000000..0f9ca05f2 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-log-viewer-search-filter.gif differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-log-viewer-specific-time.gif b/pr-preview/pr-6948/img/chronograf/1-7-log-viewer-specific-time.gif new file mode 100644 index 000000000..2250b68b6 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-log-viewer-specific-time.gif differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-protoboard-kubernetes.png b/pr-preview/pr-6948/img/chronograf/1-7-protoboard-kubernetes.png new file mode 100644 index 000000000..6bd6fe5c9 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-protoboard-kubernetes.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-protoboard-mysql.png b/pr-preview/pr-6948/img/chronograf/1-7-protoboard-mysql.png new file mode 100644 index 000000000..43d465cb2 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-protoboard-mysql.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-protoboard-select.png b/pr-preview/pr-6948/img/chronograf/1-7-protoboard-select.png new file mode 100644 index 000000000..d5b16ad28 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-protoboard-select.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-protoboard-system.png b/pr-preview/pr-6948/img/chronograf/1-7-protoboard-system.png new file mode 100644 index 000000000..111501e82 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-protoboard-system.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-protoboard-vsphere.png b/pr-preview/pr-6948/img/chronograf/1-7-protoboard-vsphere.png new file mode 100644 index 000000000..75ed7eeab Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-protoboard-vsphere.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-viz-note-controls.png b/pr-preview/pr-6948/img/chronograf/1-7-viz-note-controls.png new file mode 100644 index 000000000..1d9ab8145 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-viz-note-controls.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-viz-note-example.png b/pr-preview/pr-6948/img/chronograf/1-7-viz-note-example.png new file mode 100644 index 000000000..f6645b0dd Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-viz-note-example.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-7-viz-note-selector.png b/pr-preview/pr-6948/img/chronograf/1-7-viz-note-selector.png new file mode 100644 index 000000000..6e16317c9 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-7-viz-note-selector.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-8-ha-architecture.svg b/pr-preview/pr-6948/img/chronograf/1-8-ha-architecture.svg new file mode 100644 index 000000000..01d334d09 --- /dev/null +++ b/pr-preview/pr-6948/img/chronograf/1-8-ha-architecture.svg @@ -0,0 +1,153 @@ + + + + + + + + User + + + + + User + + + + + User + + + + + User + + + +Load Balancer + + + Chronograf + + Chronograf + + Chronograf + + + + + + + + +etcd Cluster + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/img/chronograf/1-8-influxdb-v1-connection-config.png b/pr-preview/pr-6948/img/chronograf/1-8-influxdb-v1-connection-config.png new file mode 100644 index 000000000..e55ee57e1 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-8-influxdb-v1-connection-config.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-8-influxdb-v2-connection-config.png b/pr-preview/pr-6948/img/chronograf/1-8-influxdb-v2-connection-config.png new file mode 100644 index 000000000..322452901 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-8-influxdb-v2-connection-config.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-9-dashboard-cell-add-data.png b/pr-preview/pr-6948/img/chronograf/1-9-dashboard-cell-add-data.png new file mode 100644 index 000000000..58b4b53b8 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-9-dashboard-cell-add-data.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-9-template-var-title.png b/pr-preview/pr-6948/img/chronograf/1-9-template-var-title.png new file mode 100644 index 000000000..2bf4f7e04 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-9-template-var-title.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-9-write-data.png b/pr-preview/pr-6948/img/chronograf/1-9-write-data.png new file mode 100644 index 000000000..7d328a3f8 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-9-write-data.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-9-write-db-rp.png b/pr-preview/pr-6948/img/chronograf/1-9-write-db-rp.png new file mode 100644 index 000000000..e064a2522 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-9-write-db-rp.png differ diff --git a/pr-preview/pr-6948/img/chronograf/1-9-write-precision.png b/pr-preview/pr-6948/img/chronograf/1-9-write-precision.png new file mode 100644 index 000000000..39ead9de8 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/1-9-write-precision.png differ diff --git a/pr-preview/pr-6948/img/chronograf/v1-influxdb3/cloud-dedicated-no-mgmt.png b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/cloud-dedicated-no-mgmt.png new file mode 100644 index 000000000..cc5b86294 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/cloud-dedicated-no-mgmt.png differ diff --git a/pr-preview/pr-6948/img/chronograf/v1-influxdb3/cloud-dedicated-with-mgmt.png b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/cloud-dedicated-with-mgmt.png new file mode 100644 index 000000000..86c72735a Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/cloud-dedicated-with-mgmt.png differ diff --git a/pr-preview/pr-6948/img/chronograf/v1-influxdb3/cloud-serverless-connection.png b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/cloud-serverless-connection.png new file mode 100644 index 000000000..124353952 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/cloud-serverless-connection.png differ diff --git a/pr-preview/pr-6948/img/chronograf/v1-influxdb3/clustered-connection.png b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/clustered-connection.png new file mode 100644 index 000000000..cb19ce9df Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/clustered-connection.png differ diff --git a/pr-preview/pr-6948/img/chronograf/v1-influxdb3/core-connection.png b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/core-connection.png new file mode 100644 index 000000000..285006e20 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/core-connection.png differ diff --git a/pr-preview/pr-6948/img/chronograf/v1-influxdb3/enterprise-connection.png b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/enterprise-connection.png new file mode 100644 index 000000000..8c033a5b5 Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/enterprise-connection.png differ diff --git a/pr-preview/pr-6948/img/chronograf/v1-influxdb3/server-type-dropdown.png b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/server-type-dropdown.png new file mode 100644 index 000000000..8efeb837a Binary files /dev/null and b/pr-preview/pr-6948/img/chronograf/v1-influxdb3/server-type-dropdown.png differ diff --git a/pr-preview/pr-6948/img/cloudformation1.png b/pr-preview/pr-6948/img/cloudformation1.png new file mode 100644 index 000000000..96c002c2e Binary files /dev/null and b/pr-preview/pr-6948/img/cloudformation1.png differ diff --git a/pr-preview/pr-6948/img/cloudformation2.png b/pr-preview/pr-6948/img/cloudformation2.png new file mode 100644 index 000000000..fd0725987 Binary files /dev/null and b/pr-preview/pr-6948/img/cloudformation2.png differ diff --git a/pr-preview/pr-6948/img/enterprise/1-6-flapping-dashboard.gif b/pr-preview/pr-6948/img/enterprise/1-6-flapping-dashboard.gif new file mode 100644 index 000000000..745f94f2b Binary files /dev/null and b/pr-preview/pr-6948/img/enterprise/1-6-flapping-dashboard.gif differ diff --git a/pr-preview/pr-6948/img/enterprise/1-6-gcp-intro-1.png b/pr-preview/pr-6948/img/enterprise/1-6-gcp-intro-1.png new file mode 100644 index 000000000..494abbeaf Binary files /dev/null and b/pr-preview/pr-6948/img/enterprise/1-6-gcp-intro-1.png differ diff --git a/pr-preview/pr-6948/img/enterprise/1-6-gcp-intro-2.png b/pr-preview/pr-6948/img/enterprise/1-6-gcp-intro-2.png new file mode 100644 index 000000000..377c6cfa2 Binary files /dev/null and b/pr-preview/pr-6948/img/enterprise/1-6-gcp-intro-2.png differ diff --git a/pr-preview/pr-6948/img/enterprise/1-6-gcp-intro-3.png b/pr-preview/pr-6948/img/enterprise/1-6-gcp-intro-3.png new file mode 100644 index 000000000..f40c70fce Binary files /dev/null and b/pr-preview/pr-6948/img/enterprise/1-6-gcp-intro-3.png differ diff --git a/pr-preview/pr-6948/img/enterprise/1-6-gcp-intro-4.png b/pr-preview/pr-6948/img/enterprise/1-6-gcp-intro-4.png new file mode 100644 index 000000000..22c291ea7 Binary files /dev/null and b/pr-preview/pr-6948/img/enterprise/1-6-gcp-intro-4.png differ diff --git a/pr-preview/pr-6948/img/enterprise/1-8-network-diagram.png b/pr-preview/pr-6948/img/enterprise/1-8-network-diagram.png new file mode 100644 index 000000000..86ba784d8 Binary files /dev/null and b/pr-preview/pr-6948/img/enterprise/1-8-network-diagram.png differ diff --git a/pr-preview/pr-6948/img/favicon.png b/pr-preview/pr-6948/img/favicon.png new file mode 100644 index 000000000..07b99465e Binary files /dev/null and b/pr-preview/pr-6948/img/favicon.png differ diff --git a/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-aggregate-rate-output.png b/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-aggregate-rate-output.png new file mode 100644 index 000000000..4996b7543 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-aggregate-rate-output.png differ diff --git a/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-derivative-output.png b/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-derivative-output.png new file mode 100644 index 000000000..e3d50d0aa Binary files /dev/null and b/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-derivative-output.png differ diff --git a/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-difference-output.png b/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-difference-output.png new file mode 100644 index 000000000..8fd6b146e Binary files /dev/null and b/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-difference-output.png differ diff --git a/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-increase-input.png b/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-increase-input.png new file mode 100644 index 000000000..a6626685b Binary files /dev/null and b/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-increase-input.png differ diff --git a/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-increase-output.png b/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-increase-output.png new file mode 100644 index 000000000..3b3b5b5b1 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-increase-output.png differ diff --git a/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-normalized-input.png b/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-normalized-input.png new file mode 100644 index 000000000..2c1f278dd Binary files /dev/null and b/pr-preview/pr-6948/img/flux/0-x-prometheus-counter-normalized-input.png differ diff --git a/pr-preview/pr-6948/img/flux/0-x-prometheus-gauge-aggregate-rate-output.png b/pr-preview/pr-6948/img/flux/0-x-prometheus-gauge-aggregate-rate-output.png new file mode 100644 index 000000000..b4f2028d6 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/0-x-prometheus-gauge-aggregate-rate-output.png differ diff --git a/pr-preview/pr-6948/img/flux/0-x-prometheus-gauge-derivative-output.png b/pr-preview/pr-6948/img/flux/0-x-prometheus-gauge-derivative-output.png new file mode 100644 index 000000000..56147d947 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/0-x-prometheus-gauge-derivative-output.png differ diff --git a/pr-preview/pr-6948/img/flux/0-x-prometheus-gauge-input.png b/pr-preview/pr-6948/img/flux/0-x-prometheus-gauge-input.png new file mode 100644 index 000000000..81681267f Binary files /dev/null and b/pr-preview/pr-6948/img/flux/0-x-prometheus-gauge-input.png differ diff --git a/pr-preview/pr-6948/img/flux/0-x-prometheus-histogram-multiple-quantiles.png b/pr-preview/pr-6948/img/flux/0-x-prometheus-histogram-multiple-quantiles.png new file mode 100644 index 000000000..116aa4423 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/0-x-prometheus-histogram-multiple-quantiles.png differ diff --git a/pr-preview/pr-6948/img/flux/0-x-prometheus-histogram-quantile.png b/pr-preview/pr-6948/img/flux/0-x-prometheus-histogram-quantile.png new file mode 100644 index 000000000..6fe45e824 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/0-x-prometheus-histogram-quantile.png differ diff --git a/pr-preview/pr-6948/img/flux/0-x-prometheus-summary-quantiles.png b/pr-preview/pr-6948/img/flux/0-x-prometheus-summary-quantiles.png new file mode 100644 index 000000000..833c73bc4 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/0-x-prometheus-summary-quantiles.png differ diff --git a/pr-preview/pr-6948/img/flux/0-x-water-process-dark.svg b/pr-preview/pr-6948/img/flux/0-x-water-process-dark.svg new file mode 100644 index 000000000..86945c1e0 --- /dev/null +++ b/pr-preview/pr-6948/img/flux/0-x-water-process-dark.svg @@ -0,0 +1,2898 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/img/flux/0-x-water-process-light.svg b/pr-preview/pr-6948/img/flux/0-x-water-process-light.svg new file mode 100644 index 000000000..ecd10405d --- /dev/null +++ b/pr-preview/pr-6948/img/flux/0-x-water-process-light.svg @@ -0,0 +1,2548 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/img/flux/grouping-by-cpu-time.png b/pr-preview/pr-6948/img/flux/grouping-by-cpu-time.png new file mode 100644 index 000000000..6c4390a9f Binary files /dev/null and b/pr-preview/pr-6948/img/flux/grouping-by-cpu-time.png differ diff --git a/pr-preview/pr-6948/img/flux/grouping-by-time.png b/pr-preview/pr-6948/img/flux/grouping-by-time.png new file mode 100644 index 000000000..dd0f5812e Binary files /dev/null and b/pr-preview/pr-6948/img/flux/grouping-by-time.png differ diff --git a/pr-preview/pr-6948/img/flux/grouping-data-set.png b/pr-preview/pr-6948/img/flux/grouping-data-set.png new file mode 100644 index 000000000..9af7c6914 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/grouping-data-set.png differ diff --git a/pr-preview/pr-6948/img/flux/simple-unwindowed-data.png b/pr-preview/pr-6948/img/flux/simple-unwindowed-data.png new file mode 100644 index 000000000..6b84ef467 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/simple-unwindowed-data.png differ diff --git a/pr-preview/pr-6948/img/flux/simple-windowed-aggregate-data.png b/pr-preview/pr-6948/img/flux/simple-windowed-aggregate-data.png new file mode 100644 index 000000000..4a16bfd04 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/simple-windowed-aggregate-data.png differ diff --git a/pr-preview/pr-6948/img/flux/simple-windowed-data.png b/pr-preview/pr-6948/img/flux/simple-windowed-data.png new file mode 100644 index 000000000..0c3df7288 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/simple-windowed-data.png differ diff --git a/pr-preview/pr-6948/img/flux/windowed-aggregates-ungrouped.png b/pr-preview/pr-6948/img/flux/windowed-aggregates-ungrouped.png new file mode 100644 index 000000000..510ec5006 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/windowed-aggregates-ungrouped.png differ diff --git a/pr-preview/pr-6948/img/flux/windowed-aggregates.png b/pr-preview/pr-6948/img/flux/windowed-aggregates.png new file mode 100644 index 000000000..9c51ee719 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/windowed-aggregates.png differ diff --git a/pr-preview/pr-6948/img/flux/windowed-data.png b/pr-preview/pr-6948/img/flux/windowed-data.png new file mode 100644 index 000000000..8589db679 Binary files /dev/null and b/pr-preview/pr-6948/img/flux/windowed-data.png differ diff --git a/pr-preview/pr-6948/img/grafana/enterprise-influxdb-v1-grafana-flux.png b/pr-preview/pr-6948/img/grafana/enterprise-influxdb-v1-grafana-flux.png new file mode 100644 index 000000000..a0a4d1a7d Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/enterprise-influxdb-v1-grafana-flux.png differ diff --git a/pr-preview/pr-6948/img/grafana/enterprise-influxdb-v1-grafana-influxql.png b/pr-preview/pr-6948/img/grafana/enterprise-influxdb-v1-grafana-influxql.png new file mode 100644 index 000000000..53c86108b Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/enterprise-influxdb-v1-grafana-influxql.png differ diff --git a/pr-preview/pr-6948/img/grafana/grafana-sql-insecure-connection.png b/pr-preview/pr-6948/img/grafana/grafana-sql-insecure-connection.png new file mode 100644 index 000000000..ec39fc576 Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/grafana-sql-insecure-connection.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb-cloud-grafana-flux.png b/pr-preview/pr-6948/img/grafana/influxdb-cloud-grafana-flux.png new file mode 100644 index 000000000..f3ed30ef9 Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb-cloud-grafana-flux.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb-cloud-grafana-influxql.png b/pr-preview/pr-6948/img/grafana/influxdb-cloud-grafana-influxql.png new file mode 100644 index 000000000..228c8d8ae Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb-cloud-grafana-influxql.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb-v1-grafana-flux.png b/pr-preview/pr-6948/img/grafana/influxdb-v1-grafana-flux.png new file mode 100644 index 000000000..71da27b5d Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb-v1-grafana-flux.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb-v1-grafana-influxql.png b/pr-preview/pr-6948/img/grafana/influxdb-v1-grafana-influxql.png new file mode 100644 index 000000000..97743afcd Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb-v1-grafana-influxql.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb-v2-grafana-influxql-flux.png b/pr-preview/pr-6948/img/grafana/influxdb-v2-grafana-influxql-flux.png new file mode 100644 index 000000000..00af8fc4c Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb-v2-grafana-influxql-flux.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb-v2-grafana-influxql.png b/pr-preview/pr-6948/img/grafana/influxdb-v2-grafana-influxql.png new file mode 100644 index 000000000..9c66bde2d Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb-v2-grafana-influxql.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb3-cloud-dedicated-grafana-influxql.png b/pr-preview/pr-6948/img/grafana/influxdb3-cloud-dedicated-grafana-influxql.png new file mode 100644 index 000000000..53465f23f Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb3-cloud-dedicated-grafana-influxql.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb3-cloud-dedicated-grafana-sql.png b/pr-preview/pr-6948/img/grafana/influxdb3-cloud-dedicated-grafana-sql.png new file mode 100644 index 000000000..12add0308 Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb3-cloud-dedicated-grafana-sql.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb3-cloud-serverless-grafana-influxql.png b/pr-preview/pr-6948/img/grafana/influxdb3-cloud-serverless-grafana-influxql.png new file mode 100644 index 000000000..93623ea0e Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb3-cloud-serverless-grafana-influxql.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb3-cloud-serverless-grafana-sql.png b/pr-preview/pr-6948/img/grafana/influxdb3-cloud-serverless-grafana-sql.png new file mode 100644 index 000000000..fd6d01496 Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb3-cloud-serverless-grafana-sql.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb3-clustered-grafana-influxql.png b/pr-preview/pr-6948/img/grafana/influxdb3-clustered-grafana-influxql.png new file mode 100644 index 000000000..c7ec0587c Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb3-clustered-grafana-influxql.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb3-clustered-grafana-sql.png b/pr-preview/pr-6948/img/grafana/influxdb3-clustered-grafana-sql.png new file mode 100644 index 000000000..1742f749d Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb3-clustered-grafana-sql.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb3-core-grafana-influxql.png b/pr-preview/pr-6948/img/grafana/influxdb3-core-grafana-influxql.png new file mode 100644 index 000000000..f99f70158 Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb3-core-grafana-influxql.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb3-core-grafana-sql.png b/pr-preview/pr-6948/img/grafana/influxdb3-core-grafana-sql.png new file mode 100644 index 000000000..34f4db136 Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb3-core-grafana-sql.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb3-enterprise-grafana-influxql.png b/pr-preview/pr-6948/img/grafana/influxdb3-enterprise-grafana-influxql.png new file mode 100644 index 000000000..c4bdd46ed Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb3-enterprise-grafana-influxql.png differ diff --git a/pr-preview/pr-6948/img/grafana/influxdb3-enterprise-grafana-sql.png b/pr-preview/pr-6948/img/grafana/influxdb3-enterprise-grafana-sql.png new file mode 100644 index 000000000..6c1b5b167 Binary files /dev/null and b/pr-preview/pr-6948/img/grafana/influxdb3-enterprise-grafana-sql.png differ diff --git a/pr-preview/pr-6948/img/influx-logo-cubo-dark.png b/pr-preview/pr-6948/img/influx-logo-cubo-dark.png new file mode 100644 index 000000000..d87fc95a4 Binary files /dev/null and b/pr-preview/pr-6948/img/influx-logo-cubo-dark.png differ diff --git a/pr-preview/pr-6948/img/influx-logo-cubo-white.png b/pr-preview/pr-6948/img/influx-logo-cubo-white.png new file mode 100644 index 000000000..e5e562624 Binary files /dev/null and b/pr-preview/pr-6948/img/influx-logo-cubo-white.png differ diff --git a/pr-preview/pr-6948/img/influxdb/1-3-hw-first-step-1-2.png b/pr-preview/pr-6948/img/influxdb/1-3-hw-first-step-1-2.png new file mode 100644 index 000000000..8e7ad7f3f Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/1-3-hw-first-step-1-2.png differ diff --git a/pr-preview/pr-6948/img/influxdb/1-3-hw-raw-data-1-2.png b/pr-preview/pr-6948/img/influxdb/1-3-hw-raw-data-1-2.png new file mode 100644 index 000000000..dad78a76c Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/1-3-hw-raw-data-1-2.png differ diff --git a/pr-preview/pr-6948/img/influxdb/1-3-hw-second-step-1-2.png b/pr-preview/pr-6948/img/influxdb/1-3-hw-second-step-1-2.png new file mode 100644 index 000000000..8b4745b11 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/1-3-hw-second-step-1-2.png differ diff --git a/pr-preview/pr-6948/img/influxdb/1-3-hw-third-step-1-2.png b/pr-preview/pr-6948/img/influxdb/1-3-hw-third-step-1-2.png new file mode 100644 index 000000000..23f68b913 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/1-3-hw-third-step-1-2.png differ diff --git a/pr-preview/pr-6948/img/influxdb/1-5-calc-percentage-apple-variety.png b/pr-preview/pr-6948/img/influxdb/1-5-calc-percentage-apple-variety.png new file mode 100644 index 000000000..dedb91bb3 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/1-5-calc-percentage-apple-variety.png differ diff --git a/pr-preview/pr-6948/img/influxdb/1-5-calc-percentage-hourly-apple-variety.png b/pr-preview/pr-6948/img/influxdb/1-5-calc-percentage-hourly-apple-variety.png new file mode 100644 index 000000000..4c1e9070b Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/1-5-calc-percentage-hourly-apple-variety.png differ diff --git a/pr-preview/pr-6948/img/influxdb/1-7-flux-dashboard-add-filter.png b/pr-preview/pr-6948/img/influxdb/1-7-flux-dashboard-add-filter.png new file mode 100644 index 000000000..349fb9951 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/1-7-flux-dashboard-add-filter.png differ diff --git a/pr-preview/pr-6948/img/influxdb/1-7-flux-dashboard-cell.png b/pr-preview/pr-6948/img/influxdb/1-7-flux-dashboard-cell.png new file mode 100644 index 000000000..8ad80ef93 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/1-7-flux-dashboard-cell.png differ diff --git a/pr-preview/pr-6948/img/influxdb/1-7-flux-dashboard-view-raw.png b/pr-preview/pr-6948/img/influxdb/1-7-flux-dashboard-view-raw.png new file mode 100644 index 000000000..05bd88dcc Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/1-7-flux-dashboard-view-raw.png differ diff --git a/pr-preview/pr-6948/img/influxdb/1-8-tools-vsflux-explore-schema.png b/pr-preview/pr-6948/img/influxdb/1-8-tools-vsflux-explore-schema.png new file mode 100644 index 000000000..ff64eb1e6 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/1-8-tools-vsflux-explore-schema.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-controls-dark-light-mode.png b/pr-preview/pr-6948/img/influxdb/2-0-controls-dark-light-mode.png new file mode 100644 index 000000000..8e699ef57 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-controls-dark-light-mode.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-controls-time-range.png b/pr-preview/pr-6948/img/influxdb/2-0-controls-time-range.png new file mode 100644 index 000000000..7813e6c8c Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-controls-time-range.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-controls-timezone.png b/pr-preview/pr-6948/img/influxdb/2-0-controls-timezone.png new file mode 100644 index 000000000..b8193f12c Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-controls-timezone.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-data-explorer.png b/pr-preview/pr-6948/img/influxdb/2-0-data-explorer.png new file mode 100644 index 000000000..cdb82eafe Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-data-explorer.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-sql-dashboard-variable.png b/pr-preview/pr-6948/img/influxdb/2-0-sql-dashboard-variable.png new file mode 100644 index 000000000..8632d0913 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-sql-dashboard-variable.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-tools-chronograf-v2-auth.png b/pr-preview/pr-6948/img/influxdb/2-0-tools-chronograf-v2-auth.png new file mode 100644 index 000000000..b619dcdf4 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-tools-chronograf-v2-auth.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-tools-vsflux-errors-warnings.png b/pr-preview/pr-6948/img/influxdb/2-0-tools-vsflux-errors-warnings.png new file mode 100644 index 000000000..dc82301fe Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-tools-vsflux-errors-warnings.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-tools-vsflux-explore-schema.png b/pr-preview/pr-6948/img/influxdb/2-0-tools-vsflux-explore-schema.png new file mode 100644 index 000000000..a7f969fcf Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-tools-vsflux-explore-schema.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-variables-data-explorer-view.png b/pr-preview/pr-6948/img/influxdb/2-0-variables-data-explorer-view.png new file mode 100644 index 000000000..6f27a03e6 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-variables-data-explorer-view.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-Band-example.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-Band-example.png new file mode 100644 index 000000000..0977d1bcd Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-Band-example.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-dropdown.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-dropdown.png new file mode 100644 index 000000000..5dd1ae686 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-dropdown.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-gauge-example-8.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-gauge-example-8.png new file mode 100644 index 000000000..d90b599c0 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-gauge-example-8.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-gauge-example.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-gauge-example.png new file mode 100644 index 000000000..eb7421584 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-gauge-example.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-gauge-pressure-8.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-gauge-pressure-8.png new file mode 100644 index 000000000..5c48f4658 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-gauge-pressure-8.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-graph-linear-static.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-graph-linear-static.png new file mode 100644 index 000000000..5951bcb39 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-graph-linear-static.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-graph-single-stat-mem-8.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-graph-single-stat-mem-8.png new file mode 100644 index 000000000..a02a9b76c Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-graph-single-stat-mem-8.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-graph-smooth-hover.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-graph-smooth-hover.png new file mode 100644 index 000000000..08fcece53 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-graph-smooth-hover.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-heatmap-correlation.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-heatmap-correlation.png new file mode 100644 index 000000000..945e678fa Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-heatmap-correlation.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-heatmap-example.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-heatmap-example.png new file mode 100644 index 000000000..11f897d4a Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-heatmap-example.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-heatmap-vs-scatter.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-heatmap-vs-scatter.png new file mode 100644 index 000000000..fb2fc9525 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-heatmap-vs-scatter.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-histogram-errors.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-histogram-errors.png new file mode 100644 index 000000000..77055b353 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-histogram-errors.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-histogram-example.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-histogram-example.png new file mode 100644 index 000000000..f399ebd19 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-histogram-example.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-example-8.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-example-8.png new file mode 100644 index 000000000..8a6a2b7dc Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-example-8.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-example.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-example.png new file mode 100644 index 000000000..5060bee91 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-example.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-single-stat-example-8.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-single-stat-example-8.png new file mode 100644 index 000000000..6a2f56892 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-single-stat-example-8.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-single-stat-example.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-single-stat-example.png new file mode 100644 index 000000000..16e1d4670 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-single-stat-example.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-step-example-8.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-step-example-8.png new file mode 100644 index 000000000..b22d53453 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-line-graph-step-example-8.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-map-circle-example.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-map-circle-example.png new file mode 100644 index 000000000..e9e0664b1 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-map-circle-example.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-map-heat-example.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-map-heat-example.png new file mode 100644 index 000000000..0c8affbbb Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-map-heat-example.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-map-point-example.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-map-point-example.png new file mode 100644 index 000000000..8676ef6e0 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-map-point-example.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-mosaic-example.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-mosaic-example.png new file mode 100644 index 000000000..e08b70da1 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-mosaic-example.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-scatter-correlation.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-scatter-correlation.png new file mode 100644 index 000000000..e1b3df197 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-scatter-correlation.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-scatter-example.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-scatter-example.png new file mode 100644 index 000000000..83e9c7b8e Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-scatter-example.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-single-stat-example-8.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-single-stat-example-8.png new file mode 100644 index 000000000..ece3e1fd8 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-single-stat-example-8.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-single-stat-example.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-single-stat-example.png new file mode 100644 index 000000000..a7bc1577d Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-single-stat-example.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-table-example.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-table-example.png new file mode 100644 index 000000000..666413266 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-table-example.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-0-visualizations-table-human-readable.png b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-table-human-readable.png new file mode 100644 index 000000000..a554b2351 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-0-visualizations-table-human-readable.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-1-migration-dashboard.png b/pr-preview/pr-6948/img/influxdb/2-1-migration-dashboard.png new file mode 100644 index 000000000..a1a6b7b67 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-1-migration-dashboard.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-1-tools-vsflux-add-connection.png b/pr-preview/pr-6948/img/influxdb/2-1-tools-vsflux-add-connection.png new file mode 100644 index 000000000..62362f8cf Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-1-tools-vsflux-add-connection.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-1-tools-vsflux-influxdb-pane.png b/pr-preview/pr-6948/img/influxdb/2-1-tools-vsflux-influxdb-pane.png new file mode 100644 index 000000000..6bf82b9c2 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-1-tools-vsflux-influxdb-pane.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-4-get-started-visualize-query-builder.png b/pr-preview/pr-6948/img/influxdb/2-4-get-started-visualize-query-builder.png new file mode 100644 index 000000000..1ce6383e9 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-4-get-started-visualize-query-builder.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-4-get-started-visualize-time-range.png b/pr-preview/pr-6948/img/influxdb/2-4-get-started-visualize-time-range.png new file mode 100644 index 000000000..46ccc7d33 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-4-get-started-visualize-time-range.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-4-get-started-visualize-variable-select.png b/pr-preview/pr-6948/img/influxdb/2-4-get-started-visualize-variable-select.png new file mode 100644 index 000000000..a5b25b073 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-4-get-started-visualize-variable-select.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-4-influxql-holtwinters-1.png b/pr-preview/pr-6948/img/influxdb/2-4-influxql-holtwinters-1.png new file mode 100644 index 000000000..f355c4c14 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-4-influxql-holtwinters-1.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-4-influxql-holtwinters-2.png b/pr-preview/pr-6948/img/influxdb/2-4-influxql-holtwinters-2.png new file mode 100644 index 000000000..6071275f1 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-4-influxql-holtwinters-2.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-4-influxql-holtwinters-3.png b/pr-preview/pr-6948/img/influxdb/2-4-influxql-holtwinters-3.png new file mode 100644 index 000000000..83281d657 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-4-influxql-holtwinters-3.png differ diff --git a/pr-preview/pr-6948/img/influxdb/2-4-influxql-shell-table-format.png b/pr-preview/pr-6948/img/influxdb/2-4-influxql-shell-table-format.png new file mode 100644 index 000000000..5b07811c8 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/2-4-influxql-shell-table-format.png differ diff --git a/pr-preview/pr-6948/img/influxdb/3-0-query-plan-tree.png b/pr-preview/pr-6948/img/influxdb/3-0-query-plan-tree.png new file mode 100644 index 000000000..fad64092a Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/3-0-query-plan-tree.png differ diff --git a/pr-preview/pr-6948/img/influxdb/OSS-v1-grafana-product-dropdown-flux.png b/pr-preview/pr-6948/img/influxdb/OSS-v1-grafana-product-dropdown-flux.png new file mode 100644 index 000000000..3b20ffbae Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/OSS-v1-grafana-product-dropdown-flux.png differ diff --git a/pr-preview/pr-6948/img/influxdb/OSS-v1-grafana-product-dropdown-influxql.png b/pr-preview/pr-6948/img/influxdb/OSS-v1-grafana-product-dropdown-influxql.png new file mode 100644 index 000000000..87b3de6d4 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/OSS-v1-grafana-product-dropdown-influxql.png differ diff --git a/pr-preview/pr-6948/img/influxdb/cloud-controls-view-raw-data.png b/pr-preview/pr-6948/img/influxdb/cloud-controls-view-raw-data.png new file mode 100644 index 000000000..70d7cffcb Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/cloud-controls-view-raw-data.png differ diff --git a/pr-preview/pr-6948/img/influxdb/cloud-internals-auth.png b/pr-preview/pr-6948/img/influxdb/cloud-internals-auth.png new file mode 100644 index 000000000..1d3c4f6bf Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/cloud-internals-auth.png differ diff --git a/pr-preview/pr-6948/img/influxdb/cloud-internals-cluster.png b/pr-preview/pr-6948/img/influxdb/cloud-internals-cluster.png new file mode 100644 index 000000000..bc616c436 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/cloud-internals-cluster.png differ diff --git a/pr-preview/pr-6948/img/influxdb/cloudformation1.png b/pr-preview/pr-6948/img/influxdb/cloudformation1.png new file mode 100644 index 000000000..96c002c2e Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/cloudformation1.png differ diff --git a/pr-preview/pr-6948/img/influxdb/cloudformation2.png b/pr-preview/pr-6948/img/influxdb/cloudformation2.png new file mode 100644 index 000000000..fd0725987 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/cloudformation2.png differ diff --git a/pr-preview/pr-6948/img/influxdb/influxdb-3-enterprise-dedicated-compactor.png b/pr-preview/pr-6948/img/influxdb/influxdb-3-enterprise-dedicated-compactor.png new file mode 100644 index 000000000..cb5d04957 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/influxdb-3-enterprise-dedicated-compactor.png differ diff --git a/pr-preview/pr-6948/img/influxdb/influxdb-3-enterprise-high-availability.png b/pr-preview/pr-6948/img/influxdb/influxdb-3-enterprise-high-availability.png new file mode 100644 index 000000000..f43eced79 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/influxdb-3-enterprise-high-availability.png differ diff --git a/pr-preview/pr-6948/img/influxdb/influxdb-3-enterprise-workload-isolation.png b/pr-preview/pr-6948/img/influxdb/influxdb-3-enterprise-workload-isolation.png new file mode 100644 index 000000000..06769d342 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/influxdb-3-enterprise-workload-isolation.png differ diff --git a/pr-preview/pr-6948/img/influxdb/user-icon.png b/pr-preview/pr-6948/img/influxdb/user-icon.png new file mode 100644 index 000000000..68be783d7 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb/user-icon.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-observability-dashboard.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-observability-dashboard.png new file mode 100644 index 000000000..ab0d1284d Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-observability-dashboard.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-account-switcher.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-account-switcher.png new file mode 100644 index 000000000..9c0036cc6 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-account-switcher.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-all-accounts.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-all-accounts.png new file mode 100644 index 000000000..dd6c06987 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-all-accounts.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-all-clusters.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-all-clusters.png new file mode 100644 index 000000000..0bd998dd0 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-all-clusters.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-autoscaling.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-autoscaling.png new file mode 100644 index 000000000..f68df6b3c Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-autoscaling.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-custom-partitioned-table.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-custom-partitioned-table.png new file mode 100644 index 000000000..d644a58ba Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-custom-partitioned-table.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-database-token.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-database-token.png new file mode 100644 index 000000000..0196eccc0 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-database-token.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-database.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-database.png new file mode 100644 index 000000000..8dcf698d1 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-database.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-management-token.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-management-token.png new file mode 100644 index 000000000..f36bd5365 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-management-token.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-table-custom-partitioning.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-table-custom-partitioning.png new file mode 100644 index 000000000..2e1dbc264 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-table-custom-partitioning.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-table-default.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-table-default.png new file mode 100644 index 000000000..873e1cc7b Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-create-table-default.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-database-token-options-menu.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-database-token-options-menu.png new file mode 100644 index 000000000..daeef3bc8 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-database-token-options-menu.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-database-tokens.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-database-tokens.png new file mode 100644 index 000000000..463d3293b Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-database-tokens.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-databases.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-databases.png new file mode 100644 index 000000000..73d71b77e Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-databases.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-delete-database.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-delete-database.png new file mode 100644 index 000000000..f16e0e4d1 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-delete-database.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-edit-database-token.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-edit-database-token.png new file mode 100644 index 000000000..87bb83e2c Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-edit-database-token.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-help.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-help.png new file mode 100644 index 000000000..ec01c4a77 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-help.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-list-databases.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-list-databases.png new file mode 100644 index 000000000..04a20cf04 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-list-databases.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-login.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-login.png new file mode 100644 index 000000000..f276e3654 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-login.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-management-tokens.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-management-tokens.png new file mode 100644 index 000000000..1e6f3b6fb Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-management-tokens.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-overview.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-overview.png new file mode 100644 index 000000000..25b3497f3 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-overview.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-query-log-detail-view.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-query-log-detail-view.png new file mode 100644 index 000000000..22da99d63 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-query-log-detail-view.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-query-log-list-view.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-query-log-list-view.png new file mode 100644 index 000000000..26ab18414 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-query-log-list-view.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-revoke-database-token.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-revoke-database-token.png new file mode 100644 index 000000000..2472d5332 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-revoke-database-token.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-tables.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-tables.png new file mode 100644 index 000000000..060204251 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-tables.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-users.png b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-users.png new file mode 100644 index 000000000..b74fe5cfe Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-dedicated-admin-ui-users.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-serverless-migration-dashboard.png b/pr-preview/pr-6948/img/influxdb3/cloud-serverless-migration-dashboard.png new file mode 100644 index 000000000..55078a65d Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-serverless-migration-dashboard.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-serverless-superset-connect.png b/pr-preview/pr-6948/img/influxdb3/cloud-serverless-superset-connect.png new file mode 100644 index 000000000..779332b3d Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-serverless-superset-connect.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-serverless-superset-dashboard.png b/pr-preview/pr-6948/img/influxdb3/cloud-serverless-superset-dashboard.png new file mode 100644 index 000000000..45817f446 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-serverless-superset-dashboard.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/cloud-serverless-superset-schema.png b/pr-preview/pr-6948/img/influxdb3/cloud-serverless-superset-schema.png new file mode 100644 index 000000000..32fcde30e Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/cloud-serverless-superset-schema.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/core-mcp-influxdb3-plugin.png b/pr-preview/pr-6948/img/influxdb3/core-mcp-influxdb3-plugin.png new file mode 100644 index 000000000..a966c96bf Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/core-mcp-influxdb3-plugin.png differ diff --git a/pr-preview/pr-6948/img/influxdb3/influxdb3-core-enterprise-ingest-path-flow.png b/pr-preview/pr-6948/img/influxdb3/influxdb3-core-enterprise-ingest-path-flow.png new file mode 100644 index 000000000..1e6daca92 Binary files /dev/null and b/pr-preview/pr-6948/img/influxdb3/influxdb3-core-enterprise-ingest-path-flow.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-add-kapacitor-connection01.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-add-kapacitor-connection01.png new file mode 100644 index 000000000..2b6b46781 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-add-kapacitor-connection01.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-add-kapacitor-connection02.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-add-kapacitor-connection02.png new file mode 100644 index 000000000..d9c7adc47 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-add-kapacitor-connection02.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-add-kapacitor-connection03.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-add-kapacitor-connection03.png new file mode 100644 index 000000000..a55c95f8f Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-add-kapacitor-connection03.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-add-kapacitor-connection04.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-add-kapacitor-connection04.png new file mode 100644 index 000000000..3271a3b17 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-add-kapacitor-connection04.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration01.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration01.png new file mode 100644 index 000000000..51144bdd0 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration01.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration02.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration02.png new file mode 100644 index 000000000..947abdb88 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration02.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration03.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration03.png new file mode 100644 index 000000000..be8ad170a Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration03.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration04.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration04.png new file mode 100644 index 000000000..8772a93d0 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration04.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration05.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration05.png new file mode 100644 index 000000000..62f2eb390 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-configuration05.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert01.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert01.png new file mode 100644 index 000000000..c16ee976e Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert01.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert02.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert02.png new file mode 100644 index 000000000..bf7646f0a Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert02.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert03.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert03.png new file mode 100644 index 000000000..fceab7689 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert03.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert04.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert04.png new file mode 100644 index 000000000..f15da4b23 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert04.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert05.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert05.png new file mode 100644 index 000000000..c39846c42 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert05.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert06.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert06.png new file mode 100644 index 000000000..391428019 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert06.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert07.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert07.png new file mode 100644 index 000000000..f0a3d9a22 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert07.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert08.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert08.png new file mode 100644 index 000000000..3d39c7c12 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-create-alert08.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-delete-rule.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-delete-rule.png new file mode 100644 index 000000000..f327960b7 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-delete-rule.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-editable-task-in-chrono01.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-editable-task-in-chrono01.png new file mode 100644 index 000000000..5b64d4080 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-editable-task-in-chrono01.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-editable-task-in-chrono02.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-editable-task-in-chrono02.png new file mode 100644 index 000000000..6c84ecb35 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-editable-task-in-chrono02.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-enable-disable-alerts01.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-enable-disable-alerts01.png new file mode 100644 index 000000000..36cd5040a Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-enable-disable-alerts01.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-update-endpoints01.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-update-endpoints01.png new file mode 100644 index 000000000..4b01398e3 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-update-endpoints01.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-update-endpoints02.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-update-endpoints02.png new file mode 100644 index 000000000..e2a4098b0 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-update-endpoints02.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-update-endpoints03.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-update-endpoints03.png new file mode 100644 index 000000000..26146f7cc Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-update-endpoints03.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-update-endpoints04.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-update-endpoints04.png new file mode 100644 index 000000000..6d5c89220 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-update-endpoints04.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-use-alerts-db01.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-use-alerts-db01.png new file mode 100644 index 000000000..aa7f7b9a4 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-use-alerts-db01.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-use-alerts-db02.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-use-alerts-db02.png new file mode 100644 index 000000000..3906225d9 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-use-alerts-db02.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-view-alert-history01.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-view-alert-history01.png new file mode 100644 index 000000000..8480aebcf Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-view-alert-history01.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-chrono-view-alert-history02.png b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-view-alert-history02.png new file mode 100644 index 000000000..d0e7b214a Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-chrono-view-alert-history02.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-hipchat-token.png b/pr-preview/pr-6948/img/kapacitor/1-4-hipchat-token.png new file mode 100644 index 000000000..159441a67 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-hipchat-token.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-4-pull-metrics.png b/pr-preview/pr-6948/img/kapacitor/1-4-pull-metrics.png new file mode 100644 index 000000000..43fb8dd17 Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-4-pull-metrics.png differ diff --git a/pr-preview/pr-6948/img/kapacitor/1-5-comparing-two-measurements.png b/pr-preview/pr-6948/img/kapacitor/1-5-comparing-two-measurements.png new file mode 100644 index 000000000..857e2fcea Binary files /dev/null and b/pr-preview/pr-6948/img/kapacitor/1-5-comparing-two-measurements.png differ diff --git a/pr-preview/pr-6948/img/platform/troubleshooting-disk-usage.png b/pr-preview/pr-6948/img/platform/troubleshooting-disk-usage.png new file mode 100644 index 000000000..6dde0a528 Binary files /dev/null and b/pr-preview/pr-6948/img/platform/troubleshooting-disk-usage.png differ diff --git a/pr-preview/pr-6948/img/platform/troubleshooting-oom-loop.png b/pr-preview/pr-6948/img/platform/troubleshooting-oom-loop.png new file mode 100644 index 000000000..693bac546 Binary files /dev/null and b/pr-preview/pr-6948/img/platform/troubleshooting-oom-loop.png differ diff --git a/pr-preview/pr-6948/img/resources/late-arriving-data.png b/pr-preview/pr-6948/img/resources/late-arriving-data.png new file mode 100644 index 000000000..31ca167bb Binary files /dev/null and b/pr-preview/pr-6948/img/resources/late-arriving-data.png differ diff --git a/pr-preview/pr-6948/img/telegraf/controller-agents-list.png b/pr-preview/pr-6948/img/telegraf/controller-agents-list.png new file mode 100644 index 000000000..b46ab5bfa Binary files /dev/null and b/pr-preview/pr-6948/img/telegraf/controller-agents-list.png differ diff --git a/pr-preview/pr-6948/img/telegraf/controller-code-editor.png b/pr-preview/pr-6948/img/telegraf/controller-code-editor.png new file mode 100644 index 000000000..2d8d0c840 Binary files /dev/null and b/pr-preview/pr-6948/img/telegraf/controller-code-editor.png differ diff --git a/pr-preview/pr-6948/img/telegraf/controller-command-builder.png b/pr-preview/pr-6948/img/telegraf/controller-command-builder.png new file mode 100644 index 000000000..f4fd8ff78 Binary files /dev/null and b/pr-preview/pr-6948/img/telegraf/controller-command-builder.png differ diff --git a/pr-preview/pr-6948/img/telegraf/controller-telegraf-builder.png b/pr-preview/pr-6948/img/telegraf/controller-telegraf-builder.png new file mode 100644 index 000000000..9fb1aa72f Binary files /dev/null and b/pr-preview/pr-6948/img/telegraf/controller-telegraf-builder.png differ diff --git a/pr-preview/pr-6948/img/telegraf/new-citibike-query.png b/pr-preview/pr-6948/img/telegraf/new-citibike-query.png new file mode 100644 index 000000000..c8287eb3c Binary files /dev/null and b/pr-preview/pr-6948/img/telegraf/new-citibike-query.png differ diff --git a/pr-preview/pr-6948/index.html b/pr-preview/pr-6948/index.html new file mode 100644 index 000000000..09169bdf9 --- /dev/null +++ b/pr-preview/pr-6948/index.html @@ -0,0 +1,64 @@ + + + + + + PR Preview + + + +

PR Preview

+

This preview contains 41 page(s):

+ +

Generated: 2026-03-17T14:26:29.586Z

+ + \ No newline at end of file diff --git a/pr-preview/pr-6948/influxdb/cloud/query-data/influxql/explore-data/time-and-timezone/index.html b/pr-preview/pr-6948/influxdb/cloud/query-data/influxql/explore-data/time-and-timezone/index.html new file mode 100644 index 000000000..8ddbdc309 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/cloud/query-data/influxql/explore-data/time-and-timezone/index.html @@ -0,0 +1,5540 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Time and timezone queries | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Time and timezone queries

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL is designed for working with time series data and includes features specifically for working with time. +You can review the following ways to work with time and timestamps in your InfluxQL queries:

+ +

Configuring returned timestamps

+

The InfluxQL shell returns timestamps in +nanosecond UNIX epoch format by default. +Specify alternative formats with the +precision <format> command.

+

If you are using the InfluxQL shell, use the precision helper command precision rfc3339 to view results in human readable format.

+

The InfluxDB API returns timestamps +in RFC3339 format by default. +Specify alternative formats with the +epoch query string parameter.

+

Time syntax

+

For most SELECT statements, the default time range is between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC. +For SELECT statements with a GROUP BY time() clause, +the default time range is between 1677-09-21 00:12:43.145224194 UTC and now(). +The following sections detail how to specify alternative time ranges in the SELECT +statement’s WHERE clause.

+

Other supported features include:
+Absolute time
+Relative time

+

Absolute time

+

Specify absolute time with date-time strings and epoch time.

+

Syntax

+ + +
SELECT_clause FROM_clause WHERE time <operator> ['<rfc3339_date_time_string>' | '<rfc3339_like_date_time_string>' | <epoch_time>] [AND ['<rfc3339_date_time_string>' | '<rfc3339_like_date_time_string>' | <epoch_time>] [...]]
+

Supported operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorMeaning
=equal to
<>not equal to
!=not equal to
>greater than
>=greater than or equal to
<less than
<=less than or equal to
+

Currently, InfluxDB does not support using OR with absolute time in the WHERE +clause. See the Frequently Asked Questions +document and the GitHub Issue +for more information.

+

rfc3339_date_time_string

+ + +
'YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ'
+

.nnnnnnnnn is optional and is set to .000000000 if not included. +The RFC3339 date-time string requires single quotes.

+

rfc3339_like_date_time_string

+ + +
'YYYY-MM-DD HH:MM:SS.nnnnnnnnn'
+

HH:MM:SS.nnnnnnnnn.nnnnnnnnn is optional and is set to 00:00:00.000000000 if not included. +The RFC3339-like date-time string requires single quotes.

+

epoch_time

+

Epoch time is the amount of time that has elapsed since 00:00:00 +Coordinated Universal Time (UTC), Thursday, 1 January 1970.

+

By default, InfluxDB assumes that all epoch timestamps are in nanoseconds. Include a duration literal at the end of the epoch timestamp to indicate a precision other than nanoseconds.

+

Basic arithmetic

+

All timestamp formats support basic arithmetic. +Add (+) or subtract (-) a time from a timestamp with a duration literal. +Note that InfluxQL requires a whitespace between the + or - and the +duration literal.

+

Examples

+
+ + + + + +
+ +

+ Specify a time range with RFC3339 date-time strings +

+ +
+ + + + + +
+ +

+ Specify a time range with RFC3339-like date-time strings +

+ +
+ + + + + +
+ +

+ Specify a time range with epoch timestamps +

+ +
+ + + + + +
+ +

+ Specify a time range with second-precision epoch timestamps +

+ +
+ + + + + +
+ +

+ Perform basic arithmetic on an RFC3339-like date-time string +

+ +
+ + + + + +
+ +

+ Perform basic arithmetic on an epoch timestamp +

+ +
+ + + +
+ +

Relative time

+

Use now() to query data with timestamps relative to the server’s current timestamp.

+

Syntax

+ + +
SELECT_clause FROM_clause WHERE time <operator> now() [[ - | + ] <duration_literal>] [(AND|OR) now() [...]]
+

now() is the Unix time of the server at the time the query is executed on that server. +The whitespace between - or + and the duration literal is required.

+

Supported operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorMeaning
=equal to
<>not equal to
!=not equal to
>greater than
>=greater than or equal to
<less than
<=less than or equal to
+

duration_literal

+
    +
  • microseconds: u or µ
  • +
  • milliseconds: ms
  • +
  • secondss
  • +
  • minutesm
  • +
  • hours:h
  • +
  • days:d
  • +
  • weeks:w
  • +
+

Examples

+
+ + + + + +
+ +

+ Specify a time range with relative time +

+ +
+ + + + + +
+ +

+ Specify a time range with absolute time and relative time +

+ +
+ + + +
+ +

The Time Zone clause

+

Use the tz() clause to return the UTC offset for the specified timezone.

+

Syntax

+ + +
SELECT_clause FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause] tz('<time_zone>')
+

By default, InfluxDB stores and returns timestamps in UTC. +The tz() clause includes the UTC offset or, if applicable, the UTC Daylight Savings Time (DST) offset to the query’s returned timestamps. The returned timestamps must be in RFC3339 format for the UTC offset or UTC DST to appear. +The time_zone parameter follows the TZ syntax in the Internet Assigned Numbers Authority time zone database and it requires single quotes.

+

Examples

+
+ + + + + +
+ +

+ Return the UTC offset for Chicago’s time zone +

+ +
+ + + +
+ +

Common issues with time syntax

+

Using OR to select time multiple time intervals

+

InfluxDB does not support using the OR operator in the WHERE clause to specify multiple time intervals.

+

For more information, see Frequently asked questions.

+

Querying data that occur after now() with a GROUP BY time() clause

+

Most SELECT statements have a default time range between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC. +For SELECT statements with a GROUP BY time() clause, +the default time range is between 1677-09-21 00:12:43.145224194 UTC and now().

+

To query data with timestamps that occur after now(), SELECT statements with +a GROUP BY time() clause must provide an alternative upper bound in the +WHERE clause.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/cloud/query-data/influxql/manage-data/index.html b/pr-preview/pr-6948/influxdb/cloud/query-data/influxql/manage-data/index.html new file mode 100644 index 000000000..73709dfec --- /dev/null +++ b/pr-preview/pr-6948/influxdb/cloud/query-data/influxql/manage-data/index.html @@ -0,0 +1,4952 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Manage your data using InfluxQL | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Manage your data using InfluxQL

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Use the following data management commands to write and delete data with InfluxQL:

+ +

Write data with INSERT

+

The INSERT statement writes line protocol +to a database and retention policy.

+

Syntax

+ + +
INSERT [INTO <database>[.<retention-policy>]] <line-protocol>
+
    +
  • The INTO clause is optional. +If the command does not include INTO, you must specify the +database with USE <database_name> when using the InfluxQL shell +or with the db query string parameter in the +InfluxDB 1.x compatibility API request.
  • +
+

Examples

+ +

Insert data into the a specific database and retention policy

+ + +
INSERT INTO mydb.myrp example-m,tag1=value1 field1=1i 1640995200000000000
+

Insert data into the a the default retention policy of a database

+ + +
INSERT INTO mydb example-m,tag1=value1 field1=1i 1640995200000000000
+

Insert data into the currently used database

+

The following example uses the InfluxQL shell.

+ + +
USE mydb
+INSERT example-m,tag1=value1 field1=1i 1640995200000000000
+

Delete series with DELETE

+

The DELETE statement deletes all points from a series in a database.

+

Syntax

+ + +
DELETE FROM <measurement_name> WHERE [<tag_key>='<tag_value>'] | [<time interval>]
+

You must include either the FROM clause, the WHERE clause, or both.

+ +
+
    +
  • DELETE supports regular expressions +in the FROM clause when specifying measurement names and in the WHERE clause +when specifying tag values.
  • +
  • DELETE does not support fields in the WHERE clause.
  • +
+ +
+ +

Examples

+ +

Delete all measurement data

+

Delete all data associated with the measurement h2o_feet:

+ + +
DELETE FROM "h2o_feet"
+

Delete data in a measurement that has a specific tag value

+

Delete all data associated with the measurement h2o_quality and where the tag randtag equals 3:

+ + +
DELETE FROM "h2o_quality" WHERE "randtag" = '3'
+

Delete data before or after specified time

+

Delete all data in the database that occur before January 01, 2020:

+ + +
DELETE WHERE time < '2020-01-01'
+

A successful DELETE query returns an empty result.

+

If you need to delete points in the future, you must specify the future time period because DELETE SERIES runs for time < now() by default.

+

Delete future points:

+ + +
DELETE FROM device_data WHERE "device" = 'sensor1" and time > now() and < '2024-01-14T01:00:00Z'
+

Delete points in the future within a specified time range:

+ + +
DELETE FROM device_data WHERE "device" = 'sensor15" and time >= '2024-01-01T12:00:00Z' and <= '2025-06-30T11:59:00Z'
+

Delete measurements with DROP MEASUREMENT

+

The DROP MEASUREMENT statement deletes all data and series from the specified measurement and deletes the measurement from the index.

+

Syntax

+ + +
DROP MEASUREMENT <measurement_name>
+

Example

+

Delete the measurement h2o_feet:

+ + +
DROP MEASUREMENT "h2o_feet"
+

A successful DROP MEASUREMENT query returns an empty result.

+ +
+

The DROP MEASUREMENT command is very resource intensive. We do not recommend this command for bulk data deletion. Use the DELETE FROM command instead, which is less resource intensive.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/cloud/reference/syntax/influxql/spec/index.html b/pr-preview/pr-6948/influxdb/cloud/reference/syntax/influxql/spec/index.html new file mode 100644 index 000000000..5f11010ee --- /dev/null +++ b/pr-preview/pr-6948/influxdb/cloud/reference/syntax/influxql/spec/index.html @@ -0,0 +1,5506 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Influx Query Language (InfluxQL) 2.x specification | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Influx Query Language (InfluxQL) 2.x specification

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL is a SQL-like query language used to interact with InfluxDB and work with your times series data.

+

Find Influx Query Language (InfluxQL) definitions and details, including:

+ +

To learn more about InfluxQL, browse the following topics:

+ +

Notation

+

The syntax is specified using Extended Backus-Naur Form (“EBNF”). +EBNF is the same notation used in the Go programming language specification, +which can be found here.

+ + +
Production  = production_name "=" [ Expression ] "." .
+Expression  = Alternative { "|" Alternative } .
+Alternative = Term { Term } .
+Term        = production_name | token [ "…" token ] | Group | Option | Repetition .
+Group       = "(" Expression ")" .
+Option      = "[" Expression "]" .
+Repetition  = "{" Expression "}" .
+

Notation operators in order of increasing precedence:

+ + +
|   alternation
+()  grouping
+[]  option (0 or 1 times)
+{}  repetition (0 to n times)
+

Query representation

+

Characters

+

InfluxQL is Unicode text encoded in UTF-8.

+ + +
newline             = /* the Unicode code point U+000A */ .
+unicode_char        = /* an arbitrary Unicode code point except newline */ .
+

Letters and digits

+

Letters are the set of ASCII characters plus the underscore character _ (U+005F) is considered a letter.

+

Only decimal digits are supported.

+ + +
letter              = ascii_letter | "_" .
+ascii_letter        = "A" … "Z" | "a" … "z" .
+digit               = "0" … "9" .
+

Identifiers

+

Identifiers are tokens which refer to database names, retention policy names, user names, measurement names, tag keys, and field keys.

+

The rules:

+
    +
  • double quoted identifiers can contain any unicode character other than a new line
  • +
  • double quoted identifiers can contain escaped " characters (i.e., \")
  • +
  • double quoted identifiers can contain InfluxQL keywords
  • +
  • unquoted identifiers must start with an upper or lowercase ASCII character or “_”
  • +
  • unquoted identifiers may contain only ASCII letters, decimal digits, and “_”
  • +
+ + +
identifier          = unquoted_identifier | quoted_identifier .
+unquoted_identifier = ( letter ) { letter | digit } .
+quoted_identifier   = `"` unicode_char { unicode_char } `"` .
+

Examples

+ + +
cpu
+_cpu_stats
+"1h"
+"anything really"
+"1_Crazy-1337.identifier>NAME👍"
+

Keywords

+ + +
ALL           ALTER         ANY           AS            ASC           BEGIN
+BY            CREATE        CONTINUOUS    DATABASE      DATABASES     DEFAULT
+DELETE        DESC          DESTINATIONS  DIAGNOSTICS   DISTINCT      DROP
+DURATION      END           EVERY         EXPLAIN       FIELD         FOR
+FROM          GRANT         GRANTS        GROUP         GROUPS        IN
+INF           INSERT        INTO          KEY           KEYS          KILL
+LIMIT         SHOW          MEASUREMENT   MEASUREMENTS  NAME          OFFSET
+ON            ORDER         PASSWORD      POLICY        POLICIES      PRIVILEGES
+QUERIES       QUERY         READ          REPLICATION   RESAMPLE      RETENTION
+REVOKE        SELECT        SERIES        SET           SHARD         SHARDS
+SLIMIT        SOFFSET       STATS         SUBSCRIPTION  SUBSCRIPTIONS TAG
+TO            USER          USERS         VALUES        WHERE         WITH
+WRITE
+

If you use an InfluxQL keywords as an +identifier you will need to +double quote that identifier in every query.

+

The keyword time is a special case. +time can be a +database name, +measurement name, +retention policy name, +subscription name, and +user name. +In those cases, time does not require double quotes in queries. +time cannot be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error. +See Frequently Asked Questions for more information.

+

Literals

+

Integers

+

InfluxQL supports decimal integer literals. +Hexadecimal and octal literals are not currently supported.

+ + +
int_lit             = ( "1" … "9" ) { digit } .
+

Floats

+

InfluxQL supports floating-point literals. +Exponents are not currently supported.

+ + +
float_lit           = int_lit "." int_lit .
+

Strings

+

String literals must be surrounded by single quotes. +Strings may contain ' characters as long as they are escaped (i.e., \').

+ + +
string_lit          = `'` { unicode_char } `'` .
+

Durations

+

Duration literals specify a length of time. +An integer literal followed immediately (with no spaces) by a duration unit listed below is interpreted as a duration literal. +Durations can be specified with mixed units.

+
Duration units
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UnitsMeaning
nsnanoseconds (1 billionth of a second)
u or µmicroseconds (1 millionth of a second)
msmilliseconds (1 thousandth of a second)
ssecond
mminute
hhour
dday
wweek
+ + +
duration_lit        = int_lit duration_unit .
+duration_unit       = "ns" | "u" | "µ" | "ms" | "s" | "m" | "h" | "d" | "w" .
+

Dates & Times

+

The date and time literal format is not specified in EBNF like the rest of this document. +It is specified using Go’s date / time parsing format, which is a reference date written in the format required by InfluxQL. +The reference date time is:

+

InfluxQL reference date time: January 2nd, 2006 at 3:04:05 PM

+ + +
time_lit            = "2006-01-02 15:04:05.999999" | "2006-01-02" .
+

Booleans

+ + +
bool_lit            = TRUE | FALSE .
+

Regular Expressions

+ + +
regex_lit           = "/" { unicode_char } "/" .
+

Comparators: +=~ matches against +!~ doesn’t match against

+ +
+

NOTE: InfluxQL supports using regular expressions when specifying:

+ +

Currently, InfluxQL does not support using regular expressions to match non-string field values in the WHERE clause, databases, and retention polices.

+ +
+ +

Queries

+

A query is composed of one or more statements separated by a semicolon.

+ + +
query               = statement { ";" statement } .
+
+statement           = delete_stmt |
+                      drop_measurement_stmt |
+                      explain_stmt |
+                      explain_analyze_stmt |
+                      select_stmt |
+                      show_databases_stmt |
+                      show_field_key_cardinality_stmt |
+                      show_field_keys_stmt |
+                      show_measurement_exact_cardinality_stmt |
+                      show_measurements_stmt |
+                      show_series_exact_cardinality_stmt |
+                      show_series_stmt |
+                      show_tag_key_cardinality_stmt |
+                      show_tag_key_exact_cardinality_stmt |
+                      show_tag_keys_stmt |
+                      show_tag_values_with_key = stmt |
+                      show_tag_values_cardinality_stmt .
+

Statements

+

DELETE

+ + +
delete_stmt = "DELETE" ( from_clause | where_clause | from_clause where_clause ) .
+

Examples

+ + +
DELETE FROM "cpu"
+DELETE FROM "cpu" WHERE time < '2000-01-01T00:00:00Z'
+DELETE WHERE time < '2000-01-01T00:00:00Z'
+

DROP MEASUREMENT

+ + +
drop_measurement_stmt = "DROP MEASUREMENT" measurement .
+

Examples

+ + +
-- drop the cpu measurement
+DROP MEASUREMENT "cpu"
+

EXPLAIN

+

Parses and plans the query, and then prints a summary of estimated costs.

+

Many SQL engines use the EXPLAIN statement to show join order, join algorithms, and predicate and expression pushdown. +Since InfluxQL does not support joins, the cost of a InfluxQL query is typically a function of the total series accessed, the number of iterator accesses to a TSM file, and the number of TSM blocks that need to be scanned.

+

The elements of EXPLAIN query plan include:

+
    +
  • expression
  • +
  • auxiliary fields
  • +
  • number of shards
  • +
  • number of series
  • +
  • cached values
  • +
  • number of files
  • +
  • number of blocks
  • +
  • size of blocks
  • +
+ + +
explain_stmt = "EXPLAIN" select_stmt .
+

Example

+ + +
> explain select sum(pointReq) from "_internal"."monitor"."write" group by hostname;
+> QUERY PLAN
+------
+EXPRESSION: sum(pointReq::integer)
+NUMBER OF SHARDS: 2
+NUMBER OF SERIES: 2
+CACHED VALUES: 110
+NUMBER OF FILES: 1
+NUMBER OF BLOCKS: 1
+SIZE OF BLOCKS: 931
+

EXPLAIN ANALYZE

+

Executes the specified SELECT statement and returns data on the query performance and storage during runtime, visualized as a tree. Use this statement to analyze query performance and storage, including execution time and planning time, and the iterator type and cursor type.

+

For example, executing the following statement:

+ + +
explain analyze select mean(usage_steal) from cpu where time >= '2018-02-22T00:00:00Z' and time < '2018-02-22T12:00:00Z'
+

May produce an output similar to the following:

+ + +
EXPLAIN ANALYZE
+---------------
+.
+└── select
+    ├── execution_time: 2.25823ms
+    ├── planning_time: 18.381616ms
+    ├── total_time: 20.639846ms
+    └── field_iterators
+        ├── labels
+           └── statement: SELECT mean(usage_steal::float) FROM telegraf."default".cpu
+        └── expression
+            ├── labels
+               └── expr: mean(usage_steal::float)
+            └── create_iterator
+                ├── labels
+                   ├── measurement: cpu
+                   └── shard_id: 608
+                ├── cursors_ref: 779
+                ├── cursors_aux: 0
+                ├── cursors_cond: 0
+                ├── float_blocks_decoded: 431
+                ├── float_blocks_size_bytes: 1003552
+                ├── integer_blocks_decoded: 0
+                ├── integer_blocks_size_bytes: 0
+                ├── unsigned_blocks_decoded: 0
+                ├── unsigned_blocks_size_bytes: 0
+                ├── string_blocks_decoded: 0
+                ├── string_blocks_size_bytes: 0
+                ├── boolean_blocks_decoded: 0
+                ├── boolean_blocks_size_bytes: 0
+                └── planning_time: 14.805277ms```
+ +
+

Note: EXPLAIN ANALYZE ignores query output, so the cost of serialization to JSON or CSV is not accounted for.

+ +
+
execution_time
+

Shows the amount of time the query took to execute, including reading the time series data, performing operations as data flows through iterators, and draining processed data from iterators. Execution time doesn’t include the time taken to serialize the output into JSON or other formats.

+
planning_time
+

Shows the amount of time the query took to plan. +Planning a query in InfluxDB requires a number of steps. Depending on the complexity of the query, planning can require more work and consume more CPU and memory resources than the executing the query. For example, the number of series keys required to execute a query affects how quickly the query is planned and the required memory.

+

First, InfluxDB determines the effective time range of the query and selects the shards to access (in InfluxDB Enterprise, shards may be on remote nodes). +Next, for each shard and each measurement, InfluxDB performs the following steps:

+
    +
  1. Select matching series keys from the index, filtered by tag predicates in the WHERE clause.
  2. +
  3. Group filtered series keys into tag sets based on the GROUP BY dimensions.
  4. +
  5. Enumerate each tag set and create a cursor and iterator for each series key.
  6. +
  7. Merge iterators and return the merged result to the query executor.
  8. +
+
iterator type
+

EXPLAIN ANALYZE supports the following iterator types:

+
    +
  • create_iterator node represents work done by the local influxd instance──a complex composition of nested iterators combined and merged to produce the final query output.
  • +
  • (InfluxDB Enterprise only) remote_iterator node represents work done on remote machines.
  • +
+

For more information about iterators, see Understanding iterators.

+
cursor type
+

EXPLAIN ANALYZE distinguishes 3 cursor types. While the cursor types have the same data structures and equal CPU and I/O costs, each cursor type is constructed for a different reason and separated in the final output. Consider the following cursor types when tuning a statement:

+
    +
  • cursor_ref: Reference cursor created for SELECT projections that include a function, such as last() or mean().
  • +
  • cursor_aux: Auxiliary cursor created for simple expression projections (not selectors or an aggregation). For example, SELECT foo FROM m or SELECT foo+bar FROM m, where foo and bar are fields.
  • +
  • cursor_cond: Condition cursor created for fields referenced in a WHERE clause.
  • +
+

For more information about cursors, see Understanding cursors.

+
block types
+

EXPLAIN ANALYZE separates storage block types, and reports the total number of blocks decoded and their size (in bytes) on disk. The following block types are supported:

+

| float | 64-bit IEEE-754 floating-point number | +| integer | 64-bit signed integer | +| unsigned | 64-bit unsigned integer | +| boolean | 1-bit, LSB encoded | +| string | UTF-8 string |

+

For more information about storage blocks, see TSM files.

+

SELECT

+ + +
select_stmt = "SELECT" fields from_clause [ where_clause ]
+              [ group_by_clause ] [ order_by_clause ] [ limit_clause ]
+              [ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ timezone_clause ] .
+

Example

+

Select from measurements grouped by the day with a timezone

+ + +
SELECT mean("value") FROM "cpu" GROUP BY region, time(1d) fill(0) tz('America/Chicago')
+

SHOW CARDINALITY

+

Refers to the group of commands used to estimate or count exactly the cardinality of measurements, series, tag keys, tag key values, and field keys.

+

The SHOW CARDINALITY commands are available in two variations: estimated and exact. Estimated values are calculated using sketches and are a safe default for all cardinality sizes. Exact values are counts directly from TSM (Time-Structured Merge Tree) data, but are expensive to run for high cardinality data. Unless required, use the estimated variety.

+

Filtering by time is only supported when Time Series Index (TSI) is enabled on a database.

+

See the specific SHOW CARDINALITY commands for details:

+ +

SHOW DATABASES

+ + +
show_databases_stmt = "SHOW DATABASES" .
+

Example

+ + +
-- show all databases
+SHOW DATABASES
+

SHOW FIELD KEY CARDINALITY

+

Estimates or counts exactly the cardinality of the field key set for the current database unless a database is specified using the ON <database> option.

+ +
+

Note: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when Time Series Index (TSI) is enabled and time is not supported in the WHERE clause.

+ +
+ + +
show_field_key_cardinality_stmt = "SHOW FIELD KEY CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+
+show_field_key_exact_cardinality_stmt = "SHOW FIELD KEY EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+

Examples

+ + +
-- show estimated cardinality of the field key set of current database
+SHOW FIELD KEY CARDINALITY
+-- show exact cardinality on field key set of specified database
+SHOW FIELD KEY EXACT CARDINALITY ON mydb
+

SHOW FIELD KEYS

+ + +
show_field_keys_stmt = "SHOW FIELD KEYS" [on_clause] [ from_clause ] .
+

Examples

+ + +
-- show field keys and field value data types from all measurements
+SHOW FIELD KEYS
+
+-- show field keys and field value data types from specified measurement
+SHOW FIELD KEYS FROM "cpu"
+

SHOW MEASUREMENTS

+ + +
show_measurements_stmt = "SHOW MEASUREMENTS" [on_clause] [ with_measurement_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all measurements
+SHOW MEASUREMENTS
+
+-- show measurements where region tag = 'uswest' AND host tag = 'serverA'
+SHOW MEASUREMENTS WHERE "region" = 'uswest' AND "host" = 'serverA'
+
+-- show measurements that start with 'h2o'
+SHOW MEASUREMENTS WITH MEASUREMENT =~ /h2o.*/
+

SHOW SERIES

+ + +
show_series_stmt = "SHOW SERIES" [on_clause] [ from_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .
+

Example

+ + +
SHOW SERIES FROM "telegraf"."autogen"."cpu" WHERE cpu = 'cpu8'
+

SHOW SERIES EXACT CARDINALITY

+

Estimates or counts exactly the cardinality of the series for the current database unless a database is specified using the ON option.

+

Example

+

SHOW SERIES EXACT CARDINALITY" [ on_clause ] [ from_clause ] +[ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]

+ + +
SHOW SERIES EXACT CARDINALITY ON mydb
+
    +
  • +

    Series cardinality is the major factor that affects RAM requirements. For more information, see:

    +
  • +
  • +

    Don’t have too many series. As the number of unique series grows, so does the memory usage. High series cardinality can force the host operating system to kill the InfluxDB process with an out of memory (OOM) exception.

    +
  • +
+ +
+

NOTE: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is not supported in the WHERE clause.

+ +
+ +

SHOW TAG KEY CARDINALITY

+

Estimates or counts exactly the cardinality of tag key set on the current database unless a database is specified using the ON <database> option.

+ +
+

Note: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when TSI (Time Series Index) is enabled and time is not supported in the WHERE clause.

+ +
+ + +
show_tag_key_cardinality_stmt = "SHOW TAG KEY CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+
+show_tag_key_exact_cardinality_stmt = "SHOW TAG KEY EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+

Examples

+ + +
-- show estimated tag key cardinality
+SHOW TAG KEY CARDINALITY
+-- show exact tag key cardinality
+SHOW TAG KEY EXACT CARDINALITY
+

SHOW TAG KEYS

+ + +
show_tag_keys_stmt = "SHOW TAG KEYS" [on_clause] [ from_clause ] [ where_clause ]
+                     [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag keys
+SHOW TAG KEYS
+
+-- show all tag keys from the cpu measurement
+SHOW TAG KEYS FROM "cpu"
+
+-- show all tag keys from the cpu measurement where the region key = 'uswest'
+SHOW TAG KEYS FROM "cpu" WHERE "region" = 'uswest'
+
+-- show all tag keys where the host key = 'serverA'
+SHOW TAG KEYS WHERE "host" = 'serverA'
+

SHOW TAG VALUES

+ + +
show_tag_values_stmt = "SHOW TAG VALUES" [on_clause] [ from_clause ] with_tag_clause [ where_clause ]
+                       [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag values across all measurements for the region tag
+SHOW TAG VALUES WITH KEY = "region"
+
+-- show tag values from the cpu measurement for the region tag
+SHOW TAG VALUES FROM "cpu" WITH KEY = "region"
+
+-- show tag values across all measurements for all tag keys that do not include the letter c
+SHOW TAG VALUES WITH KEY !~ /.*c.*/
+
+-- show tag values from the cpu measurement for region & host tag keys where service = 'redis'
+SHOW TAG VALUES FROM "cpu" WITH KEY IN ("region", "host") WHERE "service" = 'redis'
+

SHOW TAG VALUES CARDINALITY

+

Estimates or counts exactly the cardinality of tag key values for the specified tag key on the current database unless a database is specified using the ON <database> option.

+ +
+

Note: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when TSI (Time Series Index) is enabled.

+ +
+ + + +
show_tag_values_cardinality_stmt = "SHOW TAG VALUES CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ] with_key_clause
+
+show_tag_values_exact_cardinality_stmt = "SHOW TAG VALUES EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ] with_key_clause
+

Examples

+ + +
-- show estimated tag key values cardinality for a specified tag key
+SHOW TAG VALUES CARDINALITY WITH KEY = "myTagKey"
+-- show estimated tag key values cardinality for a specified tag key
+SHOW TAG VALUES CARDINALITY WITH KEY = "myTagKey"
+-- show exact tag key values cardinality for a specified tag key
+SHOW TAG VALUES EXACT CARDINALITY WITH KEY = "myTagKey"
+-- show exact tag key values cardinality for a specified tag key
+SHOW TAG VALUES EXACT CARDINALITY WITH KEY = "myTagKey"
+

Clauses

+ + +
from_clause     = "FROM" measurements .
+
+group_by_clause = "GROUP BY" dimensions fill(fill_option).
+
+limit_clause    = "LIMIT" int_lit .
+
+offset_clause   = "OFFSET" int_lit .
+
+slimit_clause   = "SLIMIT" int_lit .
+
+soffset_clause  = "SOFFSET" int_lit .
+
+timezone_clause = tz(string_lit) .
+
+on_clause       = "ON" db_name .
+
+order_by_clause = "ORDER BY" sort_fields .
+
+where_clause    = "WHERE" expr .
+
+with_measurement_clause = "WITH MEASUREMENT" ( "=" measurement | "=~" regex_lit ) .
+
+with_tag_clause = "WITH KEY" ( "=" tag_key | "!=" tag_key | "=~" regex_lit | "IN (" tag_keys ")"  ) .
+

Expressions

+ + +
binary_op        = "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | "AND" |
+                   "OR" | "=" | "!=" | "<>" | "<" | "<=" | ">" | ">=" .
+
+expr             = unary_expr { binary_op unary_expr } .
+
+unary_expr       = "(" expr ")" | var_ref | time_lit | string_lit | int_lit |
+                   float_lit | bool_lit | duration_lit | regex_lit .
+

Comments

+

Use comments with InfluxQL statements to describe your queries.

+
    +
  • A single line comment begins with two hyphens (--) and ends where InfluxDB detects a line break. +This comment type cannot span several lines.
  • +
  • A multi-line comment begins with /* and ends with */. This comment type can span several lines. +Multi-line comments do not support nested multi-line comments.
  • +
+

Other

+ + +
alias            = "AS" identifier .
+
+back_ref         = ( policy_name ".:MEASUREMENT" ) |
+                   ( db_name "." [ policy_name ] ".:MEASUREMENT" ) .
+
+db_name          = identifier .
+
+dimension        = expr .
+
+dimensions       = dimension { "," dimension } .
+
+field_key        = identifier .
+
+field            = expr [ alias ] .
+
+fields           = field { "," field } .
+
+fill_option      = "null" | "none" | "previous" | int_lit | float_lit | "linear" .
+
+host             = string_lit .
+
+measurement      = measurement_name |
+                   ( policy_name "." measurement_name ) |
+                   ( db_name "." [ policy_name ] "." measurement_name ) .
+
+measurements     = measurement { "," measurement } .
+
+measurement_name = identifier | regex_lit .
+
+policy_name      = identifier .
+
+retention_policy = identifier .
+
+retention_policy_name = "NAME" identifier .
+
+series_id        = int_lit .
+
+sort_field       = field_key [ ASC | DESC ] .
+
+sort_fields      = sort_field { "," sort_field } .
+
+tag_key          = identifier .
+
+tag_keys         = tag_key { "," tag_key } .
+
+var_ref          = measurement .
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/administration/authentication_and_authorization/index.html b/pr-preview/pr-6948/influxdb/v1/administration/authentication_and_authorization/index.html new file mode 100644 index 000000000..0bbdefec4 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/administration/authentication_and_authorization/index.html @@ -0,0 +1,2909 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Authentication and authorization in InfluxDB | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Authentication and authorization in InfluxDB

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

This document covers setting up and managing authentication and authorization in InfluxDB.

+ + +
+ + +

Authentication and authorization should not be relied upon to prevent access and protect data from malicious actors. +If additional security or compliance features are desired, InfluxDB should be run behind a third-party service. If InfluxDB is +being deployed on a publicly accessible endpoint, we strongly recommend authentication be enabled. Otherwise the data will be +publicly available to any unauthenticated user.

+
+

Authentication

+

The InfluxDB API and the command line interface (CLI), which connects to the database using the API, include simple, built-in authentication based on user credentials. +When you enable authentication, InfluxDB only executes HTTP requests that are sent with valid credentials.

+ +
+ + +

Authentication only occurs at the HTTP request scope. +Plugins do not currently have the ability to authenticate requests and service +endpoints (for example, Graphite, collectd, etc.) are not authenticated.

+
+

Set up authentication

+
    +
  1. +

    Create at least one admin user. +See the authorization section for how to create an admin user.

    + +
    + + +

    If you enable authentication and have no users, InfluxDB will not enforce authentication +and will only accept the query that creates a new admin user.

    +
    +

    InfluxDB will enforce authentication once there is an admin user.

    +
  2. +
  3. +

    Enable authentication in your configuration file +by setting the auth-enabled option to true in the [http] section:

    + + +
    [http]
    +  enabled = true
    +  bind-address = ":8086"
    +  auth-enabled = true # Set to true
    +  log-enabled = true
    +  write-tracing = false
    +  pprof-enabled = true
    +  pprof-auth-enabled = true
    +  debug-pprof-enabled = false
    +  ping-auth-enabled = true
    +  https-enabled = true
    +  https-certificate = "/etc/ssl/influxdb.pem"
    + +
    + + +

    If pprof-enabled is set to true, set pprof-auth-enabled and ping-auth-enabled +to true to require authentication on profiling and ping endpoints.

    +
    +
  4. +
  5. +

    Restart InfluxDB. +Once restarted, InfluxDB checks user credentials on every request and only +processes requests that have valid credentials for an existing user.

    +
  6. +
+

Authenticate requests

+

Authenticate with the InfluxDB API

+

There are two options for authenticating with the InfluxDB API.

+

If you authenticate with both Basic Authentication and the URL query parameters, the user credentials specified in the query parameters take precedence. +The queries in the following examples assume that the user is an admin user. +See the section on authorization for the different user types, their privileges, and more on user management.

+ +
+

Note: InfluxDB redacts passwords when you enable authentication.

+ +
+
Authenticate with Basic Authentication
+ + +
curl -G http://localhost:8086/query \
+  -u todd:influxdb4ever \
+  --data-urlencode "q=SHOW DATABASES"
+
Authenticate with query parameters in the URL or request body
+

Set u as the username and p as the password.

+
Credentials as query parameters
+ + +
curl -G "http://localhost:8086/query?u=todd&p=influxdb4ever" \
+  --data-urlencode "q=SHOW DATABASES"
+
Credentials in the request body
+ + +
curl -G http://localhost:8086/query \
+  --data-urlencode "u=todd" \
+  --data-urlencode "p=influxdb4ever" \
+  --data-urlencode "q=SHOW DATABASES"
+

Authenticate with the CLI

+

There are three options for authenticating with the CLI.

+
Authenticate with environment variables
+

Use the INFLUX_USERNAME and INFLUX_PASSWORD environment variables to provide +authentication credentials to the influx CLI.

+ + +
export INFLUX_USERNAME=todd
+export INFLUX_PASSWORD=influxdb4ever
+echo $INFLUX_USERNAME $INFLUX_PASSWORD
+todd influxdb4ever
+
+influx
+Connected to http://localhost:8086 version 1.12.3
+InfluxDB shell 1.12.3
+
Authenticate with CLI flags
+

Use the -username and -password flags to provide authentication credentials +to the influx CLI.

+ + +
influx -username todd -password influxdb4ever
+Connected to http://localhost:8086 version 1.12.3
+InfluxDB shell 1.12.3
+
Authenticate with credentials in the influx shell
+

Start the influx shell and run the auth command. +Enter your username and password when prompted.

+ + +
> influx
+Connected to http://localhost:8086 version 1.12.3
+InfluxDB shell 1.12.3
+> auth
+username: todd
+password:
+>
+

Authenticate using JWT tokens

+

For a more secure alternative to using passwords, include JWT tokens with requests to the InfluxDB API. +This is currently only possible through the InfluxDB HTTP API.

+
    +
  1. Add a shared secret in your InfluxDB configuration file
  2. +
  3. Generate your JWT token
  4. +
  5. Include the token in HTTP requests
  6. +
+
Add a shared secret in your InfluxDB configuration file
+

InfluxDB uses the shared secret to encode the JWT signature. +By default, shared-secret is set to an empty string, in which case no JWT authentication takes place. +Add a custom shared secret in your InfluxDB configuration file. +The longer the secret string, the more secure it is:

+ + +
[http]
+  shared-secret = "my super secret pass phrase"
+

Alternatively, to avoid keeping your secret phrase as plain text in your InfluxDB configuration file, set the value with the INFLUXDB_HTTP_SHARED_SECRET environment variable.

+
Generate your JWT token
+

Use an authentication service to generate a secure token using your InfluxDB username, an expiration time, and your shared secret. +There are online tools, such as https://jwt.io/, that will do this for you.

+

The payload (or claims) of the token must be in the following format:

+ + +
{
+  "username": "myUserName",
+  "exp": 1516239022
+}
+
    +
  • username - The name of your InfluxDB user.
  • +
  • exp - The expiration time of the token in UNIX epoch time. +For increased security, keep token expiration periods short. +For testing, you can manually generate UNIX timestamps using https://www.unixtimestamp.com/index.php.
  • +
+

Encode the payload using your shared secret. +You can do this with either a JWT library in your own authentication server or by hand at https://jwt.io/.

+

The generated token follows this format: <header>.<payload>.<signature>

+
Include the token in HTTP requests
+

Include your generated token as part of the Authorization header in HTTP requests. +Use the Bearer authorization scheme:

+ + +
Authorization: Bearer <myToken>
+ +
+ + +

Only unexpired tokens will successfully authenticate. Be sure your token has not expired.

+
+
Example query request with JWT authentication
+ + +
curl -G "http://localhost:8086/query?db=demodb" \
+  --data-urlencode "q=SHOW DATABASES" \
+  --header "Authorization: Bearer <header>.<payload>.<signature>"
+

Authenticate Telegraf requests to InfluxDB

+

Authenticating Telegraf requests to an InfluxDB instance with +authentication enabled requires some additional steps. +In the Telegraf configuration file (/etc/telegraf/telegraf.conf), uncomment +and edit the username and password settings.

+ + +
###############################################################################
+#                            OUTPUT PLUGINS                                   #
+###############################################################################
+
+# ...
+
+[[outputs.influxdb]]
+  # ...
+  username = "example-username" # Provide your username
+  password = "example-password" # Provide your password
+
+# ...
+

Restart Telegraf and you’re all set!

+

Authorization

+

Authorization is only enforced once you’ve enabled authentication. +By default, authentication is disabled, all credentials are silently ignored, and all users have all privileges.

+

User types and privileges

+

Admin users

+

Admin users have READ and WRITE access to all databases and full access to the following administrative queries:

+
Database management
+
    +
  • CREATE DATABASE
  • +
  • DROP DATABASE
  • +
  • DROP SERIES
  • +
  • DROP MEASUREMENT
  • +
  • CREATE RETENTION POLICY
  • +
  • ALTER RETENTION POLICY
  • +
  • DROP RETENTION POLICY
  • +
  • CREATE CONTINUOUS QUERY
  • +
  • DROP CONTINUOUS QUERY
  • +
+

For more information about these commands, see Database management and +Continuous queries.

+
User management
+ +

See below for a complete discussion of the user management commands.

+

Non-admin users

+

Non-admin users can have one of the following three privileges per database:

+
    +
  • READ
  • +
  • WRITE
  • +
  • ALL (both READ and WRITE access)
  • +
+

READ, WRITE, and ALL privileges are controlled per user per database. A new non-admin user has no access to any database until they are specifically granted privileges to a database by an admin user. +Non-admin users can SHOW the databases on which they have READ and/or WRITE permissions.

+

User management commands

+

Admin user management

+

When you enable HTTP authentication, InfluxDB requires you to create at least one admin user before you can interact with the system.

+ + +
CREATE USER admin WITH PASSWORD '<password>' WITH ALL PRIVILEGES
+
Create another admin user
+ + +
CREATE USER <username> WITH PASSWORD '<password>' WITH ALL PRIVILEGES
+ +
+ + +

Repeating the exact CREATE USER statement is idempotent. +If any values change the database will return a duplicate user error.

+ + +
> CREATE USER todd WITH PASSWORD '123456' WITH ALL PRIVILEGES
+> CREATE USER todd WITH PASSWORD '123456' WITH ALL PRIVILEGES
+> CREATE USER todd WITH PASSWORD '123' WITH ALL PRIVILEGES
+ERR: user already exists
+> CREATE USER todd WITH PASSWORD '123456'
+ERR: user already exists
+> CREATE USER todd WITH PASSWORD '123456' WITH ALL PRIVILEGES
+>
+
+
GRANT administrative privileges to an existing user
+ + +
GRANT ALL PRIVILEGES TO <username>
+
REVOKE administrative privileges from an admin user
+ + +
REVOKE ALL PRIVILEGES FROM <username>
+
SHOW all existing users and their admin status
+ + +
SHOW USERS
+
CLI Example
+ + +
> SHOW USERS
+user 	   admin
+todd     false
+paul     true
+hermione false
+dobby    false
+

Non-admin user management

+
CREATE a new non-admin user
+ + +
CREATE USER <username> WITH PASSWORD '<password>'
+
CLI example
+ + +
CREATE USER todd WITH PASSWORD 'influxdb41yf3'
+CREATE USER alice WITH PASSWORD 'wonder\'land'
+CREATE USER "rachel_smith" WITH PASSWORD 'asdf1234!'
+CREATE USER "monitoring-robot" WITH PASSWORD 'XXXXX'
+CREATE USER "$savyadmin" WITH PASSWORD 'm3tr1cL0v3r'
+ +
+ + +
Important notes about providing user credentials
+
    +
  • The user value must be wrapped in double quotes if it starts with a digit, is an InfluxQL keyword, contains a hyphen and or includes any special characters, for example: !@#$%^&*()-
  • +
  • The password string must be wrapped in single quotes. +Do not include the single quotes when authenticating requests. +We recommend avoiding the single quote (') and backslash (\) characters in passwords. +For passwords that include these characters, escape the special character with a backslash (for example, (\') when creating the password and when submitting authentication requests.
  • +
  • Repeating the exact CREATE USER statement is idempotent. If any values change the database will return a duplicate user error. See GitHub Issue #6890 for details.
  • +
+
CLI example
+ + +
> CREATE USER "todd" WITH PASSWORD '123456'
+> CREATE USER "todd" WITH PASSWORD '123456'
+> CREATE USER "todd" WITH PASSWORD '123'
+ERR: user already exists
+> CREATE USER "todd" WITH PASSWORD '123456'
+> CREATE USER "todd" WITH PASSWORD '123456' WITH ALL PRIVILEGES
+ERR: user already exists
+> CREATE USER "todd" WITH PASSWORD '123456'
+>
+
+
GRANT READ, WRITE or ALL database privileges to an existing user
+ + +
GRANT [READ,WRITE,ALL] ON <database_name> TO <username>
+

CLI examples:

+

GRANT READ access to todd on the NOAA_water_database database:

+ + +
GRANT READ ON "NOAA_water_database" TO "todd"
+

GRANT ALL access to todd on the NOAA_water_database database:

+ + +
GRANT ALL ON "NOAA_water_database" TO "todd"
+
REVOKE READ, WRITE, or ALL database privileges from an existing user
+ + +
REVOKE [READ,WRITE,ALL] ON <database_name> FROM <username>
+

CLI examples:

+

REVOKE ALL privileges from todd on the NOAA_water_database database:

+ + +
REVOKE ALL ON "NOAA_water_database" FROM "todd"
+

REVOKE WRITE privileges from todd on the NOAA_water_database database:

+ + +
REVOKE WRITE ON "NOAA_water_database" FROM "todd"
+ +
+

Note: If a user with ALL privileges has WRITE privileges revoked, they are left with READ privileges, and vice versa.

+ +
+
SHOW a user’s database privileges
+ + +
SHOW GRANTS FOR <user_name>
+

CLI example:

+ + +
> SHOW GRANTS FOR "todd"
+database		            privilege
+NOAA_water_database	        WRITE
+another_database_name	      READ
+yet_another_database_name   ALL PRIVILEGES
+one_more_database_name      NO PRIVILEGES
+

General admin and non-admin user management

+
Reset a user’s password
+ + +
SET PASSWORD FOR <username> = '<password>'
+

CLI example:

+ + +
SET PASSWORD FOR "todd" = 'influxdb4ever'
+ +
+ + +

The password string must be wrapped in single quotes. +Do not include the single quotes when authenticating requests.

+

We recommend avoiding the single quote (') and backslash (\) characters in passwords +For passwords that include these characters, escape the special character with a backslash (for example, (\') when creating the password and when submitting authentication requests.

+
+
DROP a user
+ + +
DROP USER <username>
+

CLI example:

+ + +
DROP USER "todd"
+

Authentication and authorization HTTP errors

+

Requests with no authentication credentials or incorrect credentials yield the HTTP 401 Unauthorized response.

+

Requests by unauthorized users yield the HTTP 403 Forbidden response.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/flux/get-started/syntax-basics/index.html b/pr-preview/pr-6948/influxdb/v1/flux/get-started/syntax-basics/index.html new file mode 100644 index 000000000..d3a40bf26 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/flux/get-started/syntax-basics/index.html @@ -0,0 +1,2685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Flux syntax basics | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Flux syntax basics

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Flux, at its core, is a scripting language designed specifically for working with data. +This guide walks through a handful of simple expressions and how they are handled in Flux.

+

Use the influx CLI

+

Use the influx CLI in “Flux mode” as you follow this guide. +When started with -type=flux and -path-prefix=/api/v2/query, the influx +CLI is an interactive read-eval-print-loop (REPL) that supports Flux syntax.

+
Start in the influx CLI in Flux mode
+ + +
influx -type=flux -path-prefix=/api/v2/query
+ +
+

If using the InfluxData Sandbox, use the ./sandbox enter +command to enter the influxdb container, where you can start the influx CLI in Flux mode. +You will also need to specify the host as influxdb to connect to InfluxDB over the Docker network.

+ +
+ + +
./sandbox enter influxdb
+
+root@9bfc3c08579c:/# influx -host influxdb -type=flux -path-prefix=/api/v2/query
+

Basic Flux syntax

+

The code blocks below provide commands that illustrate the basic syntax of Flux. +Run these commands in the influx CLI’s Flux REPL.

+

Simple expressions

+

Flux is a scripting language that supports basic expressions. +For example, simple addition:

+ + +
> 1 + 1
+2
+

Variables

+

Assign an expression to a variable using the assignment operator, =.

+ + +
s = "this is a string"
+i = 1 // an integer
+f = 2.0 // a floating point number
+
+

Type the name of a variable to print its value:

+ + +
> s
+this is a string
+> i
+1
+> f
+2
+

Records

+

Flux also supports records. Each value in a record can be a different data type.

+ + +
o = {name:"Jim", age: 42, "favorite color": "red"}
+

Use dot notation to access a properties of a record:

+ + +
> o.name
+Jim
+> o.age
+42
+

Or bracket notation:

+ + +
> o["name"]
+Jim
+> o["age"]
+42
+> o["favorite color"]
+red
+ +
+

Use bracket notation to reference record properties with special or +white space characters in the property key.

+ +
+ +

Lists

+

Flux supports lists. List values must be the same type.

+ + +
> n = 4
+> l = [1,2,3,n]
+> l
+[1, 2, 3, 4]
+

Functions

+

Flux uses functions for most of its heavy lifting. +Below is a simple function that squares a number, n.

+ + +
> square = (n) => n * n
+> square(n:3)
+9
+ +
+

Flux does not support positional arguments or parameters. +Parameters must always be named when calling a function.

+ +
+

Pipe-forward operator

+

Flux uses the pipe-forward operator (|>) extensively to chain operations together. +After each function or operation, Flux returns a table or collection of tables containing data. +The pipe-forward operator pipes those tables into the next function where they are further processed or manipulated.

+ + +
data |> someFunction() |> anotherFunction()
+

Real-world application of basic syntax

+

This likely seems familiar if you’ve already been through through the other getting started guides. +Flux’s syntax is inspired by JavaScript and other functional scripting languages. +As you begin to apply these basic principles in real-world use cases such as creating data stream variables, +custom functions, etc., the power of Flux and its ability to query and process data will become apparent.

+

The examples below provide both multi-line and single-line versions of each input command. +Carriage returns in Flux aren’t necessary, but do help with readability. +Both single- and multi-line commands can be copied and pasted into the influx CLI running in Flux mode.

+ +
+ + + + + + + + +
+

Define data stream variables

+

A common use case for variable assignments in Flux is creating variables for one +or more input data streams.

+ + +
timeRange = -1h
+
+cpuUsageUser =
+  from(bucket:"telegraf/autogen")
+    |> range(start: timeRange)
+    |> filter(fn: (r) =>
+      r._measurement == "cpu" and
+      r._field == "usage_user" and
+      r.cpu == "cpu-total"
+    )
+
+memUsagePercent =
+  from(bucket:"telegraf/autogen")
+    |> range(start: timeRange)
+    |> filter(fn: (r) =>
+      r._measurement == "mem" and
+      r._field == "used_percent"
+    )
+

These variables can be used in other functions, such as join(), while keeping the syntax minimal and flexible.

+

Define custom functions

+

Create a function that returns the N number rows in the input stream with the highest _values. +To do this, pass the input stream (tables) and the number of results to return (n) into a custom function. +Then using Flux’s sort() and limit() functions to find the top n results in the data set.

+ + +
topN = (tables=<-, n) =>
+  tables
+    |> sort(desc: true)
+    |> limit(n: n)
+

More information about creating custom functions is available in the Custom functions documentation.

+

Using this new custom function topN and the cpuUsageUser data stream variable defined above, +find the top five data points and yield the results.

+ + +
cpuUsageUser
+  |> topN(n:5)
+  |> yield()
+ +
+ + + +
+

Define data stream variables

+

A common use case for variable assignments in Flux is creating variables for multiple filtered input data streams.

+ + +
timeRange = -1h
+cpuUsageUser = from(bucket:"telegraf/autogen") |> range(start: timeRange) |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_user" and r.cpu == "cpu-total")
+memUsagePercent = from(bucket:"telegraf/autogen") |> range(start: timeRange) |> filter(fn: (r) => r._measurement == "mem" and r._field == "used_percent")
+

These variables can be used in other functions, such as join(), while keeping the syntax minimal and flexible.

+

Define custom functions

+

Let’s create a function that returns the N number rows in the input data stream with the highest _values. +To do this, pass the input stream (tables) and the number of results to return (n) into a custom function. +Then using Flux’s sort() and limit() functions to find the top n results in the data set.

+ + +
topN = (tables=<-, n) => tables |> sort(desc: true) |> limit(n: n)
+

More information about creating custom functions is available in the Custom functions documentation.

+

Using the cpuUsageUser data stream variable defined above, +find the top five data points with the custom topN function and yield the results.

+ + +
cpuUsageUser |> topN(n:5) |> yield()
+ +
+ + +
+ +

This query will return the five data points with the highest user CPU usage over the last hour.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/guides/downsample_and_retain/index.html b/pr-preview/pr-6948/influxdb/v1/guides/downsample_and_retain/index.html new file mode 100644 index 000000000..aa6280881 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/guides/downsample_and_retain/index.html @@ -0,0 +1,2675 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Downsample and retain data | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Downsample and retain data

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxDB can handle hundreds of thousands of data points per second. Working with that much data over a long period of time can create storage concerns. +A natural solution is to downsample the data; keep the high precision raw data for only a limited time, and store the lower precision, summarized data longer. +This guide describes how to automate the process of downsampling data and expiring old data using InfluxQL. To downsample and retain data using Flux and InfluxDB 2.0, +see Process data with InfluxDB tasks.

+

Definitions

+
    +
  • +

    Continuous query (CQ) is an InfluxQL query that runs automatically and periodically within a database. +CQs require a function in the SELECT clause and must include a GROUP BY time() clause.

    +
  • +
  • +

    Retention policy (RP) is the part of InfluxDB data structure that describes for how long InfluxDB keeps data. +InfluxDB compares your local server’s timestamp to the timestamps on your data and deletes data older than the RP’s DURATION. +A single database can have several RPs and RPs are unique per database.

    +
  • +
+

This guide doesn’t go into detail about the syntax for creating and managing CQs and RPs or tasks. +If you’re new to these concepts, we recommend reviewing the following:

+ +

Sample data

+

This section uses fictional real-time data to track the number of food orders +to a restaurant via phone and via website at ten second intervals. +We store this data in a database or bucket called food_data, in +the measurement orders, and +in the fields phone and website.

+

Sample:

+ + +
name: orders
+------------
+time                   phone   website
+2016-05-10T23:18:00Z   10      30
+2016-05-10T23:18:10Z   12      39
+2016-05-10T23:18:20Z   11      56
+

Goal

+

Assume that, in the long run, we’re only interested in the average number of orders by phone +and by website at 30 minute intervals. +In the next steps, we use RPs and CQs to:

+
    +
  • Automatically aggregate the ten-second resolution data to 30-minute resolution data
  • +
  • Automatically delete the raw, ten-second resolution data that are older than two hours
  • +
  • Automatically delete the 30-minute resolution data that are older than 52 weeks
  • +
+

Database preparation

+

We perform the following steps before writing the data to the database +food_data. +We do this before inserting any data because CQs only run against recent +data; that is, data with timestamps that are no older than now() minus +the FOR clause of the CQ, or now() minus the GROUP BY time() interval if +the CQ has no FOR clause.

+

1. Create the database

+ + +
CREATE DATABASE "food_data"
+

2. Create a two-hour DEFAULT retention policy

+

InfluxDB writes to the DEFAULT retention policy if we do not supply an explicit RP when +writing a point to the database. +We make the DEFAULT RP keep data for two hours, because we want InfluxDB to +automatically write the incoming ten-second resolution data to that RP.

+

Use the +CREATE RETENTION POLICY +statement to create a DEFAULT RP:

+ + +
CREATE RETENTION POLICY "two_hours" ON "food_data" DURATION 2h REPLICATION 1 DEFAULT
+

That query creates an RP called two_hours that exists in the database +food_data. +two_hours keeps data for a DURATION of two hours (2h) and it’s the DEFAULT +RP for the database food_data.

+ +
+

The replication factor (REPLICATION 1) is a required parameter but must always +be set to 1 for single node instances.

+ +
+ + +
+

Note: When we created the food_data database in step 1, InfluxDB +automatically generated an RP named autogen and set it as the DEFAULT +RP for the database. +The autogen RP has an infinite retention period. +With the query above, the RP two_hours replaces autogen as the DEFAULT RP +for the food_data database.

+ +
+

3. Create a 52-week retention policy

+

Next we want to create another retention policy that keeps data for 52 weeks and is not the +DEFAULT retention policy (RP) for the database. +Ultimately, the 30-minute rollup data will be stored in this RP.

+

Use the +CREATE RETENTION POLICY +statement to create a non-DEFAULT retention policy:

+ + +
CREATE RETENTION POLICY "a_year" ON "food_data" DURATION 52w REPLICATION 1
+

That query creates a retention policy (RP) called a_year that exists in the database +food_data. +The a_year setting keeps data for a DURATION of 52 weeks (52w). +Leaving out the DEFAULT argument ensures that a_year is not the DEFAULT +RP for the database food_data. +That is, write and read operations against food_data that do not specify an +RP will still go to the two_hours RP (the DEFAULT RP).

+

4. Create the continuous query

+

Now that we’ve set up our RPs, we want to create a continuous query (CQ) that will automatically +and periodically downsample the ten-second resolution data to the 30-minute +resolution, and then store those results in a different measurement with a different +retention policy.

+

Use the +CREATE CONTINUOUS QUERY +statement to generate a CQ:

+ + +
> CREATE CONTINUOUS QUERY "cq_30m" ON "food_data" BEGIN
+  SELECT mean("website") AS "mean_website",mean("phone") AS "mean_phone"
+  INTO "a_year"."downsampled_orders"
+  FROM "orders"
+  GROUP BY time(30m)
+END
+

That query creates a CQ called cq_30m in the database food_data. +cq_30m tells InfluxDB to calculate the 30-minute average of the two fields +website and phone in the measurement orders and in the DEFAULT RP +two_hours. +It also tells InfluxDB to write those results to the measurement +downsampled_orders in the retention policy a_year with the field keys +mean_website and mean_phone. +InfluxDB will run this query every 30 minutes for the previous 30 minutes.

+ +
+

Note: Notice that we fully qualify (that is, we use the syntax +"<retention_policy>"."<measurement>") the measurement in the INTO +clause. +InfluxDB requires that syntax to write data to an RP other than the DEFAULT +RP.

+ +
+

Results

+

With the new CQ and two new RPs, food_data is ready to start receiving data. +After writing data to our database and letting things run for a bit, we see +two measurements: orders and downsampled_orders.

+ + +
> SELECT * FROM "orders" LIMIT 5
+name: orders
+---------
+time                    phone  website
+2016-05-13T23:00:00Z    10     30
+2016-05-13T23:00:10Z    12     39
+2016-05-13T23:00:20Z    11     56
+2016-05-13T23:00:30Z    8      34
+2016-05-13T23:00:40Z    17     32
+
+> SELECT * FROM "a_year"."downsampled_orders" LIMIT 5
+name: downsampled_orders
+---------------------
+time                    mean_phone  mean_website
+2016-05-13T15:00:00Z    12          23
+2016-05-13T15:30:00Z    13          32
+2016-05-13T16:00:00Z    19          21
+2016-05-13T16:30:00Z    3           26
+2016-05-13T17:00:00Z    4           23
+

The data in orders are the raw, ten-second resolution data that reside in the +two-hour RP. +The data in downsampled_orders are the aggregated, 30-minute resolution data +that are subject to the 52-week RP.

+

Notice that the first timestamps in downsampled_orders are older than the first +timestamps in orders. +This is because InfluxDB has already deleted data from orders with timestamps +that are older than our local server’s timestamp minus two hours (assume we +executed the SELECT queries at 2016-05-14T00:59:59Z). +InfluxDB will only start dropping data from downsampled_orders after 52 weeks.

+ +
+

Notes:

+ +
+
    +
  • Notice that we fully qualify (that is, we use the syntax +"<retention_policy>"."<measurement>") downsampled_orders in +the second SELECT statement. We must specify the RP in that query to SELECT +data that reside in an RP other than the DEFAULT RP.
  • +
+ +
+ +
+
    +
  • By default, InfluxDB checks to enforce an RP every 30 minutes. +Between checks, orders may have data that are older than two hours. +The rate at which InfluxDB checks to enforce an RP is a configurable setting, +see +Database Configuration.
  • +
+

Using a combination of RPs and CQs, we’ve successfully set up our database to +automatically keep the high precision raw data for a limited time, create lower +precision data, and store that lower precision data for a longer period of time. +Now that you have a general understanding of how these features can work +together, check out the detailed documentation on CQs and RPs +to see all that they can do for you.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/introduction/get-started/index.html b/pr-preview/pr-6948/influxdb/v1/introduction/get-started/index.html new file mode 100644 index 000000000..907cbf3c4 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/introduction/get-started/index.html @@ -0,0 +1,2666 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Get started with InfluxDB OSS v1 | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Get started with InfluxDB OSS v1

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

With InfluxDB installed, you’re ready to start working with time series data. +This guide uses the influx command line interface (CLI), which is included with InfluxDB +and provides direct access to the database. +The CLI communicates with InfluxDB through the HTTP API on port 8086.

+ +
+ + +

Docker users: Access the CLI from your container using:

+ + +
docker exec -it <container-name> influx
+
+ +
+ + +

Directly access the API

+

You can also interact with InfluxDB using the HTTP API directly. +See Writing Data and Querying Data for examples using curl.

+
+

Creating a database

+

After installing InfluxDB locally, the influx command is available from your terminal. +Running influx starts the CLI and connects to your local InfluxDB instance +(ensure InfluxDB is running with service influxdb start or influxd). +To start the CLI and connect to the local InfluxDB instance, run the following command. +The -precision argument specifies the format and precision of any returned timestamps.

+ + +
$ influx -precision rfc3339
+Connected to http://localhost:8086 version 1.12.3
+InfluxDB shell 1.12.3
+>
+

The influx CLI connects to port localhost:8086 (the default). +The timestamp precision rfc3339 tells InfluxDB to return timestamps in RFC3339 format (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ).

+

To view available options for customizing CLI connection parameters or other settings, run influx --help in your terminal.

+

The command line is ready to take input in the form of the Influx Query Language (InfluxQL) statements. +To exit the InfluxQL shell, type exit and hit return.

+

A fresh install of InfluxDB has no databases (apart from the system _internal), +so creating one is our first task. +You can create a database with the CREATE DATABASE <db-name> InfluxQL statement, +where <db-name> is the name of the database you wish to create. +Names of databases can contain any unicode character as long as the string is double-quoted. +Names can also be left unquoted if they contain only ASCII letters, +digits, or underscores and do not begin with a digit.

+

Throughout this guide, we’ll use the database name mydb:

+ + +
CREATE DATABASE mydb
+ +
+

Note: After hitting enter, a new prompt appears and nothing else is displayed. +In the CLI, this means the statement was executed and there were no errors to display. +There will always be an error displayed if something went wrong.

+ +
+

Now that the mydb database is created, we’ll use the SHOW DATABASES statement +to display all existing databases:

+ + +
> SHOW DATABASES
+name: databases
+name
+----
+_internal
+mydb
+
+>
+ +
+

Note: The _internal database is created and used by InfluxDB to store internal runtime metrics. +Check it out later to get an interesting look at how InfluxDB is performing under the hood.

+ +
+

Unlike SHOW DATABASES, most InfluxQL statements must operate against a specific database. +You may explicitly name the database with each query, +but the CLI provides a convenience statement, USE <db-name>, +which will automatically set the database for all future requests. For example:

+ + +
> USE mydb
+Using database mydb
+>
+

Now future commands will only be run against the mydb database.

+

Writing and exploring data

+

Now that we have a database, InfluxDB is ready to accept queries and writes.

+

First, a short primer on the datastore. +Data in InfluxDB is organized by “time series”, +which contain a measured value, like “cpu_load” or “temperature”. +Time series have zero to many points, one for each discrete sample of the metric. +Points consist of time (a timestamp), a measurement (“cpu_load”, for example), +at least one key-value field (the measured value itself, e.g. +“value=0.64”, or “temperature=21.2”), and zero to many key-value tags containing any metadata about the value (e.g. +“host=server01”, “region=EMEA”, “dc=Frankfurt”).

+

Conceptually you can think of a measurement as an SQL table, +where the primary index is always time. +tags and fields are effectively columns in the table. +tags are indexed, and fields are not. +The difference is that, with InfluxDB, you can have millions of measurements, +you don’t have to define schemas up-front, and null values aren’t stored.

+

Points are written to InfluxDB using the InfluxDB line protocol, which follows the following format:

+ + +
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
+

The following lines are all examples of points that can be written to InfluxDB:

+ + +
cpu,host=serverA,region=us_west value=0.64
+payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230
+stock,symbol=AAPL bid=127.46,ask=127.48
+temperature,machine=unit42,type=assembly external=25,internal=37 1434067467000000000
+ +
+

Note: For details on the InfluxDB line protocol, see InfluxDB line protocol syntax page.

+ +
+

To insert a single time series data point into InfluxDB using the CLI, enter INSERT followed by a point:

+ + +
INSERT cpu,host=serverA,region=us_west value=0.64
+

A point with the measurement name of cpu and tags host and region has now been written to the database, with the measured value of 0.64.

+

Now we will query for the data we just wrote:

+ + +
> SELECT "host", "region", "value" FROM "cpu"
+name: cpu
+---------
+time		    	                     host     	region   value
+2015-10-21T19:28:07.580664347Z  serverA	  us_west	 0.64
+
+>
+ +
+

Note: We did not supply a timestamp when writing our point. +When no timestamp is supplied for a point, InfluxDB assigns the local current timestamp when the point is ingested. +That means your timestamp will be different.

+ +
+

Let’s try storing another type of data, with two fields in the same measurement:

+ + +
INSERT temperature,machine=unit42,type=assembly external=25,internal=37
+

To return all fields and tags with a query, you can use the * operator:

+ + +
> SELECT * FROM "temperature"
+name: temperature
+-----------------
+time		                        	 external	  internal	 machine	type
+2015-10-21T19:28:08.385013942Z  25	        	37     		unit42  assembly
+
+>
+ +
+

Warning: Using * without a LIMIT clause on a large database can cause performance issues. +You can use Ctrl+C to cancel a query that is taking too long to respond.

+ +
+ +

InfluxQL has many features and keywords that are not covered here, +including support for Go-style regex. For example:

+ + +
> SELECT * FROM /.*/ LIMIT 1
+--
+> SELECT * FROM "cpu_load_short"
+--
+> SELECT * FROM "cpu_load_short" WHERE "value" > 0.9
+

Using the HTTP API

+

You can also interact with InfluxDB using HTTP requests with tools like curl:

+

Create a database

+ + +
curl -G http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb"
+

Write data

+ + +
curl -i -XPOST 'http://localhost:8086/write?db=mydb' \
+  --data-binary 'cpu,host=serverA,region=us_west value=0.64'
+

Query data

+ + +
curl -G 'http://localhost:8086/query?pretty=true' \
+  --data-urlencode "db=mydb" \
+  --data-urlencode "q=SELECT * FROM cpu"
+

Next steps

+

This is all you need to know to write data into InfluxDB and query it back. +To learn more about the InfluxDB write protocol, +check out the guide on Writing Data. +To further explore the query language, +check out the guide on Querying Data. +For more information on InfluxDB concepts, check out the Key Concepts page.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/query_language/continuous_queries/index.html b/pr-preview/pr-6948/influxdb/v1/query_language/continuous_queries/index.html new file mode 100644 index 000000000..f97abc77c --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/query_language/continuous_queries/index.html @@ -0,0 +1,3274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxQL Continuous Queries | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxQL Continuous Queries

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Introduction

+

Continuous queries (CQ) are InfluxQL queries that run automatically and +periodically on realtime data and store query results in a +specified measurement.

+ + + + + + + + + + + + + + + + +
Basic SyntaxAdvanced SyntaxCQ Management
Examples of Basic SyntaxExamples of Advanced SyntaxCQ Use Cases
Common Issues with Basic SyntaxCommon Issues with Advanced SyntaxFurther information
+

Syntax

+

Basic syntax

+ + +
CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
+BEGIN
+  <cq_query>
+END
+

Description of basic syntax

+
The cq_query
+

The cq_query requires a +function, +an INTO clause, +and a GROUP BY time() clause:

+ + +
SELECT <function[s]> INTO <destination_measurement> FROM <measurement> [WHERE <stuff>] GROUP BY time(<interval>)[,<tag_key[s]>]
+ +
+

Note: Notice that the cq_query does not require a time range in a WHERE clause. +InfluxDB automatically generates a time range for the cq_query when it executes the CQ. +Any user-specified time ranges in the cq_query’s WHERE clause will be ignored +by the system.

+ +
+
Schedule and coverage
+

Continuous queries operate on real-time data. +They use the local server’s timestamp, the GROUP BY time() interval, and +InfluxDB database’s preset time boundaries to determine when to execute and what time +range to cover in the query.

+

CQs execute at the same interval as the cq_query’s GROUP BY time() interval, +and they run at the start of the InfluxDB database’s preset time boundaries. +If the GROUP BY time() interval is one hour, the CQ executes at the start of +every hour.

+

When the CQ executes, it runs a single query for the time range between +now() and now() minus the +GROUP BY time() interval. +If the GROUP BY time() interval is one hour and the current time is 17:00, +the query’s time range is between 16:00 and 16:59.999999999.

+

Examples of basic syntax

+

The examples below use the following sample data in the transportation +database. +The measurement bus_data stores 15-minute resolution data on the number of bus +passengers and complaints:

+ + +
name: bus_data
+--------------
+time                   passengers   complaints
+2016-08-28T07:00:00Z   5            9
+2016-08-28T07:15:00Z   8            9
+2016-08-28T07:30:00Z   8            9
+2016-08-28T07:45:00Z   7            9
+2016-08-28T08:00:00Z   8            9
+2016-08-28T08:15:00Z   15           7
+2016-08-28T08:30:00Z   15           7
+2016-08-28T08:45:00Z   17           7
+2016-08-28T09:00:00Z   20           7
+
Automatically downsampling data
+

Use a simple CQ to automatically downsample data from a single field +and write the results to another measurement in the same database.

+ + +
CREATE CONTINUOUS QUERY "cq_basic" ON "transportation"
+BEGIN
+  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h)
+END
+

cq_basic calculates the average hourly number of passengers from the +bus_data measurement and stores the results in the average_passengers +measurement in the transportation database.

+

cq_basic executes at one-hour intervals, the same interval as the +GROUP BY time() interval. +Every hour, cq_basic runs a single query that covers the time range between +now() and now() minus the GROUP BY time() interval, that is, the time +range between now() and one hour prior to now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **8:00** `cq_basic` executes a query with the time range `time >= '7:00' AND time < '08:00'`.
+`cq_basic` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:00:00Z   7
+>
+At **9:00** `cq_basic` executes a query with the time range `time >= '8:00' AND time < '9:00'`.
+`cq_basic` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T08:00:00Z   13.75
+

Here are the results:

+ + +
> SELECT * FROM "average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T07:00:00Z   7
+2016-08-28T08:00:00Z   13.75
+
Automatically downsampling data into another retention policy
+

Fully qualify +the destination measurement to store the downsampled data in a non-DEFAULT +retention policy (RP).

+ + +
CREATE CONTINUOUS QUERY "cq_basic_rp" ON "transportation"
+BEGIN
+  SELECT mean("passengers") INTO "transportation"."three_weeks"."average_passengers" FROM "bus_data" GROUP BY time(1h)
+END
+

cq_basic_rp calculates the average hourly number of passengers from the +bus_data measurement and stores the results in the transportation database, +the three_weeks RP, and the average_passengers measurement.

+

cq_basic_rp executes at one-hour intervals, the same interval as the +GROUP BY time() interval. +Every hour, cq_basic_rp runs a single query that covers the time range between +now() and now() minus the GROUP BY time() interval, that is, the time +range between now() and one hour prior to now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **8:00** `cq_basic_rp` executes a query with the time range `time >= '7:00' AND time < '8:00'`.
+`cq_basic_rp` writes one point to the `three_weeks` RP and the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:00:00Z   7
+>
+At **9:00** `cq_basic_rp` executes a query with the time range
+`time >= '8:00' AND time < '9:00'`.
+`cq_basic_rp` writes one point to the `three_weeks` RP and the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T08:00:00Z   13.75
+

Here are the results:

+ + +
> SELECT * FROM "transportation"."three_weeks"."average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T07:00:00Z   7
+2016-08-28T08:00:00Z   13.75
+

cq_basic_rp uses CQs and retention policies to automatically downsample data +and keep those downsampled data for an alternative length of time. +See the Downsampling and Data Retention +guide for an in-depth discussion about this CQ use case.

+
Automatically downsampling a database with backreferencing
+

Use a function with a wildcard (*) and INTO query’s +backreferencing syntax +to automatically downsample data from all measurements and numerical fields in +a database.

+ + +
CREATE CONTINUOUS QUERY "cq_basic_br" ON "transportation"
+BEGIN
+  SELECT mean(*) INTO "downsampled_transportation"."autogen".:MEASUREMENT FROM /.*/ GROUP BY time(30m),*
+END
+

cq_basic_br calculates the 30-minute average of passengers and complaints +from every measurement in the transportation database (in this case, there’s only the +bus_data measurement). +It stores the results in the downsampled_transportation database.

+

cq_basic_br executes at 30 minutes intervals, the same interval as the +GROUP BY time() interval. +Every 30 minutes, cq_basic_br runs a single query that covers the time range +between now() and now() minus the GROUP BY time() interval, that is, +the time range between now() and 30 minutes prior to now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **7:30**, `cq_basic_br` executes a query with the time range `time >= '7:00' AND time < '7:30'`.
+`cq_basic_br` writes two points to the `bus_data` measurement in the `downsampled_transportation` database:
+>
+    name: bus_data
+    --------------
+    time                   mean_complaints   mean_passengers
+    2016-08-28T07:00:00Z   9                 6.5
+>
+At **8:00**, `cq_basic_br` executes a query with the time range `time >= '7:30' AND time < '8:00'`.
+`cq_basic_br` writes two points to the `bus_data` measurement in the `downsampled_transportation` database:
+>
+    name: bus_data
+    --------------
+    time                   mean_complaints   mean_passengers
+    2016-08-28T07:30:00Z   9                 7.5
+>
+[...]
+>
+At **9:00**, `cq_basic_br` executes a query with the time range `time >= '8:30' AND time < '9:00'`.
+`cq_basic_br` writes two points to the `bus_data` measurement in the `downsampled_transportation` database:
+>
+    name: bus_data
+    --------------
+    time                   mean_complaints   mean_passengers
+    2016-08-28T08:30:00Z   7                 16
+

Here are the results:

+ + +
> SELECT * FROM "downsampled_transportation."autogen"."bus_data"
+name: bus_data
+--------------
+time                   mean_complaints   mean_passengers
+2016-08-28T07:00:00Z   9                 6.5
+2016-08-28T07:30:00Z   9                 7.5
+2016-08-28T08:00:00Z   8                 11.5
+2016-08-28T08:30:00Z   7                 16
+
Automatically downsampling data and configuring CQ time boundaries
+

Use an +offset interval +in the GROUP BY time() clause to alter both the CQ’s default execution time and +preset time boundaries.

+ + +
CREATE CONTINUOUS QUERY "cq_basic_offset" ON "transportation"
+BEGIN
+  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h,15m)
+END
+

cq_basic_offsetcalculates the average hourly number of passengers from the +bus_data measurement and stores the results in the average_passengers +measurement.

+

cq_basic_offset executes at one-hour intervals, the same interval as the +GROUP BY time() interval. +The 15 minute offset interval forces the CQ to execute 15 minutes after the +default execution time; cq_basic_offset executes at 8:15 instead of 8:00.

+

Every hour, cq_basic_offset runs a single query that covers the time range +between now() and now() minus the GROUP BY time() interval, that is, the +time range between now() and one hour prior to now(). +The 15 minute offset interval shifts forward the generated preset time boundaries in the +CQ’s WHERE clause; cq_basic_offset queries between 7:15 and 8:14.999999999 instead of 7:00 and 7:59.999999999.

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **8:15** `cq_basic_offset` executes a query with the time range `time >= '7:15' AND time < '8:15'`.
+`cq_basic_offset` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:15:00Z   7.75
+>
+At **9:15** `cq_basic_offset` executes a query with the time range `time >= '8:15' AND time < '9:15'`.
+`cq_basic_offset` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T08:15:00Z   16.75
+

Here are the results:

+ + +
> SELECT * FROM "average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T07:15:00Z   7.75
+2016-08-28T08:15:00Z   16.75
+

Notice that the timestamps are for 7:15 and 8:15 instead of 7:00 and 8:00.

+

Common issues with basic syntax

+
Handling time intervals with no data
+

CQs do not write any results for a time interval if no data fall within that +time range.

+

Note that the basic syntax does not support using +fill() +to change the value reported for intervals with no data. +Basic syntax CQs ignore fill() if it’s included in the CQ query. +A possible workaround is to use the +advanced CQ syntax.

+
Resampling previous time intervals
+

The basic CQ runs a single query that covers the time range between now() +and now() minus the GROUP BY time() interval. +See the advanced syntax for how to configure the query’s +time range.

+
Backfilling results for older data
+

CQs operate on realtime data, that is, data with timestamps that occur +relative to now(). +Use a basic +INTO query +to backfill results for data with older timestamps.

+
Missing tags in the CQ results
+

By default, all +INTO queries +convert any tags in the source measurement to fields in the destination +measurement.

+

Include GROUP BY * in the CQ to preserve tags in the destination measurement.

+

Advanced syntax

+ + +
CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
+RESAMPLE EVERY <interval> FOR <interval>
+BEGIN
+  <cq_query>
+END
+

Description of advanced syntax

+
The cq_query
+

See Description of Basic Syntax.

+
Scheduling and coverage
+

CQs operate on real-time data. With the advanced syntax, CQs use the local +server’s timestamp, the information in the RESAMPLE clause, and the InfluxDB +server’s preset time boundaries to determine when to execute and what time range to +cover in the query.

+

CQs execute at the same interval as the EVERY interval in the RESAMPLE +clause, and they run at the start of InfluxDB’s preset time boundaries. +If the EVERY interval is two hours, InfluxDB executes the CQ at the top of +every other hour.

+

When the CQ executes, it runs a single query for the time range between +now() and now() minus the FOR interval in the RESAMPLE clause. +If the FOR interval is two hours and the current time is 17:00, the query’s +time range is between 15:00 and 16:59.999999999.

+

Both the EVERY interval and the FOR interval accept +duration literals. +The RESAMPLE clause works with either or both of the EVERY and FOR intervals +configured. +CQs default to the relevant +basic syntax behavior +if the EVERY interval or FOR interval is not provided (see the first issue in +Common Issues with Advanced Syntax +for an anomalous case).

+

Examples of advanced syntax

+

The examples below use the following sample data in the transportation database. +The measurement bus_data stores 15-minute resolution data on the number of bus +passengers:

+ + +
name: bus_data
+--------------
+time                   passengers
+2016-08-28T06:30:00Z   2
+2016-08-28T06:45:00Z   4
+2016-08-28T07:00:00Z   5
+2016-08-28T07:15:00Z   8
+2016-08-28T07:30:00Z   8
+2016-08-28T07:45:00Z   7
+2016-08-28T08:00:00Z   8
+2016-08-28T08:15:00Z   15
+2016-08-28T08:30:00Z   15
+2016-08-28T08:45:00Z   17
+2016-08-28T09:00:00Z   20
+
Configuring execution intervals
+

Use an EVERY interval in the RESAMPLE clause to specify the CQ’s execution +interval.

+ + +
CREATE CONTINUOUS QUERY "cq_advanced_every" ON "transportation"
+RESAMPLE EVERY 30m
+BEGIN
+  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h)
+END
+

cq_advanced_every calculates the one-hour average of passengers +from the bus_data measurement and stores the results in the +average_passengers measurement in the transportation database.

+

cq_advanced_every executes at 30-minute intervals, the same interval as the +EVERY interval. +Every 30 minutes, cq_advanced_every runs a single query that covers the time +range for the current time bucket, that is, the one-hour time bucket that +intersects with now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **8:00**, `cq_advanced_every` executes a query with the time range `WHERE time >= '7:00' AND time < '8:00'`.
+`cq_advanced_every` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:00:00Z   7
+>
+At **8:30**, `cq_advanced_every` executes a query with the time range `WHERE time >= '8:00' AND time < '9:00'`.
+`cq_advanced_every` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T08:00:00Z   12.6667
+>
+At **9:00**, `cq_advanced_every` executes a query with the time range `WHERE time >= '8:00' AND time < '9:00'`.
+`cq_advanced_every` writes one point to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T08:00:00Z   13.75
+

Here are the results:

+ + +
> SELECT * FROM "average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T07:00:00Z   7
+2016-08-28T08:00:00Z   13.75
+

Notice that cq_advanced_every calculates the result for the 8:00 time interval +twice. +First, it runs at 8:30 and calculates the average for every available data point +between 8:00 and 9:00 (8,15, and 15). +Second, it runs at 9:00 and calculates the average for every available data +point between 8:00 and 9:00 (8, 15, 15, and 17). +Because of the way InfluxDB +handles duplicate points +, the second result simply overwrites the first result.

+
Configuring time ranges for resampling
+

Use a FOR interval in the RESAMPLE clause to specify the length of the CQ’s +time range.

+ + +
CREATE CONTINUOUS QUERY "cq_advanced_for" ON "transportation"
+RESAMPLE FOR 1h
+BEGIN
+  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(30m)
+END
+

cq_advanced_for calculates the 30-minute average of passengers +from the bus_data measurement and stores the results in the average_passengers +measurement in the transportation database.

+

cq_advanced_for executes at 30-minute intervals, the same interval as the +GROUP BY time() interval. +Every 30 minutes, cq_advanced_for runs a single query that covers the time +range between now() and now() minus the FOR interval, that is, the time +range between now() and one hour prior to now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **8:00** `cq_advanced_for` executes a query with the time range `WHERE time >= '7:00' AND time < '8:00'`.
+`cq_advanced_for` writes two points to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:00:00Z   6.5
+    2016-08-28T07:30:00Z   7.5
+>
+At **8:30** `cq_advanced_for` executes a query with the time range  `WHERE time >= '7:30' AND time < '8:30'`.
+`cq_advanced_for` writes two points to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:30:00Z   7.5
+    2016-08-28T08:00:00Z   11.5
+>
+At **9:00** `cq_advanced_for` executes a query with the time range `WHERE time >= '8:00' AND time < '9:00'`.
+`cq_advanced_for` writes two points to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T08:00:00Z   11.5
+    2016-08-28T08:30:00Z   16
+

Notice that cq_advanced_for will calculate the result for every time interval +twice. +The CQ calculates the average for the 7:30 time interval at 8:00 and at 8:30, +and it calculates the average for the 8:00 time interval at 8:30 and 9:00.

+

Here are the results:

+ + +
> SELECT * FROM "average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T07:00:00Z   6.5
+2016-08-28T07:30:00Z   7.5
+2016-08-28T08:00:00Z   11.5
+2016-08-28T08:30:00Z   16
+
Configuring execution intervals and CQ time ranges
+

Use an EVERY interval and FOR interval in the RESAMPLE clause to specify +the CQ’s execution interval and the length of the CQ’s time range.

+ + +
CREATE CONTINUOUS QUERY "cq_advanced_every_for" ON "transportation"
+RESAMPLE EVERY 1h FOR 90m
+BEGIN
+  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(30m)
+END
+

cq_advanced_every_for calculates the 30-minute average of +passengers from the bus_data measurement and stores the results in the +average_passengers measurement in the transportation database.

+

cq_advanced_every_for executes at one-hour intervals, the same interval as the +EVERY interval. +Every hour, cq_advanced_every_for runs a single query that covers the time +range between now() and now() minus the FOR interval, that is, the time +range between now() and 90 minutes prior to now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **8:00** `cq_advanced_every_for` executes a query with the time range `WHERE time >= '6:30' AND time < '8:00'`.
+`cq_advanced_every_for` writes three points to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T06:30:00Z   3
+    2016-08-28T07:00:00Z   6.5
+    2016-08-28T07:30:00Z   7.5
+>
+At **9:00** `cq_advanced_every_for` executes a query with the time range `WHERE time >= '7:30' AND time < '9:00'`.
+`cq_advanced_every_for` writes three points to the `average_passengers` measurement:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T07:30:00Z   7.5
+    2016-08-28T08:00:00Z   11.5
+    2016-08-28T08:30:00Z   16
+

Notice that cq_advanced_every_for will calculate the result for every time +interval twice. +The CQ calculates the average for the 7:30 interval at 8:00 and 9:00.

+

Here are the results:

+ + +
> SELECT * FROM "average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T06:30:00Z   3
+2016-08-28T07:00:00Z   6.5
+2016-08-28T07:30:00Z   7.5
+2016-08-28T08:00:00Z   11.5
+2016-08-28T08:30:00Z   16
+
Configuring CQ time ranges and filling empty results
+

Use a FOR interval and fill() to change the value reported for time +intervals with no data. +Note that at least one data point must fall within the FOR interval for fill() +to operate. +If no data fall within the FOR interval the CQ writes no points to the +destination measurement.

+ + +
CREATE CONTINUOUS QUERY "cq_advanced_for_fill" ON "transportation"
+RESAMPLE FOR 2h
+BEGIN
+  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h) fill(1000)
+END
+

cq_advanced_for_fill calculates the one-hour average of passengers from the +bus_data measurement and stores the results in the average_passengers +measurement in the transportation database. +Where possible, it writes the value 1000 for time intervals with no results.

+

cq_advanced_for_fill executes at one-hour intervals, the same interval as the +GROUP BY time() interval. +Every hour, cq_advanced_for_fill runs a single query that covers the time +range between now() and now() minus the FOR interval, that is, the time +range between now() and two hours prior to now().

+

Annotated log output on the morning of August 28, 2016:

+ + +
>
+At **6:00**, `cq_advanced_for_fill` executes a query with the time range `WHERE time >= '4:00' AND time < '6:00'`.
+`cq_advanced_for_fill` writes nothing to `average_passengers`; `bus_data` has no data
+that fall within that time range.
+>
+At **7:00**, `cq_advanced_for_fill` executes a query with the time range `WHERE time >= '5:00' AND time < '7:00'`.
+`cq_advanced_for_fill` writes two points to `average_passengers`:
+>
+    name: average_passengers
+    ------------------------
+    time                   mean
+    2016-08-28T05:00:00Z   1000          <------ fill(1000)
+    2016-08-28T06:00:00Z   3             <------ average of 2 and 4
+>
+[...]
+>
+At **11:00**, `cq_advanced_for_fill` executes a query with the time range `WHERE time >= '9:00' AND time < '11:00'`.
+`cq_advanced_for_fill` writes two points to `average_passengers`:
+>
+    name: average_passengers
+    ------------------------
+    2016-08-28T09:00:00Z   20            <------ average of 20
+    2016-08-28T10:00:00Z   1000          <------ fill(1000)
+>
+

At 12:00, cq_advanced_for_fill executes a query with the time range WHERE time >= '10:00' AND time < '12:00'. +cq_advanced_for_fill writes nothing to average_passengers; bus_data has no data +that fall within that time range.

+

Here are the results:

+ + +
> SELECT * FROM "average_passengers"
+name: average_passengers
+------------------------
+time                   mean
+2016-08-28T05:00:00Z   1000
+2016-08-28T06:00:00Z   3
+2016-08-28T07:00:00Z   7
+2016-08-28T08:00:00Z   13.75
+2016-08-28T09:00:00Z   20
+2016-08-28T10:00:00Z   1000
+ +
+

Note: fill(previous) doesn’t fill the result for a time interval if the +previous value is outside the query’s time range. +See Frequently Asked Questions +for more information.

+ +
+

Common issues with advanced syntax

+
If the EVERY interval is greater than the GROUP BY time() interval
+

If the EVERY interval is greater than the GROUP BY time() interval, the CQ +executes at the same interval as the EVERY interval and runs a single query +that covers the time range between now() and now() minus the EVERY +interval (not between now() and now() minus the GROUP BY time() interval).

+

For example, if the GROUP BY time() interval is 5m and the EVERY interval +is 10m, the CQ executes every ten minutes. +Every ten minutes, the CQ runs a single query that covers the time range +between now() and now() minus the EVERY interval, that is, the time +range between now() and ten minutes prior to now().

+

This behavior is intentional and prevents the CQ from missing data between +execution times.

+
If the FOR interval is less than the execution interval
+

If the FOR interval is less than the GROUP BY time() interval or, if +specified, the EVERY interval, InfluxDB returns the following error:

+ + +
error parsing query: FOR duration must be >= GROUP BY time duration: must be a minimum of <minimum-allowable-interval> got <user-specified-interval>
+

To avoid missing data between execution times, the FOR interval must be equal +to or greater than the GROUP BY time() interval or, if specified, the EVERY +interval.

+

Currently, this is the intended behavior. +GitHub Issue #6963 +outlines a feature request for CQs to support gaps in data coverage.

+

Continuous query management

+

Only admin users are allowed to work with CQs. For more on user privileges, see Authentication and Authorization.

+

Listing continuous queries

+

List every CQ on an InfluxDB instance with:

+ + +
SHOW CONTINUOUS QUERIES
+

SHOW CONTINUOUS QUERIES groups results by database.

+
Examples
+

The output shows that the telegraf and mydb databases have CQs:

+ + +
> SHOW CONTINUOUS QUERIES
+name: _internal
+---------------
+name   query
+
+
+name: telegraf
+--------------
+name           query
+idle_hands     CREATE CONTINUOUS QUERY idle_hands ON telegraf BEGIN SELECT min(usage_idle) INTO telegraf.autogen.min_hourly_cpu FROM telegraf.autogen.cpu GROUP BY time(1h) END
+feeling_used   CREATE CONTINUOUS QUERY feeling_used ON telegraf BEGIN SELECT mean(used) INTO downsampled_telegraf.autogen.:MEASUREMENT FROM telegraf.autogen./.*/ GROUP BY time(1h) END
+
+
+name: downsampled_telegraf
+--------------------------
+name   query
+
+
+name: mydb
+----------
+name      query
+vampire   CREATE CONTINUOUS QUERY vampire ON mydb BEGIN SELECT count(dracula) INTO mydb.autogen.all_of_them FROM mydb.autogen.one GROUP BY time(5m) END
+

Deleting continuous queries

+

Delete a CQ from a specific database with:

+ + +
DROP CONTINUOUS QUERY <cq_name> ON <database_name>
+

DROP CONTINUOUS QUERY returns an empty result.

+
Examples
+

Drop the idle_hands CQ from the telegraf database:

+ + +
DROP CONTINUOUS QUERY "idle_hands" ON "telegraf"
+

Altering continuous queries

+

CQs cannot be altered once they’re created. +To change a CQ, you must DROP and reCREATE it with the updated settings.

+

Continuous query statistics

+

If query-stats-enabled is set to true in your influxdb.conf or using the INFLUXDB_CONTINUOUS_QUERIES_QUERY_STATS_ENABLED environment variable, data will be written to _internal with information about when continuous queries ran and their duration. +Information about CQ configuration settings is available in the Configuration documentation.

+ +
+

Note: _internal houses internal system data and is meant for internal use. +The structure of and data stored in _internal can change at any time. +Use of this data falls outside the scope of official InfluxData support.

+ +
+

Continuous query use cases

+

Downsampling and Data Retention

+

Use CQs with InfluxDB database +retention policies +(RPs) to mitigate storage concerns. +Combine CQs and RPs to automatically downsample high precision data to a lower +precision and remove the dispensable, high precision data from the database.

+

See the +Downsampling and data retention +guide for a detailed walkthrough of this common use case.

+

Precalculating expensive queries

+

Shorten query runtimes by pre-calculating expensive queries with CQs. +Use a CQ to automatically downsample commonly queried, high precision data to a +lower precision. +Queries on lower precision data require fewer resources and return faster.

+

Tip: Pre-calculate queries for your preferred graphing tool to accelerate +the population of graphs and dashboards.

+

Substituting for a HAVING clause

+

InfluxQL does not support HAVING clauses. +Get the same functionality by creating a CQ to aggregate the data and querying +the CQ results to apply the HAVING clause.

+ +
+

Note: InfluxQL supports subqueries which also offer similar functionality to HAVING clauses. +See Data Exploration for more information.

+ +
+
Example
+

InfluxDB does not accept the following query with a HAVING clause. +The query calculates the average number of bees at 30 minute intervals and +requests averages that are greater than 20.

+ + +
SELECT mean("bees") FROM "farm" GROUP BY time(30m) HAVING mean("bees") > 20
+

To get the same results:

+

1. Create a CQ

+

This step performs the mean("bees") part of the query above. +Because this step creates CQ you only need to execute it once.

+

The following CQ automatically calculates the average number of bees at +30 minutes intervals and writes those averages to the mean_bees field in the +aggregate_bees measurement.

+ + +
CREATE CONTINUOUS QUERY "bee_cq" ON "mydb" BEGIN SELECT mean("bees") AS "mean_bees" INTO "aggregate_bees" FROM "farm" GROUP BY time(30m) END
+

2. Query the CQ results

+

This step performs the HAVING mean("bees") > 20 part of the query above.

+

Query the data in the measurement aggregate_bees and request values of the mean_bees field that are greater than 20 in the WHERE clause:

+ + +
SELECT "mean_bees" FROM "aggregate_bees" WHERE "mean_bees" > 20
+

Substituting for nested functions

+

Some InfluxQL functions +support nesting +of other functions. +Most do not. +If your function does not support nesting, you can get the same functionality using a CQ to calculate +the inner-most function. +Then simply query the CQ results to calculate the outer-most function.

+ +
+

Note: InfluxQL supports subqueries which also offer the same functionality as nested functions. +See Data Exploration for more information.

+ +
+
Example
+

InfluxDB does not accept the following query with a nested function. +The query calculates the number of non-null values +of bees at 30 minute intervals and the average of those counts:

+ + +
SELECT mean(count("bees")) FROM "farm" GROUP BY time(30m)
+

To get the same results:

+

1. Create a CQ

+

This step performs the count("bees") part of the nested function above. +Because this step creates a CQ you only need to execute it once.

+

The following CQ automatically calculates the number of non-null values of bees at 30 minute intervals +and writes those counts to the count_bees field in the aggregate_bees measurement.

+ + +
CREATE CONTINUOUS QUERY "bee_cq" ON "mydb" BEGIN SELECT count("bees") AS "count_bees" INTO "aggregate_bees" FROM "farm" GROUP BY time(30m) END
+

2. Query the CQ results

+

This step performs the mean([...]) part of the nested function above.

+

Query the data in the measurement aggregate_bees to calculate the average of the +count_bees field:

+ + +
SELECT mean("count_bees") FROM "aggregate_bees" WHERE time >= <start_time> AND time <= <end_time>
+

Further information

+

To see how to combine two InfluxDB features, CQs, and retention policies, +to periodically downsample data and automatically expire the dispensable high +precision data, see Downsampling and data retention.

+

Kapacitor, InfluxData’s data processing engine, can do the same work as +continuous queries in InfluxDB databases.

+

To learn when to use Kapacitor instead of InfluxDB and how to perform the same CQ +functionality with a TICKscript, see examples of continuous queries in Kapacitor.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/query_language/explore-data/index.html b/pr-preview/pr-6948/influxdb/v1/query_language/explore-data/index.html new file mode 100644 index 000000000..837e18b39 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/query_language/explore-data/index.html @@ -0,0 +1,5614 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Explore data using InfluxQL | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Explore data using InfluxQL

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL is an SQL-like query language for interacting with data in InfluxDB. +The following sections detail InfluxQL’s SELECT statement and useful query syntax +for exploring your data.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
The Basics:Configure Query Results:General Tips on Query Syntax:
The SELECT statementORDER BY time DESCTime Syntax
The WHERE clauseThe LIMIT and SLIMIT clausesRegular Expressions
The GROUP BY clauseThe OFFSET and SOFFSET clausesData types and cast operations
The INTO clauseThe Time Zone clauseMerge behavior
Multiple statements
Subqueries
+

Sample data

+

This document uses publicly available data from the +National Oceanic and Atmospheric Administration’s (NOAA) Center for Operational Oceanographic Products and Services. +See the Sample Data page to download +the data and follow along with the example queries in the sections below.

+

Start by logging into the Influx CLI:

+ + +
$ influx -precision rfc3339 -database NOAA_water_database
+Connected to http://localhost:8086 version 1.12.3
+InfluxDB shell 1.12.3
+>
+

Next, get acquainted with this subsample of the data in the h2o_feet measurement:

+

name: h2o_feet

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
timelevel descriptionlocationwater_level
2015-08-18T00:00:00Zbetween 6 and 9 feetcoyote_creek8.12
2015-08-18T00:00:00Zbelow 3 feetsanta_monica2.064
2015-08-18T00:06:00Zbetween 6 and 9 feetcoyote_creek8.005
2015-08-18T00:06:00Zbelow 3 feetsanta_monica2.116
2015-08-18T00:12:00Zbetween 6 and 9 feetcoyote_creek7.887
2015-08-18T00:12:00Zbelow 3 feetsanta_monica2.028
+

The data in the h2o_feet measurement +occur at six-minute time intervals. +The measurement has one tag key +(location) which has two tag values: +coyote_creek and santa_monica. +The measurement also has two fields: +level description stores string field values +and water_level stores float field values. +All of these data is in the NOAA_water_database database.

+ +
+

Disclaimer: The level description field isn’t part of the original NOAA data - we snuck it in there for the sake of having a field key with a special character and string field values.

+ +
+

The basic SELECT statement

+

The SELECT statement queries data from a particular measurement or measurements.

+

Syntax

+ + +
SELECT <field_key>[,<field_key>,<tag_key>] FROM <measurement_name>[,<measurement_name>]
+

The SELECT statement requires a SELECT clause and a FROM clause.

+

SELECT clause

+

The SELECT clause supports several formats for specifying data:

+

SELECT * +          Returns all fields and tags.

+

SELECT "<field_key>" +          Returns a specific field.

+

SELECT "<field_key>","<field_key>" +          Returns more than one field.

+

SELECT "<field_key>","<tag_key>" +          Returns a specific field and tag. +The SELECT clause must specify at least one field when it includes a tag.

+

SELECT "<field_key>"::field,"<tag_key>"::tag +          Returns a specific field and tag. +The ::[field | tag] syntax specifies the identifier’s type. +Use this syntax to differentiate between field keys and tag keys that have the same name.

+

Other supported features: +Arithmetic operations, +Functions, +Basic cast operations, +Regular expressions

+ +
+

Note: The SELECT statement cannot include an aggregate function and a non-aggregate function, field key, or tag key. For more information, see error about mixing aggregate and non-aggregate queries.

+ +
+

FROM clause

+

The FROM clause supports several formats for specifying a measurement(s):

+

FROM <measurement_name> +           +Returns data from a single measurement. +If you’re using the CLI InfluxDB queries the measurement in the +USEd +database and the DEFAULT retention policy. +If you’re using the InfluxDB API InfluxDB queries the +measurement in the database specified in the db query string parameter +and the DEFAULT retention policy.

+

FROM <measurement_name>,<measurement_name> +           +Returns data from more than one measurement.

+

FROM <database_name>.<retention_policy_name>.<measurement_name> +           +Returns data from a fully qualified measurement. +Fully qualify a measurement by specifying its database and retention policy.

+

FROM <database_name>..<measurement_name> +           +Returns data from a measurement in a user-specified database and the DEFAULT +retention policy.

+

Other supported features: +Regular Expressions

+

Quoting

+

Identifiers must be double quoted if they contain characters other than [A-z,0-9,_], if they +begin with a digit, or if they are an InfluxQL keyword. +While not always necessary, we recommend that you double quote identifiers.

+ +
+

Note: The quoting syntax for queries differs from the line protocol. +Please review the rules for single and double-quoting in queries.

+ +
+

Examples

+

Select all fields and tags from a single measurement

+ + +
> SELECT * FROM "h2o_feet"
+
+name: h2o_feet
+--------------
+time                   level description      location       water_level
+2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938
+

The query selects all fields and +tags from the h2o_feet +measurement.

+

If you’re using the CLI be sure to enter +USE NOAA_water_database before you run the query. +The CLI queries the data in the USEd database and the +DEFAULT retention policy. +If you’re using the InfluxDB API be sure to set the +db query string parameter +to NOAA_water_database. +If you do not set the rp query string parameter, the InfluxDB API automatically +queries the database’s DEFAULT retention policy.

+

Select specific tags and fields from a single measurement

+ + +
> SELECT "level description","location","water_level" FROM "h2o_feet"
+
+name: h2o_feet
+--------------
+time                   level description      location       water_level
+2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938
+

The query selects the level description field, the location tag, and the +water_level field. +Note that the SELECT clause must specify at least one field when it includes +a tag.

+

Select specific tags and fields from a single measurement, and provide their identifier type

+ + +
> SELECT "level description"::field,"location"::tag,"water_level"::field FROM "h2o_feet"
+
+name: h2o_feet
+--------------
+time                   level description      location       water_level
+2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938
+

The query selects the level description field, the location tag, and the +water_level field from the h2o_feet measurement. +The ::[field | tag] syntax specifies if the +identifier is a field or tag. +Use ::[field | tag] to differentiate between an identical field key and tag key . +That syntax is not required for most use cases.

+

Select all fields from a single measurement

+ + +
> SELECT *::field FROM "h2o_feet"
+
+name: h2o_feet
+--------------
+time                   level description      water_level
+2015-08-18T00:00:00Z   below 3 feet           2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   4.938
+

The query selects all fields from the h2o_feet measurement. +The SELECT clause supports combining the * syntax with the :: syntax.

+

Select a specific field from a measurement and perform basic arithmetic

+ + +
> SELECT ("water_level" * 2) + 4 FROM "h2o_feet"
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   20.24
+2015-08-18T00:00:00Z   8.128
+[...]
+2015-09-18T21:36:00Z   14.132
+2015-09-18T21:42:00Z   13.876
+

The query multiplies water_level’s field values by two and adds four to those +values. +Note that InfluxDB follows the standard order of operations. +See Mathematical Operators +for more on supported operators.

+

Select all data from more than one measurement

+ + +
> SELECT * FROM "h2o_feet","h2o_pH"
+
+name: h2o_feet
+--------------
+time                   level description      location       pH   water_level
+2015-08-18T00:00:00Z   below 3 feet           santa_monica        2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek        8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica        5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica        4.938
+
+name: h2o_pH
+------------
+time                   level description   location       pH   water_level
+2015-08-18T00:00:00Z                       santa_monica   6
+2015-08-18T00:00:00Z                       coyote_creek   7
+[...]
+2015-09-18T21:36:00Z                       santa_monica   8
+2015-09-18T21:42:00Z                       santa_monica   7
+

The query selects all fields and tags from two measurements: h2o_feet and +h2o_pH. +Separate multiple measurements with a comma (,).

+

Select all data from a fully qualified measurement

+ + +
> SELECT * FROM "NOAA_water_database"."autogen"."h2o_feet"
+
+name: h2o_feet
+--------------
+time                   level description      location       water_level
+2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938
+

The query selects data in the NOAA_water_database, the autogen retention +policy, and the measurement h2o_feet.

+

In the CLI, fully qualify a measurement to query data in a database other +than the USEd database and in a retention policy other than the +DEFAULT retention policy. +In the InfluxDB API, fully qualify a measurement in place of using the db +and rp query string parameters if desired.

+

Select all data from a measurement in a particular database

+ + +
> SELECT * FROM "NOAA_water_database".."h2o_feet"
+
+name: h2o_feet
+--------------
+time                   level description      location       water_level
+2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+[...]
+2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
+2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938
+

The query selects data in the NOAA_water_database, the DEFAULT retention +policy, and the h2o_feet measurement. +The .. indicates the DEFAULT retention policy for the specified database.

+

In the CLI, specify the database to query data in a database other than the +USEd database. +In the InfluxDB API, specify the database in place of using the db query +string parameter if desired.

+

Common issues with the SELECT statement

+

Selecting tag keys in the SELECT clause

+

A query requires at least one field key +in the SELECT clause to return data. +If the SELECT clause only includes a single tag key or several tag keys, the +query returns an empty response. +This behavior is a result of how the system stores data.

+
Example
+

The following query returns no data because it specifies a single tag key (location) in +the SELECT clause:

+ + +
SELECT "location" FROM "h2o_feet"
+

To return any data associated with the location tag key, the query’s SELECT +clause must include at least one field key (water_level):

+ + +
> SELECT "water_level","location" FROM "h2o_feet"
+name: h2o_feet
+time                   water_level  location
+----                   -----------  --------
+2015-08-18T00:00:00Z   8.12         coyote_creek
+2015-08-18T00:00:00Z   2.064        santa_monica
+[...]
+2015-09-18T21:36:00Z   5.066        santa_monica
+2015-09-18T21:42:00Z   4.938        santa_monica
+

The WHERE clause

+

The WHERE filters data based on +fields, +tags, and/or +timestamps.

+

Tired of reading? Check out this InfluxQL Short: +
+

+ +

Syntax

+ + +
SELECT_clause FROM_clause WHERE <conditional_expression> [(AND|OR) <conditional_expression> [...]]
+

The WHERE clause supports conditional_expressions on fields, tags, and +timestamps.

+ +
+

Note InfluxDB does not support using OR in the WHERE clause to specify multiple time ranges. For example, InfluxDB returns an empty response for the following query:

+ +
+

> SELECT * FROM "absolutismus" WHERE time = '2016-07-31T20:07:00Z' OR time = '2016-07-31T23:07:17Z'

+

Fields

+ + +
field_key <operator> ['string' | boolean | float | integer]
+

The WHERE clause supports comparisons against string, boolean, float, +and integer field values.

+

Single quote string field values in the WHERE clause. +Queries with unquoted string field values or double quoted string field values +will not return any data and, in most cases, +will not return an error.

+
Supported operators
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorMeaning
=equal to
<>not equal to
!=not equal to
>greater than
>=greater than or equal to
<less than
<=less than or equal to
+

Other supported features: +Arithmetic Operations, +Regular Expressions

+

Tags

+ + +
tag_key <operator> ['tag_value']
+

Single quote tag values in +the WHERE clause. +Queries with unquoted tag values or double quoted tag values will not return +any data and, in most cases, +will not return an error.

+
Supported operators
+ + + + + + + + + + + + + + + + + + + + + +
OperatorMeaning
=equal to
<>not equal to
!=not equal to
+

Other supported features: +Regular Expressions

+

Timestamps

+

For most SELECT statements, the default time range is between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC. +For SELECT statements with a GROUP BY time() clause, the default time +range is between 1677-09-21 00:12:43.145224194 UTC and now().

+

The Time Syntax section on this page +details how to specify alternative time ranges in the WHERE clause.

+

Examples

+

Select data that have specific field key-values

+ + +
> SELECT * FROM "h2o_feet" WHERE "water_level" > 8
+
+name: h2o_feet
+--------------
+time                   level description      location       water_level
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+2015-08-18T00:06:00Z   between 6 and 9 feet   coyote_creek   8.005
+[...]
+2015-09-18T00:12:00Z   between 6 and 9 feet   coyote_creek   8.189
+2015-09-18T00:18:00Z   between 6 and 9 feet   coyote_creek   8.084
+

The query returns data from the h2o_feet +measurement with +field values of water_level +that are greater than eight.

+

Select data that have a specific string field key-value

+ + +
> SELECT * FROM "h2o_feet" WHERE "level description" = 'below 3 feet'
+
+name: h2o_feet
+--------------
+time                   level description   location       water_level
+2015-08-18T00:00:00Z   below 3 feet        santa_monica   2.064
+2015-08-18T00:06:00Z   below 3 feet        santa_monica   2.116
+[...]
+2015-09-18T14:06:00Z   below 3 feet        santa_monica   2.999
+2015-09-18T14:36:00Z   below 3 feet        santa_monica   2.907
+

The query returns data from the h2o_feet measurement with field values of +level description that equal the below 3 feet string. +InfluxQL requires single quotes around string field values in the WHERE +clause.

+

Select data that have a specific field key-value and perform basic arithmetic

+ + +
> SELECT * FROM "h2o_feet" WHERE "water_level" + 2 > 11.9
+
+name: h2o_feet
+--------------
+time                   level description           location       water_level
+2015-08-29T07:06:00Z   at or greater than 9 feet   coyote_creek   9.902
+2015-08-29T07:12:00Z   at or greater than 9 feet   coyote_creek   9.938
+2015-08-29T07:18:00Z   at or greater than 9 feet   coyote_creek   9.957
+2015-08-29T07:24:00Z   at or greater than 9 feet   coyote_creek   9.964
+2015-08-29T07:30:00Z   at or greater than 9 feet   coyote_creek   9.954
+2015-08-29T07:36:00Z   at or greater than 9 feet   coyote_creek   9.941
+2015-08-29T07:42:00Z   at or greater than 9 feet   coyote_creek   9.925
+2015-08-29T07:48:00Z   at or greater than 9 feet   coyote_creek   9.902
+2015-09-02T23:30:00Z   at or greater than 9 feet   coyote_creek   9.902
+

The query returns data from the h2o_feet measurement with field values of +water_level plus two that are greater than 11.9. +Note that InfluxDB follows the standard order of operations +See Mathematical Operators +for more on supported operators.

+

Select data that have a specific tag key-value

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica'
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+[...]
+2015-09-18T21:36:00Z   5.066
+2015-09-18T21:42:00Z   4.938
+

The query returns data from the h2o_feet measurement where the +tag key location is set to santa_monica. +InfluxQL requires single quotes around tag values in the WHERE clause.

+

Select data that have specific field key-values and tag key-values

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" <> 'santa_monica' AND (water_level < -0.59 OR water_level > 9.95)
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-29T07:18:00Z   9.957
+2015-08-29T07:24:00Z   9.964
+2015-08-29T07:30:00Z   9.954
+2015-08-29T14:30:00Z   -0.61
+2015-08-29T14:36:00Z   -0.591
+2015-08-30T15:18:00Z   -0.594
+

The query returns data from the h2o_feet measurement where the tag key +location is not set to santa_monica and where the field values of +water_level are either less than -0.59 or greater than 9.95. +The WHERE clause supports the operators AND and OR, and supports +separating logic with parentheses.

+

Select data that have specific timestamps

+ + +
SELECT * FROM "h2o_feet" WHERE time > now() - 7d
+

The query returns data from the h2o_feet measurement that have timestamps +within the past seven days. +The Time Syntax section on this page +offers in-depth information on supported time syntax in the WHERE clause.

+

Common issues with the WHERE clause

+

A WHERE clause query unexpectedly returns no data

+

In most cases, this issue is the result of missing single quotes around +tag values +or string field values. +Queries with unquoted or double quoted tag values or string field values will +not return any data and, in most cases, will not return an error.

+

The first two queries in the code block below attempt to specify the tag value +santa_monica without any quotes and with double quotes. +Those queries return no results. +The third query single quotes santa_monica (this is the supported syntax) +and returns the expected results.

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = santa_monica
+
+> SELECT "water_level" FROM "h2o_feet" WHERE "location" = "santa_monica"
+
+> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica'
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   2.064
+[...]
+2015-09-18T21:42:00Z   4.938
+

The first two queries in the code block below attempt to specify the string +field value at or greater than 9 feet without any quotes and with double +quotes. +The first query returns an error because the string field value includes +white spaces. +The second query returns no results. +The third query single quotes at or greater than 9 feet (this is the +supported syntax) and returns the expected results.

+ + +
> SELECT "level description" FROM "h2o_feet" WHERE "level description" = at or greater than 9 feet
+
+ERR: error parsing query: found than, expected ; at line 1, char 86
+
+> SELECT "level description" FROM "h2o_feet" WHERE "level description" = "at or greater than 9 feet"
+
+> SELECT "level description" FROM "h2o_feet" WHERE "level description" = 'at or greater than 9 feet'
+
+name: h2o_feet
+--------------
+time                   level description
+2015-08-26T04:00:00Z   at or greater than 9 feet
+[...]
+2015-09-15T22:42:00Z   at or greater than 9 feet
+

The GROUP BY clause

+

The GROUP BY clause groups query results by:

+
    +
  • one or more specified tags
  • +
  • specified time interval
  • +
+ +
+

Note: You cannot use GROUP BY to group fields.

+ +
+ + + + + + + + + + + + + +
GROUP BY tags +
GROUP BY time intervals: + Basic SyntaxAdvanced SyntaxGROUP BY time intervals and fill()
+

GROUP BY tags

+

GROUP BY <tag> groups query results by one or more specified tags.

+

Watch InfluxQL short about GROUP BY with tags: +
+

+ +

Syntax

+ + +
SELECT_clause FROM_clause [WHERE_clause] GROUP BY [* | <tag_key>[,<tag_key]]
+

GROUP BY * +   Groups results by all tags

+

GROUP BY <tag_key> +   Groups results by a specific tag

+

GROUP BY <tag_key>,<tag_key> +   Groups results by more than one tag. +The order of the tag keys is irrelevant.

+

If the query includes a WHERE clause the GROUP BY +clause must appear after the WHERE clause.

+

Other supported features: Regular Expressions

+

Examples

+
Group query results by a single tag
+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" GROUP BY "location"
+
+name: h2o_feet
+tags: location=coyote_creek
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 5.359342451341401
+
+
+name: h2o_feet
+tags: location=santa_monica
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 3.530863470081006
+

The query uses an InfluxQL function +to calculate the average water_level for each +tag value of location in +the h2o_feet measurement. +InfluxDB returns results in two series: one for each tag value of location.

+ +
+

Note: In InfluxDB, epoch 0 (1970-01-01T00:00:00Z) is often used as a null timestamp equivalent. +If you request a query that has no timestamp to return, such as an aggregation function with an unbounded time range, InfluxDB returns epoch 0 as the timestamp.

+ +
+
Group query results by more than one tag
+ + +
> SELECT MEAN("index") FROM "h2o_quality" GROUP BY "location","randtag"
+
+name: h2o_quality
+tags: location=coyote_creek, randtag=1
+time                  mean
+----                  ----
+1970-01-01T00:00:00Z  50.69033760186263
+
+name: h2o_quality
+tags: location=coyote_creek, randtag=2
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   49.661867544220485
+
+name: h2o_quality
+tags: location=coyote_creek, randtag=3
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   49.360939907550076
+
+name: h2o_quality
+tags: location=santa_monica, randtag=1
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   49.132712456344585
+
+name: h2o_quality
+tags: location=santa_monica, randtag=2
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   50.2937984496124
+
+name: h2o_quality
+tags: location=santa_monica, randtag=3
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   49.99919903884662
+

The query uses an InfluxQL function to calculate the average index for +each combination of the location tag and the randtag tag in the +h2o_quality measurement. +Separate multiple tags with a comma in the GROUP BY clause.

+
Group query results by all tags
+ + +
> SELECT MEAN("index") FROM "h2o_quality" GROUP BY *
+
+name: h2o_quality
+tags: location=coyote_creek, randtag=1
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 50.55405446521169
+
+
+name: h2o_quality
+tags: location=coyote_creek, randtag=2
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 50.49958856271162
+
+
+name: h2o_quality
+tags: location=coyote_creek, randtag=3
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 49.5164137518956
+
+
+name: h2o_quality
+tags: location=santa_monica, randtag=1
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 50.43829082296367
+
+
+name: h2o_quality
+tags: location=santa_monica, randtag=2
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 52.0688508894012
+
+
+name: h2o_quality
+tags: location=santa_monica, randtag=3
+time			               mean
+----			               ----
+1970-01-01T00:00:00Z	 49.29386362086556
+

The query uses an InfluxQL function +to calculate the average index for every possible +tag combination in the h2o_quality +measurement.

+

Note that the query results are identical to the results of the query in Example 2 +where we explicitly specified the location and randtag tag keys. +This is because the h2o_quality measurement only has two tag keys.

+

GROUP BY time intervals

+

GROUP BY time() queries group query results by a user-specified time interval.

+

Basic GROUP BY time() syntax

+

Syntax

+ + +
SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(<time_interval>),[tag_key] [fill(<fill_option>)]
+

Basic GROUP BY time() queries require an InfluxQL function +in the SELECT clause and a time range in the +WHERE clause. +Note that the GROUP BY clause must come after the WHERE clause.

+
time(time_interval)
+

The time_interval in the GROUP BY time() clause is a +duration literal. +It determines how InfluxDB groups query results over time. +For example, a time_interval of 5m groups query results into five-minute +time groups across the time range specified in the WHERE clause.

+
fill(<fill_option>)
+

fill(<fill_option>) is optional. +It changes the value reported for time intervals that have no data. +See GROUP BY time intervals and fill() +for more information.

+

Coverage:

+

Basic GROUP BY time() queries rely on the time_interval and on the InfluxDB database’s +preset time boundaries to determine the raw data included in each time interval +and the timestamps returned by the query.

+

Examples of basic syntax

+

The examples below use the following subsample of the sample data:

+ + +
> SELECT "water_level","location" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'
+
+name: h2o_feet
+--------------
+time                   water_level   location
+2015-08-18T00:00:00Z   8.12          coyote_creek
+2015-08-18T00:00:00Z   2.064         santa_monica
+2015-08-18T00:06:00Z   8.005         coyote_creek
+2015-08-18T00:06:00Z   2.116         santa_monica
+2015-08-18T00:12:00Z   7.887         coyote_creek
+2015-08-18T00:12:00Z   2.028         santa_monica
+2015-08-18T00:18:00Z   7.762         coyote_creek
+2015-08-18T00:18:00Z   2.126         santa_monica
+2015-08-18T00:24:00Z   7.635         coyote_creek
+2015-08-18T00:24:00Z   2.041         santa_monica
+2015-08-18T00:30:00Z   7.5           coyote_creek
+2015-08-18T00:30:00Z   2.051         santa_monica
+
Group query results into 12 minute intervals
+ + +
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+--------------
+time                   count
+2015-08-18T00:00:00Z   2
+2015-08-18T00:12:00Z   2
+2015-08-18T00:24:00Z   2
+

The query uses an InfluxQL function +to count the number of water_level points with the tag +location = coyote_creek and it group results into 12 minute intervals.

+

The result for each timestamp +represents a single 12 minute interval. +The count for the first timestamp covers the raw data between 2015-08-18T00:00:00Z +and up to, but not including, 2015-08-18T00:12:00Z. +The count for the second timestamp covers the raw data between 2015-08-18T00:12:00Z +and up to, but not including, 2015-08-18T00:24:00Z.

+
Group query results into 12 minutes intervals and by a tag key
+ + +
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),"location"
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   count
+----                   -----
+2015-08-18T00:00:00Z   2
+2015-08-18T00:12:00Z   2
+2015-08-18T00:24:00Z   2
+
+name: h2o_feet
+tags: location=santa_monica
+time                   count
+----                   -----
+2015-08-18T00:00:00Z   2
+2015-08-18T00:12:00Z   2
+2015-08-18T00:24:00Z   2
+

The query uses an InfluxQL function +to count the number of water_level points. +It groups results by the location tag and into 12 minute intervals. +Note that the time interval and the tag key are separated by a comma in the +GROUP BY clause.

+

The query returns two series of results: one for each +tag value of the location tag. +The result for each timestamp represents a single 12 minute interval. +The count for the first timestamp covers the raw data between 2015-08-18T00:00:00Z +and up to, but not including, 2015-08-18T00:12:00Z. +The count for the second timestamp covers the raw data between 2015-08-18T00:12:00Z +and up to, but not including, 2015-08-18T00:24:00Z.

+

Common issues with basic syntax

+
Unexpected timestamps and values in query results
+

With the basic syntax, InfluxDB relies on the GROUP BY time() interval +and on the system’s preset time boundaries to determine the raw data included +in each time interval and the timestamps returned by the query. +In some cases, this can lead to unexpected results.

+

Example

+

Raw data:

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:18:00Z'
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   8.12
+2015-08-18T00:06:00Z   8.005
+2015-08-18T00:12:00Z   7.887
+2015-08-18T00:18:00Z   7.762
+

Query and results:

+

The following query covers a 12-minute time range and groups results into 12-minute time intervals, but it returns two results:

+ + +
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time < '2015-08-18T00:18:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+time                   count
+----                   -----
+2015-08-18T00:00:00Z   1        <----- Note that this timestamp occurs before the start of the query's time range
+2015-08-18T00:12:00Z   1
+

Explanation:

+

InfluxDB uses preset round-number time boundaries for GROUP BY intervals that are +independent of any time conditions in the WHERE clause. +When it calculates the results, all returned data must occur within the query’s +explicit time range but the GROUP BY intervals will be based on the preset +time boundaries.

+

The table below shows the preset time boundary, the relevant GROUP BY time() interval, the +points included, and the returned timestamp for each GROUP BY time() +interval in the results.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberPreset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-18T00:00:00Z AND time < 2015-08-18T00:12:00Ztime >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:12:00Z8.0052015-08-18T00:00:00Z
2time >= 2015-08-12T00:12:00Z AND time < 2015-08-18T00:24:00Ztime >= 2015-08-12T00:12:00Z AND time < 2015-08-18T00:18:00Z7.8872015-08-18T00:12:00Z
+

The first preset 12-minute time boundary begins at 00:00 and ends just before +00:12. +Only one raw point (8.005) falls both within the query’s first GROUP BY time() interval and in that +first time boundary. +Note that while the returned timestamp occurs before the start of the query’s time range, +the query result excludes data that occur before the query’s time range.

+

The second preset 12-minute time boundary begins at 00:12 and ends just before +00:24. +Only one raw point (7.887) falls both within the query’s second GROUP BY time() interval and in that +second time boundary.

+

The advanced GROUP BY time() syntax allows users to shift +the start time of the InfluxDB database’s preset time boundaries. +Example 3 +in the Advanced Syntax section continues with the query shown here; +it shifts forward the preset time boundaries by six minutes such that +InfluxDB returns:

+ + +
name: h2o_feet
+time                   count
+----                   -----
+2015-08-18T00:06:00Z   2
+

Advanced GROUP BY time() syntax

+

Syntax

+ + +
SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(<time_interval>,<offset_interval>),[tag_key] [fill(<fill_option>)]
+

Advanced GROUP BY time() queries require an InfluxQL function +in the SELECT clause and a time range in the +WHERE clause. +Note that the GROUP BY clause must come after the WHERE clause.

+
time(time_interval,offset_interval)
+

See the Basic GROUP BY time() Syntax +for details on the time_interval.

+

The offset_interval is a +duration literal. +It shifts forward or back the InfluxDB database’s preset time boundaries. +The offset_interval can be positive or negative.

+
fill(<fill_option>)
+

fill(<fill_option>) is optional. +It changes the value reported for time intervals that have no data. +See GROUP BY time intervals and fill() +for more information.

+

Coverage:

+

Advanced GROUP BY time() queries rely on the time_interval, the offset_interval +, and on the InfluxDB database’s preset time boundaries to determine the raw data included in each time interval +and the timestamps returned by the query.

+

Examples of advanced syntax

+

The examples below use the following subsample of the sample data:

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:54:00Z'
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   8.12
+2015-08-18T00:06:00Z   8.005
+2015-08-18T00:12:00Z   7.887
+2015-08-18T00:18:00Z   7.762
+2015-08-18T00:24:00Z   7.635
+2015-08-18T00:30:00Z   7.5
+2015-08-18T00:36:00Z   7.372
+2015-08-18T00:42:00Z   7.234
+2015-08-18T00:48:00Z   7.11
+2015-08-18T00:54:00Z   6.982
+
Group query results into 18 minute intervals and shift the preset time boundaries forward
+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time <= '2015-08-18T00:54:00Z' GROUP BY time(18m,6m)
+
+name: h2o_feet
+time                   mean
+----                   ----
+2015-08-18T00:06:00Z   7.884666666666667
+2015-08-18T00:24:00Z   7.502333333333333
+2015-08-18T00:42:00Z   7.108666666666667
+

The query uses an InfluxQL function +to calculate the average water_level, grouping results into 18 minute +time intervals, and offsetting the preset time boundaries by six minutes.

+

The time boundaries and returned timestamps for the query without the offset_interval adhere to the InfluxDB database’s preset time boundaries. Let’s first examine the results without the offset:

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time <= '2015-08-18T00:54:00Z' GROUP BY time(18m)
+
+name: h2o_feet
+time                   mean
+----                   ----
+2015-08-18T00:00:00Z   7.946
+2015-08-18T00:18:00Z   7.6323333333333325
+2015-08-18T00:36:00Z   7.238666666666667
+2015-08-18T00:54:00Z   6.982
+

The time boundaries and returned timestamps for the query without the +offset_interval adhere to the InfluxDB database’s preset time boundaries:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberPreset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-18T00:00:00Z AND time < 2015-08-18T00:18:00Ztime >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:18:00Z8.005,7.8872015-08-18T00:00:00Z
2time >= 2015-08-18T00:18:00Z AND time < 2015-08-18T00:36:00Z<— same7.762,7.635,7.52015-08-18T00:18:00Z
3time >= 2015-08-18T00:36:00Z AND time < 2015-08-18T00:54:00Z<— same7.372,7.234,7.112015-08-18T00:36:00Z
4time >= 2015-08-18T00:54:00Z AND time < 2015-08-18T01:12:00Ztime = 2015-08-18T00:54:00Z6.9822015-08-18T00:54:00Z
+

The first preset 18-minute time boundary begins at 00:00 and ends just before +00:18. +Two raw points (8.005 and 7.887) fall both within the first GROUP BY time() interval and in that +first time boundary. +Note that while the returned timestamp occurs before the start of the query’s time range, +the query result excludes data that occur before the query’s time range.

+

The second preset 18-minute time boundary begins at 00:18 and ends just before +00:36. +Three raw points (7.762 and 7.635 and 7.5) fall both within the second GROUP BY time() interval and in that +second time boundary. In this case, the boundary time range and the interval’s time range are the same.

+

The fourth preset 18-minute time boundary begins at 00:54 and ends just before +1:12:00. +One raw point (6.982) falls both within the fourth GROUP BY time() interval and in that +fourth time boundary.

+

The time boundaries and returned timestamps for the query with the +offset_interval adhere to the offset time boundaries:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberOffset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:24:00Z<— same8.005,7.887,7.7622015-08-18T00:06:00Z
2time >= 2015-08-18T00:24:00Z AND time < 2015-08-18T00:42:00Z<— same7.635,7.5,7.3722015-08-18T00:24:00Z
3time >= 2015-08-18T00:42:00Z AND time < 2015-08-18T01:00:00Z<— same7.234,7.11,6.9822015-08-18T00:42:00Z
4time >= 2015-08-18T01:00:00Z AND time < 2015-08-18T01:18:00ZNANANA
+

The six-minute offset interval shifts forward the preset boundary’s time range +such that the boundary time ranges and the relevant GROUP BY time() interval time ranges are +always the same. +With the offset, each interval performs the calculation on three points, and +the timestamp returned matches both the start of the boundary time range and the +start of the GROUP BY time() interval time range.

+

Note that offset_interval forces the fourth time boundary to be outside +the query’s time range so the query returns no results for that last interval.

+
Group query results into 12 minute intervals and shift the preset time boundaries back
+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time <= '2015-08-18T00:54:00Z' GROUP BY time(18m,-12m)
+
+name: h2o_feet
+time                   mean
+----                   ----
+2015-08-18T00:06:00Z   7.884666666666667
+2015-08-18T00:24:00Z   7.502333333333333
+2015-08-18T00:42:00Z   7.108666666666667
+

The query uses an InfluxQL function +to calculate the average water_level, grouping results into 18 minute +time intervals, and offsetting the preset time boundaries by -12 minutes.

+ +
+

Note: The query in Example 2 returns the same results as the query in Example 1, but +the query in Example 2 uses a negative offset_interval instead of a positive +offset_interval. +There are no performance differences between the two queries; feel free to choose the most +intuitive option when deciding between a positive and negative offset_interval.

+ +
+

The time boundaries and returned timestamps for the query without the offset_interval adhere to InfluxDB database’s preset time boundaries. Let’s first examine the results without the offset:

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time <= '2015-08-18T00:54:00Z' GROUP BY time(18m)
+
+name: h2o_feet
+time                    mean
+----                    ----
+2015-08-18T00:00:00Z    7.946
+2015-08-18T00:18:00Z    7.6323333333333325
+2015-08-18T00:36:00Z    7.238666666666667
+2015-08-18T00:54:00Z    6.982
+

The time boundaries and returned timestamps for the query without the +offset_interval adhere to the InfluxDB database’s preset time boundaries:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberPreset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-18T00:00:00Z AND time < 2015-08-18T00:18:00Ztime >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:18:00Z8.005,7.8872015-08-18T00:00:00Z
2time >= 2015-08-18T00:18:00Z AND time < 2015-08-18T00:36:00Z<— same7.762,7.635,7.52015-08-18T00:18:00Z
3time >= 2015-08-18T00:36:00Z AND time < 2015-08-18T00:54:00Z<— same7.372,7.234,7.112015-08-18T00:36:00Z
4time >= 2015-08-18T00:54:00Z AND time < 2015-08-18T01:12:00Ztime = 2015-08-18T00:54:00Z6.9822015-08-18T00:54:00Z
+

The first preset 18-minute time boundary begins at 00:00 and ends just before +00:18. +Two raw points (8.005 and 7.887) fall both within the first GROUP BY time() interval and in that +first time boundary. +Note that while the returned timestamp occurs before the start of the query’s time range, +the query result excludes data that occur before the query’s time range.

+

The second preset 18-minute time boundary begins at 00:18 and ends just before +00:36. +Three raw points (7.762 and 7.635 and 7.5) fall both within the second GROUP BY time() interval and in that +second time boundary. In this case, the boundary time range and the interval’s time range are the same.

+

The fourth preset 18-minute time boundary begins at 00:54 and ends just before +1:12:00. +One raw point (6.982) falls both within the fourth GROUP BY time() interval and in that +fourth time boundary.

+

The time boundaries and returned timestamps for the query with the +offset_interval adhere to the offset time boundaries:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberOffset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-17T23:48:00Z AND time < 2015-08-18T00:06:00ZNANANA
2time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:24:00Z<— same8.005,7.887,7.7622015-08-18T00:06:00Z
3time >= 2015-08-18T00:24:00Z AND time < 2015-08-18T00:42:00Z<— same7.635,7.5,7.3722015-08-18T00:24:00Z
4time >= 2015-08-18T00:42:00Z AND time < 2015-08-18T01:00:00Z<— same7.234,7.11,6.9822015-08-18T00:42:00Z
+

The negative 12-minute offset interval shifts back the preset boundary’s time range +such that the boundary time ranges and the relevant GROUP BY time() interval time ranges are always the +same. +With the offset, each interval performs the calculation on three points, and +the timestamp returned matches both the start of the boundary time range and the +start of the GROUP BY time() interval time range.

+

Note that offset_interval forces the first time boundary to be outside +the query’s time range so the query returns no results for that first interval.

+
Group query results into 12 minute intervals and shift the preset time boundaries forward
+

This example is a continuation of the scenario outlined in Common Issues with Basic Syntax.

+ + +
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time < '2015-08-18T00:18:00Z' GROUP BY time(12m,6m)
+
+name: h2o_feet
+time                   count
+----                   -----
+2015-08-18T00:06:00Z   2
+

The query uses an InfluxQL function +to count the number of water_level points, grouping results into 12 minute +time intervals, and offsetting the preset time boundaries by six minutes.

+

The time boundaries and returned timestamps for the query without the offset_interval adhere to InfluxDB database’s preset time boundaries. Let’s first examine the results without the offset:

+ + +
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time < '2015-08-18T00:18:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+time                   count
+----                   -----
+2015-08-18T00:00:00Z   1
+2015-08-18T00:12:00Z   1
+

The time boundaries and returned timestamps for the query without the +offset_interval adhere to InfluxDB database’s preset time boundaries:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberPreset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-18T00:00:00Z AND time < 2015-08-18T00:12:00Ztime >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:12:00Z8.0052015-08-18T00:00:00Z
2time >= 2015-08-12T00:12:00Z AND time < 2015-08-18T00:24:00Ztime >= 2015-08-12T00:12:00Z AND time < 2015-08-18T00:18:00Z7.8872015-08-18T00:12:00Z
+

The first preset 12-minute time boundary begins at 00:00 and ends just before +00:12. +Only one raw point (8.005) falls both within the query’s first GROUP BY time() interval and in that +first time boundary. +Note that while the returned timestamp occurs before the start of the query’s time range, +the query result excludes data that occur before the query’s time range.

+

The second preset 12-minute time boundary begins at 00:12 and ends just before +00:24. +Only one raw point (7.887) falls both within the query’s second GROUP BY time() interval and in that +second time boundary.

+

The time boundaries and returned timestamps for the query with the +offset_interval adhere to the offset time boundaries:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Time Interval NumberOffset Time BoundaryGROUP BY time() IntervalPoints IncludedReturned Timestamp
1time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:18:00Z<— same8.005,7.8872015-08-18T00:06:00Z
2time >= 2015-08-18T00:18:00Z AND time < 2015-08-18T00:30:00ZNANANA
+

The six-minute offset interval shifts forward the preset boundary’s time range +such that the preset boundary time range and the relevant GROUP BY time() interval time range are the +same. +With the offset, the query returns a single result, and the timestamp returned +matches both the start of the boundary time range and the start of the GROUP BY time() interval +time range.

+

Note that offset_interval forces the second time boundary to be outside +the query’s time range so the query returns no results for that second interval.

+

GROUP BY time intervals and fill()

+

fill() changes the value reported for time intervals that have no data.

+

Syntax

+ + +
SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(time_interval,[<offset_interval])[,tag_key] [fill(<fill_option>)]
+

By default, a GROUP BY time() interval with no data reports null as its +value in the output column. +fill() changes the value reported for time intervals that have no data. +Note that fill() must go at the end of the GROUP BY clause if you’re +GROUP(ing) BY several things (for example, both tags and a time interval).

+
fill_option
+

Any numerical value +              +Reports the given numerical value for time intervals with no data.

+

linear +              +Reports the results of linear interpolation for time intervals with no data.

+

none +              +              +           +Reports no timestamp and no value for time intervals with no data.

+

null +              +              +           +Reports null for time intervals with no data but returns a timestamp. This is the same as the default behavior.

+

previous +              +              +    +Reports the value from the previous time interval for time intervals with no data.

+

Examples

+ +
+ + + + + + + + +
+

Without fill(100):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z
+

With fill(100):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) fill(100)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z   100
+

fill(100) changes the value reported for the time interval with no data to 100.

+ +
+ + + +
+

Without fill(linear):

+ + +
> SELECT MEAN("tadpoles") FROM "pond" WHERE time >= '2016-11-11T21:00:00Z' AND time <= '2016-11-11T22:06:00Z' GROUP BY time(12m)
+
+name: pond
+time                   mean
+----                   ----
+2016-11-11T21:00:00Z   1
+2016-11-11T21:12:00Z
+2016-11-11T21:24:00Z   3
+2016-11-11T21:36:00Z
+2016-11-11T21:48:00Z
+2016-11-11T22:00:00Z   6
+

With fill(linear):

+ + +
> SELECT MEAN("tadpoles") FROM "pond" WHERE time >= '2016-11-11T21:00:00Z' AND time <= '2016-11-11T22:06:00Z' GROUP BY time(12m) fill(linear)
+
+name: pond
+time                   mean
+----                   ----
+2016-11-11T21:00:00Z   1
+2016-11-11T21:12:00Z   2
+2016-11-11T21:24:00Z   3
+2016-11-11T21:36:00Z   4
+2016-11-11T21:48:00Z   5
+2016-11-11T22:00:00Z   6
+

fill(linear) changes the value reported for the time interval with no data +to the results of linear interpolation.

+ +
+

Note: The data in Example 2 are not in NOAA_water_database. +We had to create a dataset with less regular data to work with fill(linear).

+ +
+ +
+ + + +
+

Without fill(none):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z
+

With fill(none):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) fill(none)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+

fill(none) reports no value and no timestamp for the time interval with no data.

+ +
+ + + +
+

Without fill(null):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z
+

With fill(null):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) fill(null)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z
+

fill(null) reports null as the value for the time interval with no data. +That result matches the result of the query without fill(null).

+ +
+ + + +
+

Without fill(previous):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z
+

With fill(previous):

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) fill(previous)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:00:00Z   3.599
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z   3.235
+

fill(previous) changes the value reported for the time interval with no data to 3.235, +the value from the previous time interval.

+ +
+ + +
+ +

Common issues with fill()

+
Queries with fill() when no data fall within the query’s time range
+

Currently, queries ignore fill() if no data fall within the query’s time range. +This is the expected behavior. An open +feature request on GitHub +proposes that fill() should force a return of values even if the query’s time +range covers no data.

+

Example

+

The following query returns no data because water_level has no points within +the query’s time range. +Note that fill(800) has no effect on the query results.

+ + +
SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location" = 'coyote_creek' AND time >= '2015-09-18T22:00:00Z' AND time <= '2015-09-18T22:18:00Z' GROUP BY time(12m) fill(800)
+
Queries with fill(previous) when the previous result falls outside the query’s time range
+

fill(previous) doesn’t fill the result for a time interval if the previous +value is outside the query’s time range.

+

Example

+

The following query covers the time range between 2015-09-18T16:24:00Z and 2015-09-18T16:54:00Z. +Note that fill(previous) fills the result for 2015-09-18T16:36:00Z with the +result from 2015-09-18T16:24:00Z.

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE location = 'coyote_creek' AND time >= '2015-09-18T16:24:00Z' AND time <= '2015-09-18T16:54:00Z' GROUP BY time(12m) fill(previous)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:24:00Z   3.235
+2015-09-18T16:36:00Z   3.235
+2015-09-18T16:48:00Z   4
+

The next query shortens the time range in the previous query. +It now covers the time between 2015-09-18T16:36:00Z and 2015-09-18T16:54:00Z. +Note that fill(previous) doesn’t fill the result for 2015-09-18T16:36:00Z with the +result from 2015-09-18T16:24:00Z; the result for 2015-09-18T16:24:00Z is outside the query’s +shorter time range.

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" WHERE location = 'coyote_creek' AND time >= '2015-09-18T16:36:00Z' AND time <= '2015-09-18T16:54:00Z' GROUP BY time(12m) fill(previous)
+
+name: h2o_feet
+--------------
+time                   max
+2015-09-18T16:36:00Z
+2015-09-18T16:48:00Z   4
+
fill(linear) when the previous or following result falls outside the query’s time range
+

fill(linear) doesn’t fill the result for a time interval with no data if the +previous result or the following result is outside the query’s time range.

+

Example

+

The following query covers the time range between 2016-11-11T21:24:00Z and +2016-11-11T22:06:00Z. Note that fill(linear) fills the results for the +2016-11-11T21:36:00Z time interval and the 2016-11-11T21:48:00Z time interval +using the values from the 2016-11-11T21:24:00Z time interval and the +2016-11-11T22:00:00Z time interval.

+ + +
> SELECT MEAN("tadpoles") FROM "pond" WHERE time > '2016-11-11T21:24:00Z' AND time <= '2016-11-11T22:06:00Z' GROUP BY time(12m) fill(linear)
+
+name: pond
+time                   mean
+----                   ----
+2016-11-11T21:24:00Z   3
+2016-11-11T21:36:00Z   4
+2016-11-11T21:48:00Z   5
+2016-11-11T22:00:00Z   6
+

The next query shortens the time range in the previous query. +It now covers the time between 2016-11-11T21:36:00Z and 2016-11-11T22:06:00Z. +Note that fill() previous doesn’t fill the results for the 2016-11-11T21:36:00Z +time interval and the 2016-11-11T21:48:00Z time interval; the result for +2016-11-11T21:24:00Z is outside the query’s shorter time range and InfluxDB +cannot perform the linear interpolation.

+ + +
> SELECT MEAN("tadpoles") FROM "pond" WHERE time >= '2016-11-11T21:36:00Z' AND time <= '2016-11-11T22:06:00Z' GROUP BY time(12m) fill(linear)
+name: pond
+time                   mean
+----                   ----
+2016-11-11T21:36:00Z
+2016-11-11T21:48:00Z
+2016-11-11T22:00:00Z   6
+ +
+

Note: The data in Issue 3 are not in NOAA_water_database. +We had to create a dataset with less regular data to work with fill(linear).

+ +
+

The INTO clause

+

The INTO clause writes query results to a user-specified measurement.

+

Syntax

+ + +
SELECT_clause INTO <measurement_name> FROM_clause [WHERE_clause] [GROUP_BY_clause]
+

The INTO clause supports several formats for specifying a measurement:

+

INTO <measurement_name> +           +Writes data to the specified measurement. +If you’re using the CLI InfluxDB writes the data to the measurement in the +USEd +database and the DEFAULT retention policy. +If you’re using the InfluxDB API InfluxDB writes the data to the +measurement in the database specified in the db query string parameter +and the DEFAULT retention policy.

+

INTO <database_name>.<retention_policy_name>.<measurement_name> +           +Writes data to a fully qualified measurement. +Fully qualify a measurement by specifying its database and retention policy.

+

INTO <database_name>..<measurement_name> +           +Writes data to a measurement in a user-specified database and the DEFAULT +retention policy.

+

INTO <database_name>.<retention_policy_name>.:MEASUREMENT FROM /<regular_expression>/ +           +Writes data to all measurements in the user-specified database and +retention policy that match the regular expression in the FROM clause. +:MEASUREMENT is a backreference to each measurement matched in the FROM clause.

+

Examples

+

Rename a database

+ + +
> SELECT * INTO "copy_NOAA_water_database"."autogen".:MEASUREMENT FROM "NOAA_water_database"."autogen"./.*/ GROUP BY *
+
+name: result
+time written
+---- -------
+0    76290
+

Directly renaming a database in InfluxDB is not possible, so a common use for the INTO clause is to move data from one database to another. +The query above writes all data in the NOAA_water_database and autogen retention policy to the copy_NOAA_water_database database and the autogen retention policy.

+

The backreference syntax (:MEASUREMENT) maintains the source measurement names in the destination database. +Note that both the copy_NOAA_water_database database and its autogen retention policy must exist prior to running the INTO query. +See Database Management +for how to manage databases and retention policies.

+

The GROUP BY * clause preserves tags in the source database as tags in the destination database. +The following query does not maintain the series context for tags; tags will be stored as fields in the destination database (copy_NOAA_water_database):

+ + +
SELECT * INTO "copy_NOAA_water_database"."autogen".:MEASUREMENT FROM "NOAA_water_database"."autogen"./.*/
+

When moving large amounts of data, to avoid running out of memory, sequentially +run INTO queries for different measurements and time boundaries. +Use the WHERE clause to define time boundaries for each query.

+ +
+

INTO queries without time boundaries fail with the error: ERR: no data received.

+ +
+ +
Move large amounts of data with sequential queries
+ + +
SELECT *
+INTO <destination_database>.<retention_policy_name>.<measurement_name>
+FROM <source_database>.<retention_policy_name>.<measurement_name>
+WHERE time > now() - 100w AND time < now() - 90w GROUP BY *
+
+SELECT *
+INTO <destination_database>.<retention_policy_name>.<measurement_name>
+FROM <source_database>.<retention_policy_name>.<measurement_name>}
+WHERE time > now() - 90w AND < now() - 80w GROUP BY *
+
+SELECT *
+INTO <destination_database>.<retention_policy_name>.<measurement_name>
+FROM <source_database>.<retention_policy_name>.<measurement_name>
+WHERE time > now() - 80w AND time < now() - 70w GROUP BY *
+

Write the results of a query to a measurement

+ + +
> SELECT "water_level" INTO "h2o_feet_copy_1" FROM "h2o_feet" WHERE "location" = 'coyote_creek'
+
+name: result
+------------
+time                   written
+1970-01-01T00:00:00Z   7604
+
+> SELECT * FROM "h2o_feet_copy_1"
+
+name: h2o_feet_copy_1
+---------------------
+time                   water_level
+2015-08-18T00:00:00Z   8.12
+[...]
+2015-09-18T16:48:00Z   4
+

The query writes its results a new measurement: h2o_feet_copy_1. +If you’re using the CLI, InfluxDB writes the data to +the USEd database and the DEFAULT retention policy. +If you’re using the InfluxDB API, InfluxDB writes the +data to the database and retention policy specified in the db and rp +query string parameters. +If you do not set the rp query string parameter, the InfluxDB API automatically +writes the data to the database’s DEFAULT retention policy.

+

The response shows the number of points (7605) that InfluxDB writes to h2o_feet_copy_1. +The timestamp in the response is meaningless; InfluxDB uses epoch 0 +(1970-01-01T00:00:00Z) as a null timestamp equivalent.

+

Write the results of a query to a fully qualified measurement

+ + +
> SELECT "water_level" INTO "where_else"."autogen"."h2o_feet_copy_2" FROM "h2o_feet" WHERE "location" = 'coyote_creek'
+
+name: result
+------------
+time                   written
+1970-01-01T00:00:00Z   7604
+
+> SELECT * FROM "where_else"."autogen"."h2o_feet_copy_2"
+
+name: h2o_feet_copy_2
+---------------------
+time                   water_level
+2015-08-18T00:00:00Z   8.12
+[...]
+2015-09-18T16:48:00Z   4
+

The query writes its results to a new measurement: h2o_feet_copy_2. +InfluxDB writes the data to the where_else database and to the autogen +retention policy. +Note that both where_else and autogen must exist prior to running the INTO +query. +See Database Management +for how to manage databases and retention policies.

+

The response shows the number of points (7605) that InfluxDB writes to h2o_feet_copy_2. +The timestamp in the response is meaningless; InfluxDB uses epoch 0 +(1970-01-01T00:00:00Z) as a null timestamp equivalent.

+

Write aggregated results to a measurement (downsampling)

+ + +
> SELECT MEAN("water_level") INTO "all_my_averages" FROM "h2o_feet" WHERE "location" = 'coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m)
+
+name: result
+------------
+time                   written
+1970-01-01T00:00:00Z   3
+
+> SELECT * FROM "all_my_averages"
+
+name: all_my_averages
+---------------------
+time                   mean
+2015-08-18T00:00:00Z   8.0625
+2015-08-18T00:12:00Z   7.8245
+2015-08-18T00:24:00Z   7.5675
+

The query aggregates data using an +InfluxQL function and a GROUP BY time() clause. +It also writes its results to the all_my_averages measurement.

+

The response shows the number of points (3) that InfluxDB writes to all_my_averages. +The timestamp in the response is meaningless; InfluxDB uses epoch 0 +(1970-01-01T00:00:00Z) as a null timestamp equivalent.

+

The query is an example of downsampling: taking higher precision data, +aggregating those data to a lower precision, and storing the lower precision +data in the database. +Downsampling is a common use case for the INTO clause.

+

Write aggregated results for more than one measurement to a different database (downsampling with backreferencing)

+ + +
> SELECT MEAN(*) INTO "where_else"."autogen".:MEASUREMENT FROM /.*/ WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:06:00Z' GROUP BY time(12m)
+
+name: result
+time                   written
+----                   -------
+1970-01-01T00:00:00Z   5
+
+> SELECT * FROM "where_else"."autogen"./.*/
+
+name: average_temperature
+time                   mean_degrees   mean_index   mean_pH   mean_water_level
+----                   ------------   ----------   -------   ----------------
+2015-08-18T00:00:00Z   78.5
+
+name: h2o_feet
+time                   mean_degrees   mean_index   mean_pH   mean_water_level
+----                   ------------   ----------   -------   ----------------
+2015-08-18T00:00:00Z                                         5.07625
+
+name: h2o_pH
+time                   mean_degrees   mean_index   mean_pH   mean_water_level
+----                   ------------   ----------   -------   ----------------
+2015-08-18T00:00:00Z                               6.75
+
+name: h2o_quality
+time                   mean_degrees   mean_index   mean_pH   mean_water_level
+----                   ------------   ----------   -------   ----------------
+2015-08-18T00:00:00Z                  51.75
+
+name: h2o_temperature
+time                   mean_degrees   mean_index   mean_pH   mean_water_level
+----                   ------------   ----------   -------   ----------------
+2015-08-18T00:00:00Z   63.75
+

The query aggregates data using an +InfluxQL function and a GROUP BY time() clause. +It aggregates data in every measurement that matches the regular expression +in the FROM clause and writes the results to measurements with the same name in the +where_else database and the autogen retention policy. +Note that both where_else and autogen must exist prior to running the INTO +query. +See Database management +for how to manage databases and retention policies.

+

The response shows the number of points (5) that InfluxDB writes to the where_else +database and the autogen retention policy. +The timestamp in the response is meaningless; InfluxDB uses epoch 0 +(1970-01-01T00:00:00Z) as a null timestamp equivalent.

+

The query is an example of downsampling with backreferencing. +It takes higher precision data from more than one measurement, +aggregates those data to a lower precision, and stores the lower precision +data in the database. +Downsampling with backreferencing is a common use case for the INTO clause.

+

Common issues with the INTO clause

+

Missing data

+

If an INTO query includes a tag key in the SELECT clause, the query converts tags in the current +measurement to fields in the destination measurement. +This can cause InfluxDB to overwrite points that were previously differentiated +by a tag value. +Note that this behavior does not apply to queries that use the TOP() or BOTTOM() functions. +The +Frequently Asked Questions +document describes that behavior in detail.

+

To preserve tags in the current measurement as tags in the destination measurement, +GROUP BY the relevant tag key or GROUP BY * in the INTO query.

+

Automating queries with the INTO clause

+

The INTO clause section in this document shows how to manually implement +queries with an INTO clause. +See the Continuous Queries +documentation for how to automate INTO clause queries on realtime data. +Among other uses, +Continuous Queries automate the downsampling process.

+

ORDER BY time DESC

+

By default, InfluxDB returns results in ascending time order; the first point +returned has the oldest timestamp and +the last point returned has the most recent timestamp. +ORDER BY time DESC reverses that order such that InfluxDB returns the points +with the most recent timestamps first.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] ORDER BY time DESC
+

ORDER by time DESC must appear after the GROUP BY clause +if the query includes a GROUP BY clause. +ORDER by time DESC must appear after the WHERE clause +if the query includes a WHERE clause and no GROUP BY clause.

+

Examples

+

Return the newest points first

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' ORDER BY time DESC
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-09-18T21:42:00Z   4.938
+2015-09-18T21:36:00Z   5.066
+[...]
+2015-08-18T00:06:00Z   2.116
+2015-08-18T00:00:00Z   2.064
+

The query returns the points with the most recent timestamps from the +h2o_feet measurement first. +Without ORDER by time DESC, the query would return 2015-08-18T00:00:00Z +first and 2015-09-18T21:42:00Z last.

+

Return the newest points first and include a GROUP BY time() clause

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY time(12m) ORDER BY time DESC
+
+name: h2o_feet
+time                   mean
+----                   ----
+2015-08-18T00:36:00Z   4.6825
+2015-08-18T00:24:00Z   4.80675
+2015-08-18T00:12:00Z   4.950749999999999
+2015-08-18T00:00:00Z   5.07625
+

The query uses an InfluxQL function +and a time interval in the GROUP BY clause +to calculate the average water_level for each twelve-minute +interval in the query’s time range. +ORDER BY time DESC returns the most recent 12-minute time intervals +first.

+

Without ORDER BY time DESC, the query would return +2015-08-18T00:00:00Z first and 2015-08-18T00:36:00Z last.

+

The LIMIT and SLIMIT clauses

+

LIMIT and SLIMIT limit the number of +points and the number of +series returned per query.

+

The LIMIT clause

+

LIMIT <N> returns the first N points from the specified measurement.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] LIMIT <N>
+

N specifies the number of points to return from the specified measurement. +If N is greater than the number of points in a measurement, InfluxDB returns +all points from that series.

+

Note that the LIMIT clause must appear in the order outlined in the syntax above.

+

Examples

+

Limit the number of points returned

+ + +
> SELECT "water_level","location" FROM "h2o_feet" LIMIT 3
+
+name: h2o_feet
+time                   water_level   location
+----                   -----------   --------
+2015-08-18T00:00:00Z   8.12          coyote_creek
+2015-08-18T00:00:00Z   2.064         santa_monica
+2015-08-18T00:06:00Z   8.005         coyote_creek
+

The query returns the three oldest points (determined by timestamp) from the h2o_feet measurement.

+

Limit the number points returned and include a GROUP BY clause

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) LIMIT 2
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+2015-08-18T00:00:00Z   8.0625
+2015-08-18T00:12:00Z   7.8245
+
+name: h2o_feet
+tags: location=santa_monica
+time                   mean
+----                   ----
+2015-08-18T00:00:00Z   2.09
+2015-08-18T00:12:00Z   2.077
+

The query uses an InfluxQL function +and a GROUP BY clause +to calculate the average water_level for each tag and for each twelve-minute +interval in the query’s time range. +LIMIT 2 requests the two oldest twelve-minute averages (determined by timestamp).

+

Note that without LIMIT 2, the query would return four points per series; +one for each twelve-minute interval in the query’s time range.

+

The SLIMIT clause

+

SLIMIT <N> returns every point from <N> series in the specified measurement.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(<time_interval>)] [ORDER_BY_clause] SLIMIT <N>
+

N specifies the number of series to return from the specified measurement. +If N is greater than the number of series in a measurement, InfluxDB returns +all series from that measurement.

+

There is an ongoing issue that requires queries with SLIMIT to include GROUP BY *. +Note that the SLIMIT clause must appear in the order outlined in the syntax above.

+

Examples

+

Limit the number of series returned

+ + +
> SELECT "water_level" FROM "h2o_feet" GROUP BY * SLIMIT 1
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   water_level
+----                   -----
+2015-08-18T00:00:00Z   8.12
+2015-08-18T00:06:00Z   8.005
+2015-08-18T00:12:00Z   7.887
+[...]
+2015-09-18T16:12:00Z   3.402
+2015-09-18T16:18:00Z   3.314
+2015-09-18T16:24:00Z   3.235
+

The query returns all water_level points from one of the series associated +with the h2o_feet measurement.

+

Limit the number of series returned and include a GROUP BY time() clause

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) SLIMIT 1
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+2015-08-18T00:00:00Z   8.0625
+2015-08-18T00:12:00Z   7.8245
+2015-08-18T00:24:00Z   7.5675
+2015-08-18T00:36:00Z   7.303
+

The query uses an InfluxQL function +and a time interval in the GROUP BY clause +to calculate the average water_level for each twelve-minute +interval in the query’s time range. +SLIMIT 1 requests a single series associated with the h2o_feet measurement.

+

Note that without SLIMIT 1, the query would return results for the two series +associated with the h2o_feet measurement: location=coyote_creek and +location=santa_monica.

+

LIMIT and SLIMIT

+

LIMIT <N> followed by SLIMIT <N> returns the first <N> points from <N> series in the specified measurement.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(<time_interval>)] [ORDER_BY_clause] LIMIT <N1> SLIMIT <N2>
+

N1 specifies the number of points to return per measurement. +If N1 is greater than the number of points in a measurement, InfluxDB returns all points from that measurement.

+

N2 specifies the number of series to return from the specified measurement. +If N2 is greater than the number of series in a measurement, InfluxDB returns all series from that measurement.

+

There is an ongoing issue that requires queries with LIMIT and SLIMIT to include GROUP BY *. +Note that the LIMIT and SLIMIT clauses must appear in the order outlined in the syntax above.

+

Examples

+

Limit the number of points and series returned

+ + +
> SELECT "water_level" FROM "h2o_feet" GROUP BY * LIMIT 3 SLIMIT 1
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   8.12
+2015-08-18T00:06:00Z   8.005
+2015-08-18T00:12:00Z   7.887
+

The query returns the three oldest points (determined by timestamp) from one +of the series associated with the +measurement h2o_feet.

+

Limit the number of points and series returned and include a GROUP BY time() clause

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) LIMIT 2 SLIMIT 1
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+2015-08-18T00:00:00Z   8.0625
+2015-08-18T00:12:00Z   7.8245
+

The query uses an InfluxQL function +and a time interval in the GROUP BY clause +to calculate the average water_level for each twelve-minute +interval in the query’s time range. +LIMIT 2 requests the two oldest twelve-minute averages (determined by +timestamp) and SLIMIT 1 requests a single series +associated with the h2o_feet measurement.

+

Note that without LIMIT 2 SLIMIT 1, the query would return four points +for each of the two series associated with the h2o_feet measurement.

+

The OFFSET and SOFFSET clauses

+

OFFSET and SOFFSET paginates points and series returned.

+ + + + + +
The OFFSET clauseThe SOFFSET clause
+

The OFFSET clause

+

OFFSET <N> paginates N points in the query results.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] LIMIT_clause OFFSET <N> [SLIMIT_clause]
+

N specifies the number of points to paginate. +The OFFSET clause requires a LIMIT clause. +Using the OFFSET clause without a LIMIT clause can cause inconsistent +query results.

+ +
+

Note: InfluxDB returns no results if the WHERE clause includes a time +range and the OFFSET clause would cause InfluxDB to return points with +timestamps outside of that time range.

+ +
+

Examples

+

Paginate points

+ + +
> SELECT "water_level","location" FROM "h2o_feet" LIMIT 3 OFFSET 3
+
+name: h2o_feet
+time                   water_level   location
+----                   -----------   --------
+2015-08-18T00:06:00Z   2.116         santa_monica
+2015-08-18T00:12:00Z   7.887         coyote_creek
+2015-08-18T00:12:00Z   2.028         santa_monica
+

The query returns the fourth, fifth, and sixth points from the h2o_feet measurement. +If the query did not include OFFSET 3, it would return the first, second, +and third points from that measurement.

+

Paginate points and include several clauses

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) ORDER BY time DESC LIMIT 2 OFFSET 2 SLIMIT 1
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+2015-08-18T00:12:00Z   7.8245
+2015-08-18T00:00:00Z   8.0625
+

This example is pretty involved, so here’s the clause-by-clause breakdown:

+

The SELECT clause specifies an InfluxQL function. +The FROM clause specifies a single measurement. +The WHERE clause specifies the time range for the query. +The GROUP BY clause groups results by all tags (*) and into 12-minute intervals. +The ORDER BY time DESC clause returns results in descending timestamp order. +The LIMIT 2 clause limits the number of points returned to two. +The OFFSET 2 clause excludes the first two averages from the query results. +The SLIMIT 1 clause limits the number of series returned to one.

+

Without OFFSET 2, the query would return the first two averages of the query results:

+ + +
name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+2015-08-18T00:36:00Z   7.303
+2015-08-18T00:24:00Z   7.5675
+

The SOFFSET clause

+

SOFFSET <N> paginates N series in the query results.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(time_interval)] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] SLIMIT_clause SOFFSET <N>
+

N specifies the number of series to paginate. +The SOFFSET clause requires an SLIMIT clause. +Using the SOFFSET clause without an SLIMIT clause can cause inconsistent +query results. +There is an ongoing issue that requires queries with SLIMIT to include GROUP BY *.

+ +
+

Note: InfluxDB returns no results if the SOFFSET clause paginates +through more than the total number of series.

+ +
+

Examples

+

Paginate series

+ + +
> SELECT "water_level" FROM "h2o_feet" GROUP BY * SLIMIT 1 SOFFSET 1
+
+name: h2o_feet
+tags: location=santa_monica
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+[...]
+2015-09-18T21:36:00Z   5.066
+2015-09-18T21:42:00Z   4.938
+

The query returns data for the series associated with the h2o_feet +measurement and the location = santa_monica tag. +Without SOFFSET 1, the query returns data for the series associated with the +h2o_feet measurement and the location = coyote_creek tag.

+

Paginate series and include all clauses

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) ORDER BY time DESC LIMIT 2 OFFSET 2 SLIMIT 1 SOFFSET 1
+
+name: h2o_feet
+tags: location=santa_monica
+time                   mean
+----                   ----
+2015-08-18T00:12:00Z   2.077
+2015-08-18T00:00:00Z   2.09
+

This example is pretty involved, so here’s the clause-by-clause breakdown:

+

The SELECT clause specifies an InfluxQL function. +The FROM clause specifies a single measurement. +The WHERE clause specifies the time range for the query. +The GROUP BY clause groups results by all tags (*) and into 12-minute intervals. +The ORDER BY time DESC clause returns results in descending timestamp order. +The LIMIT 2 clause limits the number of points returned to two. +The OFFSET 2 clause excludes the first two averages from the query results. +The SLIMIT 1 clause limits the number of series returned to one. +The SOFFSET 1 clause paginates the series returned.

+

Without SOFFSET 1, the query would return the results for a different series:

+ + +
name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+2015-08-18T00:12:00Z   7.8245
+2015-08-18T00:00:00Z   8.0625
+

The Time Zone clause

+

The tz() clause returns the UTC offset for the specified timezone.

+

Syntax

+ + +
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause] tz('<time_zone>')
+

By default, InfluxDB stores and returns timestamps in UTC. +The tz() clause includes the UTC offset or, if applicable, the UTC Daylight Savings Time (DST) offset to the query’s returned timestamps. +The returned timestamps must be in RFC3339 format for the UTC offset or UTC DST to appear. +The time_zone parameter follows the TZ syntax in the Internet Assigned Numbers Authority time zone database and it requires single quotes.

+

Examples

+

Return the UTC offset for Chicago’s time zone

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:18:00Z' tz('America/Chicago')
+
+name: h2o_feet
+time                       water_level
+----                       -----------
+2015-08-17T19:00:00-05:00  2.064
+2015-08-17T19:06:00-05:00  2.116
+2015-08-17T19:12:00-05:00  2.028
+2015-08-17T19:18:00-05:00  2.126
+

The query results include the UTC offset (-05:00) for the America/Chicago time zone in the timestamps.

+

Time syntax

+

For most SELECT statements, the default time range is between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC. +For SELECT statements with a GROUP BY time() clause, +the default time range is between 1677-09-21 00:12:43.145224194 UTC and now(). +The following sections detail how to specify alternative time ranges in the SELECT +statement’s WHERE clause.

+ + + + + + +
Absolute timeRelative timeCommon issues with time syntax
+

Tired of reading? Check out this InfluxQL Short: +
+

+ +

Absolute time

+

Specify absolute time with date-time strings and epoch time.

+

Syntax

+ + +
SELECT_clause FROM_clause WHERE time <operator> ['<rfc3339_date_time_string>' | '<rfc3339_like_date_time_string>' | <epoch_time>] [AND ['<rfc3339_date_time_string>' | '<rfc3339_like_date_time_string>' | <epoch_time>] [...]]
+

Supported operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorMeaning
=equal to
<>not equal to
!=not equal to
>greater than
>=greater than or equal to
<less than
<=less than or equal to
+

Currently, InfluxDB does not support using OR with absolute time in the WHERE +clause. See the Frequently Asked Questions +document and the GitHub Issue +for more information.

+

rfc3339_date_time_string

+ + +
'YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ'
+

.nnnnnnnnn is optional and is set to .000000000 if not included. +The RFC3339 date-time string requires single quotes.

+

rfc3339_like_date_time_string

+ + +
'YYYY-MM-DD HH:MM:SS.nnnnnnnnn'
+

HH:MM:SS.nnnnnnnnn.nnnnnnnnn is optional and is set to 00:00:00.000000000 if not included. +The RFC3339-like date-time string requires single quotes.

+

epoch_time

+

Epoch time is the amount of time that has elapsed since 00:00:00 +Coordinated Universal Time (UTC), Thursday, 1 January 1970.

+

By default, InfluxDB assumes that all epoch timestamps are in nanoseconds. +Include a duration literal +at the end of the epoch timestamp to indicate a precision other than nanoseconds.

+

Basic arithmetic

+

All timestamp formats support basic arithmetic. +Add (+) or subtract (-) a time from a timestamp with a duration literal. +Note that InfluxQL requires a whitespace between the + or - and the +duration literal.

+

Examples

+

Specify a time range with RFC3339 date-time strings

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00.000000000Z' AND time <= '2015-08-18T00:12:00Z'
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+2015-08-18T00:12:00Z   2.028
+

The query returns data with timestamps between August 18, 2015 at 00:00:00.000000000 and +August 18, 2015 at 00:12:00. +The nanosecond specification in the first timestamp (.000000000) +is optional.

+

Note that the single quotes around the RFC3339 date-time strings are required.

+

Specify a time range with RFC3339-like date-time strings

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18' AND time <= '2015-08-18 00:12:00'
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+2015-08-18T00:12:00Z   2.028
+

The query returns data with timestamps between August 18, 2015 at 00:00:00 and August 18, 2015 +at 00:12:00. +The first date-time string does not include a time; InfluxDB assumes the time +is 00:00:00.

+

Note that the single quotes around the RFC3339-like date-time strings are +required.

+

Specify a time range with epoch timestamps

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= 1439856000000000000 AND time <= 1439856720000000000
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+2015-08-18T00:12:00Z   2.028
+

The query returns data with timestamps that occur between August 18, 2015 +at 00:00:00 and August 18, 2015 at 00:12:00. +By default InfluxDB assumes epoch timestamps are in nanoseconds.

+

Specify a time range with second-precision epoch timestamps

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= 1439856000s AND time <= 1439856720s
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+2015-08-18T00:12:00Z   2.028
+

The query returns data with timestamps that occur between August 18, 2015 +at 00:00:00 and August 18, 2015 at 00:12:00. +The s duration literal at the +end of the epoch timestamps indicate that the epoch timestamps are in seconds.

+

Perform basic arithmetic on an RFC3339-like date-time string

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE time > '2015-09-18T21:24:00Z' + 6m
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-09-18T21:36:00Z   5.066
+2015-09-18T21:42:00Z   4.938
+

The query returns data with timestamps that occur at least six minutes after +September 18, 2015 at 21:24:00. +Note that the whitespace between the + and 6m is required.

+

Perform basic arithmetic on an epoch timestamp

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE time > 24043524m - 6m
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-09-18T21:24:00Z   5.013
+2015-09-18T21:30:00Z   5.01
+2015-09-18T21:36:00Z   5.066
+2015-09-18T21:42:00Z   4.938
+

The query returns data with timestamps that occur at least six minutes before +September 18, 2015 at 21:24:00. +Note that the whitespace between the - and 6m is required.

+

Relative time

+

Use now() to query data with timestamps relative to the server’s current timestamp.

+

Syntax

+ + +
SELECT_clause FROM_clause WHERE time <operator> now() [[ - | + ] <duration_literal>] [(AND|OR) now() [...]]
+

now() is the Unix time of the server at the time the query is executed on that server. +The whitespace between - or + and the duration literal is required.

+

Supported operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorMeaning
=equal to
<>not equal to
!=not equal to
>greater than
>=greater than or equal to
<less than
<=less than or equal to
+

duration_literal

+
    +
  • microseconds: u or µ
  • +
  • milliseconds: ms
  • +
  • secondss
  • +
  • minutesm
  • +
  • hours:h
  • +
  • days:d
  • +
  • weeks:w
  • +
+

Examples

+

Specify a time range with relative time

+ + +
SELECT "water_level" FROM "h2o_feet" WHERE time > now() - 1h
+

The query returns data with timestamps that occur within the past hour. +The whitespace between - and 1h is required.

+

Specify a time range with absolute time and relative time

+ + +
> SELECT "level description" FROM "h2o_feet" WHERE time > '2015-09-18T21:18:00Z' AND time < now() + 1000d
+
+name: h2o_feet
+time                   level description
+----                   -----------------
+2015-09-18T21:24:00Z   between 3 and 6 feet
+2015-09-18T21:30:00Z   between 3 and 6 feet
+2015-09-18T21:36:00Z   between 3 and 6 feet
+2015-09-18T21:42:00Z   between 3 and 6 feet
+

The query returns data with timestamps that occur between September 18, 2015 +at 21:18:00 and 1000 days from now(). +The whitespace between + and 1000d is required.

+

Common issues with time syntax

+

Using OR to select time multiple time intervals

+

InfluxDB does not support using the OR operator in the WHERE clause to specify multiple time intervals.

+

For more information, see Frequently asked questions.

+

Querying data that occur after now() with a GROUP BY time() clause

+

Most SELECT statements have a default time range between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC. +For SELECT statements with a GROUP BY time() clause, +the default time range is between 1677-09-21 00:12:43.145224194 UTC and now().

+

To query data with timestamps that occur after now(), SELECT statements with +a GROUP BY time() clause must provide an alternative upper bound in the +WHERE clause.

+

Example

+

Use the CLI to write a point to the NOAA_water_database that occurs after now():

+ + +
INSERT h2o_feet,location=santa_monica water_level=3.1 1587074400000000000
+

Run a GROUP BY time() query that covers data with timestamps between +2015-09-18T21:30:00Z and now():

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='santa_monica' AND time >= '2015-09-18T21:30:00Z' GROUP BY time(12m) fill(none)
+
+name: h2o_feet
+time                   mean
+----                   ----
+2015-09-18T21:24:00Z   5.01
+2015-09-18T21:36:00Z   5.002
+

Run a GROUP BY time() query that covers data with timestamps between +2015-09-18T21:30:00Z and 180 weeks from now():

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='santa_monica' AND time >= '2015-09-18T21:30:00Z' AND time <= now() + 180w GROUP BY time(12m) fill(none)
+
+name: h2o_feet
+time                   mean
+----                   ----
+2015-09-18T21:24:00Z   5.01
+2015-09-18T21:36:00Z   5.002
+2020-04-16T22:00:00Z   3.1
+

Note that the WHERE clause must provide an alternative upper bound to +override the default now() upper bound. The following query merely resets +the lower bound to now() such that the query’s time range is between +now() and now():

+ + +
SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='santa_monica' AND time >= now() GROUP BY time(12m) fill(none)
+

Configuring the returned timestamps

+

The CLI returns timestamps in +nanosecond epoch format by default. +Specify alternative formats with the +precision <format> command. +The InfluxDB API returns timestamps +in RFC3339 format by default. +Specify alternative formats with the +epoch query string parameter.

+

Regular expressions

+

InfluxQL supports using regular expressions when specifying:

+ +

Currently, InfluxQL does not support using regular expressions to match +non-string field values in the +WHERE clause, +databases, and +retention polices.

+ +
+

Note: Regular expression comparisons are more computationally intensive than exact +string comparisons; queries with regular expressions are not as performant +as those without.

+ +
+

Syntax

+ + +
SELECT /<regular_expression_field_key>/ FROM /<regular_expression_measurement>/ WHERE [<tag_key> <operator> /<regular_expression_tag_value>/ | <field_key> <operator> /<regular_expression_field_value>/] GROUP BY /<regular_expression_tag_key>/
+

Regular expressions are surrounded by / characters and use +Golang’s regular expression syntax.

+

Supported operators

+

=~ matches against +!~ doesn’t match against

+

Examples

+

Use a regular expression to specify field keys and tag keys in the SELECT clause

+ + +
> SELECT /l/ FROM "h2o_feet" LIMIT 1
+
+name: h2o_feet
+time                   level description      location       water_level
+----                   -----------------      --------       -----------
+2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
+

The query selects all field keys +and tag keys that include an l. +Note that the regular expression in the SELECT clause must match at least one +field key in order to return results for a tag key that matches the regular +expression.

+

Currently, there is no syntax to distinguish between regular expressions for +field keys and regular expressions for tag keys in the SELECT clause. +The syntax /<regular_expression>/::[field | tag] is not supported.

+

Use a regular expression to specify measurements in the FROM clause

+ + +
> SELECT MEAN("degrees") FROM /temperature/
+
+name: average_temperature
+time			mean
+----			----
+1970-01-01T00:00:00Z   79.98472932232272
+
+name: h2o_temperature
+time			mean
+----			----
+1970-01-01T00:00:00Z   64.98872722506226
+

The query uses an InfluxQL function +to calculate the average degrees for every measurement in the NOAA_water_database +database that contains the word temperature.

+

Use a regular expression to specify tag values in the WHERE clause

+ + +
> SELECT MEAN(water_level) FROM "h2o_feet" WHERE "location" =~ /[m]/ AND "water_level" > 3
+
+name: h2o_feet
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   4.47155532049926
+

The query uses an InfluxQL function +to calculate the average water_level where the tag value of location +includes an m and water_level is greater than three.

+

Use a regular expression to specify a tag with no value in the WHERE clause

+ + +
SELECT * FROM "h2o_feet" WHERE "location" !~ /./
+

The query selects all data from the h2o_feet measurement where the location +tag has no value. +Every data point in the NOAA_water_database has a tag value for location.

+

It’s possible to perform this same query without a regular expression. +See the +Frequently Asked Questions +document for more information.

+

Use a regular expression to specify a tag with a value in the WHERE clause

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location" =~ /./
+
+name: h2o_feet
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   4.442107025822523
+

The query uses an InfluxQL function +to calculate the average water_level across all data that have a tag value for +location.

+

Use a regular expression to specify a field value in the WHERE clause

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location" = 'santa_monica' AND "level description" =~ /between/
+
+name: h2o_feet
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   4.47155532049926
+

The query uses an InfluxQL function +to calculate the average water_level for all data where the field value of +level description includes the word between.

+

Use a regular expression to specify tag keys in the GROUP BY clause

+ + +
> SELECT FIRST("index") FROM "h2o_quality" GROUP BY /l/
+
+name: h2o_quality
+tags: location=coyote_creek
+time                   first
+----                   -----
+2015-08-18T00:00:00Z   41
+
+name: h2o_quality
+tags: location=santa_monica
+time                   first
+----                   -----
+2015-08-18T00:00:00Z   99
+

The query uses an InfluxQL function +to select the first value of index for every tag that includes the letter l +in its tag key.

+

Data types and cast operations

+

The SELECT clause supports specifying a field’s type and basic cast +operations with the :: syntax.

+ + + + + +
Data TypesCast Operations
+

Data types

+

Field values can be floats, integers, strings, or booleans. +The :: syntax allows users to specify the field’s type in a query.

+ +
+

Note: Generally, it is not necessary to specify the field value +type in the SELECT clause. +In most cases, InfluxDB rejects any writes that attempt to write a field value +to a field that previously accepted field values of a different type.

+ +
+

It is possible for field value types to differ across shard groups. +In these cases, it may be necessary to specify the field value type in the +SELECT clause. +Please see the +Frequently Asked Questions +document for more information on how InfluxDB handles field value type discrepancies.

+

Syntax

+ + +
SELECT_clause <field_key>::<type> FROM_clause
+

type can be float, integer, string, or boolean. +In most cases, InfluxDB returns no data if the field_key does not store data of the specified +type. See Cast Operations for more information.

+

Example

+ + +
> SELECT "water_level"::float FROM "h2o_feet" LIMIT 4
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   8.12
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   8.005
+2015-08-18T00:06:00Z   2.116
+

The query returns values of the water_level field key that are floats.

+

Cast operations

+

The :: syntax allows users to perform basic cast operations in queries. +Currently, InfluxDB supports casting field values from integers to +floats or from floats to integers.

+

Syntax

+ + +
SELECT_clause <field_key>::<type> FROM_clause
+

type can be float or integer.

+

InfluxDB returns no data if the query attempts to cast an integer or float to a +string or boolean.

+

Examples

+

Cast float field values to integers

+ + +
> SELECT "water_level"::integer FROM "h2o_feet" LIMIT 4
+
+name: h2o_feet
+--------------
+time                   water_level
+2015-08-18T00:00:00Z   8
+2015-08-18T00:00:00Z   2
+2015-08-18T00:06:00Z   8
+2015-08-18T00:06:00Z   2
+

The query returns the integer form of water_level’s float field values.

+

Cast float field values to strings (this functionality is not supported)

+ + +
SELECT "water_level"::string FROM "h2o_feet" LIMIT 4
+

The query returns no data as casting a float field value to a string is not +yet supported.

+

Merge behavior

+

In InfluxDB, queries merge series +automatically.

+

Example

+

The h2o_feet measurement in the NOAA_water_database is part of two series. +The first series is made up of the h2o_feet measurement and the location = coyote_creek tag. +The second series is made of up the h2o_feet measurement and the location = santa_monica tag.

+

The following query automatically merges those two series when it calculates the average water_level:

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet"
+
+name: h2o_feet
+--------------
+time                   mean
+1970-01-01T00:00:00Z   4.442107025822521
+

If you want the average water_level for the first series only, specify the relevant tag in the WHERE clause:

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location" = 'coyote_creek'
+
+name: h2o_feet
+--------------
+time                   mean
+1970-01-01T00:00:00Z   5.359342451341401
+

If you want the average water_level for each individual series, include a GROUP BY clause:

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet" GROUP BY "location"
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   5.359342451341401
+
+name: h2o_feet
+tags: location=santa_monica
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   3.530863470081006
+

Multiple statements

+

Separate multiple SELECT statements in a query with a semicolon (;).

+

Examples

+ +
+ + + + + + + + + +
+

In the InfluxDB CLI:

+ + +
> SELECT MEAN("water_level") FROM "h2o_feet"; SELECT "water_level" FROM "h2o_feet" LIMIT 2
+
+name: h2o_feet
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   4.442107025822522
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   8.12
+2015-08-18T00:00:00Z   2.064
+ +
+ + + +
+

With the InfluxDB API:

+ + +
{
+    "results": [
+        {
+            "statement_id": 0,
+            "series": [
+                {
+                    "name": "h2o_feet",
+                    "columns": [
+                        "time",
+                        "mean"
+                    ],
+                    "values": [
+                        [
+                            "1970-01-01T00:00:00Z",
+                            4.442107025822522
+                        ]
+                    ]
+                }
+            ]
+        },
+        {
+            "statement_id": 1,
+            "series": [
+                {
+                    "name": "h2o_feet",
+                    "columns": [
+                        "time",
+                        "water_level"
+                    ],
+                    "values": [
+                        [
+                            "2015-08-18T00:00:00Z",
+                            8.12
+                        ],
+                        [
+                            "2015-08-18T00:00:00Z",
+                            2.064
+                        ]
+                    ]
+                }
+            ]
+        }
+    ]
+}
+ +
+ + +
+ +

Subqueries

+

A subquery is a query that is nested in the FROM clause of another query. +Use a subquery to apply a query as a condition in the enclosing query. +Subqueries offer functionality similar to nested functions and SQL +HAVING clauses.

+

Syntax

+ + +
SELECT_clause FROM ( SELECT_statement ) [...]
+

InfluxDB performs the subquery first and the main query second.

+

The main query surrounds the subquery and requires at least the SELECT clause and the FROM clause. +The main query supports all clauses listed in this document.

+

The subquery appears in the main query’s FROM clause, and it requires surrounding parentheses. +The subquery supports all clauses listed in this document.

+

InfluxQL supports multiple nested subqueries per main query. +Sample syntax for multiple subqueries:

+ + +
SELECT_clause FROM ( SELECT_clause FROM ( SELECT_statement ) [...] ) [...]
+ +
+

Improve performance of time-bound subqueries

+

To improve the performance of InfluxQL queries with time-bound subqueries, +apply the WHERE time clause to the outer query instead of the inner query. +For example, the following queries return the same results, but the query with +time bounds on the outer query is more performant than the query with time +bounds on the inner query:

+ + + +
SELECT inner_value AS value FROM (SELECT raw_value as inner_value)
+WHERE time >= '2020-07-19T21:00:00Z'
+AND time <= '2020-07-20T22:00:00Z'
+
Time bounds on the inner query
+ + +
SELECT inner_value AS value FROM (
+  SELECT raw_value as inner_value
+  WHERE time >= '2020-07-19T21:00:00Z'
+  AND time <= '2020-07-20T22:00:00Z'
+)
+ +
+ +

Examples

+

Calculate the SUM() of several MAX() values

+ + +
> SELECT SUM("max") FROM (SELECT MAX("water_level") FROM "h2o_feet" GROUP BY "location")
+
+name: h2o_feet
+time                   sum
+----                   ---
+1970-01-01T00:00:00Z   17.169
+

The query returns the sum of the maximum water_level values across every tag value of location.

+

InfluxDB first performs the subquery; it calculates the maximum value of water_level for each tag value of location:

+ + +
> SELECT MAX("water_level") FROM "h2o_feet" GROUP BY "location"
+name: h2o_feet
+
+tags: location=coyote_creek
+time                   max
+----                   ---
+2015-08-29T07:24:00Z   9.964
+
+name: h2o_feet
+tags: location=santa_monica
+time                   max
+----                   ---
+2015-08-29T03:54:00Z   7.205
+

Next, InfluxDB performs the main query and calculates the sum of those maximum values: 9.964 + 7.205 = 17.169. +Notice that the main query specifies max, not water_level, as the field key in the SUM() function.

+

Calculate the MEAN() difference between two fields

+ + +
> SELECT MEAN("difference") FROM (SELECT "cats" - "dogs" AS "difference" FROM "pet_daycare")
+
+name: pet_daycare
+time                   mean
+----                   ----
+1970-01-01T00:00:00Z   1.75
+

The query returns the average of the differences between the number of cats and dogs in the pet_daycare measurement.

+

InfluxDB first performs the subquery. +The subquery calculates the difference between the values in the cats field and the values in the dogs field, +and it names the output column difference:

+ + +
> SELECT "cats" - "dogs" AS "difference" FROM "pet_daycare"
+
+name: pet_daycare
+time                   difference
+----                   ----------
+2017-01-20T00:55:56Z   -1
+2017-01-21T00:55:56Z   -49
+2017-01-22T00:55:56Z   66
+2017-01-23T00:55:56Z   -9
+

Next, InfluxDB performs the main query and calculates the average of those differences. +Notice that the main query specifies difference as the field key in the MEAN() function.

+

Calculate several MEAN() values and place a condition on those mean values

+ + +
> SELECT "all_the_means" FROM (SELECT MEAN("water_level") AS "all_the_means" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m) ) WHERE "all_the_means" > 5
+
+name: h2o_feet
+time                   all_the_means
+----                   -------------
+2015-08-18T00:00:00Z   5.07625
+

The query returns all mean values of the water_level field that are greater than five.

+

InfluxDB first performs the subquery. +The subquery calculates MEAN() values of water_level from 2015-08-18T00:00:00Z through 2015-08-18T00:30:00Z and groups the results into 12-minute intervals. +It also names the output column all_the_means:

+ + +
> SELECT MEAN("water_level") AS "all_the_means" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m)
+
+name: h2o_feet
+time                   all_the_means
+----                   -------------
+2015-08-18T00:00:00Z   5.07625
+2015-08-18T00:12:00Z   4.950749999999999
+2015-08-18T00:24:00Z   4.80675
+

Next, InfluxDB performs the main query and returns only those mean values that are greater than five. +Notice that the main query specifies all_the_means as the field key in the SELECT clause.

+

Calculate the SUM() of several DERIVATIVE() values

+ + +
> SELECT SUM("water_level_derivative") AS "sum_derivative" FROM (SELECT DERIVATIVE(MEAN("water_level")) AS "water_level_derivative" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),"location") GROUP BY "location"
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   sum_derivative
+----                   --------------
+1970-01-01T00:00:00Z   -0.4950000000000001
+
+name: h2o_feet
+tags: location=santa_monica
+time                   sum_derivative
+----                   --------------
+1970-01-01T00:00:00Z   -0.043999999999999595
+

The query returns the sum of the derivative of average water_level values for each tag value of location.

+

InfluxDB first performs the subquery. +The subquery calculates the derivative of average water_level values taken at 12-minute intervals. +It performs that calculation for each tag value of location and names the output column water_level_derivative:

+ + +
> SELECT DERIVATIVE(MEAN("water_level")) AS "water_level_derivative" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),"location"
+
+name: h2o_feet
+tags: location=coyote_creek
+time                   water_level_derivative
+----                   ----------------------
+2015-08-18T00:12:00Z   -0.23800000000000043
+2015-08-18T00:24:00Z   -0.2569999999999997
+
+name: h2o_feet
+tags: location=santa_monica
+time                   water_level_derivative
+----                   ----------------------
+2015-08-18T00:12:00Z   -0.0129999999999999
+2015-08-18T00:24:00Z   -0.030999999999999694
+

Next, InfluxDB performs the main query and calculates the sum of the water_level_derivative values for each tag value of location. +Notice that the main query specifies water_level_derivative, not water_level or derivative, as the field key in the SUM() function.

+

Common issues with subqueries

+

Multiple SELECT statements in a subquery

+

InfluxQL supports multiple nested subqueries per main query:

+ + +
SELECT_clause FROM ( SELECT_clause FROM ( SELECT_statement ) [...] ) [...]
+                     ------------------   ----------------
+                         Subquery 1          Subquery 2
+

InfluxQL does not support multiple SELECT statements per subquery:

+ + +
SELECT_clause FROM (SELECT_statement; SELECT_statement) [...]
+

The system returns a parsing error if a subquery includes multiple SELECT statements.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/query_language/manage-database/index.html b/pr-preview/pr-6948/influxdb/v1/query_language/manage-database/index.html new file mode 100644 index 000000000..7c579eed5 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/query_language/manage-database/index.html @@ -0,0 +1,2814 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Manage your database using InfluxQL | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Manage your database using InfluxQL

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL offers a full suite of administrative commands.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data Management:Retention Policy Management:
CREATE DATABASECREATE RETENTION POLICY
DROP DATABASEALTER RETENTION POLICY
DROP SERIESDROP RETENTION POLICY
DELETE
DROP MEASUREMENT
DROP SHARD
+

If you’re looking for SHOW queries (for example, SHOW DATABASES or SHOW RETENTION POLICIES), see Schema Exploration.

+

The examples in the sections below use the InfluxDB Command Line Interface (CLI). +You can also execute the commands using the InfluxDB API; simply send a GET request to the /query endpoint and include the command in the URL parameter q. +For more on using the InfluxDB API, see Querying data.

+ +
+

Note: When authentication is enabled, only admin users can execute most of the commands listed on this page. +See the documentation on authentication and authorization for more information.

+ +
+

Data management

+

CREATE DATABASE

+

Creates a new database.

+

Syntax

+ + +
CREATE DATABASE <database_name> [WITH [DURATION <duration>] [REPLICATION <n>] [SHARD DURATION <duration>] [FUTURE LIMIT <duration>] [PAST LIMIT <duration>] [NAME <retention-policy-name>]]
+

Description of syntax

+

CREATE DATABASE requires a database name.

+

The WITH, DURATION, REPLICATION, SHARD DURATION, FUTURE LIMIT, +PAST LIMIT, and NAME clauses are optional and create a single +retention policy +associated with the created database. +If you do not specify one of the clauses after WITH, the relevant behavior +defaults to the autogen retention policy settings. +The created retention policy automatically serves as the database’s default retention policy. +For more information about those clauses, see +Retention Policy Management.

+

A successful CREATE DATABASE query returns an empty result. +If you attempt to create a database that already exists, InfluxDB does nothing and does not return an error.

+

Examples

+
Create a database
+ + +
CREATE DATABASE "NOAA_water_database"
+

The query creates a database called NOAA_water_database. +By default, InfluxDB also creates the autogen retention policy and associates it with the NOAA_water_database.

+
Create a database with a specific retention policy
+ + +
CREATE DATABASE "NOAA_water_database" WITH DURATION 3d REPLICATION 1 SHARD DURATION 1h NAME "liquid"
+

The query creates a database called NOAA_water_database. +It also creates a default retention policy for NOAA_water_database with a DURATION of three days, a replication factor of one, a shard group duration of one hour, and with the name liquid.

+

Delete a database with DROP DATABASE

+

The DROP DATABASE query deletes all of the data, measurements, series, continuous queries, and retention policies from the specified database. +The query takes the following form:

+ + +
DROP DATABASE <database_name>
+

Drop the database NOAA_water_database:

+ + +
DROP DATABASE "NOAA_water_database"
+

A successful DROP DATABASE query returns an empty result. +If you attempt to drop a database that does not exist, InfluxDB does not return an error.

+

Drop series from the index with DROP SERIES

+

The DROP SERIES query deletes all points from a series in a database, +and it drops the series from the index.

+

The query takes the following form, where you must specify either the FROM clause or the WHERE clause:

+ + +
DROP SERIES FROM <measurement_name[,measurement_name]> WHERE <tag_key>='<tag_value>'
+

Drop all series from a single measurement:

+ + +
DROP SERIES FROM "h2o_feet"
+

Drop series with a specific tag pair from a single measurement:

+ + +
DROP SERIES FROM "h2o_feet" WHERE "location" = 'santa_monica'
+

Drop all points in the series that have a specific tag pair from all measurements in the database:

+ + +
DROP SERIES WHERE "location" = 'santa_monica'
+

A successful DROP SERIES query returns an empty result.

+

Delete series with DELETE

+

The DELETE query deletes all points from a +series in a database. +Unlike +DROP SERIES, DELETE does not drop the series from the index.

+

You must include either the FROM clause, the WHERE clause, or both:

+ + +
DELETE FROM <measurement_name> WHERE [<tag_key>='<tag_value>'] | [<time interval>]
+

Delete all data associated with the measurement h2o_feet:

+ + +
DELETE FROM "h2o_feet"
+

Delete all data associated with the measurement h2o_quality and where the tag randtag equals 3:

+ + +
DELETE FROM "h2o_quality" WHERE "randtag" = '3'
+

Delete all data in the database that occur before January 01, 2020:

+ + +
DELETE WHERE time < '2020-01-01'
+

Delete all data associated with the measurement h2o_feet in retention policy one_day:

+ + +
DELETE FROM "one_day"."h2o_feet"
+

A successful DELETE query returns an empty result.

+

Things to note about DELETE:

+
    +
  • DELETE supports +regular expressions +in the FROM clause when specifying measurement names and in the WHERE clause +when specifying tag values. It does not support regular expressions for the +retention policy in the FROM clause. +If deleting a series in a retention policy, DELETE requires that you define +only one retention policy in the FROM clause.
  • +
  • DELETE does not support fields in +the WHERE clause.
  • +
  • If you need to delete points in the future, you must specify that time period +as DELETE SERIES runs for time < now() by default.
  • +
+

Delete measurements with DROP MEASUREMENT

+

The DROP MEASUREMENT query deletes all data and series from the specified measurement and deletes the +measurement from the index.

+

The query takes the following form:

+ + +
DROP MEASUREMENT <measurement_name>
+

Delete the measurement h2o_feet:

+ + +
DROP MEASUREMENT "h2o_feet"
+ +
+

Note: DROP MEASUREMENT drops all data and series in the measurement. +It does not drop the associated continuous queries.

+ +
+

A successful DROP MEASUREMENT query returns an empty result.

+ +
+

Currently, InfluxDB does not support regular expressions with DROP MEASUREMENT. +See GitHub Issue #4275 for more information.

+ +
+ +

Delete a shard with DROP SHARD

+

The DROP SHARD query deletes a shard. It also drops the shard from the +metastore. +The query takes the following form:

+ + +
DROP SHARD <shard_id_number>
+

Delete the shard with the id 1:

+ + +
DROP SHARD 1
+

A successful DROP SHARD query returns an empty result. +InfluxDB does not return an error if you attempt to drop a shard that does not +exist.

+

Retention policy management

+

The following sections cover how to create, alter, and delete retention policies. +Note that when you create a database, InfluxDB automatically creates a retention policy named autogen which has infinite retention. +You may disable its auto-creation in the configuration file.

+

Create retention policies with CREATE RETENTION POLICY

+

Syntax

+ + +
CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [FUTURE LIMIT <duration>] [PAST LIMIT <duration>] [DEFAULT]
+

Description of syntax

+
DURATION
+
    +
  • The DURATION clause determines how long InfluxDB keeps the data. +The <duration> is a duration literal +or INF (infinite). +The minimum duration for a retention policy is one hour and the maximum +duration is INF.
  • +
+
REPLICATION
+
    +
  • +

    The REPLICATION clause determines how many independent copies of each point +are stored in the cluster.

    +
  • +
  • +

    By default, the replication factor n usually equals the number of data nodes. However, if you have four or more data nodes, the default replication factor n is 3.

    +
  • +
  • +

    To ensure data is immediately available for queries, set the replication factor n to less than or equal to the number of data nodes in the cluster.

    +
  • +
+ +
+

Important: If you have four or more data nodes, verify that the database replication factor is correct.

+ +
+
    +
  • Replication factors do not serve a purpose with single node instances.
  • +
+
SHARD DURATION
+
    +
  • Optional. The SHARD DURATION clause determines the time range covered by a shard group.
  • +
  • The <duration> is a duration literal +and does not support an INF (infinite) duration.
  • +
  • By default, the shard group duration is determined by the retention policy’s +DURATION:
  • +
+ + + + + + + + + + + + + + + + + + + + + +
Retention Policy’s DURATIONShard Group Duration
< 2 days1 hour
>= 2 days and <= 6 months1 day
> 6 months7 days
+

The minimum allowable SHARD GROUP DURATION is 1h. +If the CREATE RETENTION POLICY query attempts to set the SHARD GROUP DURATION to less than 1h and greater than 0s, InfluxDB automatically sets the SHARD GROUP DURATION to 1h. +If the CREATE RETENTION POLICY query attempts to set the SHARD GROUP DURATION to 0s, InfluxDB automatically sets the SHARD GROUP DURATION according to the default settings listed above.

+

See +Shard group duration management +for recommended configurations.

+
FUTURE LIMIT
+

The FUTURE LIMIT clause defines a time boundary after and relative to now +in which points written to the retention policy are accepted. If a point has a +timestamp after the specified boundary, the point is rejected and the write +request returns a partial write error.

+

For example, if a write request tries to write data to a retention policy with a +FUTURE LIMIT 6h and there are points in the request with future timestamps +greater than 6 hours from now, those points are rejected.

+
PAST LIMIT
+

The PAST LIMIT clause defines a time boundary before and relative to now +in which points written to the retention policy are accepted. If a point has a +timestamp before the specified boundary, the point is rejected and the write +request returns a partial write error.

+

For example, if a write request tries to write data to a retention policy with a +PAST LIMIT 6h and there are points in the request with timestamps older than +6 hours, those points are rejected.

+
DEFAULT
+

Sets the new retention policy as the default retention policy for the database. +This setting is optional.

+

Examples

+
Create a retention policy
+ + +
CREATE RETENTION POLICY "one_day_only" ON "NOAA_water_database" DURATION 1d REPLICATION 1
+

The query creates a retention policy called one_day_only for the database +NOAA_water_database with a one day duration and a replication factor of one.

+
Create a DEFAULT retention policy
+ + +
CREATE RETENTION POLICY "one_day_only" ON "NOAA_water_database" DURATION 23h60m REPLICATION 1 DEFAULT
+

The query creates the same retention policy as the one in the example above, but +sets it as the default retention policy for the database.

+

A successful CREATE RETENTION POLICY query returns an empty response. +If you attempt to create a retention policy identical to one that already exists, InfluxDB does not return an error. +If you attempt to create a retention policy with the same name as an existing retention policy but with differing attributes, InfluxDB returns an error.

+ +
+

Note: You can also specify a new retention policy in the CREATE DATABASE query. +See Create a database with CREATE DATABASE.

+ +
+

Modify retention policies with ALTER RETENTION POLICY

+

The ALTER RETENTION POLICY query takes the following form, where you must declare at least one of the retention policy attributes DURATION, REPLICATION, SHARD DURATION, FUTURE LIMIT, PAST LIMIT, or DEFAULT:

+ + +
ALTER RETENTION POLICY <retention_policy_name> ON <database_name> [DURATION <duration>] [REPLICATION <n>] [SHARD DURATION <duration>] [FUTURE LIMIT <duration>] [PAST LIMIT <duration>] [DEFAULT]
+ +
+

Replication factors do not serve a purpose with single node instances.

+ +
+ +

For information about the FUTURE LIMIT and PAST LIMIT clauses, see +CREATE RETENTION POLICY.

+

First, create the retention policy what_is_time with a DURATION of two days:

+ + +
CREATE RETENTION POLICY "what_is_time" ON "NOAA_water_database" DURATION 2d REPLICATION 1
+

Modify what_is_time to have a three week DURATION, a two hour shard group duration, and make it the DEFAULT retention policy for NOAA_water_database.

+ + +
ALTER RETENTION POLICY "what_is_time" ON "NOAA_water_database" DURATION 3w SHARD DURATION 2h DEFAULT
+

In the last example, what_is_time retains its original replication factor of 1.

+

A successful ALTER RETENTION POLICY query returns an empty result.

+

Delete retention policies with DROP RETENTION POLICY

+

Delete all measurements and data in a specific retention policy:

+ +
+

Dropping a retention policy will permanently delete all measurements and data stored in the retention policy.

+ +
+ + + +
DROP RETENTION POLICY <retention_policy_name> ON <database_name>
+

Delete the retention policy what_is_time in the NOAA_water_database database:

+ + +
DROP RETENTION POLICY "what_is_time" ON "NOAA_water_database"
+

A successful DROP RETENTION POLICY query returns an empty result. +If you attempt to drop a retention policy that does not exist, InfluxDB does not return an error.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/query_language/sample-data/index.html b/pr-preview/pr-6948/influxdb/v1/query_language/sample-data/index.html new file mode 100644 index 000000000..ebf7b29c2 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/query_language/sample-data/index.html @@ -0,0 +1,2569 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sample data | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Sample data

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

In order to explore the query language further, these instructions help you create a database, +download and write data to that database within your InfluxDB installation. +The sample data is then used and referenced in Data Exploration, +Schema Exploration, and Functions.

+

Creating a database

+

If you’ve installed InfluxDB locally, the influx command should be available via the command line. +Executing influx will start the CLI and automatically connect to the local InfluxDB instance +(assuming you have already started the server with service influxdb start or by running influxd directly). +The output should look like this:

+ + +
$ influx -precision rfc3339
+Connected to http://localhost:8086 version 1.12.3
+InfluxDB shell 1.12.3
+>
+ +
+

Notes:

+ +
+
    +
  • The InfluxDB API runs on port 8086 by default. +Therefore, influx will connect to port 8086 and localhost by default. +If you need to alter these defaults, run influx --help.
  • +
  • The -precision argument specifies the format/precision of any returned timestamps. +In the example above, rfc3339 tells InfluxDB to return timestamps in RFC3339 format (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ).
  • +
+

The command line is now ready to take input in the form of the Influx Query Language (a.k.a InfluxQL) statements. +To exit the InfluxQL shell, type exit and hit return.

+

A fresh install of InfluxDB has no databases (apart from the system _internal), +so creating one is our first task. +You can create a database with the CREATE DATABASE <db-name> InfluxQL statement, +where <db-name> is the name of the database you wish to create. +Names of databases can contain any unicode character as long as the string is double-quoted. +Names can also be left unquoted if they contain only ASCII letters, +digits, or underscores and do not begin with a digit.

+

Throughout the query language exploration, we’ll use the database name NOAA_water_database:

+ + +
CREATE DATABASE NOAA_water_database
+exit
+

Download and write the data to InfluxDB

+

From your terminal, download the text file that contains the data in line protocol format:

+ + +
curl https://s3.amazonaws.com/noaa.water-database/NOAA_data.txt -o NOAA_data.txt
+

Write the data to InfluxDB via the CLI:

+ + +
influx -import -path=NOAA_data.txt -precision=s -database=NOAA_water_database
+

Test queries

+ + +
$ influx -precision rfc3339 -database NOAA_water_database
+Connected to http://localhost:8086 version 1.12.3
+InfluxDB shell 1.12.3
+>
+

See all five measurements:

+ + +
> SHOW measurements
+name: measurements
+------------------
+name
+average_temperature
+h2o_feet
+h2o_pH
+h2o_quality
+h2o_temperature
+

Count the number of non-null values of water_level in h2o_feet:

+ + +
> SELECT COUNT("water_level") FROM h2o_feet
+name: h2o_feet
+--------------
+time			               count
+1970-01-01T00:00:00Z	 15258
+

Select the first five observations in the measurement h2o_feet:

+ + +
> SELECT * FROM h2o_feet LIMIT 5
+name: h2o_feet
+--------------
+time			                 level description	      location	       water_level
+2015-08-18T00:00:00Z	   below 3 feet		          santa_monica	   2.064
+2015-08-18T00:00:00Z	   between 6 and 9 feet	   coyote_creek	   8.12
+2015-08-18T00:06:00Z	   between 6 and 9 feet	   coyote_creek	   8.005
+2015-08-18T00:06:00Z	   below 3 feet		          santa_monica	   2.116
+2015-08-18T00:12:00Z	   between 6 and 9 feet	   coyote_creek	   7.887
+

Data sources and things to note

+

The sample data is publicly available data from the National Oceanic and Atmospheric Administration’s (NOAA) Center for Operational Oceanographic Products and Services. +The data include 15,258 observations of water levels (ft) collected every six minutes at two stations (Santa Monica, CA (ID 9410840) and Coyote Creek, CA (ID 9414575)) over the period from August 18, 2015 through September 18, 2015.

+

Note that the measurements average_temperature, h2o_pH, h2o_quality, and h2o_temperature contain fictional data. +Those measurements serve to illuminate query functionality in Schema Exploration.

+

The h2o_feet measurement is the only measurement that contains the NOAA data. +Please note that the level description field isn’t part of the original NOAA data - we snuck it in there for the sake of having a field key with a special character and string field values.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/query_language/spec/index.html b/pr-preview/pr-6948/influxdb/v1/query_language/spec/index.html new file mode 100644 index 000000000..2de472c62 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/query_language/spec/index.html @@ -0,0 +1,3836 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Influx Query Language (InfluxQL) reference | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Influx Query Language (InfluxQL) reference

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL is a SQL-like query language for interacting with InfluxDB +and providing features specific to storing and analyzing time series data.

+ +

Notation

+

The syntax is specified using Extended Backus-Naur Form (“EBNF”). +EBNF is the same notation used in the Go programming language specification.

+ + +
Production  = production_name "=" [ Expression ] "." .
+Expression  = Alternative { "|" Alternative } .
+Alternative = Term { Term } .
+Term        = production_name | token [ "…" token ] | Group | Option | Repetition .
+Group       = "(" Expression ")" .
+Option      = "[" Expression "]" .
+Repetition  = "{" Expression "}" .
+

Notation operators in order of increasing precedence:

+ + +
|   alternation
+()  grouping
+[]  option (0 or 1 times)
+{}  repetition (0 to n times)
+

Query representation

+

Characters

+

InfluxQL is Unicode text encoded in UTF-8.

+ + +
newline             = /* the Unicode code point U+000A */ .
+unicode_char        = /* an arbitrary Unicode code point except newline */ .
+

Letters and digits

+

Letters are the set of ASCII characters plus the underscore character _ (U+005F) is considered a letter.

+

Only decimal digits are supported.

+ + +
letter              = ascii_letter | "_" .
+ascii_letter        = "A" … "Z" | "a" … "z" .
+digit               = "0" … "9" .
+

Identifiers

+

Identifiers are tokens which refer to database names, retention policy names, user names, measurement names, tag keys, and field keys.

+

The rules:

+
    +
  • double quoted identifiers can contain any unicode character other than a new line
  • +
  • double quoted identifiers can contain escaped " characters (i.e., \")
  • +
  • double quoted identifiers can contain InfluxQL keywords
  • +
  • unquoted identifiers must start with an upper or lowercase ASCII character or “_”
  • +
  • unquoted identifiers may contain only ASCII letters, decimal digits, and “_”
  • +
+ + +
identifier          = unquoted_identifier | quoted_identifier .
+unquoted_identifier = ( letter ) { letter | digit } .
+quoted_identifier   = `"` unicode_char { unicode_char } `"` .
+

Examples

+ + +
cpu
+_cpu_stats
+"1h"
+"anything really"
+"1_Crazy-1337.identifier>NAME👍"
+

Keywords

+ + +
ALL           ALTER         ANY           AS            ASC           BEGIN
+BY            CREATE        CONTINUOUS    DATABASE      DATABASES     DEFAULT
+DELETE        DESC          DESTINATIONS  DIAGNOSTICS   DISTINCT      DROP
+DURATION      END           EVERY         EXPLAIN       FIELD         FOR
+FROM          FUTURE        GRANT         GRANTS        GROUP         GROUPS
+IN            INF           INSERT        INTO          KEY           KEYS
+KILL          LIMIT         SHOW          MEASUREMENT   MEASUREMENTS  NAME
+OFFSET        ON            ORDER         PASSWORD      PAST          POLICY
+POLICIES      PRIVILEGES    QUERIES       QUERY         READ          REPLICATION
+RESAMPLE      RETENTION     REVOKE        SELECT        SERIES        SET
+SHARD         SHARDS        SLIMIT        SOFFSET       STATS         SUBSCRIPTION
+SUBSCRIPTIONS TAG           TO            USER          USERS         VALUES
+WHERE         WITH          WRITE
+

If you use an InfluxQL keyword as an +identifier you will need to +double quote that identifier in every query.

+

The keyword time is a special case. +time can be a +continuous query name, +database name, +measurement name, +retention policy name, +subscription name, and +user name. +In those cases, time does not require double quotes in queries. +time cannot be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error. +For more information, see Frequently Asked Questions.

+

Literals

+

Integers

+

InfluxQL supports decimal integer literals. +Hexadecimal and octal literals are not currently supported.

+ + +
int_lit             = ( "1" … "9" ) { digit } .
+

Floats

+

InfluxQL supports floating-point literals. +Exponents are not currently supported.

+ + +
float_lit           = int_lit "." int_lit .
+

Strings

+

String literals must be surrounded by single quotes. +Strings may contain ' characters as long as they are escaped (i.e., \').

+ + +
string_lit          = `'` { unicode_char } `'` .
+

Durations

+

Duration literals specify a length of time. +An integer literal followed immediately (with no spaces) by a duration unit listed below is interpreted as a duration literal. +Durations can be specified with mixed units.

+

Duration units

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UnitsMeaning
nsnanoseconds (1 billionth of a second)
u or µmicroseconds (1 millionth of a second)
msmilliseconds (1 thousandth of a second)
ssecond
mminute
hhour
dday
wweek
+ + +
duration_lit        = int_lit duration_unit .
+duration_unit       = "ns" | "u" | "µ" | "ms" | "s" | "m" | "h" | "d" | "w" .
+

Dates & Times

+

The date and time literal format is not specified in EBNF like the rest of this document. +It is specified using Go’s date / time parsing format, which is a reference date written in the format required by InfluxQL. +The reference date time is:

+

InfluxQL reference date time: January 2nd, 2006 at 3:04:05 PM

+ + +
time_lit            = "2006-01-02 15:04:05.999999" | "2006-01-02" .
+

Booleans

+ + +
bool_lit            = TRUE | FALSE .
+

Regular Expressions

+ + +
regex_lit           = "/" { unicode_char } "/" .
+

Comparators: +=~ matches against +!~ doesn’t match against

+

InfluxQL supports using regular expressions when specifying:

+ + +
+ + +

Regular expressions and non-string field values

+

Currently, InfluxQL does not support using regular expressions to match +non-string field values in the +WHERE clause, +databases, and +retention policies.

+
+

Queries

+

A query is composed of one or more statements separated by a semicolon.

+ + +
query               = statement { ";" statement } .
+
+statement           = alter_retention_policy_stmt |
+                      create_continuous_query_stmt |
+                      create_database_stmt |
+                      create_retention_policy_stmt |
+                      create_subscription_stmt |
+                      create_user_stmt |
+                      delete_stmt |
+                      drop_continuous_query_stmt |
+                      drop_database_stmt |
+                      drop_measurement_stmt |
+                      drop_retention_policy_stmt |
+                      drop_series_stmt |
+                      drop_shard_stmt |
+                      drop_subscription_stmt |
+                      drop_user_stmt |
+                      explain_stmt |
+                      explain_analyze_stmt |
+                      grant_stmt |
+                      kill_query_statement |
+                      revoke_stmt |
+                      select_stmt |
+                      show_continuous_queries_stmt |
+                      show_databases_stmt |
+                      show_diagnostics_stmt |
+                      show_field_key_cardinality_stmt |
+                      show_field_keys_stmt |
+                      show_grants_stmt |
+                      show_measurement_cardinality_stmt |
+                      show_measurement_exact_cardinality_stmt |
+                      show_measurements_stmt |
+                      show_queries_stmt |
+                      show_retention_policies_stmt |
+                      show_series_cardinality_stmt |
+                      show_series_exact_cardinality_stmt |
+                      show_series_stmt |
+                      show_shard_groups_stmt |
+                      show_shards_stmt |
+                      show_stats_stmt |
+                      show_subscriptions_stmt |
+                      show_tag_key_cardinality_stmt |
+                      show_tag_key_exact_cardinality_stmt |
+                      show_tag_keys_stmt |
+                      show_tag_values_stmt |
+                      show_tag_values_cardinality_stmt |
+                      show_users_stmt .
+

Statements

+

ALTER RETENTION POLICY

+ + +
alter_retention_policy_stmt  = "ALTER RETENTION POLICY" policy_name on_clause
+                               retention_policy_option
+                               [ retention_policy_option ]
+                               [ retention_policy_option ]
+                               [ retention_policy_option ]
+                               [ retention_policy_option ]
+                               [ retention_policy_option ] .
+

Examples

+ + +
-- Set default retention policy for mydb to 1h.cpu.
+ALTER RETENTION POLICY "1h.cpu" ON "mydb" DEFAULT
+
+-- Change duration and replication factor.
+-- REPLICATION (replication factor) not valid for OSS instances.
+ALTER RETENTION POLICY "policy1" ON "somedb" DURATION 1h REPLICATION 4
+
+-- Change future and past limits.
+ALTER RETENTION POLICY "policy1" ON "somedb" FUTURE LIMIT 6h PAST LIMIT 6h
+

CREATE CONTINUOUS QUERY

+ + +
create_continuous_query_stmt = "CREATE CONTINUOUS QUERY" query_name on_clause
+                               [ "RESAMPLE" resample_opts ]
+                               "BEGIN" select_stmt "END" .
+
+query_name                   = identifier .
+
+resample_opts                = (every_stmt for_stmt | every_stmt | for_stmt) .
+every_stmt                   = "EVERY" duration_lit
+for_stmt                     = "FOR" duration_lit
+

Examples

+ + +
-- selects from DEFAULT retention policy and writes into 6_months retention policy
+CREATE CONTINUOUS QUERY "10m_event_count"
+ON "db_name"
+BEGIN
+  SELECT count("value")
+  INTO "6_months"."events"
+  FROM "events"
+  GROUP (10m)
+END;
+
+-- this selects from the output of one continuous query in one retention policy and outputs to another series in another retention policy
+CREATE CONTINUOUS QUERY "1h_event_count"
+ON "db_name"
+BEGIN
+  SELECT sum("count") as "count"
+  INTO "2_years"."events"
+  FROM "6_months"."events"
+  GROUP BY time(1h)
+END;
+
+-- this customizes the resample interval so the interval is queried every 10s and intervals are resampled until 2m after their start time
+-- when resample is used, at least one of "EVERY" or "FOR" must be used
+CREATE CONTINUOUS QUERY "cpu_mean"
+ON "db_name"
+RESAMPLE EVERY 10s FOR 2m
+BEGIN
+  SELECT mean("value")
+  INTO "cpu_mean"
+  FROM "cpu"
+  GROUP BY time(1m)
+END;
+

CREATE DATABASE

+ + +
create_database_stmt = "CREATE DATABASE" db_name
+                       [ WITH
+                           [ retention_policy_duration ]
+                           [ retention_policy_replication ]
+                           [ retention_policy_shard_group_duration ]
+                           [ retention_future_limit ]
+                           [ retention_past_limit ]
+                           [ retention_policy_name ]
+                       ] .
+ +
+ + +

When using both FUTURE LIMIT and PAST LIMIT clauses, FUTURE LIMIT must appear before PAST LIMIT.

+
+ +
+ + +

Replication factors do not serve a purpose with single node instances.

+
+

Examples

+ + +
-- Create a database called foo
+CREATE DATABASE "foo"
+
+-- Create a database called bar with a new DEFAULT retention policy and specify
+-- the duration, replication, shard group duration, and name of that retention policy
+CREATE DATABASE "bar" WITH DURATION 1d REPLICATION 1 SHARD DURATION 30m NAME "myrp"
+
+-- Create a database called mydb with a new DEFAULT retention policy and specify
+-- the name of that retention policy
+CREATE DATABASE "mydb" WITH NAME "myrp"
+
+-- Create a database called bar with a new retention policy named "myrp", and
+-- specify the duration, future and past limits, and name of that retention policy
+CREATE DATABASE "bar" WITH DURATION 1d FUTURE LIMIT 6h PAST LIMIT 6h NAME "myrp"
+

CREATE RETENTION POLICY

+ + +
create_retention_policy_stmt = "CREATE RETENTION POLICY" policy_name on_clause
+                               retention_policy_duration
+                               retention_policy_replication
+                               [ retention_policy_shard_group_duration ]
+                               [ retention_future_limit ]
+                               [ retention_past_limit ]
+                               [ "DEFAULT" ] .
+ +
+ + +

When using both FUTURE LIMIT and PAST LIMIT clauses, FUTURE LIMIT must appear before PAST LIMIT.

+
+ +
+ + +

Replication factors do not serve a purpose with single node instances.

+
+

Examples

+ + +
-- Create a retention policy.
+CREATE RETENTION POLICY "10m.events" ON "somedb" DURATION 60m REPLICATION 2
+
+-- Create a retention policy and set it as the DEFAULT.
+CREATE RETENTION POLICY "10m.events" ON "somedb" DURATION 60m REPLICATION 2 DEFAULT
+
+-- Create a retention policy and specify the shard group duration.
+CREATE RETENTION POLICY "10m.events" ON "somedb" DURATION 60m REPLICATION 2 SHARD DURATION 30m
+
+-- Create a retention policy and specify future and past limits.
+CREATE RETENTION POLICY "10m.events" ON "somedb" DURATION 12h FUTURE LIMIT 6h PAST LIMIT 6h
+

CREATE SUBSCRIPTION

+

Subscriptions tell InfluxDB to send all the data it receives to Kapacitor.

+ + +
create_subscription_stmt = "CREATE SUBSCRIPTION" subscription_name "ON" db_name "." retention_policy "DESTINATIONS" ("ANY"|"ALL") host { "," host} .
+

Examples

+ + +
-- Create a SUBSCRIPTION on database 'mydb' and retention policy 'autogen' that send data to 'example.com:9090' via UDP.
+CREATE SUBSCRIPTION "sub0" ON "mydb"."autogen" DESTINATIONS ALL 'udp://example.com:9090'
+
+-- Create a SUBSCRIPTION on database 'mydb' and retention policy 'autogen' that round robins the data to 'h1.example.com:9090' and 'h2.example.com:9090'.
+CREATE SUBSCRIPTION "sub0" ON "mydb"."autogen" DESTINATIONS ANY 'udp://h1.example.com:9090', 'udp://h2.example.com:9090'
+

CREATE USER

+ + +
create_user_stmt = "CREATE USER" user_name "WITH PASSWORD" password
+                   [ "WITH ALL PRIVILEGES" ] .
+

Examples

+ + +
-- Create a normal database user.
+CREATE USER "jdoe" WITH PASSWORD '1337password'
+
+-- Create an admin user.
+-- Note: Unlike the GRANT statement, the "PRIVILEGES" keyword is required here.
+CREATE USER "jdoe" WITH PASSWORD '1337password' WITH ALL PRIVILEGES
+ +
+

Note: The password string must be wrapped in single quotes.

+ +
+

DELETE

+ + +
delete_stmt = "DELETE" ( from_clause | where_clause | from_clause where_clause ) .
+

Examples

+ + +
DELETE FROM "cpu"
+DELETE FROM "cpu" WHERE time < '2000-01-01T00:00:00Z'
+DELETE WHERE time < '2000-01-01T00:00:00Z'
+

DROP CONTINUOUS QUERY

+ + +
drop_continuous_query_stmt = "DROP CONTINUOUS QUERY" query_name on_clause .
+

Example

+ + +
DROP CONTINUOUS QUERY "myquery" ON "mydb"
+

DROP DATABASE

+ + +
drop_database_stmt = "DROP DATABASE" db_name .
+

Example

+ + +
DROP DATABASE "mydb"
+

DROP MEASUREMENT

+ + +
drop_measurement_stmt = "DROP MEASUREMENT" measurement .
+

Examples

+ + +
-- drop the cpu measurement
+DROP MEASUREMENT "cpu"
+

DROP RETENTION POLICY

+ + +
drop_retention_policy_stmt = "DROP RETENTION POLICY" policy_name on_clause .
+

Example

+ + +
-- drop the retention policy named 1h.cpu from mydb
+DROP RETENTION POLICY "1h.cpu" ON "mydb"
+

DROP SERIES

+ + +
drop_series_stmt = "DROP SERIES" ( from_clause | where_clause | from_clause where_clause ) .
+ +
+

Note: Filtering by time is not supported in the WHERE clause.

+ +
+

Example

+ + +
DROP SERIES FROM "telegraf"."autogen"."cpu" WHERE cpu = 'cpu8'
+

DROP SHARD

+ + +
drop_shard_stmt = "DROP SHARD" ( shard_id ) .
+

Example

+ + +
DROP SHARD 1
+

DROP SUBSCRIPTION

+ + +
drop_subscription_stmt = "DROP SUBSCRIPTION" subscription_name "ON" db_name "." retention_policy .
+

Example

+ + +
DROP SUBSCRIPTION "sub0" ON "mydb"."autogen"
+

DROP USER

+ + +
drop_user_stmt = "DROP USER" user_name .
+

Example

+ + +
DROP USER "jdoe"
+

EXPLAIN

+

Parses and plans the query, and then prints a summary of estimated costs.

+

Many SQL engines use the EXPLAIN statement to show join order, join algorithms, and predicate and expression pushdown. +Since InfluxQL does not support joins, the cost of a InfluxQL query is typically a function of the total series accessed, the number of iterator accesses to a TSM file, and the number of TSM blocks that need to be scanned.

+

The elements of EXPLAIN query plan include:

+
    +
  • expression
  • +
  • auxiliary fields
  • +
  • number of shards
  • +
  • number of series
  • +
  • cached values
  • +
  • number of files
  • +
  • number of blocks
  • +
  • size of blocks
  • +
+ + +
explain_stmt = "EXPLAIN" select_stmt .
+

Example

+ + +
> explain select sum(pointReq) from "_internal"."monitor"."write" group by hostname;
+> QUERY PLAN
+------
+EXPRESSION: sum(pointReq::integer)
+NUMBER OF SHARDS: 2
+NUMBER OF SERIES: 2
+CACHED VALUES: 110
+NUMBER OF FILES: 1
+NUMBER OF BLOCKS: 1
+SIZE OF BLOCKS: 931
+

EXPLAIN ANALYZE

+

Executes the specified SELECT statement and returns data on the query performance and storage during runtime, visualized as a tree. Use this statement to analyze query performance and storage, including execution time and planning time, and the iterator type and cursor type.

+

For example, executing the following statement:

+ + +
explain analyze select mean(usage_steal) from cpu where time >= '2018-02-22T00:00:00Z' and time < '2018-02-22T12:00:00Z'
+

May produce an output similar to the following:

+ + +
EXPLAIN ANALYZE
+---------------
+.
+└── select
+    ├── execution_time: 2.25823ms
+    ├── planning_time: 18.381616ms
+    ├── total_time: 20.639846ms
+    └── field_iterators
+        ├── labels
+           └── statement: SELECT mean(usage_steal::float) FROM telegraf."default".cpu
+        └── expression
+            ├── labels
+               └── expr: mean(usage_steal::float)
+            └── create_iterator
+                ├── labels
+                   ├── measurement: cpu
+                   └── shard_id: 608
+                ├── cursors_ref: 779
+                ├── cursors_aux: 0
+                ├── cursors_cond: 0
+                ├── float_blocks_decoded: 431
+                ├── float_blocks_size_bytes: 1003552
+                ├── integer_blocks_decoded: 0
+                ├── integer_blocks_size_bytes: 0
+                ├── unsigned_blocks_decoded: 0
+                ├── unsigned_blocks_size_bytes: 0
+                ├── string_blocks_decoded: 0
+                ├── string_blocks_size_bytes: 0
+                ├── boolean_blocks_decoded: 0
+                ├── boolean_blocks_size_bytes: 0
+                └── planning_time: 14.805277ms```
+ +
+

Note: EXPLAIN ANALYZE ignores query output, so the cost of serialization to JSON or CSV is not accounted for.

+ +
+

execution_time

+

Shows the amount of time the query took to execute, including reading the time series data, performing operations as data flows through iterators, and draining processed data from iterators. Execution time doesn’t include the time taken to serialize the output into JSON or other formats.

+

planning_time

+

Shows the amount of time the query took to plan. +Planning a query in InfluxDB requires a number of steps. Depending on the complexity of the query, planning can require more work and consume more CPU and memory resources than the executing the query. For example, the number of series keys required to execute a query affects how quickly the query is planned and the required memory.

+

First, InfluxDB determines the effective time range of the query and selects the shards to access (in InfluxDB Enterprise, shards may be on remote nodes). +Next, for each shard and each measurement, InfluxDB performs the following steps:

+
    +
  1. Select matching series keys from the index, filtered by tag predicates in the WHERE clause.
  2. +
  3. Group filtered series keys into tag sets based on the GROUP BY dimensions.
  4. +
  5. Enumerate each tag set and create a cursor and iterator for each series key.
  6. +
  7. Merge iterators and return the merged result to the query executor.
  8. +
+

iterator type

+

EXPLAIN ANALYZE supports the following iterator types:

+
    +
  • create_iterator node represents work done by the local influxd instance──a complex composition of nested iterators combined and merged to produce the final query output.
  • +
  • (InfluxDB Enterprise only) remote_iterator node represents work done on remote machines.
  • +
+

For more information about iterators, see Understanding iterators.

+

cursor type

+

EXPLAIN ANALYZE distinguishes 3 cursor types. While the cursor types have the same data structures and equal CPU and I/O costs, each cursor type is constructed for a different reason and separated in the final output. Consider the following cursor types when tuning a statement:

+
    +
  • cursor_ref: Reference cursor created for SELECT projections that include a function, such as last() or mean().
  • +
  • cursor_aux: Auxiliary cursor created for simple expression projections (not selectors or an aggregation). For example, SELECT foo FROM m or SELECT foo+bar FROM m, where foo and bar are fields.
  • +
  • cursor_cond: Condition cursor created for fields referenced in a WHERE clause.
  • +
+

For more information about cursors, see Understanding cursors.

+

block types

+

EXPLAIN ANALYZE separates storage block types, and reports the total number of blocks decoded and their size (in bytes) on disk. The following block types are supported:

+

| float | 64-bit IEEE-754 floating-point number | +| integer | 64-bit signed integer | +| unsigned | 64-bit unsigned integer | +| boolean | 1-bit, LSB encoded | +| string | UTF-8 string |

+

For more information about storage blocks, see TSM files.

+

GRANT

+ +
+ + +

Users can be granted privileges on databases that do not yet exist.

+
+ + +
grant_stmt = "GRANT" privilege [ on_clause ] to_clause .
+

Examples

+ + +
-- grant admin privileges
+GRANT ALL TO "jdoe"
+
+-- grant read access to a database
+GRANT READ ON "mydb" TO "jdoe"
+

KILL QUERY

+

Stop a currently-running query.

+ + +
KILL QUERY <query_id>
+ + +
kill_query_statement = "KILL QUERY" query_id .
+

Replace query_id with your query ID from SHOW QUERIES, output as qid.

+

Examples

+ + +
-- kill query with qid of 36 on the local host
+KILL QUERY 36
+

REVOKE

+ + +
revoke_stmt = "REVOKE" privilege [ on_clause ] "FROM" user_name .
+

Examples

+ + +
-- revoke admin privileges from jdoe
+REVOKE ALL PRIVILEGES FROM "jdoe"
+
+-- revoke read privileges from jdoe on mydb
+REVOKE READ ON "mydb" FROM "jdoe"
+

SELECT

+ + +
select_stmt = "SELECT" fields from_clause [ into_clause ] [ where_clause ]
+              [ group_by_clause ] [ order_by_clause ] [ limit_clause ]
+              [ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ timezone_clause ] .
+

Examples

+

Select from all measurements beginning with cpu into the same measurement name in the cpu_1h retention policy

+ + +
SELECT mean("value") INTO "cpu_1h".:MEASUREMENT FROM /cpu.*/
+

Select from measurements grouped by the day with a timezone

+ + +
SELECT mean("value") FROM "cpu" GROUP BY region, time(1d) fill(0) tz('America/Chicago')
+

SHOW CARDINALITY

+

Refers to the group of commands used to estimate or count exactly the cardinality of measurements, series, tag keys, tag key values, and field keys.

+

The SHOW CARDINALITY commands are available in two variations: estimated and exact. Estimated values are calculated using sketches and are a safe default for all cardinality sizes. Exact values are counts directly from TSM (Time-Structured Merge Tree) data, but are expensive to run for high cardinality data. Unless required, use the estimated variety.

+

Filtering by time is only supported when Time Series Index (TSI) is enabled on a database.

+

See the specific SHOW CARDINALITY commands for details:

+ +

SHOW CONTINUOUS QUERIES

+ + +
show_continuous_queries_stmt = "SHOW CONTINUOUS QUERIES" .
+

Example

+ + +
-- show all continuous queries
+SHOW CONTINUOUS QUERIES
+

SHOW DATABASES

+ + +
show_databases_stmt = "SHOW DATABASES" .
+

Example

+ + +
-- show all databases
+SHOW DATABASES
+

SHOW DIAGNOSTICS

+

Displays node information, such as build information, uptime, hostname, server configuration, memory usage, and Go runtime diagnostics.

+

For more information on using the SHOW DIAGNOSTICS command, see Using the SHOW DIAGNOSTICS command for monitoring InfluxDB.

+ + +
show_diagnostics_stmt = "SHOW DIAGNOSTICS"
+

SHOW FIELD KEY CARDINALITY

+

Estimates or counts exactly the cardinality of the field key set for the current database unless a database is specified using the ON <database> option.

+ +
+

Note: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when Time Series Index (TSI) is enabled and time is not supported in the WHERE clause.

+ +
+ + +
show_field_key_cardinality_stmt = "SHOW FIELD KEY CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+
+show_field_key_exact_cardinality_stmt = "SHOW FIELD KEY EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+

Examples

+ + +
-- show estimated cardinality of the field key set of current database
+SHOW FIELD KEY CARDINALITY
+-- show exact cardinality on field key set of specified database
+SHOW FIELD KEY EXACT CARDINALITY ON mydb
+

SHOW FIELD KEYS

+ + +
show_field_keys_stmt = "SHOW FIELD KEYS" [on_clause] [ from_clause ] .
+

Examples

+ + +
-- show field keys and field value data types from all measurements
+SHOW FIELD KEYS
+
+-- show field keys and field value data types from specified measurement
+SHOW FIELD KEYS FROM "cpu"
+

SHOW GRANTS

+ + +
show_grants_stmt = "SHOW GRANTS FOR" user_name .
+

Example

+ + +
-- show grants for jdoe
+SHOW GRANTS FOR "jdoe"
+

SHOW MEASUREMENT CARDINALITY

+

Estimates or counts exactly the cardinality of the measurement set for the current database unless a database is specified using the ON <database> option.

+ +
+

Note: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when TSI (Time Series Index) is enabled and time is not supported in the WHERE clause.

+ +
+ + +
show_measurement_cardinality_stmt = "SHOW MEASUREMENT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+
+show_measurement_exact_cardinality_stmt = "SHOW MEASUREMENT EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+

Example

+ + +
-- show estimated cardinality of measurement set on current database
+SHOW MEASUREMENT CARDINALITY
+-- show exact cardinality of measurement set on specified database
+SHOW MEASUREMENT EXACT CARDINALITY ON mydb
+

SHOW MEASUREMENTS

+ + +
show_measurements_stmt = "SHOW MEASUREMENTS" [on_clause] [ with_measurement_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all measurements
+SHOW MEASUREMENTS
+
+-- show measurements where region tag = 'uswest' AND host tag = 'serverA'
+SHOW MEASUREMENTS WHERE "region" = 'uswest' AND "host" = 'serverA'
+
+-- show measurements that start with 'h2o'
+SHOW MEASUREMENTS WITH MEASUREMENT =~ /h2o.*/
+

SHOW QUERIES

+ + +
show_queries_stmt = "SHOW QUERIES" .
+

Example

+ + +
-- show all currently-running queries
+SHOW QUERIES
+--
+

SHOW RETENTION POLICIES

+ + +
show_retention_policies_stmt = "SHOW RETENTION POLICIES" [on_clause] .
+

Example

+ + +
-- show all retention policies on a database
+SHOW RETENTION POLICIES ON "mydb"
+

SHOW SERIES

+ + +
show_series_stmt = "SHOW SERIES" [on_clause] [ from_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .
+

Example

+ + +
SHOW SERIES FROM "telegraf"."autogen"."cpu" WHERE cpu = 'cpu8'
+

SHOW SERIES CARDINALITY

+

Estimates or counts exactly the cardinality of the series for the current database unless a database is specified using the ON <database> option.

+

Series cardinality is the major factor that affects RAM requirements. For more information, see:

+ + +
+ + +

ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is not supported in the WHERE clause.

+
+ + +
show_series_cardinality_stmt = "SHOW SERIES CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+
+show_series_exact_cardinality_stmt = "SHOW SERIES EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+

Examples

+ + +
-- show estimated cardinality of the series on current database
+SHOW SERIES CARDINALITY
+-- show estimated cardinality of the series on specified database
+SHOW SERIES CARDINALITY ON mydb
+-- show exact series cardinality
+SHOW SERIES EXACT CARDINALITY
+-- show series cardinality of the series on specified database
+SHOW SERIES EXACT CARDINALITY ON mydb
+

SHOW SHARD GROUPS

+ + +
show_shard_groups_stmt = "SHOW SHARD GROUPS" .
+

Example

+ + +
SHOW SHARD GROUPS
+

SHOW SHARDS

+ + +
show_shards_stmt = "SHOW SHARDS" .
+

Example

+ + +
SHOW SHARDS
+
+name: telegraf
+id  database   retention_policy shard_group start_time           end_time             expiry_time          owners
+--  --------   ---------------- ----------- ----------           --------             -----------          ------
+16  telegraf   autogen          6           2020-10-19T00:00:00Z 2020-10-26T00:00:00Z 2020-10-26T00:00:00Z 6,7,8
+17  telegraf   autogen          6           2020-10-19T00:00:00Z 2020-10-26T00:00:00Z 2020-10-26T00:00:00Z 9,4,5
+21  telegraf   autogen          8           2020-10-26T00:00:00Z 2020-11-02T00:00:00Z 2020-11-02T00:00:00Z 8,9,4
+22  telegraf   autogen          8           2020-10-26T00:00:00Z 2020-11-02T00:00:00Z 2020-11-02T00:00:00Z 5,6,7
+26  telegraf   autogen          10          2020-11-02T00:00:00Z 2020-11-09T00:00:00Z 2020-11-09T00:00:00Z 9,4,5
+27  telegraf   autogen          10          2020-11-02T00:00:00Z 2020-11-09T00:00:00Z 2020-11-09T00:00:00Z 6,7,8
+31  telegraf   autogen          12          2020-11-09T00:00:00Z 2020-11-16T00:00:00Z 2020-11-16T00:00:00Z 6,7,8
+

SHOW SHARDS outputs the following data:

+
    +
  • id column: Shard IDs that belong to the specified database and retention policy.
  • +
  • shard_group column: Group number that a shard belongs to. Shards in the same shard group have the same start_time and end_time. This interval indicates how long the shard is active, and the expiry_time columns shows when the shard group expires. No timestamps will show under expiry_time if the retention policy duration is set to infinite.
  • +
  • owners column: Shows the data nodes that own a shard. The number of nodes that own a shard is equal to the replication factor. In this example, the replication factor is 3, so 3 nodes own each shard.
  • +
+

SHOW STATS

+

Returns detailed statistics on available components of an InfluxDB node and available (enabled) components.

+

Statistics returned by SHOW STATS are stored in memory and reset to zero when the node is restarted, +but SHOW STATS is triggered every 10 seconds to populate the _internal database.

+

The SHOW STATS command does not list index memory usage – +use the SHOW STATS FOR 'indexes' command.

+

For more information on using the SHOW STATS command, see Using the SHOW STATS command to monitor InfluxDB.

+ + +
show_stats_stmt = "SHOW STATS [ FOR '<component>' | 'indexes' ]"
+

Example

+ + +
> show stats
+name: runtime
+-------------
+Alloc   Frees   HeapAlloc       HeapIdle        HeapInUse       HeapObjects     HeapReleased    HeapSys         Lookups Mallocs NumGC   NumGoroutine    PauseTotalNs    Sys             TotalAlloc
+4136056 6684537 4136056         34586624        5816320         49412           0               40402944        110     6733949 83      44              36083006        46692600        439945704
+
+name: graphite
+tags: proto=tcp
+batches_tx      bytes_rx        connections_active      connections_handled     points_rx       points_tx
+----------      --------        ------------------      -------------------     ---------       ---------
+159             3999750         0                       1                       158110          158110
+

SHOW STATS FOR

+

For the specified component (<component>), the command returns available statistics. +For the runtime component, the command returns an overview of memory usage by the InfluxDB system, +using the Go runtime package.

+

SHOW STATS FOR ‘indexes’

+

Returns an estimate of memory use of all indexes. +Index memory use is not reported with SHOW STATS because it is a potentially expensive operation.

+

SHOW SUBSCRIPTIONS

+ + +
show_subscriptions_stmt = "SHOW SUBSCRIPTIONS" .
+

Example

+ + +
SHOW SUBSCRIPTIONS
+

SHOW TAG KEY CARDINALITY

+

Estimates or counts exactly the cardinality of tag key set on the current database unless a database is specified using the ON <database> option.

+ +
+ + +

ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when TSI (Time Series Index) is enabled and time is not supported in the WHERE clause.

+
+ + +
show_tag_key_cardinality_stmt = "SHOW TAG KEY CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+
+show_tag_key_exact_cardinality_stmt = "SHOW TAG KEY EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+

Examples

+ + +
-- show estimated tag key cardinality
+SHOW TAG KEY CARDINALITY
+-- show exact tag key cardinality
+SHOW TAG KEY EXACT CARDINALITY
+

SHOW TAG KEYS

+ + +
show_tag_keys_stmt = "SHOW TAG KEYS" [on_clause] [with_key_clause] [ from_clause ] [ where_clause ]
+                     [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag keys
+SHOW TAG KEYS
+
+-- show all tag keys from the cpu measurement
+SHOW TAG KEYS FROM "cpu"
+
+-- show all tag keys from the cpu measurement where the region key = 'uswest'
+SHOW TAG KEYS FROM "cpu" WHERE "region" = 'uswest'
+
+-- show all tag keys where the host key = 'serverA'
+SHOW TAG KEYS WHERE "host" = 'serverA'
+
+-- show specific tag keys
+SHOW TAG KEYS WITH KEY IN ("region", "host")
+

SHOW TAG VALUES

+ + +
show_tag_values_stmt = "SHOW TAG VALUES" [on_clause] [ from_clause ] with_tag_clause [ where_clause ]
+                       [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag values across all measurements for the region tag
+SHOW TAG VALUES WITH KEY = "region"
+
+-- show tag values from the cpu measurement for the region tag
+SHOW TAG VALUES FROM "cpu" WITH KEY = "region"
+
+-- show tag values across all measurements for all tag keys that do not include the letter c
+SHOW TAG VALUES WITH KEY !~ /.*c.*/
+
+-- show tag values from the cpu measurement for region & host tag keys where service = 'redis'
+SHOW TAG VALUES FROM "cpu" WITH KEY IN ("region", "host") WHERE "service" = 'redis'
+

SHOW TAG VALUES CARDINALITY

+

Estimates or counts exactly the cardinality of tag key values for the specified tag key on the current database unless a database is specified using the ON <database> option.

+ +
+ + +

ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when TSI (Time Series Index) is enabled.

+
+ + +
show_tag_values_cardinality_stmt = "SHOW TAG VALUES CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ] with_key_clause
+
+show_tag_values_exact_cardinality_stmt = "SHOW TAG VALUES EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ] with_key_clause
+

Examples

+ + +
-- show estimated tag key values cardinality for a specified tag key
+SHOW TAG VALUES CARDINALITY WITH KEY = "myTagKey"
+-- show estimated tag key values cardinality for a specified tag key
+SHOW TAG VALUES CARDINALITY WITH KEY = "myTagKey"
+-- show exact tag key values cardinality for a specified tag key
+SHOW TAG VALUES EXACT CARDINALITY WITH KEY = "myTagKey"
+-- show exact tag key values cardinality for a specified tag key
+SHOW TAG VALUES EXACT CARDINALITY WITH KEY = "myTagKey"
+

SHOW USERS

+ + +
show_users_stmt = "SHOW USERS" .
+

Example

+ + +
-- show all users
+SHOW USERS
+

Clauses

+ + +
from_clause     = "FROM" measurements .
+
+group_by_clause = "GROUP BY" dimensions fill(fill_option).
+
+into_clause     = "INTO" ( measurement | back_ref ).
+
+limit_clause    = "LIMIT" int_lit .
+
+offset_clause   = "OFFSET" int_lit .
+
+slimit_clause   = "SLIMIT" int_lit .
+
+soffset_clause  = "SOFFSET" int_lit .
+
+timezone_clause = tz(string_lit) .
+
+on_clause       = "ON" db_name .
+
+order_by_clause = "ORDER BY" sort_fields .
+
+to_clause       = "TO" user_name .
+
+where_clause    = "WHERE" expr .
+
+with_measurement_clause = "WITH MEASUREMENT" ( "=" measurement | "=~" regex_lit ) .
+
+with_tag_clause = "WITH KEY" ( "=" tag_key | "!=" tag_key | "=~" regex_lit | "IN (" tag_keys ")"  ) .
+

Expressions

+ + +
binary_op        = "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | "AND" |
+                   "OR" | "=" | "!=" | "<>" | "<" | "<=" | ">" | ">=" .
+
+expr             = unary_expr { binary_op unary_expr } .
+
+unary_expr       = "(" expr ")" | var_ref | time_lit | string_lit | int_lit |
+                   float_lit | bool_lit | duration_lit | regex_lit .
+

Comments

+

Use comments with InfluxQL statements to describe your queries.

+
    +
  • A single line comment begins with two hyphens (--) and ends where InfluxDB detects a line break. +This comment type cannot span several lines.
  • +
  • A multi-line comment begins with /* and ends with */. This comment type can span several lines. +Multi-line comments do not support nested multi-line comments.
  • +
+

Other

+ + +
alias            = "AS" identifier .
+
+back_ref         = ( policy_name ".:MEASUREMENT" ) |
+                   ( db_name "." [ policy_name ] ".:MEASUREMENT" ) .
+
+db_name          = identifier .
+
+dimension        = expr .
+
+dimensions       = dimension { "," dimension } .
+
+field_key        = identifier .
+
+field            = expr [ alias ] .
+
+fields           = field { "," field } .
+
+fill_option      = "null" | "none" | "previous" | int_lit | float_lit | "linear" .
+
+host             = string_lit .
+
+measurement      = measurement_name |
+                   ( policy_name "." measurement_name ) |
+                   ( db_name "." [ policy_name ] "." measurement_name ) .
+
+measurements     = measurement { "," measurement } .
+
+measurement_name = identifier | regex_lit .
+
+password         = string_lit .
+
+policy_name      = identifier .
+
+privilege        = "ALL" [ "PRIVILEGES" ] | "READ" | "WRITE" .
+
+query_id         = int_lit .
+
+query_name       = identifier .
+
+retention_policy = identifier .
+
+retention_policy_option      = retention_policy_duration |
+                               retention_policy_replication |
+                               retention_policy_shard_group_duration |
+                               retention_future_limit |
+                               retention_past_limit |
+                               "DEFAULT" .
+
+retention_policy_duration    = "DURATION" duration_lit .
+
+retention_policy_replication = "REPLICATION" int_lit .
+
+retention_policy_shard_group_duration = "SHARD DURATION" duration_lit .
+
+retention_future_limit       = "FUTURE LIMIT" duration_lit .
+
+retention_past_limit         = "PAST LIMIT" duration_lit .
+
+retention_policy_name = "NAME" identifier .
+
+series_id        = int_lit .
+
+shard_id         = int_lit .
+
+sort_field       = field_key [ ASC | DESC ] .
+
+sort_fields      = sort_field { "," sort_field } .
+
+subscription_name = identifier .
+
+tag_key          = identifier .
+
+tag_keys         = tag_key { "," tag_key } .
+
+user_name        = identifier .
+
+var_ref          = measurement .
+

Query Engine Internals

+

Once you understand the language itself, it’s important to know how these +language constructs are implemented in the query engine. This gives you an +intuitive sense for how results will be processed and how to create efficient +queries.

+

The life cycle of a query looks like this:

+
    +
  1. +

    InfluxQL query string is tokenized and then parsed into an abstract syntax +tree (AST). This is the code representation of the query itself.

    +
  2. +
  3. +

    The AST is passed to the QueryExecutor which directs queries to the +appropriate handlers. For example, queries related to meta data are executed +by the meta service and SELECT statements are executed by the shards +themselves.

    +
  4. +
  5. +

    The query engine then determines the shards that match the SELECT +statement’s time range. From these shards, iterators are created for each +field in the statement.

    +
  6. +
  7. +

    Iterators are passed to the emitter which drains them and joins the resulting +points. The emitter’s job is to convert simple time/value points into the +more complex result objects that are returned to the client.

    +
  8. +
+

Understanding iterators

+

Iterators are at the heart of the query engine. They provide a simple interface +for looping over a set of points. For example, this is an iterator over Float +points:

+ + +
type FloatIterator interface {
+    Next() *FloatPoint
+}
+

These iterators are created through the IteratorCreator interface:

+ + +
type IteratorCreator interface {
+    CreateIterator(opt *IteratorOptions) (Iterator, error)
+}
+

The IteratorOptions provide arguments about field selection, time ranges, +and dimensions that the iterator creator can use when planning an iterator. +The IteratorCreator interface is used at many levels such as the Shards, +Shard, and Engine. This allows optimizations to be performed when applicable +such as returning a precomputed COUNT().

+

Iterators aren’t just for reading raw data from storage though. Iterators can be +composed so that they provided additional functionality around an input +iterator. For example, a DistinctIterator can compute the distinct values for +each time window for an input iterator. Or a FillIterator can generate +additional points that are missing from an input iterator.

+

This composition also lends itself well to aggregation. For example, a statement +such as this:

+ + +
SELECT MEAN(value) FROM cpu GROUP BY time(10m)
+

In this case, MEAN(value) is a MeanIterator wrapping an iterator from the +underlying shards. However, if we can add an additional iterator to determine +the derivative of the mean:

+ + +
SELECT DERIVATIVE(MEAN(value), 20m) FROM cpu GROUP BY time(10m)
+

Understanding cursors

+

A cursor identifies data by shard in tuples (time, value) for a single series (measurement, tag set and field). The cursor trasverses data stored as a log-structured merge-tree and handles deduplication across levels, tombstones for deleted data, and merging the cache (Write Ahead Log). A cursor sorts the (time, value) tuples by time in ascending or descending order.

+

For example, a query that evaluates one field for 1,000 series over 3 shards constructs a minimum of 3,000 cursors (1,000 per shard).

+

Understanding auxiliary fields

+

Because InfluxQL allows users to use selector functions such as FIRST(), +LAST(), MIN(), and MAX(), the engine must provide a way to return related +data at the same time with the selected point.

+

For example, in this query:

+ + +
SELECT FIRST(value), host FROM cpu GROUP BY time(1h)
+

We are selecting the first value that occurs every hour but we also want to +retrieve the host associated with that point. Since the Point types only +specify a single typed Value for efficiency, we push the host into the +auxiliary fields of the point. These auxiliary fields are attached to the point +until it is passed to the emitter where the fields get split off to their own +iterator.

+

Built-in iterators

+

InfluxDB provides many helper iterators for building queries:

+
    +
  • +

    Merge Iterator - This iterator combines one or more iterators into a single +new iterator of the same type. This iterator guarantees that all points +within a window will be output before starting the next window but does not +provide ordering guarantees within the window. This allows for fast access +for aggregate queries which do not need stronger sorting guarantees.

    +
  • +
  • +

    Sorted Merge Iterator - This iterator also combines one or more iterators +into a new iterator of the same type. However, this iterator guarantees +time ordering of every point. This makes it slower than the MergeIterator +but this ordering guarantee is required for non-aggregate queries which +return the raw data points.

    +
  • +
  • +

    Limit Iterator - This iterator limits the number of points per name/tag +group. This is the implementation of the LIMIT & OFFSET syntax.

    +
  • +
  • +

    Fill Iterator - This iterator injects extra points if they are missing from +the input iterator. It can provide null points, points with the previous +value, or points with a specific value.

    +
  • +
  • +

    Buffered Iterator - This iterator provides the ability to “unread” a point +back onto a buffer so it can be read again next time. This is used extensively +to provide lookahead for windowing.

    +
  • +
  • +

    Reduce Iterator - This iterator calls a reduction function for each point in +a window. When the window is complete then all points for that window are +output. This is used for simple aggregate functions such as COUNT().

    +
  • +
  • +

    Reduce Slice Iterator - This iterator collects all points for a window first +and then passes them all to a reduction function at once. The results are +returned from the iterator. This is used for aggregate functions such as +DERIVATIVE().

    +
  • +
  • +

    Transform Iterator - This iterator calls a transform function for each point +from an input iterator. This is used for executing binary expressions.

    +
  • +
  • +

    Dedupe Iterator - This iterator only outputs unique points. It is resource +intensive so it is only used for small queries such as meta query statements.

    +
  • +
+

Call iterators

+

Function calls in InfluxQL are implemented at two levels. Some calls can be +wrapped at multiple layers to improve efficiency. For example, a COUNT() can +be performed at the shard level and then multiple CountIterators can be +wrapped with another CountIterator to compute the count of all shards. These +iterators can be created using NewCallIterator().

+

Some iterators are more complex or need to be implemented at a higher level. +For example, the DERIVATIVE() needs to retrieve all points for a window first +before performing the calculation. This iterator is created by the engine itself +and is never requested to be created by the lower levels.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/tools/influx-cli/use-influx-cli/index.html b/pr-preview/pr-6948/influxdb/v1/tools/influx-cli/use-influx-cli/index.html new file mode 100644 index 000000000..abcc58be5 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/tools/influx-cli/use-influx-cli/index.html @@ -0,0 +1,2864 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Using influx - InfluxDB command line interface | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Using influx - InfluxDB command line interface

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

The influx command line interface (CLI) provides an interactive shell for the HTTP API associated with influxd. +Use influx to write data (manually or from a file), query data interactively, view query output in different formats, and manage resources in InfluxDB.

+ +

Launch influx

+

The influx CLI is included when you install InfluxDB OSS 1.12.

+

The influx CLI is installed at the following path, depending on your +system and package manager:

+ +
+ + + + + +
+ + +
/usr/bin/influx
+ +
+ + +
+ + +
/usr/local/bin/influx
+ +
+ + +
+ + +
/opt/homebrew/opt/influxdb@1/bin/influx
+ +
+ + +
+ +

To access the CLI, first launch the influxd database process and then launch influx in your terminal.

+ + +
influx
+

If successfully connected to an InfluxDB node, the output is the following:

+ + +
Connected to http://localhost:8086 version 1.12.3
+InfluxDB shell version: 1.12.3
+>
+

The versions of InfluxDB and the CLI should be identical. If not, parsing issues can occur with queries.

+

In the prompt, you can enter InfluxQL queries as well as CLI-specific commands. +Enter help to get a list of available commands. +Use Ctrl+C to cancel if you want to cancel a long-running InfluxQL query.

+

Environment Variables

+

The following environment variables can be used to configure settings used by the influx client. They can be specified in lower or upper case, however the upper case version takes precedence.

+

HTTP_PROXY

+

Defines the proxy server to use for HTTP.

+

Value format:[protocol://]<host>[:port]

+ + +
HTTP_PROXY=http://localhost:1234
+

HTTPS_PROXY

+

Defines the proxy server to use for HTTPS. Takes precedence over HTTP_PROXY for HTTPS.

+

Value format:[protocol://]<host>[:port]

+ + +
HTTPS_PROXY=https://localhost:1443
+

NO_PROXY

+

List of host names that should not go through any proxy. If set to an asterisk ‘*’ only, it matches all hosts.

+

Value format: comma-separated list of hosts

+ + +
NO_PROXY=123.45.67.89,123.45.67.90
+

influx Arguments

+

Arguments specify connection, write, import, and output options for the CLI session.

+

influx provides the following arguments:

+

-h, -help +List influx arguments

+

-compressed +Set to true if the import file is compressed. +Use with -import.

+

-consistency 'any|one|quorum|all' +Set the write consistency level.

+

-database 'database name' +The database to which influx connects.

+

-execute 'command' +Execute an InfluxQL command and quit. +See -execute.

+

-format 'json|csv|column' +Specifies the format of the server responses. +See -format.

+

-host 'host name' +The host to which influx connects. +By default, InfluxDB runs on localhost.

+

-import +Import new data or exported data from a file. +See -import.

+

-password 'password' +The password influx uses to connect to the server. +influx will prompt for a password if you leave it blank (-password ''). +Alternatively, set the password for the CLI with the INFLUX_PASSWORD environment +variable.

+

-path +The path to the file to import. +Use with-import.

+

-port 'port #' +The port to which influx connects. +By default, InfluxDB runs on port 8086.

+

-pps +How many points per second the import will allow. +By default, pps is zero and influx will not throttle importing. +Use with -import.

+

-precision 'rfc3339|h|m|s|ms|u|ns' +Specifies the format/precision of the timestamp: rfc3339 (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ), h (hours), m (minutes), s (seconds), ms (milliseconds), u (microseconds), ns (nanoseconds). +Precision defaults to nanoseconds.

+ +
+

Note: Setting the precision to rfc3339 (-precision rfc3339) works with the -execute option, but it does not work with the -import option. All other precision formats (e.g., h,m,s,ms,u, and ns) work with the -execute and -import options.

+ +
+

-pretty +Turns on pretty print for the json format.

+

-ssl +Use HTTPS for requests.

+

-unsafeSsl +Disables SSL certificate verification. +Use when connecting over HTTPS with a self-signed certificate.

+

-username 'username' +The username that influx uses to connect to the server. +Alternatively, set the username for the CLI with the INFLUX_USERNAME environment variable.

+

-version +Display the InfluxDB version and exit.

+

The following sections provide detailed examples for some arguments, including -execute, -format, and -import.

+ +

Execute an InfluxQL command and quit with -execute

+

Execute queries that don’t require a database specification:

+ + +
$ influx -execute 'SHOW DATABASES'
+name: databases
+---------------
+name
+NOAA_water_database
+_internal
+telegraf
+pirates
+

Execute queries that do require a database specification, and change the timestamp precision:

+ + +
$ influx -execute 'SELECT * FROM "h2o_feet" LIMIT 3' -database="NOAA_water_database" -precision=rfc3339
+name: h2o_feet
+--------------
+time			               level description	    location	     water_level
+2015-08-18T00:00:00Z	 below 3 feet		        santa_monica	 2.064
+2015-08-18T00:00:00Z	 between 6 and 9 feet  coyote_creek  8.12
+2015-08-18T00:06:00Z	 between 6 and 9 feet  coyote_creek  8.005
+

Specify the format of the server responses with -format

+

The default format is column:

+ + +
$ influx -format=column
+[...]
+> SHOW DATABASES
+name: databases
+---------------
+name
+NOAA_water_database
+_internal
+telegraf
+pirates
+

Change the format to csv:

+ + +
$ influx -format=csv
+[...]
+> SHOW DATABASES
+name,name
+databases,NOAA_water_database
+databases,_internal
+databases,telegraf
+databases,pirates
+

Change the format to json:

+ + +
$ influx -format=json
+[...]
+> SHOW DATABASES
+{"results":[{"series":[{"name":"databases","columns":["name"],"values":[["NOAA_water_database"],["_internal"],["telegraf"],["pirates"]]}]}]}
+

Change the format to json and turn on pretty print:

+ + +
$ influx -format=json -pretty
+[...]
+> SHOW DATABASES
+{
+    "results": [
+        {
+            "series": [
+                {
+                    "name": "databases",
+                    "columns": [
+                        "name"
+                    ],
+                    "values": [
+                        [
+                            "NOAA_water_database"
+                        ],
+                        [
+                            "_internal"
+                        ],
+                        [
+                            "telegraf"
+                        ],
+                        [
+                            "pirates"
+                        ]
+                    ]
+                }
+            ]
+        }
+    ]
+}
+

Import data from a file

+

An import file has two sections:

+
    +
  • Optional: DDL (Data Definition Language): Contains the InfluxQL commands for creating the relevant database and managing the retention policy. +If your database and retention policy already exist, your file can skip this section.
  • +
  • DML (Data Manipulation Language): Context metadata that specifies the database and (if desired) retention policy for the import and contains the data in line protocol.
  • +
+

Example:

+

File (datarrr.txt):

+ + +
# DDL
+CREATE DATABASE pirates
+CREATE RETENTION POLICY oneday ON pirates DURATION 1d REPLICATION 1
+
+# DML
+# CONTEXT-DATABASE: pirates
+# CONTEXT-RETENTION-POLICY: oneday
+
+treasures,captain_id=dread_pirate_roberts value=801 1439856000
+treasures,captain_id=flint value=29 1439856000
+treasures,captain_id=sparrow value=38 1439856000
+treasures,captain_id=tetra value=47 1439856000
+treasures,captain_id=crunch value=109 1439858880
+

Command:

+ + +
$influx -import -path=datarrr.txt -precision=s
+

Results:

+ + +
2015/12/22 12:25:06 Processed 2 commands
+2015/12/22 12:25:06 Processed 5 inserts
+2015/12/22 12:25:06 Failed 0 inserts
+ +
+ + +

For large datasets, influx writes out a status message every 100,000 points.

+

For example:

+ + +
2015/08/21 14:48:01 Processed 3100000 lines.
+Time elapsed: 56.740578415s.
+Points per second (PPS): 54634
+
+

Things to note about -import:

+
    +
  • To throttle the import, use -pps to set the number of points per second to ingest. By default, pps is zero and influx does not throttle importing.
  • +
  • To import a file compressed with gzip (GNU zip), include the -compressed flag.
  • +
  • Include timestamps in the data file. +If points don’t include a timestamp, InfluxDB assigns the same timestamp to those points, which can result in unintended duplicate points or overwrites.
  • +
  • If your data file contains more than 5,000 points, consider splitting it into smaller files to write data to InfluxDB in batches. +We recommend writing points in batches of 5,000 to 10,000 for optimal performance. +Writing smaller batches increases the number of HTTP requests, which can negatively impact performance. +By default, the HTTP request times out after five seconds. Although InfluxDB continues attempting to write the points after a timeout, you won’t receive confirmation of a successful write.
  • +
+ +
+

Note: To export data from InfluxDB version 0.8.9, see Exporting from 0.8.9.

+ +
+

For more information, see exporting and importing data.

+

influx commands

+

Enter help in the CLI for a partial list of the available commands.

+

Commands

+

The list below offers a brief discussion of each command. +We provide detailed information on insert at the end of this section.

+

auth +Prompts you for your username and password. +influx uses those credentials when querying a database. +Alternatively, set the username and password for the CLI with the +INFLUX_USERNAME and INFLUX_PASSWORD environment variables.

+

chunked +Turns on chunked responses from the server when issuing queries. +This setting is enabled by default.

+

chunk size <size> +Sets the size of the chunked responses. +The default size is 10,000. +Setting it to 0 resets chunk size to its default value.

+

clear [ database | db | retention policy | rp ] +Clears the current context for the database or retention policy.

+

connect <host:port> +Connect to a different server without exiting the shell. +By default, influx connects to localhost:8086. +If you do not specify either the host or the port, influx assumes the default setting for the missing attribute.

+

consistency <level> +Sets the write consistency level: any, one, quorum, or all.

+

Ctrl+C +Terminates the currently running query. Useful when an interactive query is taking too long to respond +because it is trying to return too much data.

+

exit quit Ctrl+D +Quits the influx shell.

+

format <format> +Specifies the format of the server responses: json, csv, or column. +See the description of -format for examples of each format.

+

history +Displays your command history. +To use the history while in the shell, simply use the “up” arrow. +influx stores your last 1,000 commands in your home directory in .influx_history.

+

insert +Write data using line protocol. +See insert.

+

precision <format> +Specifies the format/precision of the timestamp: rfc3339 (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ), h (hours), m (minutes), s (seconds), ms (milliseconds), u (microseconds), ns (nanoseconds). +Precision defaults to nanoseconds.

+

pretty +Turns on pretty print for the json format.

+

settings +Outputs the current settings for the shell including the Host, Username, Database, Retention Policy, Pretty status, Chunked status, Chunk Size, Format, and Write Consistency.

+

use [ "<database_name>" | "<database_name>"."<retention policy_name>" ] +Sets the current database and/or retention policy. +Once influx sets the current database and/or retention policy, there is no need to specify that database and/or retention policy in queries. +If you do not specify the retention policy, influx automatically queries the used database’s DEFAULT retention policy.

+

Write data to InfluxDB with insert

+

Enter insert followed by the data in line protocol to write data to InfluxDB. +Use insert into <retention policy> <line protocol> to write data to a specific retention policy.

+

Write data to a single field in the measurement treasures with the tag captain_id = pirate_king. +influx automatically writes the point to the database’s DEFAULT retention policy.

+ + +
INSERT treasures,captain_id=pirate_king value=2
+

Write the same point to the already-existing retention policy oneday:

+ + +
> INSERT INTO oneday treasures,captain_id=pirate_king value=2
+Using retention policy oneday
+>
+

Queries

+

Execute all InfluxQL queries in influx.

+

See Data exploration, Schema exploration, Database management, Authentication and authorization for InfluxQL documentation.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/troubleshooting/errors/index.html b/pr-preview/pr-6948/influxdb/v1/troubleshooting/errors/index.html new file mode 100644 index 000000000..73d18389f --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/troubleshooting/errors/index.html @@ -0,0 +1,2776 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxDB error messages | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxDB error messages

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

This page documents errors, their descriptions, and, where applicable, +common resolutions.

+ +
+ + +

Disclaimer: This document does not contain an exhaustive list of all possible InfluxDB errors.

+
+

error: database name required

+

The database name required error occurs when certain SHOW queries do +not specify a database. +Specify a database with an ON clause in the SHOW query, with USE <database_name> in the +CLI, or with the db query string parameter in +the InfluxDB API request.

+

The relevant SHOW queries include SHOW RETENTION POLICIES, SHOW SERIES, +SHOW MEASUREMENTS, SHOW TAG KEYS, SHOW TAG VALUES, and SHOW FIELD KEYS.

+

Resources: +Schema exploration, +InfluxQL reference

+

error: max series per database exceeded: < >

+

The max series per database exceeded error occurs when a write causes the +number of series in a database to +exceed the maximum allowable series per database. +The maximum allowable series per database is controlled by the +max-series-per-database setting in the [data] section of the configuration +file.

+

The information in the < > shows the measurement and the tag set of the series +that exceeded max-series-per-database.

+

By default max-series-per-database is set to one million. +Changing the setting to 0 allows an unlimited number of series per database.

+

Resources: +Database Configuration

+

error parsing query: found < >, expected identifier at line < >, char < >

+

InfluxQL syntax

+

The expected identifier error occurs when InfluxDB anticipates an identifier +in a query but doesn’t find it. +Identifiers are tokens that refer to continuous query names, database names, +field keys, measurement names, retention policy names, subscription names, +tag keys, and user names. +The error is often a gentle reminder to double-check your query’s syntax.

+

Examples

+

Query 1:

+ + +
> CREATE CONTINUOUS QUERY ON "telegraf" BEGIN SELECT mean("usage_idle") INTO "average_cpu" FROM "cpu" GROUP BY time(1h),"cpu" END
+ERR: error parsing query: found ON, expected identifier at line 1, char 25
+

Query 1 is missing a continuous query name between CREATE CONTINUOUS QUERY and +ON.

+

Query 2:

+ + +
> SELECT * FROM WHERE "blue" = true
+ERR: error parsing query: found WHERE, expected identifier at line 1, char 15
+

Query 2 is missing a measurement name between FROM and WHERE.

+

InfluxQL keywords

+

In some cases the expected identifier error occurs when one of the +identifiers in the query is an +InfluxQL Keyword. +To successfully query an identifier that’s also a keyword, enclose that +identifier in double quotes.

+

Examples

+

Query 1:

+ + +
> SELECT duration FROM runs
+ERR: error parsing query: found DURATION, expected identifier, string, number, bool at line 1, char 8
+

In Query 1, the field key duration is an InfluxQL Keyword. +Double quote duration to avoid the error:

+ + +
SELECT "duration" FROM runs
+

Query 2:

+ + +
> CREATE RETENTION POLICY limit ON telegraf DURATION 1d REPLICATION 1
+ERR: error parsing query: found LIMIT, expected identifier at line 1, char 25
+

In Query 2, the retention policy name limit is an InfluxQL Keyword. +Double quote limit to avoid the error:

+ + +
CREATE RETENTION POLICY "limit" ON telegraf DURATION 1d REPLICATION 1
+

While using double quotes is an acceptable workaround, we recommend that you avoid using InfluxQL keywords as identifiers for simplicity’s sake.

+

Resources: +InfluxQL Keywords, +Query Language Documentation

+

error parsing query: found < >, expected string at line < >, char < >

+

The expected string error occurs when InfluxDB anticipates a string +but doesn’t find it. +In most cases, the error is a result of forgetting to quote the password +string in the CREATE USER statement.

+

Example

+ + +
> CREATE USER penelope WITH PASSWORD timeseries4dayz
+ERR: error parsing query: found timeseries4dayz, expected string at line 1, char 36
+

The CREATE USER statement requires single quotation marks around the password +string:

+ + +
CREATE USER penelope WITH PASSWORD 'timeseries4dayz'
+

Note that you should not include the single quotes when authenticating requests.

+

Resources: +Authentication and Authorization

+

error parsing query: mixing aggregate and non-aggregate queries is not supported

+

The mixing aggregate and non-aggregate error occurs when a SELECT statement +includes both an aggregate function +and a standalone field key or +tag key.

+

Aggregate functions return a single calculated value and there is no obvious +single value to return for any unaggregated fields or tags.

+

Example

+

Raw data:

+

The peg measurement has two fields (square and round) and one tag +(force):

+ + +
name: peg
+---------
+time                   square   round   force
+2016-10-07T18:50:00Z   2        8       1
+2016-10-07T18:50:10Z   4        12      2
+2016-10-07T18:50:20Z   6        14      4
+2016-10-07T18:50:30Z   7        15      3
+

Query 1:

+ + +
> SELECT mean("square"),"round" FROM "peg"
+ERR: error parsing query: mixing aggregate and non-aggregate queries is not supported
+

Query 1 includes an aggregate function and a standalone field.

+

mean("square") returns a single aggregated value calculated from the four values +of square in the peg measurement, and there is no obvious single field value +to return from the four unaggregated values of the round field.

+

Query 2:

+ + +
> SELECT mean("square"),"force" FROM "peg"
+ERR: error parsing query: mixing aggregate and non-aggregate queries is not supported
+

Query 2 includes an aggregate function and a standalone tag.

+

mean("square") returns a single aggregated value calculated from the four values +of square in the peg measurement, and there is no obvious single tag value +to return from the four unaggregated values of the force tag.

+

Resources: +Functions

+

invalid operation: time and \*influxql.VarRef are not compatible

+

The time and \*influxql.VarRef are not compatible error occurs when +date-time strings are double quoted in queries. +Date-time strings require single quotes.

+

Examples

+

Double quoted date-time strings:

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= "2015-08-18T00:00:00Z" AND time <= "2015-08-18T00:12:00Z"
+ERR: invalid operation: time and *influxql.VarRef are not compatible
+

Single quoted date-time strings:

+ + +
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:12:00Z'
+
+name: h2o_feet
+time                   water_level
+----                   -----------
+2015-08-18T00:00:00Z   2.064
+2015-08-18T00:06:00Z   2.116
+2015-08-18T00:12:00Z   2.028
+

Resources: +Data Exploration

+

unable to parse < >: bad timestamp

+

Timestamp syntax

+

The bad timestamp error occurs when the +line protocol includes a +timestamp in a format other than a UNIX timestamp.

+

Example

+ + +
> INSERT pineapple value=1 '2015-08-18T23:00:00Z'
+ERR: {"error":"unable to parse 'pineapple value=1 '2015-08-18T23:00:00Z'': bad timestamp"}
+

The line protocol above uses an RFC3339 +timestamp. +Replace the timestamp with a UNIX timestamp to avoid the error and successfully +write the point to InfluxDB:

+ + +
INSERT pineapple,fresh=true value=1 1439938800000000000
+

InfluxDB line protocol syntax

+

In some cases, the bad timestamp error occurs with more general syntax errors +in the InfluxDB line protocol. +Line protocol is whitespace sensitive; misplaced spaces can cause InfluxDB +to assume that a field or tag is an invalid timestamp.

+

Example

+

Write 1

+ + +
> INSERT hens location=2 value=9
+ERR: {"error":"unable to parse 'hens location=2 value=9': bad timestamp"}
+

The line protocol in Write 1 separates the hen measurement from the location=2 +tag with a space instead of a comma. +InfluxDB assumes that the value=9 field is the timestamp and returns an error.

+

Use a comma instead of a space between the measurement and tag to avoid the error:

+ + +
INSERT hens,location=2 value=9
+

Write 2

+ + +
> INSERT cows,name=daisy milk_prod=3 happy=3
+ERR: {"error":"unable to parse 'cows,name=daisy milk_prod=3 happy=3': bad timestamp"}
+

The line protocol in Write 2 separates the milk_prod=3 field and the +happy=3 field with a space instead of a comma. +InfluxDB assumes that the happy=3 field is the timestamp and returns an error.

+

Use a comma instead of a space between the two fields to avoid the error:

+ + +
INSERT cows,name=daisy milk_prod=3,happy=3
+

Resources: +InfluxDB line protocol tutorial, +InfluxDB line protocol reference

+

unable to parse < >: time outside range

+

The time outside range error occurs when the timestamp in the +InfluxDB line protocol +falls outside the valid time range for InfluxDB.

+

The minimum valid timestamp is -9223372036854775806 or 1677-09-21T00:12:43.145224194Z. +The maximum valid timestamp is 9223372036854775806 or 2262-04-11T23:47:16.854775806Z.

+

Resources: +InfluxDB line protocol tutorial, +InfluxDB line protocol reference

+

write failed for shard < >: engine: cache maximum memory size exceeded

+

The cache maximum memory size exceeded error occurs when the cached +memory size increases beyond the +cache-max-memory-size setting +in the configuration file.

+

By default, cache-max-memory-size is set to 512mb. +This value is fine for most workloads, but is too small for larger write volumes +or for datasets with higher series cardinality. +If you have lots of RAM you could set it to 0 to disable the cached memory +limit and never get this error. +You can also examine the memBytes field in thecache measurement in the +_internal database +to get a sense of how big the caches are in memory.

+

Resources: +Database Configuration

+

already killed

+

The already killed error occurs when a query has already been killed, but +there are subsequent kill attempts before the query has exited. +When a query is killed, it may not exit immediately. +It will be in the killed state, which means the signal has been sent, but the +query itself has not hit an interrupt point.

+

Resources: +Query management

+

Common -import errors

+

Find common errors that occur when importing data in the command line interface (CLI).

+
    +
  1. (Optional) Customize how to view -import errors and output by running any of the following commands:
  2. +
+
    +
  • Send errors and output to a new file: influx -import -path={import-file}.gz -compressed {new-file} 2>&1
  • +
  • Send errors and output to separate files: influx -import -path={import-file}.gz -compressed > {output-file} 2> {error-file}
  • +
  • Send errors to a new file: influx -import -path={import-file}.gz -compressed 2> {new-file}
  • +
  • Send output to a new file: influx -import -path={import-file}.gz -compressed {new-file}
  • +
+
    +
  1. Review import errors for possible causes to resolve:
  2. +
+ + +
+

Note: To learn how to use the -import command, see Import data from a file with -import.

+ +
+

Inconsistent data types

+

Error: partial write: field type conflict:

+

This error occurs when fields in an imported measurement have inconsistent data types. Make sure all fields in a measurement have the same data type, such as float64, int64, and so on.

+

Data points older than retention policy

+

Error: partial write: points beyond retention policy dropped={number-of-points-dropped}

+

This error occurs when an imported data point is older than the specified retention policy and dropped. Verify the correct retention policy is specified in the import file.

+

Unnamed import file

+

Error: reading standard input: /path/to/directory: is a directory

+

This error occurs when the -import command doesn’t include the name of an import file. Specify the file to import, for example: $ influx -import -path={filename}.txt -precision=s

+

Docker container cannot read host files

+

Error: open /path/to/file: no such file or directory

+

This error occurs when the Docker container cannot read files on the host machine. To make host machine files readable, complete the following procedure.

+

Make host machine files readable to Docker

+
    +
  1. +

    Create a directory, and then copy files to import into InfluxDB to this directory.

    +
  2. +
  3. +

    When you launch the Docker container, mount the new directory on the InfluxDB container by running the following command:

    + + +
    docker run -v /dir/path/on/host:/dir/path/in/container
    +
  4. +
  5. +

    Verify the Docker container can read host machine files by running the following command:

    + + +
    influx -import -path=/path/in/container
    +
  6. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/troubleshooting/frequently-asked-questions/index.html b/pr-preview/pr-6948/influxdb/v1/troubleshooting/frequently-asked-questions/index.html new file mode 100644 index 000000000..4984618a7 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/troubleshooting/frequently-asked-questions/index.html @@ -0,0 +1,3556 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxDB frequently asked questions | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxDB frequently asked questions

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

This page addresses frequent sources of confusion and places where InfluxDB behaves in an unexpected way relative to other database systems. +Where applicable, it links to outstanding issues on GitHub.

+

Administration

+ +

Command line interface (CLI)

+ +

Data types

+ +

InfluxQL functions

+ +

Querying data

+ +

Series and series cardinality

+ +

Writing data

+ +

How do I include a single quote in a password?

+

Escape the single quote with a backslash (\) both when creating the password +and when sending authentication requests.

+

How can I identify my version of InfluxDB?

+

There a number of ways to identify the version of InfluxDB that you’re using:

+

Run influxd version in your terminal:

+ + +
$ influxd version
+
+InfluxDB v1.12.3 (git: master b7bb7e8359642b6e071735b50ae41f5eb343fd42)
+

curl the /ping endpoint:

+ + +
$ curl -i 'http://localhost:8086/ping'
+
+HTTP/1.1 204 No Content
+Content-Type: application/json
+Request-Id: 1e08aeb6-fec0-11e6-8486-000000000000
+X-Influxdb-Version: 1.12.3
+Date: Wed, 01 Mar 2017 20:46:17 GMT
+

Launch the InfluxDB Command Line Interface:

+ + +
$ influx
+
+Connected to http://localhost:8086version 1.12.3
+InfluxDB shell version: 1.12.3
+

Check the HTTP response in your logs:

+ + +
$ journalctl -u influxdb.service
+
+Mar 01 20:49:45 rk-api influxd[29560]: [httpd] 127.0.0.1 - - [01/Mar/2017:20:49:45 +0000] "POST /query?db=&epoch=ns&q=SHOW+DATABASES HTTP/1.1" 200 151 "-" "InfluxDBShell/1.12.3" 9a4371a1-fec0-11e6-84b6-000000000000 1709
+

Where can I find InfluxDB logs?

+

On System V operating systems logs are stored under /var/log/influxdb/.

+

On systemd operating systems you can access the logs using journalctl. +Use journalctl -u influxdb to view the logs in the journal or journalctl -u influxdb > influxd.log to print the logs to a text file. With systemd, log retention depends on your system’s journald settings.

+

What is the relationship between shard group durations and retention policies?

+

InfluxDB stores data in shard groups. +A single shard group covers a specific time interval; InfluxDB determines that time interval by looking at the DURATION of the relevant retention policy (RP). +The table below outlines the default relationship between the DURATION of an RP and the time interval of a shard group:

+ + + + + + + + + + + + + + + + + + + + + +
RP durationShard group interval
< 2 days1 hour
>= 2 days and <= 6 months1 day
> 6 months7 days
+

Users can also configure the shard group duration with the +CREATE RETENTION POLICY +and +ALTER RETENTION POLICY +statements. +Check your retention policy’s shard group duration with the +SHOW RETENTION POLICIES +statement.

+

Why aren’t data dropped after I’ve altered a retention policy?

+

Several factors explain why data may not be immediately dropped after a +retention policy (RP) change.

+

The first and most likely cause is that, by default, InfluxDB checks to enforce +an RP every 30 minutes. +You may need to wait for the next RP check for InfluxDB to drop data that are +outside the RP’s new DURATION setting. +The 30 minute interval is +configurable.

+

Second, altering both the DURATION and SHARD DURATION of an RP can result in +unexpected data retention. +InfluxDB stores data in shard groups which cover a specific RP and time +interval. +When InfluxDB enforces an RP it drops entire shard groups, not individual data +points. +InfluxDB cannot divide shard groups.

+

If the RP’s new DURATION is less than the old SHARD DURATION and InfluxDB is +currently writing data to one of the old, longer shard groups, the system is +forced to keep all of the data in that shard group. +This occurs even if some of the data in that shard group are outside of the new +DURATION. +InfluxDB will drop that shard group once all of its data is outside the new +DURATION. +The system will then begin writing data to shard groups that have the new, +shorter SHARD DURATION preventing any further unexpected data retention.

+

Why does InfluxDB fail to parse microsecond units in the configuration file?

+

The syntax for specifying microsecond duration units differs for configuration settings, writes, queries, and setting the precision in the InfluxDB Command Line Interface (CLI). +The table below shows the supported syntax for each category:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Configuration FileInfluxDB API WritesAll QueriesCLI Precision Command
u👍👍👍
us👍
µ👍
µs👍
+

If a configuration option specifies the u or µ syntax, InfluxDB fails to start and reports the following error in the logs:

+ + +
run: parse config: time: unknown unit [µ|u] in duration [<integer>µ|<integer>u]
+

Does InfluxDB have a file system size limit?

+

InfluxDB works within file system size restrictions for Linux and Windows POSIX. Some storage providers and distributions have size restrictions; for example:

+
    +
  • Amazon EBS volume limits size to ~16TB
  • +
  • Linux ext3 file system limits size ~16TB
  • +
  • Linux ext4 file system limits size to ~1EB (with file size limit ~16TB)
  • +
+

If you anticipate growing over 16TB per volume/file system, we recommend finding a provider and distribution that supports your storage requirements.

+

How do I use the InfluxDB CLI to return human readable timestamps?

+

When you first connect to the CLI, specify the rfc3339 precision:

+ + +
influx -precision rfc3339
+

Alternatively, specify the precision once you’ve already connected to the CLI:

+ + +
$ influx
+Connected to http://localhost:8086 version 0.xx.x
+InfluxDB shell 0.xx.x
+> precision rfc3339
+>
+

Check out CLI/Shell for more useful CLI options.

+

How can a non-admin user USE a database in the InfluxDB CLI?

+

In versions prior to v1.3, non-admin users could not execute a USE <database_name> query in the CLI even if they had READ and/or WRITE permissions on that database.

+

Starting with version 1.3, non-admin users can execute the USE <database_name> query for databases on which they have READ and/or WRITE permissions. +If a non-admin user attempts to USE a database on which the user doesn’t have READ and/or WRITE permissions, the system returns an error:

+ + +
ERR: Database <database_name> doesn't exist. Run SHOW DATABASES for a list of existing databases.
+ +
+

Note that the SHOW DATABASES query returns only those databases on which the non-admin user has READ and/or WRITE permissions.

+ +
+

How do I write to a non-DEFAULT retention policy with the InfluxDB CLI?

+

Use the syntax INSERT INTO [<database>.]<retention_policy> <line_protocol> to write data to a non-DEFAULT retention policy using the CLI. +(Specifying the database and retention policy this way is only allowed with the CLI. +Writes over HTTP must specify the database and optionally the retention policy with the db and rp query parameters.)

+

For example:

+ + +
> INSERT INTO one_day mortality bool=true
+Using retention policy one_day
+> SELECT * FROM "mydb"."one_day"."mortality"
+name: mortality
+---------------
+time                             bool
+2016-09-13T22:29:43.229530864Z   true
+

Note that you will need to fully qualify the measurement to query data in the non-DEFAULT retention policy. Fully qualify the measurement with the syntax:

+ + +
"<database>"."<retention_policy>"."<measurement>"
+

How do I cancel a long-running query?

+

You can cancel a long-running interactive query from the CLI using Ctrl+C. To stop other long-running query that you see when using the SHOW QUERIES command, +you can use the KILL QUERY command to stop it.

+

Why can’t I query Boolean field values?

+

Acceptable Boolean syntax differs for data writes and data queries.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Boolean syntaxWritesQueries
t,f👍
T,F👍
true,false👍👍
True,False👍👍
TRUE,FALSE👍👍
+

For example, SELECT * FROM "hamlet" WHERE "bool"=True returns all points with bool set to TRUE, but SELECT * FROM "hamlet" WHERE "bool"=T returns nothing.

+ + + +

How does InfluxDB handle field type discrepancies across shards?

+

Field values can be floats, integers, strings, or Booleans. +Field value types cannot differ within a +shard, but they can differ across shards.

+

The SELECT statement

+

The +SELECT statement +returns all field values if all values have the same type. +If field value types differ across shards, InfluxDB first performs any +applicable cast +operations and then returns all values with the type that occurs first in the +following list: float, integer, string, Boolean.

+

If your data have field value type discrepancies, use the syntax +<field_key>::<type> to query the different data types.

+

Example

+

The measurement just_my_type has a single field called my_field. +my_field has four field values across four different shards, and each value has +a different data type (float, integer, string, and Boolean).

+

SELECT * returns only the float and integer field values. +Note that InfluxDB casts the integer value to a float in the response.

+ + +
SELECT * FROM just_my_type
+
+name: just_my_type
+------------------
+time		                	my_field
+2016-06-03T15:45:00Z	  9.87034
+2016-06-03T16:45:00Z	  7
+

SELECT <field_key>::<type> [...] returns all value types. +InfluxDB outputs each value type in its own column with incremented column names. +Where possible, InfluxDB casts field values to another type; +it casts the integer 7 to a float in the first column, and it +casts the float 9.879034 to an integer in the second column. +InfluxDB cannot cast floats or integers to strings or Booleans.

+ + +
SELECT "my_field"::float,"my_field"::integer,"my_field"::string,"my_field"::boolean FROM just_my_type
+
+name: just_my_type
+------------------
+time			               my_field	 my_field_1	 my_field_2		 my_field_3
+2016-06-03T15:45:00Z	 9.87034	  9
+2016-06-03T16:45:00Z	 7	        7
+2016-06-03T17:45:00Z			                     a string
+2016-06-03T18:45:00Z					                                true
+

The SHOW FIELD KEYS query

+

SHOW FIELD KEYS returns every data type, across every shard, associated with +the field key.

+

Example

+

The measurement just_my_type has a single field called my_field. +my_field has four field values across four different shards, and each value has +a different data type (float, integer, string, and Boolean). +SHOW FIELD KEYS returns all four data types:

+ + +
> SHOW FIELD KEYS
+
+name: just_my_type
+fieldKey   fieldType
+--------   ---------
+my_field   float
+my_field   string
+my_field   integer
+my_field   boolean
+

What are the minimum and maximum integers that InfluxDB can store?

+

InfluxDB stores all integers as signed int64 data types. +The minimum and maximum valid values for int64 are -9223372036854775808 and 9223372036854775807. +See Go builtins for more information.

+

Values close to but within those limits may lead to unexpected results; some functions and operators convert the int64 data type to float64 during calculation which can cause overflow issues.

+

What are the minimum and maximum timestamps that InfluxDB can store?

+

The minimum timestamp is -9223372036854775806 or 1677-09-21T00:12:43.145224194Z. +The maximum timestamp is 9223372036854775806 or 2262-04-11T23:47:16.854775806Z.

+

Timestamps outside that range return a parsing error.

+

How can I tell what type of data is stored in a field?

+

The SHOW FIELD KEYS query also returns the field’s type.

+

Example

+ + +
> SHOW FIELD KEYS FROM all_the_types
+name: all_the_types
+-------------------
+fieldKey  fieldType
+blue      string
+green     boolean
+orange    integer
+yellow    float
+

Can I change a field’s data type?

+

Currently, InfluxDB offers very limited support for changing a field’s data type.

+

The <field_key>::<type> syntax supports casting field values from integers to +floats or from floats to integers. +See Cast Operations +for an example. +There is no way to cast a float or integer to a string or Boolean (or vice versa).

+

We list possible workarounds for changing a field’s data type below. +Note that these workarounds will not update data that have already been +written to the database.

+

Write the data to a different field

+

The simplest workaround is to begin writing the new data type to a different field in the same +series.

+

Work the shard system

+

Field value types cannot differ within a +shard but they can differ across +shards.

+

Users looking to change a field’s data type can use the SHOW SHARDS query +to identify the end_time of the current shard. +InfluxDB will accept writes with a different data type to an existing field if the point has a timestamp +that occurs after that end_time.

+

Note that this will not change the field’s data type on prior shards. +For how this will affect your queries, please see +How does InfluxDB handle field type discrepancies across shards.

+

How do I perform mathematical operations within a function?

+

Currently, InfluxDB does not support mathematical operations within functions. +We recommend using InfluxQL’s subqueries +as a workaround.

+

Example

+

InfluxQL does not support the following syntax:

+ + +
SELECT MEAN("dogs" - "cats") from "pet_daycare"
+

Instead, use a subquery to get the same result:

+ + +
SELECT MEAN("difference") FROM (SELECT "dogs" - "cat" AS "difference" FROM "pet_daycare")
+

See the +Data Exploration +page for more information.

+

Why does my query return epoch 0 as the timestamp?

+

In InfluxDB, epoch 0 (1970-01-01T00:00:00Z) is often used as a null timestamp equivalent. +If you request a query that has no timestamp to return, such as an aggregation function with an unbounded time range, InfluxDB returns epoch 0 as the timestamp.

+

Which InfluxQL functions support nesting?

+

The following InfluxQL functions support nesting:

+ +

For information on how to use a subquery as a substitute for nested functions, see +Data exploration.

+

What determines the time intervals returned by GROUP BY time() queries?

+

The time intervals returned by GROUP BY time() queries conform to the InfluxDB database’s preset time +buckets or to the user-specified offset interval.

+

Example

+
Preset time buckets
+

The following query calculates the average value of sunflowers between +6:15pm and 7:45pm and groups those averages into one hour intervals:

+ + +
SELECT mean("sunflowers")
+FROM "flower_orders"
+WHERE time >= '2016-08-29T18:15:00Z' AND time <= '2016-08-29T19:45:00Z' GROUP BY time(1h)
+

The results below show how InfluxDB maintains its preset time buckets.

+

In this example, the 6pm hour is a preset bucket and the 7pm hour is a preset bucket. +The average for the 6pm time bucket does not include data prior to 6:15pm because of the WHERE time clause, +but any data included in the average for the 6pm time bucket must occur in the 6pm hour. +The same goes for the 7pm time bucket; any data included in the average for the 7pm +time bucket must occur in the 7pm hour. +The dotted lines show the points that make up each average.

+

Note that while the first timestamp in the results is 2016-08-29T18:00:00Z, +the query results in that bucket do not include data with timestamps that occur before the start of the +WHERE time clause (2016-08-29T18:15:00Z).

+

Raw data: +              +              +              +              +              +         

+

Results:

+ + +
name: flower_orders                                name: flower_orders
+—————————                                          -------------------
+time                    sunflowers                 time                  mean
+2016-08-29T18:00:00Z    34                         2016-08-29T18:00:00Z  22.332
+                       |--|                        2016-08-29T19:00:00Z  62.75
+2016-08-29T18:15:00Z   |28|
+2016-08-29T18:30:00Z   |19|
+2016-08-29T18:45:00Z   |20|
+                       |--|
+                       |--|
+2016-08-29T19:00:00Z   |56|
+2016-08-29T19:15:00Z   |76|
+2016-08-29T19:30:00Z   |29|
+2016-08-29T19:45:00Z   |90|
+                       |--|
+2016-08-29T20:00:00Z    70
+
Offset interval
+

The following query calculates the average value of sunflowers between +6:15pm and 7:45pm and groups those averages into one hour intervals. +It also offsets the InfluxDB database’s preset time buckets by 15 minutes.

+ + +
SELECT mean("sunflowers")
+FROM "flower_orders"
+WHERE time >= '2016-08-29T18:15:00Z' AND time <= '2016-08-29T19:45:00Z' GROUP BY time(1h,15m)
+                                                                                         ---
+                                                                                          |
+                                                                                   offset interval
+

In this example, the user-specified +offset interval +shifts the InfluxDB database’s preset time buckets forward by 15 minutes. +The average for the 6pm time bucket now includes data between 6:15pm and 7pm, and +the average for the 7pm time bucket includes data between 7:15pm and 8pm. +The dotted lines show the points that make up each average.

+

Note that the first timestamp in the result is 2016-08-29T18:15:00Z +instead of 2016-08-29T18:00:00Z.

+

Raw data: +              +              +              +              +              +         

+

Results:

+ + +
name: flower_orders                                name: flower_orders
+—————————                                          -------------------
+time                    sunflowers                 time                  mean
+2016-08-29T18:00:00Z    34                         2016-08-29T18:15:00Z  30.75
+                       |--|                        2016-08-29T19:15:00Z  65
+2016-08-29T18:15:00Z   |28|
+2016-08-29T18:30:00Z   |19|
+2016-08-29T18:45:00Z   |20|
+2016-08-29T19:00:00Z   |56|
+                       |--|
+                       |--|
+2016-08-29T19:15:00Z   |76|
+2016-08-29T19:30:00Z   |29|
+2016-08-29T19:45:00Z   |90|
+2016-08-29T20:00:00Z   |70|
+                       |--|
+

Why do my queries return no data or partial data?

+

The most common reasons why your query returns no data or partial data:

+ +

Querying the wrong retention policy

+

InfluxDB automatically queries data in a database’s default retention policy (RP). If your data is stored in another RP, you must specify the RP in your query to get results.

+

No field key in the SELECT clause

+

A query requires at least one field key in the SELECT clause. If the SELECT clause includes only tag keys, the query returns an empty response. For more information, see Data exploration.

+

SELECT query includes GROUP BY time()

+

If your SELECT query includes a GROUP BY time() clause, only data points between 1677-09-21 00:12:43.145224194 and now() are returned. Therefore, if any of your data points occur after now(), specify an alternative upper bound in your time interval.

+

(By default, most SELECT queries query data with timestamps between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC.)

+

Tag and field key with the same name

+

Avoid using the same name for a tag and field key. If you inadvertently add the same name for a tag and field key, and then query both keys together, the query results show the second key queried (tag or field) appended with _1 (also visible as the column header in Chronograf). To query a tag or field key appended with _1, you must drop the appended _1 and include the syntax ::tag or ::field.

+

Example

+
    +
  1. +

    Launch influx.

    +
  2. +
  3. +

    Write the following points to create both a field and tag key with the same name leaves:

    + + +
    # create the `leaves` tag key
    +INSERT grape,leaves=species leaves=6
    +
    +#create the `leaves` field key
    +INSERT grape leaves=5
    +
  4. +
  5. +

    If you view both keys, you’ll notice that neither key includes _1:

    + + +
    # show the `leaves` tag key
    +SHOW TAG KEYS
    +
    +name: grape
    +tagKey
    +------
    +leaves
    +
    +# create the `leaves` field key
    +SHOW FIELD KEYS
    +
    +name: grape
    +fieldKey   fieldType
    +------     ---------
    +leaves     float
    +
  6. +
  7. +

    If you query the grape measurement, you’ll see the leaves tag key has an appended _1:

    + + +
    # query the `grape` measurement
    +SELECT * FROM <database_name>.<retention_policy>."grape"
    +
    +name: grape
    +time                leaves      leaves_1
    +----                --------    ----------
    +1574128162128468000 6.00        species
    +1574128238044155000 5.00
    +
  8. +
  9. +

    To query a duplicate key name, you must drop _1 and include ::tag or ::field after the key:

    + + +
    # query duplicate keys using the correct syntax
    +SELECT "leaves"::tag, "leaves"::field FROM <database_name>.<retention_policy>."grape"
    +
    +name: grape
    +time                leaves     leaves_1
    +----                --------   ----------
    +1574128162128468000 species    6.00
    +1574128238044155000            5.00
    +

    Therefore, queries that reference leaves_1 don’t return values.

    +
  10. +
+ +
+

Warning: If you inadvertently add a duplicate key name, follow the steps +below to remove a duplicate key. Because of memory +requirements, if you have large amounts of data, we recommend chunking your data +(while selecting it) by a specified interval (for example, date range) to fit +the allotted memory.

+ +
+ +

Remove a duplicate key

+
    +
  1. +

    Launch influx.

    +
  2. +
  3. +

    Use the following queries to remove a duplicate key.

    + + +
    
    +/* select each field key to keep in the original measurement and send to a temporary
    +   measurement; then, group by the tag keys to keep (leave out the duplicate key) */
    +
    +SELECT "field_key","field_key2","field_key3"
    +INTO <temporary_measurement> FROM <original_measurement>
    +WHERE <date range> GROUP BY "tag_key","tag_key2","tag_key3"
    +
    +/* verify the field keys and tags keys were successfully moved to the temporary
    +measurement */
    +SELECT * FROM "temporary_measurement"
    +
    +/* drop original measurement (with the duplicate key) */
    +DROP MEASUREMENT "original_measurement"
    +
    +/* move data from temporary measurement back to original measurement you just dropped */
    +SELECT * INTO "original_measurement" FROM "temporary_measurement" GROUP BY *
    +
    +/* verify the field keys and tags keys were successfully moved back to the original
    + measurement */
    +SELECT * FROM "original_measurement"
    +
    +/* drop temporary measurement */
    +DROP MEASUREMENT "temporary_measurement"
    +
  4. +
+

Why don’t my GROUP BY time() queries return timestamps that occur after now()?

+

Most SELECT statements have a default time range between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC. +For SELECT statements with a GROUP BY time() clause, the default time +range is between 1677-09-21 00:12:43.145224194 UTC and now().

+

To query data with timestamps that occur after now(), SELECT statements with +a GROUP BY time() clause must provide an alternative upper bound in the +WHERE clause.

+

In the following example, the first query covers data with timestamps between +2015-09-18T21:30:00Z and now(). +The second query covers data with timestamps between 2015-09-18T21:30:00Z and 180 weeks from now().

+ + +
SELECT MEAN("boards") FROM "hillvalley" WHERE time >= '2015-09-18T21:30:00Z' GROUP BY time(12m) fill(none)
+
+SELECT MEAN("boards") FROM "hillvalley" WHERE time >= '2015-09-18T21:30:00Z' AND time <= now() + 180w GROUP BY time(12m) fill(none)
+

Note that the WHERE clause must provide an alternative upper bound to +override the default now() upper bound. The following query merely resets +the lower bound to now() such that the query’s time range is between +now() and now():

+ + +
SELECT MEAN("boards") FROM "hillvalley" WHERE time >= now() GROUP BY time(12m) fill(none)
+

For for more on time syntax in queries, see Data Exploration.

+

Can I perform mathematical operations against timestamps?

+

Currently, it is not possible to execute mathematical operators against timestamp values in InfluxDB. +Most time calculations must be carried out by the client receiving the query results.

+

There is limited support for using InfluxQL functions against timestamp values. +The function ELAPSED() +returns the difference between subsequent timestamps in a single field.

+

Can I identify write precision from returned timestamps?

+

InfluxDB stores all timestamps as nanosecond values, regardless of the write precision supplied. +It is important to note that when returning query results, the database silently drops trailing zeros from timestamps which obscures the initial write precision.

+

In the example below, the tags precision_supplied and timestamp_supplied show the time precision and timestamp that the user provided at the write. +Because InfluxDB silently drops trailing zeros on returned timestamps, the write precision is not recognizable in the returned timestamps.

+ + +
name: trails
+-------------
+time                  value	 precision_supplied  timestamp_supplied
+1970-01-01T01:00:00Z  3      n                   3600000000000
+1970-01-01T01:00:00Z  5      h                   1
+1970-01-01T02:00:00Z  4      n                   7200000000000
+1970-01-01T02:00:00Z  6      h                   2
+ + + +

When should I single quote and when should I double quote in queries?

+

Single quote string values (for example, tag values) but do not single quote identifiers (database names, retention policy names, user names, measurement names, tag keys, and field keys).

+

Double quote identifiers if they start with a digit, contain characters other than [A-z,0-9,_], or if they are an InfluxQL keyword. +Double quotes are not required for identifiers if they don’t fall into one of +those categories but we recommend double quoting them anyway.

+

Examples:

+

Yes: SELECT bikes_available FROM bikes WHERE station_id='9'

+

Yes: SELECT "bikes_available" FROM "bikes" WHERE "station_id"='9'

+

Yes: SELECT MIN("avgrq-sz") AS "min_avgrq-sz" FROM telegraf

+

Yes: SELECT * from "cr@zy" where "p^e"='2'

+

No: SELECT 'bikes_available' FROM 'bikes' WHERE 'station_id'="9"

+

No: SELECT * from cr@zy where p^e='2'

+

Single quote date time strings. InfluxDB returns an error (ERR: invalid operation: time and *influxql.VarRef are not compatible) if you double quote +a date time string.

+

Examples:

+

Yes: SELECT "water_level" FROM "h2o_feet" WHERE time > '2015-08-18T23:00:01.232000000Z' AND time < '2015-09-19'

+

No: SELECT "water_level" FROM "h2o_feet" WHERE time > "2015-08-18T23:00:01.232000000Z" AND time < "2015-09-19"

+

See Data Exploration for more on time syntax in queries.

+

Why am I missing data after creating a new DEFAULT retention policy?

+

When you create a new DEFAULT retention policy (RP) on a database, the data written to the old DEFAULT RP remain in the old RP. +Queries that do not specify an RP automatically query the new DEFAULT RP so the old data may appear to be missing. +To query the old data you must fully qualify the relevant data in the query.

+

Example:

+

All of the data in the measurement fleeting fall under the DEFAULT RP called one_hour:

+ + +
> SELECT count(flounders) FROM fleeting
+name: fleeting
+--------------
+time			               count
+1970-01-01T00:00:00Z	 8
+

We create a new DEFAULT RP (two_hour) and perform the same query:

+ + +
SELECT count(flounders) FROM fleeting
+

To query the old data, we must specify the old DEFAULT RP by fully qualifying fleeting:

+ + +
> SELECT count(flounders) FROM fish.one_hour.fleeting
+name: fleeting
+--------------
+time			               count
+1970-01-01T00:00:00Z	 8
+

Why is my query with a WHERE OR time clause returning empty results?

+

Currently, InfluxDB does not support using OR in the WHERE clause to specify multiple time ranges. +InfluxDB returns an empty response if the query’s WHERE clause uses OR +with time intervals.

+

Example:

+ + +
SELECT * FROM "absolutismus" WHERE time = '2016-07-31T20:07:00Z' OR time = '2016-07-31T23:07:17Z'
+ + + +

Why does fill(previous) return empty results?

+

fill(previous) doesn’t fill the result for a time bucket if the previous value is outside the query’s time range.

+

In the following example, InfluxDB doesn’t fill the 2016-07-12T16:50:20Z-2016-07-12T16:50:30Z time bucket with the results from the 2016-07-12T16:50:00Z-2016-07-12T16:50:10Z time bucket because the query’s time range does not include the earlier time bucket.

+

Raw data:

+ + +
> SELECT * FROM "cupcakes"
+name: cupcakes
+--------------
+time                   chocolate
+2016-07-12T16:50:00Z   3
+2016-07-12T16:50:10Z   2
+2016-07-12T16:50:40Z   12
+2016-07-12T16:50:50Z   11
+

GROUP BY time() query:

+ + +
> SELECT max("chocolate") FROM "cupcakes" WHERE time >= '2016-07-12T16:50:20Z' AND time <= '2016-07-12T16:51:10Z' GROUP BY time(20s) fill(previous)
+name: cupcakes
+--------------
+time                   max
+2016-07-12T16:50:20Z
+2016-07-12T16:50:40Z   12
+2016-07-12T16:51:00Z   12
+

While this is the expected behavior of fill(previous), an open feature request on GitHub proposes that fill(previous) should fill results even when previous values fall outside the query’s time range.

+

Why are my INTO queries missing data?

+

By default, INTO queries convert any tags in the initial data to fields in +the newly written data. +This can cause InfluxDB to overwrite points that were previously differentiated by a tag. +Include GROUP BY * in all INTO queries to preserve tags in the newly written data.

+

Note that this behavior does not apply to queries that use the TOP() or BOTTOM() functions. +See the TOP() and BOTTOM() documentation for more information.

+

Example

+
Initial data
+

The french_bulldogs measurement includes the color tag and the name field.

+ + +
> SELECT * FROM "french_bulldogs"
+name: french_bulldogs
+---------------------
+time                  color  name
+2016-05-25T00:05:00Z  peach  nugget
+2016-05-25T00:05:00Z  grey   rumple
+2016-05-25T00:10:00Z  black  prince
+
INTO query without GROUP BY *
+

An INTO query without a GROUP BY * clause turns the color tag into +a field in the newly written data. +In the initial data the nugget point and the rumple points are differentiated only by the color tag. +Once color becomes a field, InfluxDB assumes that the nugget point and the +rumple point are duplicate points and it overwrites the nugget point with +the rumple point.

+ + +
> SELECT * INTO "all_dogs" FROM "french_bulldogs"
+name: result
+------------
+time                  written
+1970-01-01T00:00:00Z  3
+
+> SELECT * FROM "all_dogs"
+name: all_dogs
+--------------
+time                  color  name
+2016-05-25T00:05:00Z  grey   rumple                <---- no more nugget 🐶
+2016-05-25T00:10:00Z  black  prince
+
INTO query with GROUP BY *
+

An INTO query with a GROUP BY * clause preserves color as a tag in the newly written data. +In this case, the nugget point and the rumple point remain unique points and InfluxDB does not overwrite any data.

+ + +
> SELECT "name" INTO "all_dogs" FROM "french_bulldogs" GROUP BY *
+name: result
+------------
+time                  written
+1970-01-01T00:00:00Z  3
+
+> SELECT * FROM "all_dogs"
+name: all_dogs
+--------------
+time                  color  name
+2016-05-25T00:05:00Z  peach  nugget
+2016-05-25T00:05:00Z  grey   rumple
+2016-05-25T00:10:00Z  black  prince
+

How do I query data with an identical tag key and field key?

+

Use the :: syntax to specify if the key is a field key or tag key.

+

Examples

+
Sample data
+ + +
> INSERT candied,almonds=true almonds=50,half_almonds=51 1465317610000000000
+> INSERT candied,almonds=true almonds=55,half_almonds=56 1465317620000000000
+
+> SELECT * FROM "candied"
+name: candied
+-------------
+time                   almonds  almonds_1  half_almonds
+2016-06-07T16:40:10Z   50       true       51
+2016-06-07T16:40:20Z   55       true       56
+
Specify that the key is a field:
+ + +
> SELECT * FROM "candied" WHERE "almonds"::field > 51
+name: candied
+-------------
+time                   almonds  almonds_1  half_almonds
+2016-06-07T16:40:20Z   55       true       56
+
Specify that the key is a tag:
+ + +
> SELECT * FROM "candied" WHERE "almonds"::tag='true'
+name: candied
+-------------
+time                   almonds  almonds_1  half_almonds
+2016-06-07T16:40:10Z   50       true       51
+2016-06-07T16:40:20Z   55       true       56
+

How do I query data across measurements?

+

Currently, there is no way to perform cross-measurement math or grouping. +All data must be under a single measurement to query it together. +InfluxDB is not a relational database and mapping data across measurements is not currently a recommended schema. +See GitHub Issue #3552 for a discussion of implementing JOIN in InfluxDB.

+

Does the order of the timestamps matter?

+

No. +Our tests indicate that there is a only a negligible difference between the times +it takes InfluxDB to complete the following queries:

+ + +
SELECT ... FROM ... WHERE time > 'timestamp1' AND time < 'timestamp2'
+SELECT ... FROM ... WHERE time < 'timestamp2' AND time > 'timestamp1'
+

How do I SELECT data with a tag that has no value?

+

Specify an empty tag value with ''. For example:

+ + +
> SELECT * FROM "vases" WHERE priceless=''
+name: vases
+-----------
+time                   origin   priceless
+2016-07-20T18:42:00Z   8
+

Why does series cardinality matter?

+

InfluxDB maintains an in-memory index of every series in the system. As the number of unique series grows, so does the RAM usage. High series cardinality can lead to the operating system killing the InfluxDB process with an out of memory (OOM) exception. See SHOW CARDINALITY to learn about the InfluxSQL commands for series cardinality.

+

How can I remove series from the index?

+

To reduce series cardinality, series must be dropped from the index. +DROP DATABASE, +DROP MEASUREMENT, and +DROP SERIES will all remove series from the index and reduce the overall series cardinality.

+ +
+

Note: DROP commands are usually CPU-intensive, as they frequently trigger a TSM compaction. Issuing DROP queries at a high frequency may significantly impact write and other query throughput.

+ +
+

How do I write integer field values?

+

Add a trailing i to the end of the field value when writing an integer. +If you do not provide the i, InfluxDB will treat the field value as a float.

+

Writes an integer: value=100i +Writes a float: value=100

+

How does InfluxDB handle duplicate points?

+

A point is uniquely identified by the measurement name, tag set, and timestamp. +If you submit a new point with the same measurement, tag set, and timestamp as an existing point, the field set becomes the union of the old field set and the new field set, where any ties go to the new field set. +This is the intended behavior.

+

For example:

+

Old point: cpu_load,hostname=server02,az=us_west val_1=24.5,val_2=7 1234567890000000

+

New point: cpu_load,hostname=server02,az=us_west val_1=5.24 1234567890000000

+

After you submit the new point, InfluxDB overwrites val_1 with the new field value and leaves the field val_2 alone:

+ + +
> SELECT * FROM "cpu_load" WHERE time = 1234567890000000
+name: cpu_load
+--------------
+time                      az        hostname   val_1   val_2
+1970-01-15T06:56:07.89Z   us_west   server02   5.24    7
+

To store both points:

+
    +
  • +

    Introduce an arbitrary new tag to enforce uniqueness.

    +

    Old point: cpu_load,hostname=server02,az=us_west,uniq=1 val_1=24.5,val_2=7 1234567890000000

    +

    New point: cpu_load,hostname=server02,az=us_west,uniq=2 val_1=5.24 1234567890000000

    +

    After writing the new point to InfluxDB:

    + + +
    > SELECT * FROM "cpu_load" WHERE time = 1234567890000000
    +name: cpu_load
    +--------------
    +time                      az        hostname   uniq   val_1   val_2
    +1970-01-15T06:56:07.89Z   us_west   server02   1      24.5    7
    +1970-01-15T06:56:07.89Z   us_west   server02   2      5.24
    +
  • +
  • +

    Increment the timestamp by a nanosecond.

    +

    Old point: cpu_load,hostname=server02,az=us_west val_1=24.5,val_2=7 1234567890000000

    +

    New point: cpu_load,hostname=server02,az=us_west val_1=5.24 1234567890000001

    +

    After writing the new point to InfluxDB:

    + + +
    > SELECT * FROM "cpu_load" WHERE time >= 1234567890000000 and time <= 1234567890000001
    +name: cpu_load
    +--------------
    +time                             az        hostname   val_1   val_2
    +1970-01-15T06:56:07.89Z          us_west   server02   24.5    7
    +1970-01-15T06:56:07.890000001Z   us_west   server02   5.24
    +
  • +
+

What newline character does the InfluxDB API require?

+

The InfluxDB line protocol relies on line feed (\n, which is ASCII 0x0A) to indicate the end of a line and the beginning of a new line. Files or data that use a newline character other than \n will result in the following errors: bad timestamp, unable to parse.

+

Note that Windows uses carriage return and line feed (\r\n) as the newline character.

+

What words and characters should I avoid when writing data to InfluxDB?

+

InfluxQL keywords

+

If you use an InfluxQL keyword as an identifier you will need to double quote that identifier in every query. +This can lead to non-intuitive errors. +Identifiers are continuous query names, database names, field keys, measurement names, retention policy names, subscription names, tag keys, and user names.

+

time

+

The keyword time is a special case. +time can be a +continuous query name, +database name, +measurement name, +retention policy name, +subscription name, and +user name. +In those cases, time does not require double quotes in queries. +time cannot be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error.

+

Examples

+
Write time as a measurement and query it
+ + +
> INSERT time value=1
+
+> SELECT * FROM time
+
+name: time
+time                            value
+----                            -----
+2017-02-07T18:28:27.349785384Z  1
+

time is a valid measurement name in InfluxDB.

+
Write time as a field key and attempt to query it
+ + +
> INSERT mymeas time=1
+ERR: {"error":"partial write: invalid field name: input field \"time\" on measurement \"mymeas\" is invalid dropped=1"}
+

time is not a valid field key in InfluxDB. +The system does does not write the point and returns a 400.

+
Write time as a tag key and attempt to query it
+ + +
> INSERT mymeas,time=1 value=1
+ERR: {"error":"partial write: invalid tag key: input tag \"time\" on measurement \"mymeas\" is invalid dropped=1"}
+

time is not a valid tag key in InfluxDB. +The system does does not write the point and returns a 400.

+

Characters

+

To keep regular expressions and quoting simple, avoid using the following characters in identifiers:

+

\ backslash +^ circumflex accent +$ dollar sign +' single quotation mark +" double quotation mark += equal sign +, comma

+

When should I single quote and when should I double quote when writing data?

+
    +
  • +

    Avoid single quoting and double quoting identifiers when writing data via +line protocol; see the examples below for how writing identifiers with quotes +can complicate queries. Identifiers are database names, retention policy +names, user names, measurement names, tag keys, and field keys. +Not recommended approaches (complicate queries):* +Write with a double-quoted measurement: INSERT "bikes" bikes_available=3 +Applicable query: SELECT * FROM "\"bikes\""

    +

    Write with a single-quoted measurement: INSERT 'bikes' bikes_available=3 +Applicable query: SELECT * FROM "\'bikes\'"

    +

    Recommended approach (simpler queries):

    +

    Write with an unquoted measurement: INSERT bikes bikes_available=3 +Applicable query: SELECT * FROM "bikes"

    +
  • +
  • +

    Double quote field values that are strings–for example:

    +

    Write: INSERT bikes happiness="level 2" +Applicable query: SELECT * FROM "bikes" WHERE "happiness"='level 2'

    +
  • +
  • +

    Special characters should be escaped with a backslash and not placed in quotes–for example:

    +

    Write: INSERT wacky va\"ue=4 +Applicable query: SELECT "va\"ue" FROM "wacky"

    +
  • +
+

For more information , see Line protocol.

+

Does the precision of the timestamp matter?

+

Yes. +To maximize performance, use the coarsest possible timestamp precision when writing data to InfluxDB.

+

In the following two examples, the first request uses a default precision of nanoseconds while the second example sets the precision to seconds:

+ + +
curl -i -XPOST "http://localhost:8086/write?db=weather" --data-binary 'temperature,location=1 value=90 1472666050000000000'
+
+curl -i -XPOST "http://localhost:8086/write?db=weather&precision=s" --data-binary 'temperature,location=1 value=90 1472666050'
+

The tradeoff is that identical points with duplicate timestamps, more likely to occur as precision gets coarser, may overwrite other points.

+

What are the configuration recommendations and schema guidelines for writing sparse, historical data?

+

For users who want to write sparse, historical data to InfluxDB, InfluxData recommends:

+

First, lengthening your retention policy‘s shard group duration to cover several years. +The default shard group duration is one week and if your data cover several hundred years – well, that’s a lot of shards! +Having an extremely high number of shards is inefficient for InfluxDB. +Increase the shard group duration for your data’s retention policy with the ALTER RETENTION POLICY query.

+

Second, temporarily lowering the cache-snapshot-write-cold-duration configuration setting. +If you’re writing a lot of historical data, the default setting (10m) can cause the system to hold all of your data in cache for every shard. +Temporarily lowering the cache-snapshot-write-cold-duration setting to 10s while you write the historical data makes the process more efficient.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/write_protocols/line_protocol_reference/index.html b/pr-preview/pr-6948/influxdb/v1/write_protocols/line_protocol_reference/index.html new file mode 100644 index 000000000..74e3281a7 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/write_protocols/line_protocol_reference/index.html @@ -0,0 +1,2789 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxDB line protocol reference | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxDB line protocol reference

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxDB line protocol is a text-based format for writing points to InfluxDB.

+

Line protocol syntax

+ + +
<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]
+

Line protocol accepts the newline character \n and is whitespace-sensitive.

+ +
+

Note Line protocol does not support the newline character \n in tag values or field values.

+ +
+

Syntax description

+

InfluxDB line protocol informs InfluxDB of the data’s measurement, tag set, field set, and timestamp.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementOptional/RequiredDescriptionType
(See data types for more information.)
MeasurementRequiredThe measurement name. InfluxDB accepts one measurement per point.String
Tag setOptionalAll tag key-value pairs for the point.Tag keys and tag values are both strings.
Field setRequired. Points must have at least one field.All field key-value pairs for the point.Field keys are strings. Field values can be floats, integers, strings, or Booleans.
TimestampOptional. InfluxDB uses the server’s local nanosecond timestamp in UTC if the timestamp is not included with the point.The timestamp for the data point. InfluxDB accepts one timestamp per point.Unix nanosecond timestamp. Specify alternative precisions with the InfluxDB API.
+ +
+

Performance tips:

+ +
+
    +
  • Before sending data to InfluxDB, sort by tag key to match the results from the +Go bytes.Compare function.
  • +
  • To significantly improve compression, use the coarsest precision possible for timestamps.
  • +
  • Use the Network Time Protocol (NTP) to synchronize time between hosts. InfluxDB uses a host’s local time in UTC to assign timestamps to data. If a host’s clock isn’t synchronized with NTP, the data that the host writes to InfluxDB may have inaccurate timestamps.
  • +
+

Data types

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DatatypeElement(s)Description
FloatField valuesDefault numerical type. IEEE-754 64-bit floating-point numbers (except NaN or +/- Inf). Examples: 1, 1.0, 1.e+78, 1.E+78.
IntegerField valuesSigned 64-bit integers (-9223372036854775808 to 9223372036854775807). Specify an integer with a trailing i on the number. Example: 1i.
StringMeasurements, tag keys, tag values, field keys, field valuesLength limit 64KB.
BooleanField valuesStores TRUE or FALSE values.

TRUE write syntax:[t, T, true, True, TRUE].

FALSE write syntax:[f, F, false, False, FALSE]
TimestampTimestampsUnix nanosecond timestamp. Specify alternative precisions with the InfluxDB API. The minimum valid timestamp is -9223372036854775806 or 1677-09-21T00:12:43.145224194Z. The maximum valid timestamp is 9223372036854775806 or 2262-04-11T23:47:16.854775806Z.
+

Boolean syntax for writes and queries

+

Acceptable Boolean syntax differs for data writes and data queries. +For more information, see +Frequently asked questions.

+

Field type discrepancies

+

In a measurement, a field’s type cannot differ in a shard, but can differ across +shards.

+

To learn how field value type discrepancies can affect SELECT * queries, see +How does InfluxDB handle field type discrepancies across shards?.

+

Examples

+

Write the field value -1.234456e+78 as a float to InfluxDB

+ + +
INSERT mymeas value=-1.234456e+78
+

InfluxDB supports field values specified in scientific notation.

+

Write a field value 1.0 as a float to InfluxDB

+ + +
INSERT mymeas value=1.0
+

Write the field value 1 as a float to InfluxDB

+ + +
INSERT mymeas value=1
+

Write the field value 1 as an integer to InfluxDB

+ + +
INSERT mymeas value=1i
+

Write the field value stringing along as a string to InfluxDB

+ + +
INSERT mymeas value="stringing along"
+

Always double quote string field values. More on quoting below.

+

Write the field value true as a Boolean to InfluxDB

+ + +
INSERT mymeas value=true
+

Do not quote Boolean field values. +The following statement writes true as a string field value to InfluxDB:

+ + +
INSERT mymeas value="true"
+

Attempt to write a string to a field that previously accepted floats

+

If the timestamps on the float and string are stored in the same shard:

+ + +
> INSERT mymeas value=3 1465934559000000000
+> INSERT mymeas value="stringing along" 1465934559000000001
+ERR: {"error":"field type conflict: input field \"value\" on measurement \"mymeas\" is type string, already exists as type float"}
+

If the timestamps on the float and string are not stored in the same shard:

+ + +
INSERT mymeas value=3 1465934559000000000
+INSERT mymeas value="stringing along" 1466625759000000000
+

Quoting, special characters, and additional naming guidelines

+

Quoting

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ElementDouble quotesSingle quotes
TimestampNeverNever
Measurements, tag keys, tag values, field keysNever*Never*
Field valuesDouble quote string field values. Do not double quote floats, integers, or Booleans.Never
+

* InfluxDB line protocol allows users to double and single quote measurement names, tag +keys, tag values, and field keys. +It will, however, assume that the double or single quotes are part of the name, +key, or value. +This can complicate query syntax (see the example below).

+

Examples

+
Invalid line protocol - Double quote the timestamp
+ + +
> INSERT mymeas value=9 "1466625759000000000"
+ERR: {"error":"unable to parse 'mymeas value=9 \"1466625759000000000\"': bad timestamp"}
+

Double quoting (or single quoting) the timestamp yields a bad timestamp +error.

+
Semantic error - Double quote a Boolean field value
+ + +
> INSERT mymeas value="true"
+> SHOW FIELD KEYS FROM "mymeas"
+name: mymeas
+------------
+fieldKey	 fieldType
+value		   string
+

InfluxDB assumes that all double quoted field values are strings.

+
Semantic error - Double quote a measurement name
+ + +
> INSERT "mymeas" value=200
+> SHOW MEASUREMENTS
+name: measurements
+------------------
+name
+"mymeas"
+> SELECT * FROM mymeas
+> SELECT * FROM "mymeas"
+> SELECT * FROM "\"mymeas\""
+name: "mymeas"
+--------------
+time				                        value
+2016-06-14T20:36:21.836131014Z	 200
+

If you double quote a measurement in line protocol, any queries on that +measurement require both double quotes and escaped (\) double quotes in the +FROM clause.

+

Special characters

+

You must use a backslash character \ to escape the following special characters:

+
    +
  • In string field values, you must escape: +
      +
    • double quotes
    • +
    • backslash character
    • +
    +
  • +
+

For example, \" escapes double quote.

+ +
+

Note on backslashes:

+ +
+
    +
  • +

    If you use multiple backslashes, they must be escaped. Influx interprets backslashes as follows:

    +
      +
    • \ or \\ interpreted as \
    • +
    • \\\ or \\\\ interpreted as \\
    • +
    • \\\\\ or \\\\\\ interpreted as \\\, and so on
    • +
    +
  • +
  • +

    In tag keys, tag values, and field keys, you must escape:

    +
      +
    • commas
    • +
    • equal signs
    • +
    • spaces
    • +
    +
  • +
+

For example, \, escapes a comma.

+
    +
  • In measurements, you must escape: +
      +
    • commas
    • +
    • spaces
    • +
    +
  • +
+

You do not need to escape other special characters.

+

Examples

+
Write a point with special characters
+ + +
INSERT "measurement\ with\ quo⚡️es\ and\ emoji",tag\ key\ with\ sp🚀ces=tag\,value\,with"commas" field_k\ey="string field value, only \" need be esc🍭ped"
+

The system writes a point where the measurement is "measurement with quo⚡️es and emoji", the tag key is tag key with sp🚀ces, the +tag value is tag,value,with"commas", the field key is field_k\ey and the field value is string field value, only " need be esc🍭ped.

+

Additional naming guidelines

+

# at the beginning of the line is a valid comment character for line protocol. +InfluxDB will ignore all subsequent characters until the next newline \n.

+

Measurement names, tag keys, tag values, field keys, and field values are +case sensitive.

+

InfluxDB line protocol accepts +InfluxQL keywords +as identifier names. +In general, we recommend avoiding using InfluxQL keywords in your schema as +it can cause +confusion when querying the data.

+ +
+

Note: Avoid using the reserved keys _field and _measurement. If these keys are included as a tag or field key, the associated point is discarded.

+ +
+

The keyword time is a special case. +time can be a +continuous query name, +database name, +measurement name, +retention policy name, +subscription name, and +user name. +In those cases, time does not require double quotes in queries. +time cannot be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error. +See Frequently Asked Questions for more information.

+

InfluxDB line protocol in practice

+

To learn how to write line protocol to the database, see Tools.

+

Duplicate points

+

A point is uniquely identified by the measurement name, tag set, field set, and timestamp

+

If you write a point to a series with a timestamp that matches an existing point, the field set becomes a union of the old and new field set, and conflicts favor the new field set.

+

For a complete example of this behavior and how to avoid it, see +How does InfluxDB handle duplicate points?

+

Duplicate keys

+

If you have a tag key and field key with the same name in a measurement, one of the keys will return appended with a _1 in query results (and as a column header in Chronograf). For example, location and location_1. To query a duplicate key, drop the _1 and use the InfluxQL ::tag or ::field syntax in your query, for example:

+ + +
  SELECT "location"::tag, "location"::field FROM "database_name"."retention_policy"."measurement"
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v1/write_protocols/line_protocol_tutorial/index.html b/pr-preview/pr-6948/influxdb/v1/write_protocols/line_protocol_tutorial/index.html new file mode 100644 index 000000000..5b3013f03 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v1/write_protocols/line_protocol_tutorial/index.html @@ -0,0 +1,2951 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxDB line protocol tutorial | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxDB line protocol tutorial

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

The InfluxDB line protocol is a text-based format for writing points to the +database. +Points must be in line protocol format for InfluxDB to successfully parse and +write points (unless you’re using a service plugin).

+

Using fictional temperature data, this page introduces InfluxDB line protocol. +It covers:

+ + + + + + + +
SyntaxData TypesQuotingSpecial Characters and Keywords
+

The final section, Writing data to InfluxDB, +describes how to get data into InfluxDB and how InfluxDB handles Line +Protocol duplicates.

+

Syntax

+

A single line of text in line protocol format represents one data point in InfluxDB. +It informs InfluxDB of the point’s measurement, tag set, field set, and +timestamp. +The following code block shows a sample of line protocol and breaks it into its +individual components:

+ + +
weather,location=us-midwest temperature=82 1465839830100400200
+  |    -------------------- --------------  |
+  |             |             |             |
+  |             |             |             |
++-----------+--------+-+---------+-+---------+
+|measurement|,tag_set| |field_set| |timestamp|
++-----------+--------+-+---------+-+---------+
+

Moving across each element in the diagram:

+

Measurement

+

The name of the measurement +that you want to write your data to. +The measurement is required in line protocol.

+

In the example, the measurement name is weather.

+

Tag set

+

The tag(s) that you want to include +with your data point. +Tags are optional in line protocol.

+ +
+

Note: Avoid using the reserved keys _field, _measurement, and time. If reserved keys are included as a tag or field key, the associated point is discarded.

+ +
+

Notice that the measurement and tag set are separated by a comma and no spaces.

+

Separate tag key-value pairs with an equals sign = and no spaces:

+ + +
<tag_key>=<tag_value>
+

Separate multiple tag-value pairs with a comma and no spaces:

+ + +
<tag_key>=<tag_value>,<tag_key>=<tag_value>
+

In the example, the tag set consists of one tag: location=us-midwest. +Adding another tag (season=summer) to the example looks like this:

+ + +
weather,location=us-midwest,season=summer temperature=82 1465839830100400200
+

When using quotes in tag sets, line protocol supports single and double quotes as described in the following table:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementDouble quotesSingle quotes
MeasurementLimited *Limited *
Tag keyLimited *Limited *
Tag valueLimited *Limited *
Field keyLimited *Limited *
Field valueStrings onlyNever
TimestampNeverNever
+

* Line protocol accepts double and single quotes in +measurement names, tag keys, tag values, and field keys, but interprets them as +part of the name, key, or value.

+ +
+

Always double quote string field values.

+ + +
measurementName fieldKey="field string value" 1556813561098000000
+ +
+ +

For best performance you should sort tags by key before sending them to the +database. +The sort should match the results from the +Go bytes.Compare function.

+

Whitespace I

+

Separate the measurement and the field set or, if you’re including a tag set +with your data point, separate the tag set and the field set with a whitespace. +The whitespace is required in line protocol.

+

Valid line protocol with no tag set:

+ + +
weather temperature=82 1465839830100400200
+

Field set

+

The field(s) for your data point. +Every data point requires at least one field in line protocol.

+

Separate field key-value pairs with an equals sign = and no spaces:

+ + +
<field_key>=<field_value>
+

Separate multiple field-value pairs with a comma and no spaces:

+ + +
<field_key>=<field_value>,<field_key>=<field_value>
+

In the example, the field set consists of one field: temperature=82. +Adding another field (humidity=71) to the example looks like this:

+ + +
weather,location=us-midwest temperature=82,humidity=71 1465839830100400200
+

Whitespace II

+

Separate the field set and the optional timestamp with a whitespace. +The whitespace is required in line protocol if you’re including a timestamp.

+

Timestamp

+

The timestamp for your data +point in nanosecond-precision Unix time. +The timestamp is optional in line protocol. +If you do not specify a timestamp for your data point InfluxDB uses the server’s +local nanosecond timestamp in UTC.

+

In the example, the timestamp is 1465839830100400200 (that’s +2016-06-13T17:43:50.1004002Z in RFC3339 format). +The line protocol below is the same data point but without the timestamp. +When InfluxDB writes it to the database it uses your server’s +local timestamp instead of 2016-06-13T17:43:50.1004002Z.

+ + +
weather,location=us-midwest temperature=82
+

Use the InfluxDB API to specify timestamps with a precision other than nanoseconds, +such as microseconds, milliseconds, or seconds. +We recommend using the coarsest precision possible as this can result in +significant improvements in compression. +See the API Reference for more information.

+ +
+

Setup Tip:

+

Use the Network Time Protocol (NTP) to synchronize time between hosts. +InfluxDB uses a host’s local time in UTC to assign timestamps to data; if +hosts’ clocks aren’t synchronized with NTP, the timestamps on the data written +to InfluxDB can be inaccurate.

+ +
+ +

Data types

+

This section covers the data types of line protocol’s major components: +measurements, +tag keys, +tag values, +field keys, +field values, and +timestamps.

+

Measurements, tag keys, tag values, and field keys are always strings.

+ +
+

Note: +Because InfluxDB stores tag values as strings, InfluxDB cannot perform math on +tag values. +In addition, InfluxQL functions +do not accept a tag value as a primary argument. +It’s a good idea to take into account that information when designing your +schema.

+ +
+

Timestamps are UNIX timestamps. +The minimum valid timestamp is -9223372036854775806 or 1677-09-21T00:12:43.145224194Z. +The maximum valid timestamp is 9223372036854775806 or 2262-04-11T23:47:16.854775806Z. +As mentioned above, by default, InfluxDB assumes that timestamps have +nanosecond precision. +See the API Reference for how to specify +alternative precisions.

+

Field values can be floats, integers, strings, or Booleans:

+
    +
  • +

    Floats - by default, InfluxDB assumes all numerical field values are floats.

    +

    Store the field value 82 as a float:

    + + +
    weather,location=us-midwest temperature=82 1465839830100400200
    +
  • +
  • +

    Integers - append an i to the field value to tell InfluxDB to store the +number as an integer.

    +

    Store the field value 82 as an integer:

    + + +
    weather,location=us-midwest temperature=82i 1465839830100400200
    +
  • +
  • +

    Strings - double quote string field values (more on quoting in line protocol +below).

    +

    Store the field value too warm as a string:

    + + +
    weather,location=us-midwest temperature="too warm" 1465839830100400200
    +
  • +
  • +

    Booleans - specify TRUE with t, T, true, True, or TRUE. Specify +FALSE with f, F, false, False, or FALSE.

    +

    Store the field value true as a Boolean:

    + + +
    weather,location=us-midwest too_hot=true 1465839830100400200
    + +
    +

    Note: Acceptable Boolean syntax differs for data writes and data +queries. See +Frequently Asked Questions +for more information.

    + +
    +
  • +
+

Within a measurement, a field’s type cannot differ within a +shard, but it can differ across +shards. For example, writing an integer to a field that previously accepted +floats fails if InfluxDB attempts to store the integer in the same shard as the +floats:

+ + +
> INSERT weather,location=us-midwest temperature=82 1465839830100400200
+> INSERT weather,location=us-midwest temperature=81i 1465839830100400300
+ERR: {"error":"field type conflict: input field \"temperature\" on measurement \"weather\" is type int64, already exists as type float"}
+

But, writing an integer to a field that previously accepted floats succeeds if +InfluxDB stores the integer in a new shard:

+ + +
INSERT weather,location=us-midwest temperature=82 1465839830100400200
+INSERT weather,location=us-midwest temperature=81i 1467154750000000000
+

See +Frequently Asked Questions +for how field value type discrepancies can affect SELECT * queries.

+

Quoting

+

This section covers when not to and when to double (") or single (') +quote in line protocol. +Moving from never quote to please do quote:

+
    +
  • +

    Never double or single quote the timestamp. +It’s not valid line protocol.

    +

    Example:

    + + +
    > INSERT weather,location=us-midwest temperature=82 "1465839830100400200"
    +ERR: {"error":"unable to parse 'weather,location=us-midwest temperature=82 \"1465839830100400200\"': bad timestamp"}
    +
  • +
  • +

    Never single quote field values (even if they’re strings!). +It’s also not valid line protocol.

    +

    Example:

    + + +
    > INSERT weather,location=us-midwest temperature='too warm'
    +ERR: {"error":"unable to parse 'weather,location=us-midwest temperature='too warm'': invalid boolean"}
    +
  • +
  • +

    Do not double or single quote measurement names, tag keys, tag values, and field +keys. +It is valid line protocol but InfluxDB assumes that the quotes are part of the +name.

    +

    Example:

    + + +
    > INSERT weather,location=us-midwest temperature=82 1465839830100400200
    +> INSERT "weather",location=us-midwest temperature=87 1465839830100400200
    +> SHOW MEASUREMENTS
    +name: measurements
    +------------------
    +name
    +"weather"
    +weather
    +

    To query data in "weather" you need to double quote the measurement name and +escape the measurement’s double quotes:

    + + +
    > SELECT * FROM "\"weather\""
    +name: "weather"
    +---------------
    +time				            location	 temperature
    +2016-06-13T17:43:50.1004002Z	us-midwest	 87
    +
  • +
  • +

    Do not double quote field values that are floats, integers, or Booleans. +InfluxDB will assume that those values are strings.

    +

    Example:

    + + +
    > INSERT weather,location=us-midwest temperature="82"
    +> SELECT * FROM weather WHERE temperature >= 70
    +>
    +
  • +
  • +

    Do double quote field values that are strings.

    +

    Example:

    + + +
    > INSERT weather,location=us-midwest temperature="too warm"
    +> SELECT * FROM weather
    +name: weather
    +-------------
    +time				            location	 temperature
    +2016-06-13T19:10:09.995766248Z	us-midwest	 too warm
    +
  • +
+

Special characters and keywords

+

Special characters

+

For tag keys, tag values, and field keys always use a backslash character \ +to escape:

+
    +
  • +

    commas ,

    + + +
    weather,location=us\,midwest temperature=82 1465839830100400200
    +
  • +
  • +

    equal signs =

    + + +
    weather,location=us-midwest temp\=rature=82 1465839830100400200
    +
  • +
  • +

    spaces

    + + +
    weather,location\ place=us-midwest temperature=82 1465839830100400200
    +
  • +
+

For measurements always use a backslash character \ to escape:

+
    +
  • +

    commas ,

    + + +
    wea\,ther,location=us-midwest temperature=82 1465839830100400200
    +
  • +
  • +

    spaces

    + + +
    wea\ ther,location=us-midwest temperature=82 1465839830100400200
    +
  • +
+

For string field values use a backslash character \ to escape:

+
    +
  • +

    double quotes "

    + + +
    weather,location=us-midwest temperature="too\"hot\"" 1465839830100400200
    +
  • +
+

line protocol does not require users to escape the backslash character \ but +will not complain if you do. For example, inserting the following:

+ + +
weather,location=us-midwest temperature_str="too hot/cold" 1465839830100400201
+weather,location=us-midwest temperature_str="too hot\cold" 1465839830100400202
+weather,location=us-midwest temperature_str="too hot\\cold" 1465839830100400203
+weather,location=us-midwest temperature_str="too hot\\\cold" 1465839830100400204
+weather,location=us-midwest temperature_str="too hot\\\\cold" 1465839830100400205
+weather,location=us-midwest temperature_str="too hot\\\\\cold" 1465839830100400206
+

Will be interpreted as follows (notice that a single and double backslash produce the same record):

+ + +
> SELECT * FROM "weather"
+name: weather
+time                location   temperature_str
+----                --------   ---------------
+1465839830100400201 us-midwest too hot/cold
+1465839830100400202 us-midwest too hot\cold
+1465839830100400203 us-midwest too hot\cold
+1465839830100400204 us-midwest too hot\\cold
+1465839830100400205 us-midwest too hot\\cold
+1465839830100400206 us-midwest too hot\\\cold
+

All other special characters also do not require escaping. +For example, line protocol handles emojis with no problem:

+ + +
> INSERT we⛅️ther,location=us-midwest temper🔥ture=82 1465839830100400200
+> SELECT * FROM "we⛅️ther"
+name: we⛅️ther
+------------------
+time			              location	   temper🔥ture
+1465839830100400200	 us-midwest	 82
+

Keywords

+

Line protocol accepts +InfluxQL keywords +as identifier names. +In general, we recommend avoiding using InfluxQL keywords in your schema as +it can cause +confusion when querying the data.

+

The keyword time is a special case. +time can be a +continuous query name, +database name, +measurement name, +retention policy name, +subscription name, and +user name. +In those cases, time does not require double quotes in queries. +time cannot be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error. +See Frequently Asked Questions for more information.

+

Writing data to InfluxDB

+

Getting data in the database

+

Now that you know all about the InfluxDB line protocol, how do you actually get the +line protocol to InfluxDB? +Here, we’ll give two quick examples and then point you to the +Tools sections for further +information.

+

InfluxDB API

+

Write data to InfluxDB using the InfluxDB API. +Send a POST request to the /write endpoint and provide your line protocol in +the request body:

+ + +
curl -i -XPOST "http://localhost:8086/write?db=science_is_cool" --data-binary 'weather,location=us-midwest temperature=82 1465839830100400200'
+

For in-depth descriptions of query string parameters, status codes, responses, +and more examples, see the API Reference.

+

CLI

+

Write data to InfluxDB using the InfluxDB command line interface (CLI). +Launch the CLI, use the relevant +database, and put INSERT in +front of your line protocol:

+ + +
INSERT weather,location=us-midwest temperature=82 1465839830100400200
+

You can also use the CLI to +import Line +Protocol from a file.

+

There are several ways to write data to InfluxDB. +See the Tools section for more +on the InfluxDB API, the +CLI, and the available Service Plugins ( +UDP, +Graphite, +CollectD, and +OpenTSDB).

+

Duplicate points

+

A point is uniquely identified by the measurement name, tag set, and timestamp. +If you submit line protocol with the same measurement, tag set, and timestamp, +but with a different field set, the field set becomes the union of the old +field set and the new field set, where any conflicts favor the new field set.

+

For a complete example of this behavior and how to avoid it, see +How does InfluxDB handle duplicate point?

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v2/install/upgrade/v1-to-v2/automatic-upgrade/index.html b/pr-preview/pr-6948/influxdb/v2/install/upgrade/v1-to-v2/automatic-upgrade/index.html new file mode 100644 index 000000000..95511b08d --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v2/install/upgrade/v1-to-v2/automatic-upgrade/index.html @@ -0,0 +1,5584 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Automatically upgrade from InfluxDB 1.x to <span class="current-version">2.8</span> | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Automatically upgrade from InfluxDB 1.x to 2.8

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Use the influxd upgrade command to upgrade InfluxDB 1.x to InfluxDB 2.8. +The influxd upgrade command is +part of the v2 influxd service and provides an in-place upgrade from +InfluxDB 1.x to InfluxDB 2.8.

+ +
+

To complete the upgrade process, ensure that you are using the +InfluxDB 2.8 influxd binary that includes the +influxd upgrade command.

+ +
+ +

The upgrade process does the following:

+
    +
  1. Reads the existing InfluxDB 1.x configuration file and generates an equivalent +InfluxDB 2.8 configuration file at ~/.influxdbv2/config.toml +or at a custom path specified with the --v2-config-path flag.
  2. +
  3. Upgrades metadata and storage engine paths to ~/.influxdbv2/meta and +~/.influxdbv2/engine, respectively (unless otherwise specified).
  4. +
  5. Writes existing data and write ahead log (WAL) files into InfluxDB +2.8 buckets.
  6. +
  7. Creates database and retention policy (DBRP) mappings +required to query data with InfluxQL.
  8. +
  9. Reads existing metadata and migrates non-admin users, passwords, and +permissions into a 1.x authorization–compatible store within ~/influxdbv2/influxdb.bolt.
  10. +
+

When starting InfluxDB 2.8 after running influxdb upgrade, +InfluxDB must build a new time series index (TSI). +Depending on the volume of data present, this may take some time.

+

Important considerations before you begin

+

Before upgrading to InfluxDB 2.8, consider the following guidelines. +Some or all might apply to your specific installation and use case. +The sections below contain our recommendations for addressing possible gaps in the upgrade process. +Consider whether you need to address any of the following before upgrading.

+ +

Available operating system, container, and platform support

+

InfluxDB 2.8 is currently available for macOS, Linux, and Windows.

+ +
+

InfluxDB 2.8 requires 64-bit operating systems.

+ +
+ +

Continuous queries

+

Continuous queries are replaced by tasks in InfluxDB 2.8. +By default, influxd upgrade writes all continuous queries to ~/continuous_queries.txt. +To convert continuous queries to InfluxDB tasks, see +Migrate continuous queries to tasks.

+

Supported protocols

+

InfluxDB 2.8 doesn’t directly support the alternate write protocols +supported in InfluxDB 1.x +(CollectD, Graphite, OpenTSDB, Prometheus, UDP). +Use Telegraf to translate these protocols to line protocol.

+

Kapacitor

+

You can continue to use Kapacitor with InfluxDB OSS 2.8 under the following scenarios:

+
    +
  • Kapacitor Batch-style TICKscripts work with the 1.x read compatible API. +Existing Kapacitor user credentials should continue to work using the 1.x compatibility API.
  • +
  • InfluxDB 2.8 has no subscriptions API and does not support Kapacitor stream tasks. +To continue using stream tasks, write data directly to both InfluxDB and Kapacitor. +Use Telegraf and its InfluxDB output plugin +to write to Kapacitor and the InfluxDB v2 output plugin +to write to InfluxDB v2.
  • +
+
Example Telegraf configuration
+ + +
# Write to Kapacitor
+[[outputs.influxdb]]
+  urls = ["http://localhost:9092"]
+  database = "example-db"
+  retention_policy = "example-rp"
+
+# Write to InfluxDB 2.8
+[[outputs.influxdb]]
+  urls = ["http://localhost:8086"]
+  database = "example-db"
+  retention_policy = "example-rp"
+  username = "v1-auth-username"
+  password = "v1-auth-password"
+

User migration

+

influxd upgrade migrates existing 1.x users and their permissions except the following users:

+ +
+ + + + +
+ +

+ Review 1.x user privileges +

+ +
+ + +
+ +

If using an admin user for visualization or Chronograf administrative functions, +create a new read-only user before upgrading:

+
Create a read-only 1.x user
+ + + +
CREATE USER <username> WITH PASSWORD '<password>'
+GRANT READ ON <database> TO "<username>"
+

InfluxDB 2.8 only grants admin privileges to the primary user +set up during the InfluxDB 2.8 upgrade. +This provides you the opportunity to reassess who to grant admin permissions to +when setting up InfluxDB 2.8.

+

Dashboards

+

You can continue to use your existing dashboards and visualization tools with +InfluxDB 2.8 via the 1.x /query compatibility API. +The upgrade process creates DBRP mappings +to ensure existing users can execute InfluxQL queries with the appropriate permissions.

+

However, if your dashboard tool is configured using a user with admin permissions, +you will need to create a new read-only user with the appropriate database permissions before upgrading. +This new username and password combination should be used within the data source +configurations to continue to provide read-only access to the underlying data.

+

Ensure your dashboards are all functioning before upgrading.

+

Other data

+

The 1.x _internal database is not migrated with the influxd upgrade command. +To collect, store, and monitor similar internal InfluxDB metrics, +create an InfluxDB 2.8 scraper +to scrape data from the /metrics endpoint and store them in a bucket.

+

Secure by default

+

InfluxDB 2.8 requires authentication and does not support +the InfluxDB 1.x auth-enabled = false configuration option.

+

Before upgrading to 2.8, enable authentication in your InfluxDB 1.x instance +and test your credentials to ensure your applications, agents, and visualization +tools can connect to InfluxDB.

+

If you upgrade with auth-enabled = false, the upgrade may appear complete, +but client requests to InfluxDB 2.8 may be silently ignored +(you won’t see a notification that the request was denied).

+

In-memory indexing option

+

InfluxDB 2.8 doesn’t support +in-memory (inmem) indexing. +The following InfluxDB 1.x configuration options associated with inmem +indexing are ignored in the upgrade process:

+
    +
  • max-series-per-database
  • +
  • max-values-per-tag
  • +
+

Interactive shell

+

The InfluxDB 2.8 influx CLI includes an interactive +InfluxQL shell for executing InfluxQL queries. +To start an InfluxQL shell:

+
    +
  1. Download and install the influx CLI.
  2. +
  3. Set up your influx CLI authentication credentials.
  4. +
  5. Run the influx v1 shell command.
  6. +
+

For more information see:

+ +

To build an interactive shell to execute Flux queries, +compile and build a command line Flux REPL from source.

+

Perform the upgrade

+

If you’ve considered the guidance above +and are ready to proceed, follow these steps to upgrade your InfluxDB 1.x to InfluxDB 2.8.

+
    +
  1. +

    Download InfluxDB OSS 2.8. +Unpackage the InfluxDB binaries and place them in your $PATH.

    +
  2. +
  3. +

    Stop your running InfluxDB 1.x instance. +Make a backup copy of all 1.x data before upgrading:

    + + + +
    cp -R .influxdb/ .influxdb_bak/
    +
  4. +
  5. +

    Use influxd version to ensure you are running InfluxDB 2.8 from the command line. +The influxd upgrade command is only available in InfluxDB 2.8.

    +
  6. +
  7. +

    If your 1.x configuration file is at the +default location, run:

    + + + +
    influxd upgrade
    + +
    +

    Upgrade .deb packages

    +

    When installed from a .deb package, InfluxDB 1.x and 2.x run under the influxdb user. +If you’ve installed both versions from .deb packages, run the upgrade command +as the influxdb user:

    + + + +
    sudo -u influxdb influxd upgrade
    + +
    + +

    If your 1.x configuration file is not at the default location, run:

    + + + +
    influxd upgrade --config-file <path to v1 config file>
    +

    To store the upgraded 2.8 configuration file in a custom location, include the --v2-config-path flag:

    + + + +
    influxd upgrade --v2-config-path <destination path for v2 config file>
    +
  8. +
  9. +

    Follow the prompts to set up a new InfluxDB 2.8 instance.

    + + +
    Welcome to InfluxDB 2.8 upgrade!
    +Please type your primary username: <your-username>
    +
    +Please type your password:
    +
    +Please type your password again:
    +
    +Please type your primary organization name: <your-org>
    +
    +Please type your primary bucket name: <your-bucket>
    +
    +Please type your retention period in hours.
    +Or press ENTER for infinite:
    +
    +You have entered:
    +  Username:          <your-username>
    +  Organization:      <your-org>
    +  Bucket:            <your-bucket>
    +  Retention Period:  infinite
    +Confirm? (y/n): y
    +
  10. +
+

The output of the upgrade prints to standard output. +It is also saved (for troubleshooting and debugging) in the current directory to +a file called upgrade.log located in the home directory of the user running +influxdb upgrade.

+

Post-upgrade

+

Verify 1.x users were migrated to 2.8

+

To verify 1.x users were successfully migrated to 2.8, run +influx v1 auth list.

+

Add authorizations for external clients

+

If your InfluxDB 1.x instance did not have authentication enabled and the +influx v1 auth list doesn’t return any users, external clients connected to +your 1.x instance will not be able to access InfluxDB 2.8, +which requires authentication.

+

For these external clients to work with InfluxDB 2.8:

+
    +
  1. Manually create a v1-compatible authorization.
  2. +
  3. Update the client configuration to use the username and password associated +with your v1-compatible authorization.
  4. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v2/query-data/influxql/explore-data/time-and-timezone/index.html b/pr-preview/pr-6948/influxdb/v2/query-data/influxql/explore-data/time-and-timezone/index.html new file mode 100644 index 000000000..4befcb84c --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v2/query-data/influxql/explore-data/time-and-timezone/index.html @@ -0,0 +1,5981 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Time and timezone queries | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Time and timezone queries

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL is designed for working with time series data and includes features specifically for working with time. +You can review the following ways to work with time and timestamps in your InfluxQL queries:

+ +

Configuring returned timestamps

+

The InfluxQL shell returns timestamps in +nanosecond UNIX epoch format by default. +Specify alternative formats with the +precision <format> command.

+

If you are using the InfluxQL shell, use the precision helper command precision rfc3339 to view results in human readable format.

+

The InfluxDB API returns timestamps +in RFC3339 format by default. +Specify alternative formats with the +epoch query string parameter.

+

Time syntax

+

For most SELECT statements, the default time range is between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC. +For SELECT statements with a GROUP BY time() clause, +the default time range is between 1677-09-21 00:12:43.145224194 UTC and now(). +The following sections detail how to specify alternative time ranges in the SELECT +statement’s WHERE clause.

+

Other supported features include:
+Absolute time
+Relative time

+

Absolute time

+

Specify absolute time with date-time strings and epoch time.

+

Syntax

+ + +
SELECT_clause FROM_clause WHERE time <operator> ['<rfc3339_date_time_string>' | '<rfc3339_like_date_time_string>' | <epoch_time>] [AND ['<rfc3339_date_time_string>' | '<rfc3339_like_date_time_string>' | <epoch_time>] [...]]
+

Supported operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorMeaning
=equal to
<>not equal to
!=not equal to
>greater than
>=greater than or equal to
<less than
<=less than or equal to
+

Currently, InfluxDB does not support using OR with absolute time in the WHERE +clause. See the Frequently Asked Questions +document and the GitHub Issue +for more information.

+

rfc3339_date_time_string

+ + +
'YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ'
+

.nnnnnnnnn is optional and is set to .000000000 if not included. +The RFC3339 date-time string requires single quotes.

+

rfc3339_like_date_time_string

+ + +
'YYYY-MM-DD HH:MM:SS.nnnnnnnnn'
+

HH:MM:SS.nnnnnnnnn.nnnnnnnnn is optional and is set to 00:00:00.000000000 if not included. +The RFC3339-like date-time string requires single quotes.

+

epoch_time

+

Epoch time is the amount of time that has elapsed since 00:00:00 +Coordinated Universal Time (UTC), Thursday, 1 January 1970.

+

By default, InfluxDB assumes that all epoch timestamps are in nanoseconds. Include a duration literal at the end of the epoch timestamp to indicate a precision other than nanoseconds.

+

Basic arithmetic

+

All timestamp formats support basic arithmetic. +Add (+) or subtract (-) a time from a timestamp with a duration literal. +Note that InfluxQL requires a whitespace between the + or - and the +duration literal.

+

Examples

+
+ + + + + +
+ +

+ Specify a time range with RFC3339 date-time strings +

+ +
+ + + + + +
+ +

+ Specify a time range with RFC3339-like date-time strings +

+ +
+ + + + + +
+ +

+ Specify a time range with epoch timestamps +

+ +
+ + + + + +
+ +

+ Specify a time range with second-precision epoch timestamps +

+ +
+ + + + + +
+ +

+ Perform basic arithmetic on an RFC3339-like date-time string +

+ +
+ + + + + +
+ +

+ Perform basic arithmetic on an epoch timestamp +

+ +
+ + + +
+ +

Relative time

+

Use now() to query data with timestamps relative to the server’s current timestamp.

+

Syntax

+ + +
SELECT_clause FROM_clause WHERE time <operator> now() [[ - | + ] <duration_literal>] [(AND|OR) now() [...]]
+

now() is the Unix time of the server at the time the query is executed on that server. +The whitespace between - or + and the duration literal is required.

+

Supported operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorMeaning
=equal to
<>not equal to
!=not equal to
>greater than
>=greater than or equal to
<less than
<=less than or equal to
+

duration_literal

+
    +
  • microseconds: u or µ
  • +
  • milliseconds: ms
  • +
  • secondss
  • +
  • minutesm
  • +
  • hours:h
  • +
  • days:d
  • +
  • weeks:w
  • +
+

Examples

+
+ + + + + +
+ +

+ Specify a time range with relative time +

+ +
+ + + + + +
+ +

+ Specify a time range with absolute time and relative time +

+ +
+ + + +
+ +

The Time Zone clause

+

Use the tz() clause to return the UTC offset for the specified timezone.

+

Syntax

+ + +
SELECT_clause FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause] tz('<time_zone>')
+

By default, InfluxDB stores and returns timestamps in UTC. +The tz() clause includes the UTC offset or, if applicable, the UTC Daylight Savings Time (DST) offset to the query’s returned timestamps. The returned timestamps must be in RFC3339 format for the UTC offset or UTC DST to appear. +The time_zone parameter follows the TZ syntax in the Internet Assigned Numbers Authority time zone database and it requires single quotes.

+

Examples

+
+ + + + + +
+ +

+ Return the UTC offset for Chicago’s time zone +

+ +
+ + + +
+ +

Common issues with time syntax

+

Using OR to select time multiple time intervals

+

InfluxDB does not support using the OR operator in the WHERE clause to specify multiple time intervals.

+

For more information, see Frequently asked questions.

+

Querying data that occur after now() with a GROUP BY time() clause

+

Most SELECT statements have a default time range between 1677-09-21 00:12:43.145224194 and 2262-04-11T23:47:16.854775806Z UTC. +For SELECT statements with a GROUP BY time() clause, +the default time range is between 1677-09-21 00:12:43.145224194 UTC and now().

+

To query data with timestamps that occur after now(), SELECT statements with +a GROUP BY time() clause must provide an alternative upper bound in the +WHERE clause.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v2/query-data/influxql/manage-data/index.html b/pr-preview/pr-6948/influxdb/v2/query-data/influxql/manage-data/index.html new file mode 100644 index 000000000..9eb95d638 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v2/query-data/influxql/manage-data/index.html @@ -0,0 +1,5393 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Manage your data using InfluxQL | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Manage your data using InfluxQL

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Use the following data management commands to write and delete data with InfluxQL:

+ +

Write data with INSERT

+

The INSERT statement writes line protocol +to a database and retention policy.

+

Syntax

+ + +
INSERT [INTO <database>[.<retention-policy>]] <line-protocol>
+
    +
  • The INTO clause is optional. +If the command does not include INTO, you must specify the +database with USE <database_name> when using the InfluxQL shell +or with the db query string parameter in the +InfluxDB 1.x compatibility API request.
  • +
+

Examples

+ +

Insert data into the a specific database and retention policy

+ + +
INSERT INTO mydb.myrp example-m,tag1=value1 field1=1i 1640995200000000000
+

Insert data into the a the default retention policy of a database

+ + +
INSERT INTO mydb example-m,tag1=value1 field1=1i 1640995200000000000
+

Insert data into the currently used database

+

The following example uses the InfluxQL shell.

+ + +
USE mydb
+INSERT example-m,tag1=value1 field1=1i 1640995200000000000
+

Delete series with DELETE

+

The DELETE statement deletes all points from a series in a database.

+

Syntax

+ + +
DELETE FROM <measurement_name> WHERE [<tag_key>='<tag_value>'] | [<time interval>]
+

You must include either the FROM clause, the WHERE clause, or both.

+ +
+
    +
  • DELETE supports regular expressions +in the FROM clause when specifying measurement names and in the WHERE clause +when specifying tag values.
  • +
  • DELETE does not support fields in the WHERE clause.
  • +
+ +
+ +

Examples

+ +

Delete all measurement data

+

Delete all data associated with the measurement h2o_feet:

+ + +
DELETE FROM "h2o_feet"
+

Delete data in a measurement that has a specific tag value

+

Delete all data associated with the measurement h2o_quality and where the tag randtag equals 3:

+ + +
DELETE FROM "h2o_quality" WHERE "randtag" = '3'
+

Delete data before or after specified time

+

Delete all data in the database that occur before January 01, 2020:

+ + +
DELETE WHERE time < '2020-01-01'
+

A successful DELETE query returns an empty result.

+

If you need to delete points in the future, you must specify the future time period because DELETE SERIES runs for time < now() by default.

+

Delete future points:

+ + +
DELETE FROM device_data WHERE "device" = 'sensor1" and time > now() and < '2024-01-14T01:00:00Z'
+

Delete points in the future within a specified time range:

+ + +
DELETE FROM device_data WHERE "device" = 'sensor15" and time >= '2024-01-01T12:00:00Z' and <= '2025-06-30T11:59:00Z'
+

Delete measurements with DROP MEASUREMENT

+

The DROP MEASUREMENT statement deletes all data and series from the specified measurement and deletes the measurement from the index.

+

Syntax

+ + +
DROP MEASUREMENT <measurement_name>
+

Example

+

Delete the measurement h2o_feet:

+ + +
DROP MEASUREMENT "h2o_feet"
+

A successful DROP MEASUREMENT query returns an empty result.

+ +
+

The DROP MEASUREMENT command is very resource intensive. We do not recommend this command for bulk data deletion. Use the DELETE FROM command instead, which is less resource intensive.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb/v2/reference/syntax/influxql/spec/index.html b/pr-preview/pr-6948/influxdb/v2/reference/syntax/influxql/spec/index.html new file mode 100644 index 000000000..63ff36d79 --- /dev/null +++ b/pr-preview/pr-6948/influxdb/v2/reference/syntax/influxql/spec/index.html @@ -0,0 +1,5947 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Influx Query Language (InfluxQL) 2.x specification | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Influx Query Language (InfluxQL) 2.x specification

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL is a SQL-like query language used to interact with InfluxDB and work with your times series data.

+

Find Influx Query Language (InfluxQL) definitions and details, including:

+ +

To learn more about InfluxQL, browse the following topics:

+ +

Notation

+

The syntax is specified using Extended Backus-Naur Form (“EBNF”). +EBNF is the same notation used in the Go programming language specification, +which can be found here.

+ + +
Production  = production_name "=" [ Expression ] "." .
+Expression  = Alternative { "|" Alternative } .
+Alternative = Term { Term } .
+Term        = production_name | token [ "…" token ] | Group | Option | Repetition .
+Group       = "(" Expression ")" .
+Option      = "[" Expression "]" .
+Repetition  = "{" Expression "}" .
+

Notation operators in order of increasing precedence:

+ + +
|   alternation
+()  grouping
+[]  option (0 or 1 times)
+{}  repetition (0 to n times)
+

Query representation

+

Characters

+

InfluxQL is Unicode text encoded in UTF-8.

+ + +
newline             = /* the Unicode code point U+000A */ .
+unicode_char        = /* an arbitrary Unicode code point except newline */ .
+

Letters and digits

+

Letters are the set of ASCII characters plus the underscore character _ (U+005F) is considered a letter.

+

Only decimal digits are supported.

+ + +
letter              = ascii_letter | "_" .
+ascii_letter        = "A" … "Z" | "a" … "z" .
+digit               = "0" … "9" .
+

Identifiers

+

Identifiers are tokens which refer to database names, retention policy names, user names, measurement names, tag keys, and field keys.

+

The rules:

+
    +
  • double quoted identifiers can contain any unicode character other than a new line
  • +
  • double quoted identifiers can contain escaped " characters (i.e., \")
  • +
  • double quoted identifiers can contain InfluxQL keywords
  • +
  • unquoted identifiers must start with an upper or lowercase ASCII character or “_”
  • +
  • unquoted identifiers may contain only ASCII letters, decimal digits, and “_”
  • +
+ + +
identifier          = unquoted_identifier | quoted_identifier .
+unquoted_identifier = ( letter ) { letter | digit } .
+quoted_identifier   = `"` unicode_char { unicode_char } `"` .
+

Examples

+ + +
cpu
+_cpu_stats
+"1h"
+"anything really"
+"1_Crazy-1337.identifier>NAME👍"
+

Keywords

+ + +
ALL           ALTER         ANY           AS            ASC           BEGIN
+BY            CREATE        CONTINUOUS    DATABASE      DATABASES     DEFAULT
+DELETE        DESC          DESTINATIONS  DIAGNOSTICS   DISTINCT      DROP
+DURATION      END           EVERY         EXPLAIN       FIELD         FOR
+FROM          GRANT         GRANTS        GROUP         GROUPS        IN
+INF           INSERT        INTO          KEY           KEYS          KILL
+LIMIT         SHOW          MEASUREMENT   MEASUREMENTS  NAME          OFFSET
+ON            ORDER         PASSWORD      POLICY        POLICIES      PRIVILEGES
+QUERIES       QUERY         READ          REPLICATION   RESAMPLE      RETENTION
+REVOKE        SELECT        SERIES        SET           SHARD         SHARDS
+SLIMIT        SOFFSET       STATS         SUBSCRIPTION  SUBSCRIPTIONS TAG
+TO            USER          USERS         VALUES        WHERE         WITH
+WRITE
+

If you use an InfluxQL keywords as an +identifier you will need to +double quote that identifier in every query.

+

The keyword time is a special case. +time can be a +database name, +measurement name, +retention policy name, +subscription name, and +user name. +In those cases, time does not require double quotes in queries. +time cannot be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error. +See Frequently Asked Questions for more information.

+

Literals

+

Integers

+

InfluxQL supports decimal integer literals. +Hexadecimal and octal literals are not currently supported.

+ + +
int_lit             = ( "1" … "9" ) { digit } .
+

Floats

+

InfluxQL supports floating-point literals. +Exponents are not currently supported.

+ + +
float_lit           = int_lit "." int_lit .
+

Strings

+

String literals must be surrounded by single quotes. +Strings may contain ' characters as long as they are escaped (i.e., \').

+ + +
string_lit          = `'` { unicode_char } `'` .
+

Durations

+

Duration literals specify a length of time. +An integer literal followed immediately (with no spaces) by a duration unit listed below is interpreted as a duration literal. +Durations can be specified with mixed units.

+
Duration units
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UnitsMeaning
nsnanoseconds (1 billionth of a second)
u or µmicroseconds (1 millionth of a second)
msmilliseconds (1 thousandth of a second)
ssecond
mminute
hhour
dday
wweek
+ + +
duration_lit        = int_lit duration_unit .
+duration_unit       = "ns" | "u" | "µ" | "ms" | "s" | "m" | "h" | "d" | "w" .
+

Dates & Times

+

The date and time literal format is not specified in EBNF like the rest of this document. +It is specified using Go’s date / time parsing format, which is a reference date written in the format required by InfluxQL. +The reference date time is:

+

InfluxQL reference date time: January 2nd, 2006 at 3:04:05 PM

+ + +
time_lit            = "2006-01-02 15:04:05.999999" | "2006-01-02" .
+

Booleans

+ + +
bool_lit            = TRUE | FALSE .
+

Regular Expressions

+ + +
regex_lit           = "/" { unicode_char } "/" .
+

Comparators: +=~ matches against +!~ doesn’t match against

+ +
+

NOTE: InfluxQL supports using regular expressions when specifying:

+ +

Currently, InfluxQL does not support using regular expressions to match non-string field values in the WHERE clause, databases, and retention polices.

+ +
+ +

Queries

+

A query is composed of one or more statements separated by a semicolon.

+ + +
query               = statement { ";" statement } .
+
+statement           = delete_stmt |
+                      drop_measurement_stmt |
+                      explain_stmt |
+                      explain_analyze_stmt |
+                      select_stmt |
+                      show_databases_stmt |
+                      show_field_key_cardinality_stmt |
+                      show_field_keys_stmt |
+                      show_measurement_exact_cardinality_stmt |
+                      show_measurements_stmt |
+                      show_series_exact_cardinality_stmt |
+                      show_series_stmt |
+                      show_tag_key_cardinality_stmt |
+                      show_tag_key_exact_cardinality_stmt |
+                      show_tag_keys_stmt |
+                      show_tag_values_with_key = stmt |
+                      show_tag_values_cardinality_stmt .
+

Statements

+

DELETE

+ + +
delete_stmt = "DELETE" ( from_clause | where_clause | from_clause where_clause ) .
+

Examples

+ + +
DELETE FROM "cpu"
+DELETE FROM "cpu" WHERE time < '2000-01-01T00:00:00Z'
+DELETE WHERE time < '2000-01-01T00:00:00Z'
+

DROP MEASUREMENT

+ + +
drop_measurement_stmt = "DROP MEASUREMENT" measurement .
+

Examples

+ + +
-- drop the cpu measurement
+DROP MEASUREMENT "cpu"
+

EXPLAIN

+

Parses and plans the query, and then prints a summary of estimated costs.

+

Many SQL engines use the EXPLAIN statement to show join order, join algorithms, and predicate and expression pushdown. +Since InfluxQL does not support joins, the cost of a InfluxQL query is typically a function of the total series accessed, the number of iterator accesses to a TSM file, and the number of TSM blocks that need to be scanned.

+

The elements of EXPLAIN query plan include:

+
    +
  • expression
  • +
  • auxiliary fields
  • +
  • number of shards
  • +
  • number of series
  • +
  • cached values
  • +
  • number of files
  • +
  • number of blocks
  • +
  • size of blocks
  • +
+ + +
explain_stmt = "EXPLAIN" select_stmt .
+

Example

+ + +
> explain select sum(pointReq) from "_internal"."monitor"."write" group by hostname;
+> QUERY PLAN
+------
+EXPRESSION: sum(pointReq::integer)
+NUMBER OF SHARDS: 2
+NUMBER OF SERIES: 2
+CACHED VALUES: 110
+NUMBER OF FILES: 1
+NUMBER OF BLOCKS: 1
+SIZE OF BLOCKS: 931
+

EXPLAIN ANALYZE

+

Executes the specified SELECT statement and returns data on the query performance and storage during runtime, visualized as a tree. Use this statement to analyze query performance and storage, including execution time and planning time, and the iterator type and cursor type.

+

For example, executing the following statement:

+ + +
explain analyze select mean(usage_steal) from cpu where time >= '2018-02-22T00:00:00Z' and time < '2018-02-22T12:00:00Z'
+

May produce an output similar to the following:

+ + +
EXPLAIN ANALYZE
+---------------
+.
+└── select
+    ├── execution_time: 2.25823ms
+    ├── planning_time: 18.381616ms
+    ├── total_time: 20.639846ms
+    └── field_iterators
+        ├── labels
+           └── statement: SELECT mean(usage_steal::float) FROM telegraf."default".cpu
+        └── expression
+            ├── labels
+               └── expr: mean(usage_steal::float)
+            └── create_iterator
+                ├── labels
+                   ├── measurement: cpu
+                   └── shard_id: 608
+                ├── cursors_ref: 779
+                ├── cursors_aux: 0
+                ├── cursors_cond: 0
+                ├── float_blocks_decoded: 431
+                ├── float_blocks_size_bytes: 1003552
+                ├── integer_blocks_decoded: 0
+                ├── integer_blocks_size_bytes: 0
+                ├── unsigned_blocks_decoded: 0
+                ├── unsigned_blocks_size_bytes: 0
+                ├── string_blocks_decoded: 0
+                ├── string_blocks_size_bytes: 0
+                ├── boolean_blocks_decoded: 0
+                ├── boolean_blocks_size_bytes: 0
+                └── planning_time: 14.805277ms```
+ +
+

Note: EXPLAIN ANALYZE ignores query output, so the cost of serialization to JSON or CSV is not accounted for.

+ +
+
execution_time
+

Shows the amount of time the query took to execute, including reading the time series data, performing operations as data flows through iterators, and draining processed data from iterators. Execution time doesn’t include the time taken to serialize the output into JSON or other formats.

+
planning_time
+

Shows the amount of time the query took to plan. +Planning a query in InfluxDB requires a number of steps. Depending on the complexity of the query, planning can require more work and consume more CPU and memory resources than the executing the query. For example, the number of series keys required to execute a query affects how quickly the query is planned and the required memory.

+

First, InfluxDB determines the effective time range of the query and selects the shards to access (in InfluxDB Enterprise, shards may be on remote nodes). +Next, for each shard and each measurement, InfluxDB performs the following steps:

+
    +
  1. Select matching series keys from the index, filtered by tag predicates in the WHERE clause.
  2. +
  3. Group filtered series keys into tag sets based on the GROUP BY dimensions.
  4. +
  5. Enumerate each tag set and create a cursor and iterator for each series key.
  6. +
  7. Merge iterators and return the merged result to the query executor.
  8. +
+
iterator type
+

EXPLAIN ANALYZE supports the following iterator types:

+
    +
  • create_iterator node represents work done by the local influxd instance──a complex composition of nested iterators combined and merged to produce the final query output.
  • +
  • (InfluxDB Enterprise only) remote_iterator node represents work done on remote machines.
  • +
+

For more information about iterators, see Understanding iterators.

+
cursor type
+

EXPLAIN ANALYZE distinguishes 3 cursor types. While the cursor types have the same data structures and equal CPU and I/O costs, each cursor type is constructed for a different reason and separated in the final output. Consider the following cursor types when tuning a statement:

+
    +
  • cursor_ref: Reference cursor created for SELECT projections that include a function, such as last() or mean().
  • +
  • cursor_aux: Auxiliary cursor created for simple expression projections (not selectors or an aggregation). For example, SELECT foo FROM m or SELECT foo+bar FROM m, where foo and bar are fields.
  • +
  • cursor_cond: Condition cursor created for fields referenced in a WHERE clause.
  • +
+

For more information about cursors, see Understanding cursors.

+
block types
+

EXPLAIN ANALYZE separates storage block types, and reports the total number of blocks decoded and their size (in bytes) on disk. The following block types are supported:

+

| float | 64-bit IEEE-754 floating-point number | +| integer | 64-bit signed integer | +| unsigned | 64-bit unsigned integer | +| boolean | 1-bit, LSB encoded | +| string | UTF-8 string |

+

For more information about storage blocks, see TSM files.

+

SELECT

+ + +
select_stmt = "SELECT" fields from_clause [ where_clause ]
+              [ group_by_clause ] [ order_by_clause ] [ limit_clause ]
+              [ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ timezone_clause ] .
+

Example

+

Select from measurements grouped by the day with a timezone

+ + +
SELECT mean("value") FROM "cpu" GROUP BY region, time(1d) fill(0) tz('America/Chicago')
+

SHOW CARDINALITY

+

Refers to the group of commands used to estimate or count exactly the cardinality of measurements, series, tag keys, tag key values, and field keys.

+

The SHOW CARDINALITY commands are available in two variations: estimated and exact. Estimated values are calculated using sketches and are a safe default for all cardinality sizes. Exact values are counts directly from TSM (Time-Structured Merge Tree) data, but are expensive to run for high cardinality data. Unless required, use the estimated variety.

+

Filtering by time is only supported when Time Series Index (TSI) is enabled on a database.

+

See the specific SHOW CARDINALITY commands for details:

+ +

SHOW DATABASES

+ + +
show_databases_stmt = "SHOW DATABASES" .
+

Example

+ + +
-- show all databases
+SHOW DATABASES
+

SHOW FIELD KEY CARDINALITY

+

Estimates or counts exactly the cardinality of the field key set for the current database unless a database is specified using the ON <database> option.

+ +
+

Note: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when Time Series Index (TSI) is enabled and time is not supported in the WHERE clause.

+ +
+ + +
show_field_key_cardinality_stmt = "SHOW FIELD KEY CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+
+show_field_key_exact_cardinality_stmt = "SHOW FIELD KEY EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+

Examples

+ + +
-- show estimated cardinality of the field key set of current database
+SHOW FIELD KEY CARDINALITY
+-- show exact cardinality on field key set of specified database
+SHOW FIELD KEY EXACT CARDINALITY ON mydb
+

SHOW FIELD KEYS

+ + +
show_field_keys_stmt = "SHOW FIELD KEYS" [on_clause] [ from_clause ] .
+

Examples

+ + +
-- show field keys and field value data types from all measurements
+SHOW FIELD KEYS
+
+-- show field keys and field value data types from specified measurement
+SHOW FIELD KEYS FROM "cpu"
+

SHOW MEASUREMENTS

+ + +
show_measurements_stmt = "SHOW MEASUREMENTS" [on_clause] [ with_measurement_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all measurements
+SHOW MEASUREMENTS
+
+-- show measurements where region tag = 'uswest' AND host tag = 'serverA'
+SHOW MEASUREMENTS WHERE "region" = 'uswest' AND "host" = 'serverA'
+
+-- show measurements that start with 'h2o'
+SHOW MEASUREMENTS WITH MEASUREMENT =~ /h2o.*/
+

SHOW SERIES

+ + +
show_series_stmt = "SHOW SERIES" [on_clause] [ from_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .
+

Example

+ + +
SHOW SERIES FROM "telegraf"."autogen"."cpu" WHERE cpu = 'cpu8'
+

SHOW SERIES EXACT CARDINALITY

+

Estimates or counts exactly the cardinality of the series for the current database unless a database is specified using the ON option.

+

Example

+

SHOW SERIES EXACT CARDINALITY" [ on_clause ] [ from_clause ] +[ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]

+ + +
SHOW SERIES EXACT CARDINALITY ON mydb
+
    +
  • +

    Series cardinality is the major factor that affects RAM requirements. For more information, see:

    +
  • +
  • +

    Don’t have too many series. As the number of unique series grows, so does the memory usage. High series cardinality can force the host operating system to kill the InfluxDB process with an out of memory (OOM) exception.

    +
  • +
+ +
+

NOTE: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is not supported in the WHERE clause.

+ +
+ +

SHOW TAG KEY CARDINALITY

+

Estimates or counts exactly the cardinality of tag key set on the current database unless a database is specified using the ON <database> option.

+ +
+

Note: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when TSI (Time Series Index) is enabled and time is not supported in the WHERE clause.

+ +
+ + +
show_tag_key_cardinality_stmt = "SHOW TAG KEY CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+
+show_tag_key_exact_cardinality_stmt = "SHOW TAG KEY EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
+

Examples

+ + +
-- show estimated tag key cardinality
+SHOW TAG KEY CARDINALITY
+-- show exact tag key cardinality
+SHOW TAG KEY EXACT CARDINALITY
+

SHOW TAG KEYS

+ + +
show_tag_keys_stmt = "SHOW TAG KEYS" [on_clause] [ from_clause ] [ where_clause ]
+                     [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag keys
+SHOW TAG KEYS
+
+-- show all tag keys from the cpu measurement
+SHOW TAG KEYS FROM "cpu"
+
+-- show all tag keys from the cpu measurement where the region key = 'uswest'
+SHOW TAG KEYS FROM "cpu" WHERE "region" = 'uswest'
+
+-- show all tag keys where the host key = 'serverA'
+SHOW TAG KEYS WHERE "host" = 'serverA'
+

SHOW TAG VALUES

+ + +
show_tag_values_stmt = "SHOW TAG VALUES" [on_clause] [ from_clause ] with_tag_clause [ where_clause ]
+                       [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag values across all measurements for the region tag
+SHOW TAG VALUES WITH KEY = "region"
+
+-- show tag values from the cpu measurement for the region tag
+SHOW TAG VALUES FROM "cpu" WITH KEY = "region"
+
+-- show tag values across all measurements for all tag keys that do not include the letter c
+SHOW TAG VALUES WITH KEY !~ /.*c.*/
+
+-- show tag values from the cpu measurement for region & host tag keys where service = 'redis'
+SHOW TAG VALUES FROM "cpu" WITH KEY IN ("region", "host") WHERE "service" = 'redis'
+

SHOW TAG VALUES CARDINALITY

+

Estimates or counts exactly the cardinality of tag key values for the specified tag key on the current database unless a database is specified using the ON <database> option.

+ +
+

Note: ON <database>, FROM <sources>, WITH KEY = <key>, WHERE <condition>, GROUP BY <dimensions>, and LIMIT/OFFSET clauses are optional. +When using these query clauses, the query falls back to an exact count. +Filtering by time is only supported when TSI (Time Series Index) is enabled.

+ +
+ + + +
show_tag_values_cardinality_stmt = "SHOW TAG VALUES CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ] with_key_clause
+
+show_tag_values_exact_cardinality_stmt = "SHOW TAG VALUES EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ] with_key_clause
+

Examples

+ + +
-- show estimated tag key values cardinality for a specified tag key
+SHOW TAG VALUES CARDINALITY WITH KEY = "myTagKey"
+-- show estimated tag key values cardinality for a specified tag key
+SHOW TAG VALUES CARDINALITY WITH KEY = "myTagKey"
+-- show exact tag key values cardinality for a specified tag key
+SHOW TAG VALUES EXACT CARDINALITY WITH KEY = "myTagKey"
+-- show exact tag key values cardinality for a specified tag key
+SHOW TAG VALUES EXACT CARDINALITY WITH KEY = "myTagKey"
+

Clauses

+ + +
from_clause     = "FROM" measurements .
+
+group_by_clause = "GROUP BY" dimensions fill(fill_option).
+
+limit_clause    = "LIMIT" int_lit .
+
+offset_clause   = "OFFSET" int_lit .
+
+slimit_clause   = "SLIMIT" int_lit .
+
+soffset_clause  = "SOFFSET" int_lit .
+
+timezone_clause = tz(string_lit) .
+
+on_clause       = "ON" db_name .
+
+order_by_clause = "ORDER BY" sort_fields .
+
+where_clause    = "WHERE" expr .
+
+with_measurement_clause = "WITH MEASUREMENT" ( "=" measurement | "=~" regex_lit ) .
+
+with_tag_clause = "WITH KEY" ( "=" tag_key | "!=" tag_key | "=~" regex_lit | "IN (" tag_keys ")"  ) .
+

Expressions

+ + +
binary_op        = "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | "AND" |
+                   "OR" | "=" | "!=" | "<>" | "<" | "<=" | ">" | ">=" .
+
+expr             = unary_expr { binary_op unary_expr } .
+
+unary_expr       = "(" expr ")" | var_ref | time_lit | string_lit | int_lit |
+                   float_lit | bool_lit | duration_lit | regex_lit .
+

Comments

+

Use comments with InfluxQL statements to describe your queries.

+
    +
  • A single line comment begins with two hyphens (--) and ends where InfluxDB detects a line break. +This comment type cannot span several lines.
  • +
  • A multi-line comment begins with /* and ends with */. This comment type can span several lines. +Multi-line comments do not support nested multi-line comments.
  • +
+

Other

+ + +
alias            = "AS" identifier .
+
+back_ref         = ( policy_name ".:MEASUREMENT" ) |
+                   ( db_name "." [ policy_name ] ".:MEASUREMENT" ) .
+
+db_name          = identifier .
+
+dimension        = expr .
+
+dimensions       = dimension { "," dimension } .
+
+field_key        = identifier .
+
+field            = expr [ alias ] .
+
+fields           = field { "," field } .
+
+fill_option      = "null" | "none" | "previous" | int_lit | float_lit | "linear" .
+
+host             = string_lit .
+
+measurement      = measurement_name |
+                   ( policy_name "." measurement_name ) |
+                   ( db_name "." [ policy_name ] "." measurement_name ) .
+
+measurements     = measurement { "," measurement } .
+
+measurement_name = identifier | regex_lit .
+
+policy_name      = identifier .
+
+retention_policy = identifier .
+
+retention_policy_name = "NAME" identifier .
+
+series_id        = int_lit .
+
+sort_field       = field_key [ ASC | DESC ] .
+
+sort_fields      = sort_field { "," sort_field } .
+
+tag_key          = identifier .
+
+tag_keys         = tag_key { "," tag_key } .
+
+var_ref          = measurement .
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb3/cloud-dedicated/reference/influxql/index.html b/pr-preview/pr-6948/influxdb3/cloud-dedicated/reference/influxql/index.html new file mode 100644 index 000000000..30eea0bf8 --- /dev/null +++ b/pr-preview/pr-6948/influxdb3/cloud-dedicated/reference/influxql/index.html @@ -0,0 +1,4305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxQL reference documentation | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxQL reference documentation

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL (Influx Query Language) is an SQL-like query language used to interact +with InfluxDB and work with times series data.

+ +
+ + +

InfluxQL feature support

+

InfluxQL is being rearchitected to work with the InfluxDB 3 storage engine. +This process is ongoing and some InfluxQL features are still being implemented. +For information about the current implementation status of InfluxQL features, +see InfluxQL feature support.

+
+ + +

Notation

+

The syntax is specified using Extended Backus-Naur Form (“EBNF”). +EBNF is the same notation used in the Go programming language specification.

+ + +
Production  = production_name "=" [ Expression ] "." .
+Expression  = Alternative { "|" Alternative } .
+Alternative = Term { Term } .
+Term        = production_name | token [ "…" token ] | Group | Option | Repetition .
+Group       = "(" Expression ")" .
+Option      = "[" Expression "]" .
+Repetition  = "{" Expression "}" .
+

Notation operators in order of increasing precedence:

+ + +
|   alternation
+()  grouping
+[]  option (0 or 1 times)
+{}  repetition (0 to n times)
+

Query representation

+

Characters

+

InfluxQL is Unicode text encoded in UTF-8.

+ + +
newline             = /* the Unicode code point U+000A */ .
+unicode_char        = /* an arbitrary Unicode code point except newline */ .
+

Letters and digits

+

Letters are the set of ASCII letters and the underscore (_, U+005F).

+

Only decimal digits are supported.

+ + +
letter              = ascii_letter | "_" .
+ascii_letter        = "A" … "Z" | "a" … "z" .
+digit               = "0" … "9" .
+

Identifiers

+

Identifiers are tokens that refer to +database names, +retention policy names, +measurement names, +tag keys, and +field keys.

+

The rules are as follows:

+
    +
  • Double-quoted identifiers can contain any Unicode character except for a new line.
  • +
  • Double-quoted identifiers can also contain escaped " characters (that is, \")
  • +
  • Double-quoted identifiers can include InfluxQL keywords.
  • +
  • Unquoted identifiers must start with an upper or lowercase ASCII character or “_”.
  • +
  • Unquoted identifiers may contain only ASCII letters, decimal digits, and “_”.
  • +
+ + +
identifier          = unquoted_identifier | quoted_identifier .
+unquoted_identifier = ( letter ) { letter | digit } .
+quoted_identifier   = `"` unicode_char { unicode_char } `"` .
+

Examples

+ + +
cpu
+_cpu_stats
+"1h"
+"anything really"
+"1_Crazy-1337.identifier>NAME👍"
+

Keywords

+ + +
ALL           ALTER         ANY           AS            ASC           BEGIN
+BY            CREATE        CONTINUOUS    DATABASE      DATABASES     DEFAULT
+DELETE        DESC          DESTINATIONS  DIAGNOSTICS   DISTINCT      DROP
+DURATION      END           EVERY         EXPLAIN       FIELD         FOR
+FROM          GRANT         GRANTS        GROUP         GROUPS        IN
+INF           INSERT        INTO          KEY           KEYS          KILL
+LIMIT         SHOW          MEASUREMENT   MEASUREMENTS  NAME          OFFSET
+ON            ORDER         PASSWORD      POLICY        POLICIES      PRIVILEGES
+QUERIES       QUERY         READ          REPLICATION   RESAMPLE      RETENTION
+REVOKE        SELECT        SERIES        SET           SHARD         SHARDS
+SLIMIT        SOFFSET       STATS         SUBSCRIPTION  SUBSCRIPTIONS TAG
+TO            USER          USERS         VALUES        WHERE         WITH
+WRITE
+

If you use an InfluxQL keyword as an +identifier, +double-quote the identifier in every query.

+

The time keyword is a special case. +time can be a +database name, +measurement name, +retention policy name, and +user name.

+

In those cases, you don’t need to double-quote time in queries.

+

time can’t be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error.

+ +

Literals

+

Integers

+

InfluxQL supports decimal integer literals. +Hexadecimal and octal literals aren’t currently supported.

+ + +
int_lit             = ( "1" … "9" ) { digit } .
+

Floats

+

InfluxQL supports floating-point literals. +Exponents aren’t currently supported.

+ + +
float_lit           = int_lit "." int_lit .
+

Strings

+

String literals must be surrounded by single quotes. +Strings may contain ' characters as long as they are escaped (that is, , \')

+ + +
string_lit          = `'` { unicode_char } `'` .
+

Durations

+

Duration literals specify a length of time. +An integer literal followed immediately (with no spaces) by one of the duration units listed below is interpreted as a duration literal. +Durations can be specified with mixed units.

+
Duration units
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UnitsMeaning
nsnanoseconds (1 billionth of a second)
u or µmicroseconds (1 millionth of a second)
msmilliseconds (1 thousandth of a second)
ssecond
mminute
hhour
dday
wweek
+ + +
duration_lit        = int_lit duration_unit .
+duration_unit       = "ns" | "u" | "µ" | "ms" | "s" | "m" | "h" | "d" | "w" .
+

Dates & Times

+

Unlike other notations used in InfluxQL, the date and time literal format isn’t specified by EBNF. +InfluxQL date and time is specified using Go’s time parsing format and +reference date written in the format required by InfluxQL. +The reference date time is:

+

InfluxQL reference date time: January 2nd, 2006 at 3:04:05 PM

+ + +
time_lit            = "2006-01-02 15:04:05.999999" | "2006-01-02" .
+

Booleans

+ + +
bool_lit            = TRUE | FALSE .
+

Regular Expressions

+ + +
regex_lit           = "/" { unicode_char } "/" .
+

Comparators: +=~ matches against +!~ doesn’t match against

+ +
+ + +

InfluxQL supports using regular expressions when specifying:

+ +

Currently, InfluxQL doesn’t support using regular expressions to match non-string +field values in the WHERE clause, databases, +and retention polices.

+
+

Queries

+

A query is composed of one or more statements separated by a semicolon (;).

+ + +
query               = statement { ";" statement } .
+
+statement           = explain_stmt |
+                      explain_analyze_stmt |
+                      select_stmt |
+                      show_field_keys_stmt |
+                      show_measurements_stmt |
+                      show_retention_policies_stmt |
+                      show_tag_keys_stmt |
+                      show_tag_values_with_key = stmt .
+ +

Statements

+

EXPLAIN

+

Parses and plans the query, and then prints a summary of estimated costs.

+

Many SQL engines use the EXPLAIN statement to show join order, join algorithms, and predicate and expression pushdown. +Since InfluxQL doesn’t support joins, the cost of an InfluxQL query is typically a function of the total series accessed, the number of iterator accesses to a TSM file, and the number of TSM blocks that need to be scanned.

+

A query plan generated by EXPLAIN contains the following elements:

+
    +
  • expression
  • +
  • auxiliary fields
  • +
  • number of shards
  • +
  • number of series
  • +
  • cached values
  • +
  • number of files
  • +
  • number of blocks
  • +
  • size of blocks
  • +
+ + +
explain_stmt = "EXPLAIN" select_stmt .
+

Example

+ + +
> explain select sum(pointReq) from "_internal"."monitor"."write" group by hostname;
+> QUERY PLAN
+------
+EXPRESSION: sum(pointReq::integer)
+NUMBER OF SHARDS: 2
+NUMBER OF SERIES: 2
+CACHED VALUES: 110
+NUMBER OF FILES: 1
+NUMBER OF BLOCKS: 1
+SIZE OF BLOCKS: 931
+

EXPLAIN ANALYZE

+

Executes the specified SELECT statement and returns data about the query performance and storage during runtime, visualized as a tree. Use this statement to analyze query performance and storage, including execution time and planning time, and the iterator type and cursor type.

+

For example, if you execute the following statement:

+ + +
explain analyze select mean(usage_steal) from cpu where time >= '2018-02-22T00:00:00Z' and time < '2018-02-22T12:00:00Z'
+

The output is similar to the following:

+ + +
EXPLAIN ANALYZE
+---------------
+.
+└── select
+    ├── execution_time: 2.25823ms
+    ├── planning_time: 18.381616ms
+    ├── total_time: 20.639846ms
+    └── field_iterators
+        ├── labels
+           └── statement: SELECT mean(usage_steal::float) FROM telegraf."default".cpu
+        └── expression
+            ├── labels
+               └── expr: mean(usage_steal::float)
+            └── create_iterator
+                ├── labels
+                   ├── measurement: cpu
+                   └── shard_id: 608
+                ├── cursors_ref: 779
+                ├── cursors_aux: 0
+                ├── cursors_cond: 0
+                ├── float_blocks_decoded: 431
+                ├── float_blocks_size_bytes: 1003552
+                ├── integer_blocks_decoded: 0
+                ├── integer_blocks_size_bytes: 0
+                ├── unsigned_blocks_decoded: 0
+                ├── unsigned_blocks_size_bytes: 0
+                ├── string_blocks_decoded: 0
+                ├── string_blocks_size_bytes: 0
+                ├── boolean_blocks_decoded: 0
+                ├── boolean_blocks_size_bytes: 0
+                └── planning_time: 14.805277ms```
+ +
+ + +

EXPLAIN ANALYZE ignores query output, so the cost of serialization to JSON or +CSV isn’t accounted for.

+
+
execution_time
+

Shows the amount of time the query took to execute, including reading the time series data, performing operations as data flows through iterators, and draining processed data from iterators. Execution time doesn’t include the time taken to serialize the output into JSON or other formats.

+
planning_time
+

Shows the amount of time the query took to plan. +Planning a query in InfluxDB requires a number of steps. Depending on the complexity of the query, planning can require more work and consume more CPU and memory resources than executing the query. For example, the number of series keys required to execute a query affects how quickly the query is planned and how much memory the planning requires.

+

First, InfluxDB determines the effective time range of the query and selects the shards to access. +Next, for each shard and each measurement, InfluxDB performs the following steps:

+
    +
  1. Select matching series keys from the index, filtered by tag predicates in the WHERE clause.
  2. +
  3. Group filtered series keys into tag sets based on the GROUP BY dimensions.
  4. +
  5. Enumerate each tag set and create a cursor and iterator for each series key.
  6. +
  7. Merge iterators and return the merged result to the query executor.
  8. +
+
iterator type
+

EXPLAIN ANALYZE supports the following iterator types:

+
    +
  • create_iterator node represents work done by the local influxd instance──a complex composition of nested iterators combined and merged to produce the final query output.
  • +
  • (InfluxDB Enterprise only) remote_iterator node represents work done on remote machines.
  • +
+

For more information about iterators, see Understanding iterators.

+
cursor type
+

EXPLAIN ANALYZE distinguishes 3 cursor types. While the cursor types have the same data structures and equal CPU and I/O costs, each cursor type is constructed for a different reason and separated in the final output. Consider the following cursor types when tuning a statement:

+
    +
  • cursor_ref: Reference cursor created for SELECT projections that include a function, such as last() or mean().
  • +
  • cursor_aux: Auxiliary cursor created for simple expression projections (not selectors or an aggregation). For example, SELECT foo FROM m or SELECT foo+bar FROM m, where foo and bar are fields.
  • +
  • cursor_cond: Condition cursor created for fields referenced in a WHERE clause.
  • +
+

For more information about cursors, see Understanding cursors.

+
block types
+

EXPLAIN ANALYZE separates storage block types, and reports the total number of +blocks decoded and their size (in bytes) on disk. The following block types are supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDescription
float64-bit IEEE-754 floating-point number
integer64-bit signed integer
unsigned64-bit unsigned integer
boolean1-bit, LSB encoded
stringUTF-8 string
+

SELECT

+ + +
select_stmt = "SELECT" fields from_clause [ where_clause ]
+              [ group_by_clause ] [ order_by_clause ] [ limit_clause ]
+              [ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ timezone_clause ] .
+

Example

+

Select from measurements grouped by the day with a timezone

+ + +
SELECT mean("value") FROM "cpu" GROUP BY region, time(1d) fill(0) tz('America/Chicago')
+ + + +

SHOW FIELD KEYS

+ + +
show_field_keys_stmt = "SHOW FIELD KEYS" [on_clause] [ from_clause ] .
+

Examples

+ + +
-- show field keys and field value data types from all measurements
+SHOW FIELD KEYS
+
+-- show field keys and field value data types from specified measurement
+SHOW FIELD KEYS FROM "cpu"
+

SHOW MEASUREMENTS

+ + +
show_measurements_stmt = "SHOW MEASUREMENTS" [on_clause] [ with_measurement_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all measurements
+SHOW MEASUREMENTS
+
+-- show measurements where region tag = 'uswest' AND host tag = 'serverA'
+SHOW MEASUREMENTS WHERE "region" = 'uswest' AND "host" = 'serverA'
+
+-- show measurements that start with 'h2o'
+SHOW MEASUREMENTS WITH MEASUREMENT =~ /h2o.*/
+ + + +

SHOW TAG KEYS

+ + +
show_tag_keys_stmt = "SHOW TAG KEYS" [on_clause] [ from_clause ] [ where_clause ]
+                     [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag keys
+SHOW TAG KEYS
+
+-- show all tag keys from the cpu measurement
+SHOW TAG KEYS FROM "cpu"
+
+-- show all tag keys from the cpu measurement where the region key = 'uswest'
+SHOW TAG KEYS FROM "cpu" WHERE "region" = 'uswest'
+
+-- show all tag keys where the host key = 'serverA'
+SHOW TAG KEYS WHERE "host" = 'serverA'
+

SHOW TAG VALUES

+ + +
show_tag_values_stmt = "SHOW TAG VALUES" [on_clause] [ from_clause ] with_tag_clause [ where_clause ]
+                       [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag values across all measurements for the region tag
+SHOW TAG VALUES WITH KEY = "region"
+
+-- show tag values from the cpu measurement for the region tag
+SHOW TAG VALUES FROM "cpu" WITH KEY = "region"
+
+-- show tag values across all measurements for all tag keys that do not include the letter c
+SHOW TAG VALUES WITH KEY !~ /.*c.*/
+
+-- show tag values from the cpu measurement for region & host tag keys where service = 'redis'
+SHOW TAG VALUES FROM "cpu" WITH KEY IN ("region", "host") WHERE "service" = 'redis'
+ +

Clauses

+ + +
from_clause     = "FROM" measurements .
+
+group_by_clause = "GROUP BY" dimensions fill(fill_option).
+
+limit_clause    = "LIMIT" int_lit .
+
+offset_clause   = "OFFSET" int_lit .
+
+slimit_clause   = "SLIMIT" int_lit .
+
+soffset_clause  = "SOFFSET" int_lit .
+
+timezone_clause = tz(string_lit) .
+
+on_clause       = "ON" db_name .
+
+order_by_clause = "ORDER BY" sort_fields .
+
+where_clause    = "WHERE" expr .
+
+with_measurement_clause = "WITH MEASUREMENT" ( "=" measurement | "=~" regex_lit ) .
+
+with_tag_clause = "WITH KEY" ( "=" tag_key | "!=" tag_key | "=~" regex_lit | "IN (" tag_keys ")"  ) .
+

Expressions

+ + +
binary_op        = "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | "AND" |
+                   "OR" | "=" | "!=" | "<>" | "<" | "<=" | ">" | ">=" .
+
+expr             = unary_expr { binary_op unary_expr } .
+
+unary_expr       = "(" expr ")" | var_ref | time_lit | string_lit | int_lit |
+                   float_lit | bool_lit | duration_lit | regex_lit .
+

Default time range

+

The default time range is the Unix epoch (1970-01-01T00:00:00Z) to now.

+

Comments

+

Use comments with InfluxQL statements to describe your queries.

+
    +
  • A single line comment begins with two hyphens (--) and ends where InfluxDB detects a line break. +This comment type cannot span several lines.
  • +
  • A multi-line comment begins with /* and ends with */. This comment type can span several lines. +Multi-line comments do not support nested multi-line comments.
  • +
+

Other

+ + +
alias            = "AS" identifier .
+
+back_ref         = ( policy_name ".:MEASUREMENT" ) |
+                   ( db_name "." [ policy_name ] ".:MEASUREMENT" ) .
+
+db_name          = identifier .
+
+dimension        = expr .
+
+dimensions       = dimension { "," dimension } .
+
+field_key        = identifier .
+
+field            = expr [ alias ] .
+
+fields           = field { "," field } .
+
+fill_option      = "null" | "none" | "previous" | int_lit | float_lit | "linear" .
+
+host             = string_lit .
+
+measurement      = measurement_name |
+                   ( policy_name "." measurement_name ) |
+                   ( db_name "." [ policy_name ] "." measurement_name ) .
+
+measurements     = measurement { "," measurement } .
+
+measurement_name = identifier | regex_lit .
+
+policy_name      = identifier .
+
+retention_policy = identifier .
+
+retention_policy_name = "NAME" identifier .
+
+series_id        = int_lit .
+
+sort_field       = field_key [ ASC | DESC ] .
+
+sort_fields      = sort_field { "," sort_field } .
+
+tag_key          = identifier .
+
+tag_keys         = tag_key { "," tag_key } .
+
+var_ref          = measurement .
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb3/cloud-serverless/reference/influxql/index.html b/pr-preview/pr-6948/influxdb3/cloud-serverless/reference/influxql/index.html new file mode 100644 index 000000000..461925302 --- /dev/null +++ b/pr-preview/pr-6948/influxdb3/cloud-serverless/reference/influxql/index.html @@ -0,0 +1,4669 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxQL reference documentation | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxQL reference documentation

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL (Influx Query Language) is an SQL-like query language used to interact +with InfluxDB and work with times series data.

+ +
+ + +

InfluxQL feature support

+

InfluxQL is being rearchitected to work with the InfluxDB 3 storage engine. +This process is ongoing and some InfluxQL features are still being implemented. +For information about the current implementation status of InfluxQL features, +see InfluxQL feature support.

+
+ + +

Notation

+

The syntax is specified using Extended Backus-Naur Form (“EBNF”). +EBNF is the same notation used in the Go programming language specification.

+ + +
Production  = production_name "=" [ Expression ] "." .
+Expression  = Alternative { "|" Alternative } .
+Alternative = Term { Term } .
+Term        = production_name | token [ "…" token ] | Group | Option | Repetition .
+Group       = "(" Expression ")" .
+Option      = "[" Expression "]" .
+Repetition  = "{" Expression "}" .
+

Notation operators in order of increasing precedence:

+ + +
|   alternation
+()  grouping
+[]  option (0 or 1 times)
+{}  repetition (0 to n times)
+

Query representation

+

Characters

+

InfluxQL is Unicode text encoded in UTF-8.

+ + +
newline             = /* the Unicode code point U+000A */ .
+unicode_char        = /* an arbitrary Unicode code point except newline */ .
+

Letters and digits

+

Letters are the set of ASCII letters and the underscore (_, U+005F).

+

Only decimal digits are supported.

+ + +
letter              = ascii_letter | "_" .
+ascii_letter        = "A" … "Z" | "a" … "z" .
+digit               = "0" … "9" .
+

Identifiers

+

Identifiers are tokens that refer to +database names, +retention policy names, +measurement names, +tag keys, and +field keys.

+

The rules are as follows:

+
    +
  • Double-quoted identifiers can contain any Unicode character except for a new line.
  • +
  • Double-quoted identifiers can also contain escaped " characters (that is, \")
  • +
  • Double-quoted identifiers can include InfluxQL keywords.
  • +
  • Unquoted identifiers must start with an upper or lowercase ASCII character or “_”.
  • +
  • Unquoted identifiers may contain only ASCII letters, decimal digits, and “_”.
  • +
+ + +
identifier          = unquoted_identifier | quoted_identifier .
+unquoted_identifier = ( letter ) { letter | digit } .
+quoted_identifier   = `"` unicode_char { unicode_char } `"` .
+

Examples

+ + +
cpu
+_cpu_stats
+"1h"
+"anything really"
+"1_Crazy-1337.identifier>NAME👍"
+

Keywords

+ + +
ALL           ALTER         ANY           AS            ASC           BEGIN
+BY            CREATE        CONTINUOUS    DATABASE      DATABASES     DEFAULT
+DELETE        DESC          DESTINATIONS  DIAGNOSTICS   DISTINCT      DROP
+DURATION      END           EVERY         EXPLAIN       FIELD         FOR
+FROM          GRANT         GRANTS        GROUP         GROUPS        IN
+INF           INSERT        INTO          KEY           KEYS          KILL
+LIMIT         SHOW          MEASUREMENT   MEASUREMENTS  NAME          OFFSET
+ON            ORDER         PASSWORD      POLICY        POLICIES      PRIVILEGES
+QUERIES       QUERY         READ          REPLICATION   RESAMPLE      RETENTION
+REVOKE        SELECT        SERIES        SET           SHARD         SHARDS
+SLIMIT        SOFFSET       STATS         SUBSCRIPTION  SUBSCRIPTIONS TAG
+TO            USER          USERS         VALUES        WHERE         WITH
+WRITE
+

If you use an InfluxQL keyword as an +identifier, +double-quote the identifier in every query.

+

The time keyword is a special case. +time can be a +database name, +measurement name, +retention policy name, and +user name.

+

In those cases, you don’t need to double-quote time in queries.

+

time can’t be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error.

+ +

Literals

+

Integers

+

InfluxQL supports decimal integer literals. +Hexadecimal and octal literals aren’t currently supported.

+ + +
int_lit             = ( "1" … "9" ) { digit } .
+

Floats

+

InfluxQL supports floating-point literals. +Exponents aren’t currently supported.

+ + +
float_lit           = int_lit "." int_lit .
+

Strings

+

String literals must be surrounded by single quotes. +Strings may contain ' characters as long as they are escaped (that is, , \')

+ + +
string_lit          = `'` { unicode_char } `'` .
+

Durations

+

Duration literals specify a length of time. +An integer literal followed immediately (with no spaces) by one of the duration units listed below is interpreted as a duration literal. +Durations can be specified with mixed units.

+
Duration units
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UnitsMeaning
nsnanoseconds (1 billionth of a second)
u or µmicroseconds (1 millionth of a second)
msmilliseconds (1 thousandth of a second)
ssecond
mminute
hhour
dday
wweek
+ + +
duration_lit        = int_lit duration_unit .
+duration_unit       = "ns" | "u" | "µ" | "ms" | "s" | "m" | "h" | "d" | "w" .
+

Dates & Times

+

Unlike other notations used in InfluxQL, the date and time literal format isn’t specified by EBNF. +InfluxQL date and time is specified using Go’s time parsing format and +reference date written in the format required by InfluxQL. +The reference date time is:

+

InfluxQL reference date time: January 2nd, 2006 at 3:04:05 PM

+ + +
time_lit            = "2006-01-02 15:04:05.999999" | "2006-01-02" .
+

Booleans

+ + +
bool_lit            = TRUE | FALSE .
+

Regular Expressions

+ + +
regex_lit           = "/" { unicode_char } "/" .
+

Comparators: +=~ matches against +!~ doesn’t match against

+ +
+ + +

InfluxQL supports using regular expressions when specifying:

+ +

Currently, InfluxQL doesn’t support using regular expressions to match non-string +field values in the WHERE clause, databases, +and retention polices.

+
+

Queries

+

A query is composed of one or more statements separated by a semicolon (;).

+ + +
query               = statement { ";" statement } .
+
+statement           = explain_stmt |
+                      explain_analyze_stmt |
+                      select_stmt |
+                      show_field_keys_stmt |
+                      show_measurements_stmt |
+                      show_retention_policies_stmt |
+                      show_tag_keys_stmt |
+                      show_tag_values_with_key = stmt .
+ +

Statements

+

EXPLAIN

+

Parses and plans the query, and then prints a summary of estimated costs.

+

Many SQL engines use the EXPLAIN statement to show join order, join algorithms, and predicate and expression pushdown. +Since InfluxQL doesn’t support joins, the cost of an InfluxQL query is typically a function of the total series accessed, the number of iterator accesses to a TSM file, and the number of TSM blocks that need to be scanned.

+

A query plan generated by EXPLAIN contains the following elements:

+
    +
  • expression
  • +
  • auxiliary fields
  • +
  • number of shards
  • +
  • number of series
  • +
  • cached values
  • +
  • number of files
  • +
  • number of blocks
  • +
  • size of blocks
  • +
+ + +
explain_stmt = "EXPLAIN" select_stmt .
+

Example

+ + +
> explain select sum(pointReq) from "_internal"."monitor"."write" group by hostname;
+> QUERY PLAN
+------
+EXPRESSION: sum(pointReq::integer)
+NUMBER OF SHARDS: 2
+NUMBER OF SERIES: 2
+CACHED VALUES: 110
+NUMBER OF FILES: 1
+NUMBER OF BLOCKS: 1
+SIZE OF BLOCKS: 931
+

EXPLAIN ANALYZE

+

Executes the specified SELECT statement and returns data about the query performance and storage during runtime, visualized as a tree. Use this statement to analyze query performance and storage, including execution time and planning time, and the iterator type and cursor type.

+

For example, if you execute the following statement:

+ + +
explain analyze select mean(usage_steal) from cpu where time >= '2018-02-22T00:00:00Z' and time < '2018-02-22T12:00:00Z'
+

The output is similar to the following:

+ + +
EXPLAIN ANALYZE
+---------------
+.
+└── select
+    ├── execution_time: 2.25823ms
+    ├── planning_time: 18.381616ms
+    ├── total_time: 20.639846ms
+    └── field_iterators
+        ├── labels
+           └── statement: SELECT mean(usage_steal::float) FROM telegraf."default".cpu
+        └── expression
+            ├── labels
+               └── expr: mean(usage_steal::float)
+            └── create_iterator
+                ├── labels
+                   ├── measurement: cpu
+                   └── shard_id: 608
+                ├── cursors_ref: 779
+                ├── cursors_aux: 0
+                ├── cursors_cond: 0
+                ├── float_blocks_decoded: 431
+                ├── float_blocks_size_bytes: 1003552
+                ├── integer_blocks_decoded: 0
+                ├── integer_blocks_size_bytes: 0
+                ├── unsigned_blocks_decoded: 0
+                ├── unsigned_blocks_size_bytes: 0
+                ├── string_blocks_decoded: 0
+                ├── string_blocks_size_bytes: 0
+                ├── boolean_blocks_decoded: 0
+                ├── boolean_blocks_size_bytes: 0
+                └── planning_time: 14.805277ms```
+ +
+ + +

EXPLAIN ANALYZE ignores query output, so the cost of serialization to JSON or +CSV isn’t accounted for.

+
+
execution_time
+

Shows the amount of time the query took to execute, including reading the time series data, performing operations as data flows through iterators, and draining processed data from iterators. Execution time doesn’t include the time taken to serialize the output into JSON or other formats.

+
planning_time
+

Shows the amount of time the query took to plan. +Planning a query in InfluxDB requires a number of steps. Depending on the complexity of the query, planning can require more work and consume more CPU and memory resources than executing the query. For example, the number of series keys required to execute a query affects how quickly the query is planned and how much memory the planning requires.

+

First, InfluxDB determines the effective time range of the query and selects the shards to access. +Next, for each shard and each measurement, InfluxDB performs the following steps:

+
    +
  1. Select matching series keys from the index, filtered by tag predicates in the WHERE clause.
  2. +
  3. Group filtered series keys into tag sets based on the GROUP BY dimensions.
  4. +
  5. Enumerate each tag set and create a cursor and iterator for each series key.
  6. +
  7. Merge iterators and return the merged result to the query executor.
  8. +
+
iterator type
+

EXPLAIN ANALYZE supports the following iterator types:

+
    +
  • create_iterator node represents work done by the local influxd instance──a complex composition of nested iterators combined and merged to produce the final query output.
  • +
  • (InfluxDB Enterprise only) remote_iterator node represents work done on remote machines.
  • +
+

For more information about iterators, see Understanding iterators.

+
cursor type
+

EXPLAIN ANALYZE distinguishes 3 cursor types. While the cursor types have the same data structures and equal CPU and I/O costs, each cursor type is constructed for a different reason and separated in the final output. Consider the following cursor types when tuning a statement:

+
    +
  • cursor_ref: Reference cursor created for SELECT projections that include a function, such as last() or mean().
  • +
  • cursor_aux: Auxiliary cursor created for simple expression projections (not selectors or an aggregation). For example, SELECT foo FROM m or SELECT foo+bar FROM m, where foo and bar are fields.
  • +
  • cursor_cond: Condition cursor created for fields referenced in a WHERE clause.
  • +
+

For more information about cursors, see Understanding cursors.

+
block types
+

EXPLAIN ANALYZE separates storage block types, and reports the total number of +blocks decoded and their size (in bytes) on disk. The following block types are supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDescription
float64-bit IEEE-754 floating-point number
integer64-bit signed integer
unsigned64-bit unsigned integer
boolean1-bit, LSB encoded
stringUTF-8 string
+

SELECT

+ + +
select_stmt = "SELECT" fields from_clause [ where_clause ]
+              [ group_by_clause ] [ order_by_clause ] [ limit_clause ]
+              [ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ timezone_clause ] .
+

Example

+

Select from measurements grouped by the day with a timezone

+ + +
SELECT mean("value") FROM "cpu" GROUP BY region, time(1d) fill(0) tz('America/Chicago')
+ + + +

SHOW FIELD KEYS

+ + +
show_field_keys_stmt = "SHOW FIELD KEYS" [on_clause] [ from_clause ] .
+

Examples

+ + +
-- show field keys and field value data types from all measurements
+SHOW FIELD KEYS
+
+-- show field keys and field value data types from specified measurement
+SHOW FIELD KEYS FROM "cpu"
+

SHOW MEASUREMENTS

+ + +
show_measurements_stmt = "SHOW MEASUREMENTS" [on_clause] [ with_measurement_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all measurements
+SHOW MEASUREMENTS
+
+-- show measurements where region tag = 'uswest' AND host tag = 'serverA'
+SHOW MEASUREMENTS WHERE "region" = 'uswest' AND "host" = 'serverA'
+
+-- show measurements that start with 'h2o'
+SHOW MEASUREMENTS WITH MEASUREMENT =~ /h2o.*/
+ + + +

SHOW TAG KEYS

+ + +
show_tag_keys_stmt = "SHOW TAG KEYS" [on_clause] [ from_clause ] [ where_clause ]
+                     [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag keys
+SHOW TAG KEYS
+
+-- show all tag keys from the cpu measurement
+SHOW TAG KEYS FROM "cpu"
+
+-- show all tag keys from the cpu measurement where the region key = 'uswest'
+SHOW TAG KEYS FROM "cpu" WHERE "region" = 'uswest'
+
+-- show all tag keys where the host key = 'serverA'
+SHOW TAG KEYS WHERE "host" = 'serverA'
+

SHOW TAG VALUES

+ + +
show_tag_values_stmt = "SHOW TAG VALUES" [on_clause] [ from_clause ] with_tag_clause [ where_clause ]
+                       [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag values across all measurements for the region tag
+SHOW TAG VALUES WITH KEY = "region"
+
+-- show tag values from the cpu measurement for the region tag
+SHOW TAG VALUES FROM "cpu" WITH KEY = "region"
+
+-- show tag values across all measurements for all tag keys that do not include the letter c
+SHOW TAG VALUES WITH KEY !~ /.*c.*/
+
+-- show tag values from the cpu measurement for region & host tag keys where service = 'redis'
+SHOW TAG VALUES FROM "cpu" WITH KEY IN ("region", "host") WHERE "service" = 'redis'
+ +

Clauses

+ + +
from_clause     = "FROM" measurements .
+
+group_by_clause = "GROUP BY" dimensions fill(fill_option).
+
+limit_clause    = "LIMIT" int_lit .
+
+offset_clause   = "OFFSET" int_lit .
+
+slimit_clause   = "SLIMIT" int_lit .
+
+soffset_clause  = "SOFFSET" int_lit .
+
+timezone_clause = tz(string_lit) .
+
+on_clause       = "ON" db_name .
+
+order_by_clause = "ORDER BY" sort_fields .
+
+where_clause    = "WHERE" expr .
+
+with_measurement_clause = "WITH MEASUREMENT" ( "=" measurement | "=~" regex_lit ) .
+
+with_tag_clause = "WITH KEY" ( "=" tag_key | "!=" tag_key | "=~" regex_lit | "IN (" tag_keys ")"  ) .
+

Expressions

+ + +
binary_op        = "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | "AND" |
+                   "OR" | "=" | "!=" | "<>" | "<" | "<=" | ">" | ">=" .
+
+expr             = unary_expr { binary_op unary_expr } .
+
+unary_expr       = "(" expr ")" | var_ref | time_lit | string_lit | int_lit |
+                   float_lit | bool_lit | duration_lit | regex_lit .
+

Default time range

+

The default time range is the Unix epoch (1970-01-01T00:00:00Z) to now.

+

Comments

+

Use comments with InfluxQL statements to describe your queries.

+
    +
  • A single line comment begins with two hyphens (--) and ends where InfluxDB detects a line break. +This comment type cannot span several lines.
  • +
  • A multi-line comment begins with /* and ends with */. This comment type can span several lines. +Multi-line comments do not support nested multi-line comments.
  • +
+

Other

+ + +
alias            = "AS" identifier .
+
+back_ref         = ( policy_name ".:MEASUREMENT" ) |
+                   ( db_name "." [ policy_name ] ".:MEASUREMENT" ) .
+
+db_name          = identifier .
+
+dimension        = expr .
+
+dimensions       = dimension { "," dimension } .
+
+field_key        = identifier .
+
+field            = expr [ alias ] .
+
+fields           = field { "," field } .
+
+fill_option      = "null" | "none" | "previous" | int_lit | float_lit | "linear" .
+
+host             = string_lit .
+
+measurement      = measurement_name |
+                   ( policy_name "." measurement_name ) |
+                   ( db_name "." [ policy_name ] "." measurement_name ) .
+
+measurements     = measurement { "," measurement } .
+
+measurement_name = identifier | regex_lit .
+
+policy_name      = identifier .
+
+retention_policy = identifier .
+
+retention_policy_name = "NAME" identifier .
+
+series_id        = int_lit .
+
+sort_field       = field_key [ ASC | DESC ] .
+
+sort_fields      = sort_field { "," sort_field } .
+
+tag_key          = identifier .
+
+tag_keys         = tag_key { "," tag_key } .
+
+var_ref          = measurement .
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb3/clustered/reference/influxql/index.html b/pr-preview/pr-6948/influxdb3/clustered/reference/influxql/index.html new file mode 100644 index 000000000..442d506b6 --- /dev/null +++ b/pr-preview/pr-6948/influxdb3/clustered/reference/influxql/index.html @@ -0,0 +1,4441 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxQL reference documentation | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxQL reference documentation

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL (Influx Query Language) is an SQL-like query language used to interact +with InfluxDB and work with times series data.

+ +
+ + +

InfluxQL feature support

+

InfluxQL is being rearchitected to work with the InfluxDB 3 storage engine. +This process is ongoing and some InfluxQL features are still being implemented. +For information about the current implementation status of InfluxQL features, +see InfluxQL feature support.

+
+ + +

Notation

+

The syntax is specified using Extended Backus-Naur Form (“EBNF”). +EBNF is the same notation used in the Go programming language specification.

+ + +
Production  = production_name "=" [ Expression ] "." .
+Expression  = Alternative { "|" Alternative } .
+Alternative = Term { Term } .
+Term        = production_name | token [ "…" token ] | Group | Option | Repetition .
+Group       = "(" Expression ")" .
+Option      = "[" Expression "]" .
+Repetition  = "{" Expression "}" .
+

Notation operators in order of increasing precedence:

+ + +
|   alternation
+()  grouping
+[]  option (0 or 1 times)
+{}  repetition (0 to n times)
+

Query representation

+

Characters

+

InfluxQL is Unicode text encoded in UTF-8.

+ + +
newline             = /* the Unicode code point U+000A */ .
+unicode_char        = /* an arbitrary Unicode code point except newline */ .
+

Letters and digits

+

Letters are the set of ASCII letters and the underscore (_, U+005F).

+

Only decimal digits are supported.

+ + +
letter              = ascii_letter | "_" .
+ascii_letter        = "A" … "Z" | "a" … "z" .
+digit               = "0" … "9" .
+

Identifiers

+

Identifiers are tokens that refer to +database names, +retention policy names, +measurement names, +tag keys, and +field keys.

+

The rules are as follows:

+
    +
  • Double-quoted identifiers can contain any Unicode character except for a new line.
  • +
  • Double-quoted identifiers can also contain escaped " characters (that is, \")
  • +
  • Double-quoted identifiers can include InfluxQL keywords.
  • +
  • Unquoted identifiers must start with an upper or lowercase ASCII character or “_”.
  • +
  • Unquoted identifiers may contain only ASCII letters, decimal digits, and “_”.
  • +
+ + +
identifier          = unquoted_identifier | quoted_identifier .
+unquoted_identifier = ( letter ) { letter | digit } .
+quoted_identifier   = `"` unicode_char { unicode_char } `"` .
+

Examples

+ + +
cpu
+_cpu_stats
+"1h"
+"anything really"
+"1_Crazy-1337.identifier>NAME👍"
+

Keywords

+ + +
ALL           ALTER         ANY           AS            ASC           BEGIN
+BY            CREATE        CONTINUOUS    DATABASE      DATABASES     DEFAULT
+DELETE        DESC          DESTINATIONS  DIAGNOSTICS   DISTINCT      DROP
+DURATION      END           EVERY         EXPLAIN       FIELD         FOR
+FROM          GRANT         GRANTS        GROUP         GROUPS        IN
+INF           INSERT        INTO          KEY           KEYS          KILL
+LIMIT         SHOW          MEASUREMENT   MEASUREMENTS  NAME          OFFSET
+ON            ORDER         PASSWORD      POLICY        POLICIES      PRIVILEGES
+QUERIES       QUERY         READ          REPLICATION   RESAMPLE      RETENTION
+REVOKE        SELECT        SERIES        SET           SHARD         SHARDS
+SLIMIT        SOFFSET       STATS         SUBSCRIPTION  SUBSCRIPTIONS TAG
+TO            USER          USERS         VALUES        WHERE         WITH
+WRITE
+

If you use an InfluxQL keyword as an +identifier, +double-quote the identifier in every query.

+

The time keyword is a special case. +time can be a +database name, +measurement name, +retention policy name, and +user name.

+

In those cases, you don’t need to double-quote time in queries.

+

time can’t be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error.

+ +

Literals

+

Integers

+

InfluxQL supports decimal integer literals. +Hexadecimal and octal literals aren’t currently supported.

+ + +
int_lit             = ( "1" … "9" ) { digit } .
+

Floats

+

InfluxQL supports floating-point literals. +Exponents aren’t currently supported.

+ + +
float_lit           = int_lit "." int_lit .
+

Strings

+

String literals must be surrounded by single quotes. +Strings may contain ' characters as long as they are escaped (that is, , \')

+ + +
string_lit          = `'` { unicode_char } `'` .
+

Durations

+

Duration literals specify a length of time. +An integer literal followed immediately (with no spaces) by one of the duration units listed below is interpreted as a duration literal. +Durations can be specified with mixed units.

+
Duration units
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UnitsMeaning
nsnanoseconds (1 billionth of a second)
u or µmicroseconds (1 millionth of a second)
msmilliseconds (1 thousandth of a second)
ssecond
mminute
hhour
dday
wweek
+ + +
duration_lit        = int_lit duration_unit .
+duration_unit       = "ns" | "u" | "µ" | "ms" | "s" | "m" | "h" | "d" | "w" .
+

Dates & Times

+

Unlike other notations used in InfluxQL, the date and time literal format isn’t specified by EBNF. +InfluxQL date and time is specified using Go’s time parsing format and +reference date written in the format required by InfluxQL. +The reference date time is:

+

InfluxQL reference date time: January 2nd, 2006 at 3:04:05 PM

+ + +
time_lit            = "2006-01-02 15:04:05.999999" | "2006-01-02" .
+

Booleans

+ + +
bool_lit            = TRUE | FALSE .
+

Regular Expressions

+ + +
regex_lit           = "/" { unicode_char } "/" .
+

Comparators: +=~ matches against +!~ doesn’t match against

+ +
+ + +

InfluxQL supports using regular expressions when specifying:

+ +

Currently, InfluxQL doesn’t support using regular expressions to match non-string +field values in the WHERE clause, databases, +and retention polices.

+
+

Queries

+

A query is composed of one or more statements separated by a semicolon (;).

+ + +
query               = statement { ";" statement } .
+
+statement           = explain_stmt |
+                      explain_analyze_stmt |
+                      select_stmt |
+                      show_field_keys_stmt |
+                      show_measurements_stmt |
+                      show_retention_policies_stmt |
+                      show_tag_keys_stmt |
+                      show_tag_values_with_key = stmt .
+ +

Statements

+

EXPLAIN

+

Parses and plans the query, and then prints a summary of estimated costs.

+

Many SQL engines use the EXPLAIN statement to show join order, join algorithms, and predicate and expression pushdown. +Since InfluxQL doesn’t support joins, the cost of an InfluxQL query is typically a function of the total series accessed, the number of iterator accesses to a TSM file, and the number of TSM blocks that need to be scanned.

+

A query plan generated by EXPLAIN contains the following elements:

+
    +
  • expression
  • +
  • auxiliary fields
  • +
  • number of shards
  • +
  • number of series
  • +
  • cached values
  • +
  • number of files
  • +
  • number of blocks
  • +
  • size of blocks
  • +
+ + +
explain_stmt = "EXPLAIN" select_stmt .
+

Example

+ + +
> explain select sum(pointReq) from "_internal"."monitor"."write" group by hostname;
+> QUERY PLAN
+------
+EXPRESSION: sum(pointReq::integer)
+NUMBER OF SHARDS: 2
+NUMBER OF SERIES: 2
+CACHED VALUES: 110
+NUMBER OF FILES: 1
+NUMBER OF BLOCKS: 1
+SIZE OF BLOCKS: 931
+

EXPLAIN ANALYZE

+

Executes the specified SELECT statement and returns data about the query performance and storage during runtime, visualized as a tree. Use this statement to analyze query performance and storage, including execution time and planning time, and the iterator type and cursor type.

+

For example, if you execute the following statement:

+ + +
explain analyze select mean(usage_steal) from cpu where time >= '2018-02-22T00:00:00Z' and time < '2018-02-22T12:00:00Z'
+

The output is similar to the following:

+ + +
EXPLAIN ANALYZE
+---------------
+.
+└── select
+    ├── execution_time: 2.25823ms
+    ├── planning_time: 18.381616ms
+    ├── total_time: 20.639846ms
+    └── field_iterators
+        ├── labels
+           └── statement: SELECT mean(usage_steal::float) FROM telegraf."default".cpu
+        └── expression
+            ├── labels
+               └── expr: mean(usage_steal::float)
+            └── create_iterator
+                ├── labels
+                   ├── measurement: cpu
+                   └── shard_id: 608
+                ├── cursors_ref: 779
+                ├── cursors_aux: 0
+                ├── cursors_cond: 0
+                ├── float_blocks_decoded: 431
+                ├── float_blocks_size_bytes: 1003552
+                ├── integer_blocks_decoded: 0
+                ├── integer_blocks_size_bytes: 0
+                ├── unsigned_blocks_decoded: 0
+                ├── unsigned_blocks_size_bytes: 0
+                ├── string_blocks_decoded: 0
+                ├── string_blocks_size_bytes: 0
+                ├── boolean_blocks_decoded: 0
+                ├── boolean_blocks_size_bytes: 0
+                └── planning_time: 14.805277ms```
+ +
+ + +

EXPLAIN ANALYZE ignores query output, so the cost of serialization to JSON or +CSV isn’t accounted for.

+
+
execution_time
+

Shows the amount of time the query took to execute, including reading the time series data, performing operations as data flows through iterators, and draining processed data from iterators. Execution time doesn’t include the time taken to serialize the output into JSON or other formats.

+
planning_time
+

Shows the amount of time the query took to plan. +Planning a query in InfluxDB requires a number of steps. Depending on the complexity of the query, planning can require more work and consume more CPU and memory resources than executing the query. For example, the number of series keys required to execute a query affects how quickly the query is planned and how much memory the planning requires.

+

First, InfluxDB determines the effective time range of the query and selects the shards to access. +Next, for each shard and each measurement, InfluxDB performs the following steps:

+
    +
  1. Select matching series keys from the index, filtered by tag predicates in the WHERE clause.
  2. +
  3. Group filtered series keys into tag sets based on the GROUP BY dimensions.
  4. +
  5. Enumerate each tag set and create a cursor and iterator for each series key.
  6. +
  7. Merge iterators and return the merged result to the query executor.
  8. +
+
iterator type
+

EXPLAIN ANALYZE supports the following iterator types:

+
    +
  • create_iterator node represents work done by the local influxd instance──a complex composition of nested iterators combined and merged to produce the final query output.
  • +
  • (InfluxDB Enterprise only) remote_iterator node represents work done on remote machines.
  • +
+

For more information about iterators, see Understanding iterators.

+
cursor type
+

EXPLAIN ANALYZE distinguishes 3 cursor types. While the cursor types have the same data structures and equal CPU and I/O costs, each cursor type is constructed for a different reason and separated in the final output. Consider the following cursor types when tuning a statement:

+
    +
  • cursor_ref: Reference cursor created for SELECT projections that include a function, such as last() or mean().
  • +
  • cursor_aux: Auxiliary cursor created for simple expression projections (not selectors or an aggregation). For example, SELECT foo FROM m or SELECT foo+bar FROM m, where foo and bar are fields.
  • +
  • cursor_cond: Condition cursor created for fields referenced in a WHERE clause.
  • +
+

For more information about cursors, see Understanding cursors.

+
block types
+

EXPLAIN ANALYZE separates storage block types, and reports the total number of +blocks decoded and their size (in bytes) on disk. The following block types are supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDescription
float64-bit IEEE-754 floating-point number
integer64-bit signed integer
unsigned64-bit unsigned integer
boolean1-bit, LSB encoded
stringUTF-8 string
+

SELECT

+ + +
select_stmt = "SELECT" fields from_clause [ where_clause ]
+              [ group_by_clause ] [ order_by_clause ] [ limit_clause ]
+              [ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ timezone_clause ] .
+

Example

+

Select from measurements grouped by the day with a timezone

+ + +
SELECT mean("value") FROM "cpu" GROUP BY region, time(1d) fill(0) tz('America/Chicago')
+ + + +

SHOW FIELD KEYS

+ + +
show_field_keys_stmt = "SHOW FIELD KEYS" [on_clause] [ from_clause ] .
+

Examples

+ + +
-- show field keys and field value data types from all measurements
+SHOW FIELD KEYS
+
+-- show field keys and field value data types from specified measurement
+SHOW FIELD KEYS FROM "cpu"
+

SHOW MEASUREMENTS

+ + +
show_measurements_stmt = "SHOW MEASUREMENTS" [on_clause] [ with_measurement_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all measurements
+SHOW MEASUREMENTS
+
+-- show measurements where region tag = 'uswest' AND host tag = 'serverA'
+SHOW MEASUREMENTS WHERE "region" = 'uswest' AND "host" = 'serverA'
+
+-- show measurements that start with 'h2o'
+SHOW MEASUREMENTS WITH MEASUREMENT =~ /h2o.*/
+ + + +

SHOW TAG KEYS

+ + +
show_tag_keys_stmt = "SHOW TAG KEYS" [on_clause] [ from_clause ] [ where_clause ]
+                     [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag keys
+SHOW TAG KEYS
+
+-- show all tag keys from the cpu measurement
+SHOW TAG KEYS FROM "cpu"
+
+-- show all tag keys from the cpu measurement where the region key = 'uswest'
+SHOW TAG KEYS FROM "cpu" WHERE "region" = 'uswest'
+
+-- show all tag keys where the host key = 'serverA'
+SHOW TAG KEYS WHERE "host" = 'serverA'
+

SHOW TAG VALUES

+ + +
show_tag_values_stmt = "SHOW TAG VALUES" [on_clause] [ from_clause ] with_tag_clause [ where_clause ]
+                       [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag values across all measurements for the region tag
+SHOW TAG VALUES WITH KEY = "region"
+
+-- show tag values from the cpu measurement for the region tag
+SHOW TAG VALUES FROM "cpu" WITH KEY = "region"
+
+-- show tag values across all measurements for all tag keys that do not include the letter c
+SHOW TAG VALUES WITH KEY !~ /.*c.*/
+
+-- show tag values from the cpu measurement for region & host tag keys where service = 'redis'
+SHOW TAG VALUES FROM "cpu" WITH KEY IN ("region", "host") WHERE "service" = 'redis'
+ +

Clauses

+ + +
from_clause     = "FROM" measurements .
+
+group_by_clause = "GROUP BY" dimensions fill(fill_option).
+
+limit_clause    = "LIMIT" int_lit .
+
+offset_clause   = "OFFSET" int_lit .
+
+slimit_clause   = "SLIMIT" int_lit .
+
+soffset_clause  = "SOFFSET" int_lit .
+
+timezone_clause = tz(string_lit) .
+
+on_clause       = "ON" db_name .
+
+order_by_clause = "ORDER BY" sort_fields .
+
+where_clause    = "WHERE" expr .
+
+with_measurement_clause = "WITH MEASUREMENT" ( "=" measurement | "=~" regex_lit ) .
+
+with_tag_clause = "WITH KEY" ( "=" tag_key | "!=" tag_key | "=~" regex_lit | "IN (" tag_keys ")"  ) .
+

Expressions

+ + +
binary_op        = "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | "AND" |
+                   "OR" | "=" | "!=" | "<>" | "<" | "<=" | ">" | ">=" .
+
+expr             = unary_expr { binary_op unary_expr } .
+
+unary_expr       = "(" expr ")" | var_ref | time_lit | string_lit | int_lit |
+                   float_lit | bool_lit | duration_lit | regex_lit .
+

Default time range

+

The default time range is the Unix epoch (1970-01-01T00:00:00Z) to now.

+

Comments

+

Use comments with InfluxQL statements to describe your queries.

+
    +
  • A single line comment begins with two hyphens (--) and ends where InfluxDB detects a line break. +This comment type cannot span several lines.
  • +
  • A multi-line comment begins with /* and ends with */. This comment type can span several lines. +Multi-line comments do not support nested multi-line comments.
  • +
+

Other

+ + +
alias            = "AS" identifier .
+
+back_ref         = ( policy_name ".:MEASUREMENT" ) |
+                   ( db_name "." [ policy_name ] ".:MEASUREMENT" ) .
+
+db_name          = identifier .
+
+dimension        = expr .
+
+dimensions       = dimension { "," dimension } .
+
+field_key        = identifier .
+
+field            = expr [ alias ] .
+
+fields           = field { "," field } .
+
+fill_option      = "null" | "none" | "previous" | int_lit | float_lit | "linear" .
+
+host             = string_lit .
+
+measurement      = measurement_name |
+                   ( policy_name "." measurement_name ) |
+                   ( db_name "." [ policy_name ] "." measurement_name ) .
+
+measurements     = measurement { "," measurement } .
+
+measurement_name = identifier | regex_lit .
+
+policy_name      = identifier .
+
+retention_policy = identifier .
+
+retention_policy_name = "NAME" identifier .
+
+series_id        = int_lit .
+
+sort_field       = field_key [ ASC | DESC ] .
+
+sort_fields      = sort_field { "," sort_field } .
+
+tag_key          = identifier .
+
+tag_keys         = tag_key { "," tag_key } .
+
+var_ref          = measurement .
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb3/core/reference/influxql/index.html b/pr-preview/pr-6948/influxdb3/core/reference/influxql/index.html new file mode 100644 index 000000000..7c8699dd6 --- /dev/null +++ b/pr-preview/pr-6948/influxdb3/core/reference/influxql/index.html @@ -0,0 +1,4129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxQL reference documentation | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxQL reference documentation

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL (Influx Query Language) is an SQL-like query language used to interact +with InfluxDB and work with times series data.

+ +
+ + +

InfluxQL feature support

+

InfluxQL is being rearchitected to work with the InfluxDB 3 storage engine. +This process is ongoing and some InfluxQL features are still being implemented. +For information about the current implementation status of InfluxQL features, +see InfluxQL feature support.

+
+ + +

Notation

+

The syntax is specified using Extended Backus-Naur Form (“EBNF”). +EBNF is the same notation used in the Go programming language specification.

+ + +
Production  = production_name "=" [ Expression ] "." .
+Expression  = Alternative { "|" Alternative } .
+Alternative = Term { Term } .
+Term        = production_name | token [ "…" token ] | Group | Option | Repetition .
+Group       = "(" Expression ")" .
+Option      = "[" Expression "]" .
+Repetition  = "{" Expression "}" .
+

Notation operators in order of increasing precedence:

+ + +
|   alternation
+()  grouping
+[]  option (0 or 1 times)
+{}  repetition (0 to n times)
+

Query representation

+

Characters

+

InfluxQL is Unicode text encoded in UTF-8.

+ + +
newline             = /* the Unicode code point U+000A */ .
+unicode_char        = /* an arbitrary Unicode code point except newline */ .
+

Letters and digits

+

Letters are the set of ASCII letters and the underscore (_, U+005F).

+

Only decimal digits are supported.

+ + +
letter              = ascii_letter | "_" .
+ascii_letter        = "A" … "Z" | "a" … "z" .
+digit               = "0" … "9" .
+

Identifiers

+

Identifiers are tokens that refer to +database names, +retention policy names, +measurement names, +tag keys, and +field keys.

+

The rules are as follows:

+
    +
  • Double-quoted identifiers can contain any Unicode character except for a new line.
  • +
  • Double-quoted identifiers can also contain escaped " characters (that is, \")
  • +
  • Double-quoted identifiers can include InfluxQL keywords.
  • +
  • Unquoted identifiers must start with an upper or lowercase ASCII character or “_”.
  • +
  • Unquoted identifiers may contain only ASCII letters, decimal digits, and “_”.
  • +
+ + +
identifier          = unquoted_identifier | quoted_identifier .
+unquoted_identifier = ( letter ) { letter | digit } .
+quoted_identifier   = `"` unicode_char { unicode_char } `"` .
+

Examples

+ + +
cpu
+_cpu_stats
+"1h"
+"anything really"
+"1_Crazy-1337.identifier>NAME👍"
+

Keywords

+ + +
ALL           ALTER         ANY           AS            ASC           BEGIN
+BY            CREATE        CONTINUOUS    DATABASE      DATABASES     DEFAULT
+DELETE        DESC          DESTINATIONS  DIAGNOSTICS   DISTINCT      DROP
+DURATION      END           EVERY         EXPLAIN       FIELD         FOR
+FROM          GRANT         GRANTS        GROUP         GROUPS        IN
+INF           INSERT        INTO          KEY           KEYS          KILL
+LIMIT         SHOW          MEASUREMENT   MEASUREMENTS  NAME          OFFSET
+ON            ORDER         PASSWORD      POLICY        POLICIES      PRIVILEGES
+QUERIES       QUERY         READ          REPLICATION   RESAMPLE      RETENTION
+REVOKE        SELECT        SERIES        SET           SHARD         SHARDS
+SLIMIT        SOFFSET       STATS         SUBSCRIPTION  SUBSCRIPTIONS TAG
+TO            USER          USERS         VALUES        WHERE         WITH
+WRITE
+

If you use an InfluxQL keyword as an +identifier, +double-quote the identifier in every query.

+

The time keyword is a special case. +time can be a +database name, +measurement name, +retention policy name, and +user name.

+

In those cases, you don’t need to double-quote time in queries.

+

time can’t be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error.

+ +

Literals

+

Integers

+

InfluxQL supports decimal integer literals. +Hexadecimal and octal literals aren’t currently supported.

+ + +
int_lit             = ( "1" … "9" ) { digit } .
+

Floats

+

InfluxQL supports floating-point literals. +Exponents aren’t currently supported.

+ + +
float_lit           = int_lit "." int_lit .
+

Strings

+

String literals must be surrounded by single quotes. +Strings may contain ' characters as long as they are escaped (that is, , \')

+ + +
string_lit          = `'` { unicode_char } `'` .
+

Durations

+

Duration literals specify a length of time. +An integer literal followed immediately (with no spaces) by one of the duration units listed below is interpreted as a duration literal. +Durations can be specified with mixed units.

+
Duration units
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UnitsMeaning
nsnanoseconds (1 billionth of a second)
u or µmicroseconds (1 millionth of a second)
msmilliseconds (1 thousandth of a second)
ssecond
mminute
hhour
dday
wweek
+ + +
duration_lit        = int_lit duration_unit .
+duration_unit       = "ns" | "u" | "µ" | "ms" | "s" | "m" | "h" | "d" | "w" .
+

Dates & Times

+

Unlike other notations used in InfluxQL, the date and time literal format isn’t specified by EBNF. +InfluxQL date and time is specified using Go’s time parsing format and +reference date written in the format required by InfluxQL. +The reference date time is:

+

InfluxQL reference date time: January 2nd, 2006 at 3:04:05 PM

+ + +
time_lit            = "2006-01-02 15:04:05.999999" | "2006-01-02" .
+

Booleans

+ + +
bool_lit            = TRUE | FALSE .
+

Regular Expressions

+ + +
regex_lit           = "/" { unicode_char } "/" .
+

Comparators: +=~ matches against +!~ doesn’t match against

+ +
+ + +

InfluxQL supports using regular expressions when specifying:

+ +

Currently, InfluxQL doesn’t support using regular expressions to match non-string +field values in the WHERE clause, databases, +and retention polices.

+
+

Queries

+

A query is composed of one or more statements separated by a semicolon (;).

+ + +
query               = statement { ";" statement } .
+
+statement           = explain_stmt |
+                      explain_analyze_stmt |
+                      select_stmt |
+                      show_field_keys_stmt |
+                      show_measurements_stmt |
+                      show_retention_policies_stmt |
+                      show_tag_keys_stmt |
+                      show_tag_values_with_key = stmt .
+ +

Statements

+

EXPLAIN

+

Parses and plans the query, and then prints a summary of estimated costs.

+

Many SQL engines use the EXPLAIN statement to show join order, join algorithms, and predicate and expression pushdown. +Since InfluxQL doesn’t support joins, the cost of an InfluxQL query is typically a function of the total series accessed, the number of iterator accesses to a TSM file, and the number of TSM blocks that need to be scanned.

+

A query plan generated by EXPLAIN contains the following elements:

+
    +
  • expression
  • +
  • auxiliary fields
  • +
  • number of shards
  • +
  • number of series
  • +
  • cached values
  • +
  • number of files
  • +
  • number of blocks
  • +
  • size of blocks
  • +
+ + +
explain_stmt = "EXPLAIN" select_stmt .
+

Example

+ + +
> explain select sum(pointReq) from "_internal"."monitor"."write" group by hostname;
+> QUERY PLAN
+------
+EXPRESSION: sum(pointReq::integer)
+NUMBER OF SHARDS: 2
+NUMBER OF SERIES: 2
+CACHED VALUES: 110
+NUMBER OF FILES: 1
+NUMBER OF BLOCKS: 1
+SIZE OF BLOCKS: 931
+

EXPLAIN ANALYZE

+

Executes the specified SELECT statement and returns data about the query performance and storage during runtime, visualized as a tree. Use this statement to analyze query performance and storage, including execution time and planning time, and the iterator type and cursor type.

+

For example, if you execute the following statement:

+ + +
explain analyze select mean(usage_steal) from cpu where time >= '2018-02-22T00:00:00Z' and time < '2018-02-22T12:00:00Z'
+

The output is similar to the following:

+ + +
EXPLAIN ANALYZE
+---------------
+.
+└── select
+    ├── execution_time: 2.25823ms
+    ├── planning_time: 18.381616ms
+    ├── total_time: 20.639846ms
+    └── field_iterators
+        ├── labels
+           └── statement: SELECT mean(usage_steal::float) FROM telegraf."default".cpu
+        └── expression
+            ├── labels
+               └── expr: mean(usage_steal::float)
+            └── create_iterator
+                ├── labels
+                   ├── measurement: cpu
+                   └── shard_id: 608
+                ├── cursors_ref: 779
+                ├── cursors_aux: 0
+                ├── cursors_cond: 0
+                ├── float_blocks_decoded: 431
+                ├── float_blocks_size_bytes: 1003552
+                ├── integer_blocks_decoded: 0
+                ├── integer_blocks_size_bytes: 0
+                ├── unsigned_blocks_decoded: 0
+                ├── unsigned_blocks_size_bytes: 0
+                ├── string_blocks_decoded: 0
+                ├── string_blocks_size_bytes: 0
+                ├── boolean_blocks_decoded: 0
+                ├── boolean_blocks_size_bytes: 0
+                └── planning_time: 14.805277ms```
+ +
+ + +

EXPLAIN ANALYZE ignores query output, so the cost of serialization to JSON or +CSV isn’t accounted for.

+
+
execution_time
+

Shows the amount of time the query took to execute, including reading the time series data, performing operations as data flows through iterators, and draining processed data from iterators. Execution time doesn’t include the time taken to serialize the output into JSON or other formats.

+
planning_time
+

Shows the amount of time the query took to plan. +Planning a query in InfluxDB requires a number of steps. Depending on the complexity of the query, planning can require more work and consume more CPU and memory resources than executing the query. For example, the number of series keys required to execute a query affects how quickly the query is planned and how much memory the planning requires.

+

First, InfluxDB determines the effective time range of the query and selects the shards to access. +Next, for each shard and each measurement, InfluxDB performs the following steps:

+
    +
  1. Select matching series keys from the index, filtered by tag predicates in the WHERE clause.
  2. +
  3. Group filtered series keys into tag sets based on the GROUP BY dimensions.
  4. +
  5. Enumerate each tag set and create a cursor and iterator for each series key.
  6. +
  7. Merge iterators and return the merged result to the query executor.
  8. +
+
iterator type
+

EXPLAIN ANALYZE supports the following iterator types:

+
    +
  • create_iterator node represents work done by the local influxd instance──a complex composition of nested iterators combined and merged to produce the final query output.
  • +
  • (InfluxDB Enterprise only) remote_iterator node represents work done on remote machines.
  • +
+

For more information about iterators, see Understanding iterators.

+
cursor type
+

EXPLAIN ANALYZE distinguishes 3 cursor types. While the cursor types have the same data structures and equal CPU and I/O costs, each cursor type is constructed for a different reason and separated in the final output. Consider the following cursor types when tuning a statement:

+
    +
  • cursor_ref: Reference cursor created for SELECT projections that include a function, such as last() or mean().
  • +
  • cursor_aux: Auxiliary cursor created for simple expression projections (not selectors or an aggregation). For example, SELECT foo FROM m or SELECT foo+bar FROM m, where foo and bar are fields.
  • +
  • cursor_cond: Condition cursor created for fields referenced in a WHERE clause.
  • +
+

For more information about cursors, see Understanding cursors.

+
block types
+

EXPLAIN ANALYZE separates storage block types, and reports the total number of +blocks decoded and their size (in bytes) on disk. The following block types are supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDescription
float64-bit IEEE-754 floating-point number
integer64-bit signed integer
unsigned64-bit unsigned integer
boolean1-bit, LSB encoded
stringUTF-8 string
+

SELECT

+ + +
select_stmt = "SELECT" fields from_clause [ where_clause ]
+              [ group_by_clause ] [ order_by_clause ] [ limit_clause ]
+              [ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ timezone_clause ] .
+

Example

+

Select from measurements grouped by the day with a timezone

+ + +
SELECT mean("value") FROM "cpu" GROUP BY region, time(1d) fill(0) tz('America/Chicago')
+ + + +

SHOW FIELD KEYS

+ + +
show_field_keys_stmt = "SHOW FIELD KEYS" [on_clause] [ from_clause ] .
+

Examples

+ + +
-- show field keys and field value data types from all measurements
+SHOW FIELD KEYS
+
+-- show field keys and field value data types from specified measurement
+SHOW FIELD KEYS FROM "cpu"
+

SHOW MEASUREMENTS

+ + +
show_measurements_stmt = "SHOW MEASUREMENTS" [on_clause] [ with_measurement_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all measurements
+SHOW MEASUREMENTS
+
+-- show measurements where region tag = 'uswest' AND host tag = 'serverA'
+SHOW MEASUREMENTS WHERE "region" = 'uswest' AND "host" = 'serverA'
+
+-- show measurements that start with 'h2o'
+SHOW MEASUREMENTS WITH MEASUREMENT =~ /h2o.*/
+ + + +

SHOW TAG KEYS

+ + +
show_tag_keys_stmt = "SHOW TAG KEYS" [on_clause] [ from_clause ] [ where_clause ]
+                     [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag keys
+SHOW TAG KEYS
+
+-- show all tag keys from the cpu measurement
+SHOW TAG KEYS FROM "cpu"
+
+-- show all tag keys from the cpu measurement where the region key = 'uswest'
+SHOW TAG KEYS FROM "cpu" WHERE "region" = 'uswest'
+
+-- show all tag keys where the host key = 'serverA'
+SHOW TAG KEYS WHERE "host" = 'serverA'
+

SHOW TAG VALUES

+ + +
show_tag_values_stmt = "SHOW TAG VALUES" [on_clause] [ from_clause ] with_tag_clause [ where_clause ]
+                       [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag values across all measurements for the region tag
+SHOW TAG VALUES WITH KEY = "region"
+
+-- show tag values from the cpu measurement for the region tag
+SHOW TAG VALUES FROM "cpu" WITH KEY = "region"
+
+-- show tag values across all measurements for all tag keys that do not include the letter c
+SHOW TAG VALUES WITH KEY !~ /.*c.*/
+
+-- show tag values from the cpu measurement for region & host tag keys where service = 'redis'
+SHOW TAG VALUES FROM "cpu" WITH KEY IN ("region", "host") WHERE "service" = 'redis'
+ +

Clauses

+ + +
from_clause     = "FROM" measurements .
+
+group_by_clause = "GROUP BY" dimensions fill(fill_option).
+
+limit_clause    = "LIMIT" int_lit .
+
+offset_clause   = "OFFSET" int_lit .
+
+slimit_clause   = "SLIMIT" int_lit .
+
+soffset_clause  = "SOFFSET" int_lit .
+
+timezone_clause = tz(string_lit) .
+
+on_clause       = "ON" db_name .
+
+order_by_clause = "ORDER BY" sort_fields .
+
+where_clause    = "WHERE" expr .
+
+with_measurement_clause = "WITH MEASUREMENT" ( "=" measurement | "=~" regex_lit ) .
+
+with_tag_clause = "WITH KEY" ( "=" tag_key | "!=" tag_key | "=~" regex_lit | "IN (" tag_keys ")"  ) .
+

Expressions

+ + +
binary_op        = "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | "AND" |
+                   "OR" | "=" | "!=" | "<>" | "<" | "<=" | ">" | ">=" .
+
+expr             = unary_expr { binary_op unary_expr } .
+
+unary_expr       = "(" expr ")" | var_ref | time_lit | string_lit | int_lit |
+                   float_lit | bool_lit | duration_lit | regex_lit .
+

Default time range

+

The default time range is the Unix epoch (1970-01-01T00:00:00Z) to now.

+

Comments

+

Use comments with InfluxQL statements to describe your queries.

+
    +
  • A single line comment begins with two hyphens (--) and ends where InfluxDB detects a line break. +This comment type cannot span several lines.
  • +
  • A multi-line comment begins with /* and ends with */. This comment type can span several lines. +Multi-line comments do not support nested multi-line comments.
  • +
+

Other

+ + +
alias            = "AS" identifier .
+
+back_ref         = ( policy_name ".:MEASUREMENT" ) |
+                   ( db_name "." [ policy_name ] ".:MEASUREMENT" ) .
+
+db_name          = identifier .
+
+dimension        = expr .
+
+dimensions       = dimension { "," dimension } .
+
+field_key        = identifier .
+
+field            = expr [ alias ] .
+
+fields           = field { "," field } .
+
+fill_option      = "null" | "none" | "previous" | int_lit | float_lit | "linear" .
+
+host             = string_lit .
+
+measurement      = measurement_name |
+                   ( policy_name "." measurement_name ) |
+                   ( db_name "." [ policy_name ] "." measurement_name ) .
+
+measurements     = measurement { "," measurement } .
+
+measurement_name = identifier | regex_lit .
+
+policy_name      = identifier .
+
+retention_policy = identifier .
+
+retention_policy_name = "NAME" identifier .
+
+series_id        = int_lit .
+
+sort_field       = field_key [ ASC | DESC ] .
+
+sort_fields      = sort_field { "," sort_field } .
+
+tag_key          = identifier .
+
+tag_keys         = tag_key { "," tag_key } .
+
+var_ref          = measurement .
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/influxdb3/enterprise/reference/influxql/index.html b/pr-preview/pr-6948/influxdb3/enterprise/reference/influxql/index.html new file mode 100644 index 000000000..143f8667c --- /dev/null +++ b/pr-preview/pr-6948/influxdb3/enterprise/reference/influxql/index.html @@ -0,0 +1,4289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +InfluxQL reference documentation | <nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

InfluxQL reference documentation

+ + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

InfluxQL (Influx Query Language) is an SQL-like query language used to interact +with InfluxDB and work with times series data.

+ +
+ + +

InfluxQL feature support

+

InfluxQL is being rearchitected to work with the InfluxDB 3 storage engine. +This process is ongoing and some InfluxQL features are still being implemented. +For information about the current implementation status of InfluxQL features, +see InfluxQL feature support.

+
+ + +

Notation

+

The syntax is specified using Extended Backus-Naur Form (“EBNF”). +EBNF is the same notation used in the Go programming language specification.

+ + +
Production  = production_name "=" [ Expression ] "." .
+Expression  = Alternative { "|" Alternative } .
+Alternative = Term { Term } .
+Term        = production_name | token [ "…" token ] | Group | Option | Repetition .
+Group       = "(" Expression ")" .
+Option      = "[" Expression "]" .
+Repetition  = "{" Expression "}" .
+

Notation operators in order of increasing precedence:

+ + +
|   alternation
+()  grouping
+[]  option (0 or 1 times)
+{}  repetition (0 to n times)
+

Query representation

+

Characters

+

InfluxQL is Unicode text encoded in UTF-8.

+ + +
newline             = /* the Unicode code point U+000A */ .
+unicode_char        = /* an arbitrary Unicode code point except newline */ .
+

Letters and digits

+

Letters are the set of ASCII letters and the underscore (_, U+005F).

+

Only decimal digits are supported.

+ + +
letter              = ascii_letter | "_" .
+ascii_letter        = "A" … "Z" | "a" … "z" .
+digit               = "0" … "9" .
+

Identifiers

+

Identifiers are tokens that refer to +database names, +retention policy names, +measurement names, +tag keys, and +field keys.

+

The rules are as follows:

+
    +
  • Double-quoted identifiers can contain any Unicode character except for a new line.
  • +
  • Double-quoted identifiers can also contain escaped " characters (that is, \")
  • +
  • Double-quoted identifiers can include InfluxQL keywords.
  • +
  • Unquoted identifiers must start with an upper or lowercase ASCII character or “_”.
  • +
  • Unquoted identifiers may contain only ASCII letters, decimal digits, and “_”.
  • +
+ + +
identifier          = unquoted_identifier | quoted_identifier .
+unquoted_identifier = ( letter ) { letter | digit } .
+quoted_identifier   = `"` unicode_char { unicode_char } `"` .
+

Examples

+ + +
cpu
+_cpu_stats
+"1h"
+"anything really"
+"1_Crazy-1337.identifier>NAME👍"
+

Keywords

+ + +
ALL           ALTER         ANY           AS            ASC           BEGIN
+BY            CREATE        CONTINUOUS    DATABASE      DATABASES     DEFAULT
+DELETE        DESC          DESTINATIONS  DIAGNOSTICS   DISTINCT      DROP
+DURATION      END           EVERY         EXPLAIN       FIELD         FOR
+FROM          GRANT         GRANTS        GROUP         GROUPS        IN
+INF           INSERT        INTO          KEY           KEYS          KILL
+LIMIT         SHOW          MEASUREMENT   MEASUREMENTS  NAME          OFFSET
+ON            ORDER         PASSWORD      POLICY        POLICIES      PRIVILEGES
+QUERIES       QUERY         READ          REPLICATION   RESAMPLE      RETENTION
+REVOKE        SELECT        SERIES        SET           SHARD         SHARDS
+SLIMIT        SOFFSET       STATS         SUBSCRIPTION  SUBSCRIPTIONS TAG
+TO            USER          USERS         VALUES        WHERE         WITH
+WRITE
+

If you use an InfluxQL keyword as an +identifier, +double-quote the identifier in every query.

+

The time keyword is a special case. +time can be a +database name, +measurement name, +retention policy name, and +user name.

+

In those cases, you don’t need to double-quote time in queries.

+

time can’t be a field key or +tag key; +InfluxDB rejects writes with time as a field key or tag key and returns an error.

+ +

Literals

+

Integers

+

InfluxQL supports decimal integer literals. +Hexadecimal and octal literals aren’t currently supported.

+ + +
int_lit             = ( "1" … "9" ) { digit } .
+

Floats

+

InfluxQL supports floating-point literals. +Exponents aren’t currently supported.

+ + +
float_lit           = int_lit "." int_lit .
+

Strings

+

String literals must be surrounded by single quotes. +Strings may contain ' characters as long as they are escaped (that is, , \')

+ + +
string_lit          = `'` { unicode_char } `'` .
+

Durations

+

Duration literals specify a length of time. +An integer literal followed immediately (with no spaces) by one of the duration units listed below is interpreted as a duration literal. +Durations can be specified with mixed units.

+
Duration units
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UnitsMeaning
nsnanoseconds (1 billionth of a second)
u or µmicroseconds (1 millionth of a second)
msmilliseconds (1 thousandth of a second)
ssecond
mminute
hhour
dday
wweek
+ + +
duration_lit        = int_lit duration_unit .
+duration_unit       = "ns" | "u" | "µ" | "ms" | "s" | "m" | "h" | "d" | "w" .
+

Dates & Times

+

Unlike other notations used in InfluxQL, the date and time literal format isn’t specified by EBNF. +InfluxQL date and time is specified using Go’s time parsing format and +reference date written in the format required by InfluxQL. +The reference date time is:

+

InfluxQL reference date time: January 2nd, 2006 at 3:04:05 PM

+ + +
time_lit            = "2006-01-02 15:04:05.999999" | "2006-01-02" .
+

Booleans

+ + +
bool_lit            = TRUE | FALSE .
+

Regular Expressions

+ + +
regex_lit           = "/" { unicode_char } "/" .
+

Comparators: +=~ matches against +!~ doesn’t match against

+ +
+ + +

InfluxQL supports using regular expressions when specifying:

+ +

Currently, InfluxQL doesn’t support using regular expressions to match non-string +field values in the WHERE clause, databases, +and retention polices.

+
+

Queries

+

A query is composed of one or more statements separated by a semicolon (;).

+ + +
query               = statement { ";" statement } .
+
+statement           = explain_stmt |
+                      explain_analyze_stmt |
+                      select_stmt |
+                      show_field_keys_stmt |
+                      show_measurements_stmt |
+                      show_retention_policies_stmt |
+                      show_tag_keys_stmt |
+                      show_tag_values_with_key = stmt .
+ +

Statements

+

EXPLAIN

+

Parses and plans the query, and then prints a summary of estimated costs.

+

Many SQL engines use the EXPLAIN statement to show join order, join algorithms, and predicate and expression pushdown. +Since InfluxQL doesn’t support joins, the cost of an InfluxQL query is typically a function of the total series accessed, the number of iterator accesses to a TSM file, and the number of TSM blocks that need to be scanned.

+

A query plan generated by EXPLAIN contains the following elements:

+
    +
  • expression
  • +
  • auxiliary fields
  • +
  • number of shards
  • +
  • number of series
  • +
  • cached values
  • +
  • number of files
  • +
  • number of blocks
  • +
  • size of blocks
  • +
+ + +
explain_stmt = "EXPLAIN" select_stmt .
+

Example

+ + +
> explain select sum(pointReq) from "_internal"."monitor"."write" group by hostname;
+> QUERY PLAN
+------
+EXPRESSION: sum(pointReq::integer)
+NUMBER OF SHARDS: 2
+NUMBER OF SERIES: 2
+CACHED VALUES: 110
+NUMBER OF FILES: 1
+NUMBER OF BLOCKS: 1
+SIZE OF BLOCKS: 931
+

EXPLAIN ANALYZE

+

Executes the specified SELECT statement and returns data about the query performance and storage during runtime, visualized as a tree. Use this statement to analyze query performance and storage, including execution time and planning time, and the iterator type and cursor type.

+

For example, if you execute the following statement:

+ + +
explain analyze select mean(usage_steal) from cpu where time >= '2018-02-22T00:00:00Z' and time < '2018-02-22T12:00:00Z'
+

The output is similar to the following:

+ + +
EXPLAIN ANALYZE
+---------------
+.
+└── select
+    ├── execution_time: 2.25823ms
+    ├── planning_time: 18.381616ms
+    ├── total_time: 20.639846ms
+    └── field_iterators
+        ├── labels
+           └── statement: SELECT mean(usage_steal::float) FROM telegraf."default".cpu
+        └── expression
+            ├── labels
+               └── expr: mean(usage_steal::float)
+            └── create_iterator
+                ├── labels
+                   ├── measurement: cpu
+                   └── shard_id: 608
+                ├── cursors_ref: 779
+                ├── cursors_aux: 0
+                ├── cursors_cond: 0
+                ├── float_blocks_decoded: 431
+                ├── float_blocks_size_bytes: 1003552
+                ├── integer_blocks_decoded: 0
+                ├── integer_blocks_size_bytes: 0
+                ├── unsigned_blocks_decoded: 0
+                ├── unsigned_blocks_size_bytes: 0
+                ├── string_blocks_decoded: 0
+                ├── string_blocks_size_bytes: 0
+                ├── boolean_blocks_decoded: 0
+                ├── boolean_blocks_size_bytes: 0
+                └── planning_time: 14.805277ms```
+ +
+ + +

EXPLAIN ANALYZE ignores query output, so the cost of serialization to JSON or +CSV isn’t accounted for.

+
+
execution_time
+

Shows the amount of time the query took to execute, including reading the time series data, performing operations as data flows through iterators, and draining processed data from iterators. Execution time doesn’t include the time taken to serialize the output into JSON or other formats.

+
planning_time
+

Shows the amount of time the query took to plan. +Planning a query in InfluxDB requires a number of steps. Depending on the complexity of the query, planning can require more work and consume more CPU and memory resources than executing the query. For example, the number of series keys required to execute a query affects how quickly the query is planned and how much memory the planning requires.

+

First, InfluxDB determines the effective time range of the query and selects the shards to access. +Next, for each shard and each measurement, InfluxDB performs the following steps:

+
    +
  1. Select matching series keys from the index, filtered by tag predicates in the WHERE clause.
  2. +
  3. Group filtered series keys into tag sets based on the GROUP BY dimensions.
  4. +
  5. Enumerate each tag set and create a cursor and iterator for each series key.
  6. +
  7. Merge iterators and return the merged result to the query executor.
  8. +
+
iterator type
+

EXPLAIN ANALYZE supports the following iterator types:

+
    +
  • create_iterator node represents work done by the local influxd instance──a complex composition of nested iterators combined and merged to produce the final query output.
  • +
  • (InfluxDB Enterprise only) remote_iterator node represents work done on remote machines.
  • +
+

For more information about iterators, see Understanding iterators.

+
cursor type
+

EXPLAIN ANALYZE distinguishes 3 cursor types. While the cursor types have the same data structures and equal CPU and I/O costs, each cursor type is constructed for a different reason and separated in the final output. Consider the following cursor types when tuning a statement:

+
    +
  • cursor_ref: Reference cursor created for SELECT projections that include a function, such as last() or mean().
  • +
  • cursor_aux: Auxiliary cursor created for simple expression projections (not selectors or an aggregation). For example, SELECT foo FROM m or SELECT foo+bar FROM m, where foo and bar are fields.
  • +
  • cursor_cond: Condition cursor created for fields referenced in a WHERE clause.
  • +
+

For more information about cursors, see Understanding cursors.

+
block types
+

EXPLAIN ANALYZE separates storage block types, and reports the total number of +blocks decoded and their size (in bytes) on disk. The following block types are supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDescription
float64-bit IEEE-754 floating-point number
integer64-bit signed integer
unsigned64-bit unsigned integer
boolean1-bit, LSB encoded
stringUTF-8 string
+

SELECT

+ + +
select_stmt = "SELECT" fields from_clause [ where_clause ]
+              [ group_by_clause ] [ order_by_clause ] [ limit_clause ]
+              [ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ timezone_clause ] .
+

Example

+

Select from measurements grouped by the day with a timezone

+ + +
SELECT mean("value") FROM "cpu" GROUP BY region, time(1d) fill(0) tz('America/Chicago')
+ + + +

SHOW FIELD KEYS

+ + +
show_field_keys_stmt = "SHOW FIELD KEYS" [on_clause] [ from_clause ] .
+

Examples

+ + +
-- show field keys and field value data types from all measurements
+SHOW FIELD KEYS
+
+-- show field keys and field value data types from specified measurement
+SHOW FIELD KEYS FROM "cpu"
+

SHOW MEASUREMENTS

+ + +
show_measurements_stmt = "SHOW MEASUREMENTS" [on_clause] [ with_measurement_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all measurements
+SHOW MEASUREMENTS
+
+-- show measurements where region tag = 'uswest' AND host tag = 'serverA'
+SHOW MEASUREMENTS WHERE "region" = 'uswest' AND "host" = 'serverA'
+
+-- show measurements that start with 'h2o'
+SHOW MEASUREMENTS WITH MEASUREMENT =~ /h2o.*/
+ + + +

SHOW TAG KEYS

+ + +
show_tag_keys_stmt = "SHOW TAG KEYS" [on_clause] [ from_clause ] [ where_clause ]
+                     [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag keys
+SHOW TAG KEYS
+
+-- show all tag keys from the cpu measurement
+SHOW TAG KEYS FROM "cpu"
+
+-- show all tag keys from the cpu measurement where the region key = 'uswest'
+SHOW TAG KEYS FROM "cpu" WHERE "region" = 'uswest'
+
+-- show all tag keys where the host key = 'serverA'
+SHOW TAG KEYS WHERE "host" = 'serverA'
+

SHOW TAG VALUES

+ + +
show_tag_values_stmt = "SHOW TAG VALUES" [on_clause] [ from_clause ] with_tag_clause [ where_clause ]
+                       [ limit_clause ] [ offset_clause ] .
+

Examples

+ + +
-- show all tag values across all measurements for the region tag
+SHOW TAG VALUES WITH KEY = "region"
+
+-- show tag values from the cpu measurement for the region tag
+SHOW TAG VALUES FROM "cpu" WITH KEY = "region"
+
+-- show tag values across all measurements for all tag keys that do not include the letter c
+SHOW TAG VALUES WITH KEY !~ /.*c.*/
+
+-- show tag values from the cpu measurement for region & host tag keys where service = 'redis'
+SHOW TAG VALUES FROM "cpu" WITH KEY IN ("region", "host") WHERE "service" = 'redis'
+ +

Clauses

+ + +
from_clause     = "FROM" measurements .
+
+group_by_clause = "GROUP BY" dimensions fill(fill_option).
+
+limit_clause    = "LIMIT" int_lit .
+
+offset_clause   = "OFFSET" int_lit .
+
+slimit_clause   = "SLIMIT" int_lit .
+
+soffset_clause  = "SOFFSET" int_lit .
+
+timezone_clause = tz(string_lit) .
+
+on_clause       = "ON" db_name .
+
+order_by_clause = "ORDER BY" sort_fields .
+
+where_clause    = "WHERE" expr .
+
+with_measurement_clause = "WITH MEASUREMENT" ( "=" measurement | "=~" regex_lit ) .
+
+with_tag_clause = "WITH KEY" ( "=" tag_key | "!=" tag_key | "=~" regex_lit | "IN (" tag_keys ")"  ) .
+

Expressions

+ + +
binary_op        = "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | "AND" |
+                   "OR" | "=" | "!=" | "<>" | "<" | "<=" | ">" | ">=" .
+
+expr             = unary_expr { binary_op unary_expr } .
+
+unary_expr       = "(" expr ")" | var_ref | time_lit | string_lit | int_lit |
+                   float_lit | bool_lit | duration_lit | regex_lit .
+

Default time range

+

The default time range is the Unix epoch (1970-01-01T00:00:00Z) to now.

+

Comments

+

Use comments with InfluxQL statements to describe your queries.

+
    +
  • A single line comment begins with two hyphens (--) and ends where InfluxDB detects a line break. +This comment type cannot span several lines.
  • +
  • A multi-line comment begins with /* and ends with */. This comment type can span several lines. +Multi-line comments do not support nested multi-line comments.
  • +
+

Other

+ + +
alias            = "AS" identifier .
+
+back_ref         = ( policy_name ".:MEASUREMENT" ) |
+                   ( db_name "." [ policy_name ] ".:MEASUREMENT" ) .
+
+db_name          = identifier .
+
+dimension        = expr .
+
+dimensions       = dimension { "," dimension } .
+
+field_key        = identifier .
+
+field            = expr [ alias ] .
+
+fields           = field { "," field } .
+
+fill_option      = "null" | "none" | "previous" | int_lit | float_lit | "linear" .
+
+host             = string_lit .
+
+measurement      = measurement_name |
+                   ( policy_name "." measurement_name ) |
+                   ( db_name "." [ policy_name ] "." measurement_name ) .
+
+measurements     = measurement { "," measurement } .
+
+measurement_name = identifier | regex_lit .
+
+policy_name      = identifier .
+
+retention_policy = identifier .
+
+retention_policy_name = "NAME" identifier .
+
+series_id        = int_lit .
+
+sort_field       = field_key [ ASC | DESC ] .
+
+sort_fields      = sort_field { "," sort_field } .
+
+tag_key          = identifier .
+
+tag_keys         = tag_key { "," tag_key } .
+
+var_ref          = measurement .
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/pr-preview/pr-6948/js/main.js b/pr-preview/pr-6948/js/main.js new file mode 100644 index 000000000..6918adbfe --- /dev/null +++ b/pr-preview/pr-6948/js/main.js @@ -0,0 +1,186397 @@ +"use strict"; +(() => { + var __create = Object.create; + var __defProp = Object.defineProperty; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropNames = Object.getOwnPropertyNames; + var __getProtoOf = Object.getPrototypeOf; + var __hasOwnProp = Object.prototype.hasOwnProperty; + var __esm = (fn3, res) => function __init() { + return fn3 && (res = (0, fn3[__getOwnPropNames(fn3)[0]])(fn3 = 0)), res; + }; + var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + }; + var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps = (to, from2, except, desc) => { + if (from2 && typeof from2 === "object" || typeof from2 === "function") { + for (let key of __getOwnPropNames(from2)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable }); + } + return to; + }; + var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default")); + var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod + )); + var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + + // node_modules/jquery/dist/jquery.js + var require_jquery = __commonJS({ + "node_modules/jquery/dist/jquery.js"(exports2, module2) { + "use strict"; + (function(global2, factory) { + "use strict"; + if (typeof module2 === "object" && typeof module2.exports === "object") { + module2.exports = global2.document ? factory(global2, true) : function(w4) { + if (!w4.document) { + throw new Error("jQuery requires a window with a document"); + } + return factory(w4); + }; + } else { + factory(global2); + } + })(typeof window !== "undefined" ? window : exports2, function(window3, noGlobal) { + "use strict"; + var arr = []; + var getProto = Object.getPrototypeOf; + var slice8 = arr.slice; + var flat = arr.flat ? function(array6) { + return arr.flat.call(array6); + } : function(array6) { + return arr.concat.apply([], array6); + }; + var push3 = arr.push; + var indexOf2 = arr.indexOf; + var class2type = {}; + var toString6 = class2type.toString; + var hasOwn = class2type.hasOwnProperty; + var fnToString = hasOwn.toString; + var ObjectFunctionString = fnToString.call(Object); + var support = {}; + var isFunction2 = function isFunction3(obj) { + return typeof obj === "function" && typeof obj.nodeType !== "number" && typeof obj.item !== "function"; + }; + var isWindow = function isWindow2(obj) { + return obj != null && obj === obj.window; + }; + var document2 = window3.document; + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + function DOMEval(code, node2, doc) { + doc = doc || document2; + var i3, val, script = doc.createElement("script"); + script.text = code; + if (node2) { + for (i3 in preservedScriptAttributes) { + val = node2[i3] || node2.getAttribute && node2.getAttribute(i3); + if (val) { + script.setAttribute(i3, val); + } + } + } + doc.head.appendChild(script).parentNode.removeChild(script); + } + function toType(obj) { + if (obj == null) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? class2type[toString6.call(obj)] || "object" : typeof obj; + } + var version4 = "3.7.1", rhtmlSuffix = /HTML$/i, jQuery = function(selector, context2) { + return new jQuery.fn.init(selector, context2); + }; + jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: version4, + constructor: jQuery, + // The default length of a jQuery object is 0 + length: 0, + toArray: function() { + return slice8.call(this); + }, + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function(num) { + if (num == null) { + return slice8.call(this); + } + return num < 0 ? this[num + this.length] : this[num]; + }, + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function(elems) { + var ret = jQuery.merge(this.constructor(), elems); + ret.prevObject = this; + return ret; + }, + // Execute a callback for every element in the matched set. + each: function(callback) { + return jQuery.each(this, callback); + }, + map: function(callback) { + return this.pushStack(jQuery.map(this, function(elem, i3) { + return callback.call(elem, i3, elem); + })); + }, + slice: function() { + return this.pushStack(slice8.apply(this, arguments)); + }, + first: function() { + return this.eq(0); + }, + last: function() { + return this.eq(-1); + }, + even: function() { + return this.pushStack(jQuery.grep(this, function(_elem, i3) { + return (i3 + 1) % 2; + })); + }, + odd: function() { + return this.pushStack(jQuery.grep(this, function(_elem, i3) { + return i3 % 2; + })); + }, + eq: function(i3) { + var len = this.length, j3 = +i3 + (i3 < 0 ? len : 0); + return this.pushStack(j3 >= 0 && j3 < len ? [this[j3]] : []); + }, + end: function() { + return this.prevObject || this.constructor(); + }, + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push3, + sort: arr.sort, + splice: arr.splice + }; + jQuery.extend = jQuery.fn.extend = function() { + var options2, name, src, copy7, copyIsArray, clone7, target = arguments[0] || {}, i3 = 1, length2 = arguments.length, deep = false; + if (typeof target === "boolean") { + deep = target; + target = arguments[i3] || {}; + i3++; + } + if (typeof target !== "object" && !isFunction2(target)) { + target = {}; + } + if (i3 === length2) { + target = this; + i3--; + } + for (; i3 < length2; i3++) { + if ((options2 = arguments[i3]) != null) { + for (name in options2) { + copy7 = options2[name]; + if (name === "__proto__" || target === copy7) { + continue; + } + if (deep && copy7 && (jQuery.isPlainObject(copy7) || (copyIsArray = Array.isArray(copy7)))) { + src = target[name]; + if (copyIsArray && !Array.isArray(src)) { + clone7 = []; + } else if (!copyIsArray && !jQuery.isPlainObject(src)) { + clone7 = {}; + } else { + clone7 = src; + } + copyIsArray = false; + target[name] = jQuery.extend(deep, clone7, copy7); + } else if (copy7 !== void 0) { + target[name] = copy7; + } + } + } + } + return target; + }; + jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + (version4 + Math.random()).replace(/\D/g, ""), + // Assume jQuery is ready without the ready module + isReady: true, + error: function(msg) { + throw new Error(msg); + }, + noop: function() { + }, + isPlainObject: function(obj) { + var proto, Ctor; + if (!obj || toString6.call(obj) !== "[object Object]") { + return false; + } + proto = getProto(obj); + if (!proto) { + return true; + } + Ctor = hasOwn.call(proto, "constructor") && proto.constructor; + return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString; + }, + isEmptyObject: function(obj) { + var name; + for (name in obj) { + return false; + } + return true; + }, + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function(code, options2, doc) { + DOMEval(code, { nonce: options2 && options2.nonce }, doc); + }, + each: function(obj, callback) { + var length2, i3 = 0; + if (isArrayLike2(obj)) { + length2 = obj.length; + for (; i3 < length2; i3++) { + if (callback.call(obj[i3], i3, obj[i3]) === false) { + break; + } + } + } else { + for (i3 in obj) { + if (callback.call(obj[i3], i3, obj[i3]) === false) { + break; + } + } + } + return obj; + }, + // Retrieve the text value of an array of DOM nodes + text: function(elem) { + var node2, ret = "", i3 = 0, nodeType3 = elem.nodeType; + if (!nodeType3) { + while (node2 = elem[i3++]) { + ret += jQuery.text(node2); + } + } + if (nodeType3 === 1 || nodeType3 === 11) { + return elem.textContent; + } + if (nodeType3 === 9) { + return elem.documentElement.textContent; + } + if (nodeType3 === 3 || nodeType3 === 4) { + return elem.nodeValue; + } + return ret; + }, + // results is for internal usage only + makeArray: function(arr2, results) { + var ret = results || []; + if (arr2 != null) { + if (isArrayLike2(Object(arr2))) { + jQuery.merge( + ret, + typeof arr2 === "string" ? [arr2] : arr2 + ); + } else { + push3.call(ret, arr2); + } + } + return ret; + }, + inArray: function(elem, arr2, i3) { + return arr2 == null ? -1 : indexOf2.call(arr2, elem, i3); + }, + isXMLDoc: function(elem) { + var namespace = elem && elem.namespaceURI, docElem = elem && (elem.ownerDocument || elem).documentElement; + return !rhtmlSuffix.test(namespace || docElem && docElem.nodeName || "HTML"); + }, + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function(first3, second2) { + var len = +second2.length, j3 = 0, i3 = first3.length; + for (; j3 < len; j3++) { + first3[i3++] = second2[j3]; + } + first3.length = i3; + return first3; + }, + grep: function(elems, callback, invert3) { + var callbackInverse, matches34 = [], i3 = 0, length2 = elems.length, callbackExpect = !invert3; + for (; i3 < length2; i3++) { + callbackInverse = !callback(elems[i3], i3); + if (callbackInverse !== callbackExpect) { + matches34.push(elems[i3]); + } + } + return matches34; + }, + // arg is for internal usage only + map: function(elems, callback, arg) { + var length2, value2, i3 = 0, ret = []; + if (isArrayLike2(elems)) { + length2 = elems.length; + for (; i3 < length2; i3++) { + value2 = callback(elems[i3], i3, arg); + if (value2 != null) { + ret.push(value2); + } + } + } else { + for (i3 in elems) { + value2 = callback(elems[i3], i3, arg); + if (value2 != null) { + ret.push(value2); + } + } + } + return flat(ret); + }, + // A global GUID counter for objects + guid: 1, + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support + }); + if (typeof Symbol === "function") { + jQuery.fn[Symbol.iterator] = arr[Symbol.iterator]; + } + jQuery.each( + "Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), + function(_i, name) { + class2type["[object " + name + "]"] = name.toLowerCase(); + } + ); + function isArrayLike2(obj) { + var length2 = !!obj && "length" in obj && obj.length, type3 = toType(obj); + if (isFunction2(obj) || isWindow(obj)) { + return false; + } + return type3 === "array" || length2 === 0 || typeof length2 === "number" && length2 > 0 && length2 - 1 in obj; + } + function nodeName(elem, name) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + } + var pop = arr.pop; + var sort4 = arr.sort; + var splice4 = arr.splice; + var whitespace2 = "[\\x20\\t\\r\\n\\f]"; + var rtrimCSS = new RegExp( + "^" + whitespace2 + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace2 + "+$", + "g" + ); + jQuery.contains = function(a3, b11) { + var bup = b11 && b11.parentNode; + return a3 === bup || !!(bup && bup.nodeType === 1 && // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + (a3.contains ? a3.contains(bup) : a3.compareDocumentPosition && a3.compareDocumentPosition(bup) & 16)); + }; + var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + function fcssescape(ch, asCodePoint) { + if (asCodePoint) { + if (ch === "\0") { + return "\uFFFD"; + } + return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; + } + return "\\" + ch; + } + jQuery.escapeSelector = function(sel) { + return (sel + "").replace(rcssescape, fcssescape); + }; + var preferredDoc = document2, pushNative = push3; + (function() { + var i3, Expr, outermostContext, sortInput, hasDuplicate, push4 = pushNative, document3, documentElement2, documentIsHTML, rbuggyQSA, matches34, expando = jQuery.expando, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), nonnativeSelectorCache = createCache(), sortOrder = function(a3, b11) { + if (a3 === b11) { + hasDuplicate = true; + } + return 0; + }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", identifier2 = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace2 + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", attributes = "\\[" + whitespace2 + "*(" + identifier2 + ")(?:" + whitespace2 + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace2 + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + `*(?:'((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)"|(` + identifier2 + "))|)" + whitespace2 + "*\\]", pseudos = ":(" + identifier2 + `)(?:\\((('((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)")|((?:\\\\.|[^\\\\()[\\]]|` + attributes + ")*)|.*)\\)|)", rwhitespace = new RegExp(whitespace2 + "+", "g"), rcomma = new RegExp("^" + whitespace2 + "*," + whitespace2 + "*"), rleadingCombinator = new RegExp("^" + whitespace2 + "*([>+~]|" + whitespace2 + ")" + whitespace2 + "*"), rdescend = new RegExp(whitespace2 + "|>"), rpseudo = new RegExp(pseudos), ridentifier = new RegExp("^" + identifier2 + "$"), matchExpr = { + ID: new RegExp("^#(" + identifier2 + ")"), + CLASS: new RegExp("^\\.(" + identifier2 + ")"), + TAG: new RegExp("^(" + identifier2 + "|[*])"), + ATTR: new RegExp("^" + attributes), + PSEUDO: new RegExp("^" + pseudos), + CHILD: new RegExp( + "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace2 + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace2 + "*(?:([+-]|)" + whitespace2 + "*(\\d+)|))" + whitespace2 + "*\\)|)", + "i" + ), + bool: new RegExp("^(?:" + booleans + ")$", "i"), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + needsContext: new RegExp("^" + whitespace2 + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace2 + "*((?:-\\d)?\\d*)" + whitespace2 + "*\\)|)(?=[^-]|$)", "i") + }, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rquickExpr2 = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, runescape = new RegExp("\\\\[\\da-fA-F]{1,6}" + whitespace2 + "?|\\\\([^\\r\\n\\f])", "g"), funescape = function(escape4, nonHex) { + var high = "0x" + escape4.slice(1) - 65536; + if (nonHex) { + return nonHex; + } + return high < 0 ? String.fromCharCode(high + 65536) : String.fromCharCode(high >> 10 | 55296, high & 1023 | 56320); + }, unloadHandler = function() { + setDocument(); + }, inDisabledFieldset = addCombinator( + function(elem) { + return elem.disabled === true && nodeName(elem, "fieldset"); + }, + { dir: "parentNode", next: "legend" } + ); + function safeActiveElement() { + try { + return document3.activeElement; + } catch (err) { + } + } + try { + push4.apply( + arr = slice8.call(preferredDoc.childNodes), + preferredDoc.childNodes + ); + arr[preferredDoc.childNodes.length].nodeType; + } catch (e3) { + push4 = { + apply: function(target, els) { + pushNative.apply(target, slice8.call(els)); + }, + call: function(target) { + pushNative.apply(target, slice8.call(arguments, 1)); + } + }; + } + function find4(selector, context2, results, seed) { + var m3, i4, elem, nid, match3, groups2, newSelector, newContext = context2 && context2.ownerDocument, nodeType3 = context2 ? context2.nodeType : 9; + results = results || []; + if (typeof selector !== "string" || !selector || nodeType3 !== 1 && nodeType3 !== 9 && nodeType3 !== 11) { + return results; + } + if (!seed) { + setDocument(context2); + context2 = context2 || document3; + if (documentIsHTML) { + if (nodeType3 !== 11 && (match3 = rquickExpr2.exec(selector))) { + if (m3 = match3[1]) { + if (nodeType3 === 9) { + if (elem = context2.getElementById(m3)) { + if (elem.id === m3) { + push4.call(results, elem); + return results; + } + } else { + return results; + } + } else { + if (newContext && (elem = newContext.getElementById(m3)) && find4.contains(context2, elem) && elem.id === m3) { + push4.call(results, elem); + return results; + } + } + } else if (match3[2]) { + push4.apply(results, context2.getElementsByTagName(selector)); + return results; + } else if ((m3 = match3[3]) && context2.getElementsByClassName) { + push4.apply(results, context2.getElementsByClassName(m3)); + return results; + } + } + if (!nonnativeSelectorCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector))) { + newSelector = selector; + newContext = context2; + if (nodeType3 === 1 && (rdescend.test(selector) || rleadingCombinator.test(selector))) { + newContext = rsibling.test(selector) && testContext(context2.parentNode) || context2; + if (newContext != context2 || !support.scope) { + if (nid = context2.getAttribute("id")) { + nid = jQuery.escapeSelector(nid); + } else { + context2.setAttribute("id", nid = expando); + } + } + groups2 = tokenize3(selector); + i4 = groups2.length; + while (i4--) { + groups2[i4] = (nid ? "#" + nid : ":scope") + " " + toSelector(groups2[i4]); + } + newSelector = groups2.join(","); + } + try { + push4.apply( + results, + newContext.querySelectorAll(newSelector) + ); + return results; + } catch (qsaError) { + nonnativeSelectorCache(selector, true); + } finally { + if (nid === expando) { + context2.removeAttribute("id"); + } + } + } + } + } + return select(selector.replace(rtrimCSS, "$1"), context2, results, seed); + } + function createCache() { + var keys2 = []; + function cache3(key, value2) { + if (keys2.push(key + " ") > Expr.cacheLength) { + delete cache3[keys2.shift()]; + } + return cache3[key + " "] = value2; + } + return cache3; + } + function markFunction(fn3) { + fn3[expando] = true; + return fn3; + } + function assert(fn3) { + var el = document3.createElement("fieldset"); + try { + return !!fn3(el); + } catch (e3) { + return false; + } finally { + if (el.parentNode) { + el.parentNode.removeChild(el); + } + el = null; + } + } + function createInputPseudo(type3) { + return function(elem) { + return nodeName(elem, "input") && elem.type === type3; + }; + } + function createButtonPseudo(type3) { + return function(elem) { + return (nodeName(elem, "input") || nodeName(elem, "button")) && elem.type === type3; + }; + } + function createDisabledPseudo(disabled) { + return function(elem) { + if ("form" in elem) { + if (elem.parentNode && elem.disabled === false) { + if ("label" in elem) { + if ("label" in elem.parentNode) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + return elem.isDisabled === disabled || // Where there is no isDisabled, check manually + elem.isDisabled !== !disabled && inDisabledFieldset(elem) === disabled; + } + return elem.disabled === disabled; + } else if ("label" in elem) { + return elem.disabled === disabled; + } + return false; + }; + } + function createPositionalPseudo(fn3) { + return markFunction(function(argument) { + argument = +argument; + return markFunction(function(seed, matches35) { + var j3, matchIndexes = fn3([], seed.length, argument), i4 = matchIndexes.length; + while (i4--) { + if (seed[j3 = matchIndexes[i4]]) { + seed[j3] = !(matches35[j3] = seed[j3]); + } + } + }); + }); + } + function testContext(context2) { + return context2 && typeof context2.getElementsByTagName !== "undefined" && context2; + } + function setDocument(node2) { + var subWindow, doc = node2 ? node2.ownerDocument || node2 : preferredDoc; + if (doc == document3 || doc.nodeType !== 9 || !doc.documentElement) { + return document3; + } + document3 = doc; + documentElement2 = document3.documentElement; + documentIsHTML = !jQuery.isXMLDoc(document3); + matches34 = documentElement2.matches || documentElement2.webkitMatchesSelector || documentElement2.msMatchesSelector; + if (documentElement2.msMatchesSelector && // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + preferredDoc != document3 && (subWindow = document3.defaultView) && subWindow.top !== subWindow) { + subWindow.addEventListener("unload", unloadHandler); + } + support.getById = assert(function(el) { + documentElement2.appendChild(el).id = jQuery.expando; + return !document3.getElementsByName || !document3.getElementsByName(jQuery.expando).length; + }); + support.disconnectedMatch = assert(function(el) { + return matches34.call(el, "*"); + }); + support.scope = assert(function() { + return document3.querySelectorAll(":scope"); + }); + support.cssHas = assert(function() { + try { + document3.querySelector(":has(*,:jqfake)"); + return false; + } catch (e3) { + return true; + } + }); + if (support.getById) { + Expr.filter.ID = function(id28) { + var attrId = id28.replace(runescape, funescape); + return function(elem) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find.ID = function(id28, context2) { + if (typeof context2.getElementById !== "undefined" && documentIsHTML) { + var elem = context2.getElementById(id28); + return elem ? [elem] : []; + } + }; + } else { + Expr.filter.ID = function(id28) { + var attrId = id28.replace(runescape, funescape); + return function(elem) { + var node3 = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return node3 && node3.value === attrId; + }; + }; + Expr.find.ID = function(id28, context2) { + if (typeof context2.getElementById !== "undefined" && documentIsHTML) { + var node3, i4, elems, elem = context2.getElementById(id28); + if (elem) { + node3 = elem.getAttributeNode("id"); + if (node3 && node3.value === id28) { + return [elem]; + } + elems = context2.getElementsByName(id28); + i4 = 0; + while (elem = elems[i4++]) { + node3 = elem.getAttributeNode("id"); + if (node3 && node3.value === id28) { + return [elem]; + } + } + } + return []; + } + }; + } + Expr.find.TAG = function(tag, context2) { + if (typeof context2.getElementsByTagName !== "undefined") { + return context2.getElementsByTagName(tag); + } else { + return context2.querySelectorAll(tag); + } + }; + Expr.find.CLASS = function(className, context2) { + if (typeof context2.getElementsByClassName !== "undefined" && documentIsHTML) { + return context2.getElementsByClassName(className); + } + }; + rbuggyQSA = []; + assert(function(el) { + var input; + documentElement2.appendChild(el).innerHTML = ""; + if (!el.querySelectorAll("[selected]").length) { + rbuggyQSA.push("\\[" + whitespace2 + "*(?:value|" + booleans + ")"); + } + if (!el.querySelectorAll("[id~=" + expando + "-]").length) { + rbuggyQSA.push("~="); + } + if (!el.querySelectorAll("a#" + expando + "+*").length) { + rbuggyQSA.push(".#.+[+~]"); + } + if (!el.querySelectorAll(":checked").length) { + rbuggyQSA.push(":checked"); + } + input = document3.createElement("input"); + input.setAttribute("type", "hidden"); + el.appendChild(input).setAttribute("name", "D"); + documentElement2.appendChild(el).disabled = true; + if (el.querySelectorAll(":disabled").length !== 2) { + rbuggyQSA.push(":enabled", ":disabled"); + } + input = document3.createElement("input"); + input.setAttribute("name", ""); + el.appendChild(input); + if (!el.querySelectorAll("[name='']").length) { + rbuggyQSA.push("\\[" + whitespace2 + "*name" + whitespace2 + "*=" + whitespace2 + `*(?:''|"")`); + } + }); + if (!support.cssHas) { + rbuggyQSA.push(":has"); + } + rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|")); + sortOrder = function(a3, b11) { + if (a3 === b11) { + hasDuplicate = true; + return 0; + } + var compare = !a3.compareDocumentPosition - !b11.compareDocumentPosition; + if (compare) { + return compare; + } + compare = (a3.ownerDocument || a3) == (b11.ownerDocument || b11) ? a3.compareDocumentPosition(b11) : ( + // Otherwise we know they are disconnected + 1 + ); + if (compare & 1 || !support.sortDetached && b11.compareDocumentPosition(a3) === compare) { + if (a3 === document3 || a3.ownerDocument == preferredDoc && find4.contains(preferredDoc, a3)) { + return -1; + } + if (b11 === document3 || b11.ownerDocument == preferredDoc && find4.contains(preferredDoc, b11)) { + return 1; + } + return sortInput ? indexOf2.call(sortInput, a3) - indexOf2.call(sortInput, b11) : 0; + } + return compare & 4 ? -1 : 1; + }; + return document3; + } + find4.matches = function(expr, elements2) { + return find4(expr, null, null, elements2); + }; + find4.matchesSelector = function(elem, expr) { + setDocument(elem); + if (documentIsHTML && !nonnativeSelectorCache[expr + " "] && (!rbuggyQSA || !rbuggyQSA.test(expr))) { + try { + var ret = matches34.call(elem, expr); + if (ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11) { + return ret; + } + } catch (e3) { + nonnativeSelectorCache(expr, true); + } + } + return find4(expr, document3, null, [elem]).length > 0; + }; + find4.contains = function(context2, elem) { + if ((context2.ownerDocument || context2) != document3) { + setDocument(context2); + } + return jQuery.contains(context2, elem); + }; + find4.attr = function(elem, name) { + if ((elem.ownerDocument || elem) != document3) { + setDocument(elem); + } + var fn3 = Expr.attrHandle[name.toLowerCase()], val = fn3 && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn3(elem, name, !documentIsHTML) : void 0; + if (val !== void 0) { + return val; + } + return elem.getAttribute(name); + }; + find4.error = function(msg) { + throw new Error("Syntax error, unrecognized expression: " + msg); + }; + jQuery.uniqueSort = function(results) { + var elem, duplicates = [], j3 = 0, i4 = 0; + hasDuplicate = !support.sortStable; + sortInput = !support.sortStable && slice8.call(results, 0); + sort4.call(results, sortOrder); + if (hasDuplicate) { + while (elem = results[i4++]) { + if (elem === results[i4]) { + j3 = duplicates.push(i4); + } + } + while (j3--) { + splice4.call(results, duplicates[j3], 1); + } + } + sortInput = null; + return results; + }; + jQuery.fn.uniqueSort = function() { + return this.pushStack(jQuery.uniqueSort(slice8.apply(this))); + }; + Expr = jQuery.expr = { + // Can be adjusted by the user + cacheLength: 50, + createPseudo: markFunction, + match: matchExpr, + attrHandle: {}, + find: {}, + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + preFilter: { + ATTR: function(match3) { + match3[1] = match3[1].replace(runescape, funescape); + match3[3] = (match3[3] || match3[4] || match3[5] || "").replace(runescape, funescape); + if (match3[2] === "~=") { + match3[3] = " " + match3[3] + " "; + } + return match3.slice(0, 4); + }, + CHILD: function(match3) { + match3[1] = match3[1].toLowerCase(); + if (match3[1].slice(0, 3) === "nth") { + if (!match3[3]) { + find4.error(match3[0]); + } + match3[4] = +(match3[4] ? match3[5] + (match3[6] || 1) : 2 * (match3[3] === "even" || match3[3] === "odd")); + match3[5] = +(match3[7] + match3[8] || match3[3] === "odd"); + } else if (match3[3]) { + find4.error(match3[0]); + } + return match3; + }, + PSEUDO: function(match3) { + var excess, unquoted = !match3[6] && match3[2]; + if (matchExpr.CHILD.test(match3[0])) { + return null; + } + if (match3[3]) { + match3[2] = match3[4] || match3[5] || ""; + } else if (unquoted && rpseudo.test(unquoted) && // Get excess from tokenize (recursively) + (excess = tokenize3(unquoted, true)) && // advance to the next closing parenthesis + (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) { + match3[0] = match3[0].slice(0, excess); + match3[2] = unquoted.slice(0, excess); + } + return match3.slice(0, 3); + } + }, + filter: { + TAG: function(nodeNameSelector) { + var expectedNodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase(); + return nodeNameSelector === "*" ? function() { + return true; + } : function(elem) { + return nodeName(elem, expectedNodeName); + }; + }, + CLASS: function(className) { + var pattern = classCache[className + " "]; + return pattern || (pattern = new RegExp("(^|" + whitespace2 + ")" + className + "(" + whitespace2 + "|$)")) && classCache(className, function(elem) { + return pattern.test( + typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" + ); + }); + }, + ATTR: function(name, operator, check) { + return function(elem) { + var result2 = find4.attr(elem, name); + if (result2 == null) { + return operator === "!="; + } + if (!operator) { + return true; + } + result2 += ""; + if (operator === "=") { + return result2 === check; + } + if (operator === "!=") { + return result2 !== check; + } + if (operator === "^=") { + return check && result2.indexOf(check) === 0; + } + if (operator === "*=") { + return check && result2.indexOf(check) > -1; + } + if (operator === "$=") { + return check && result2.slice(-check.length) === check; + } + if (operator === "~=") { + return (" " + result2.replace(rwhitespace, " ") + " ").indexOf(check) > -1; + } + if (operator === "|=") { + return result2 === check || result2.slice(0, check.length + 1) === check + "-"; + } + return false; + }; + }, + CHILD: function(type3, what, _argument, first3, last3) { + var simple = type3.slice(0, 3) !== "nth", forward = type3.slice(-4) !== "last", ofType = what === "of-type"; + return first3 === 1 && last3 === 0 ? ( + // Shortcut for :nth-*(n) + function(elem) { + return !!elem.parentNode; + } + ) : function(elem, _context, xml2) { + var cache3, outerCache, node2, nodeIndex, start3, dir3 = simple !== forward ? "nextSibling" : "previousSibling", parent5 = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml2 && !ofType, diff2 = false; + if (parent5) { + if (simple) { + while (dir3) { + node2 = elem; + while (node2 = node2[dir3]) { + if (ofType ? nodeName(node2, name) : node2.nodeType === 1) { + return false; + } + } + start3 = dir3 = type3 === "only" && !start3 && "nextSibling"; + } + return true; + } + start3 = [forward ? parent5.firstChild : parent5.lastChild]; + if (forward && useCache) { + outerCache = parent5[expando] || (parent5[expando] = {}); + cache3 = outerCache[type3] || []; + nodeIndex = cache3[0] === dirruns && cache3[1]; + diff2 = nodeIndex && cache3[2]; + node2 = nodeIndex && parent5.childNodes[nodeIndex]; + while (node2 = ++nodeIndex && node2 && node2[dir3] || // Fallback to seeking `elem` from the start + (diff2 = nodeIndex = 0) || start3.pop()) { + if (node2.nodeType === 1 && ++diff2 && node2 === elem) { + outerCache[type3] = [dirruns, nodeIndex, diff2]; + break; + } + } + } else { + if (useCache) { + outerCache = elem[expando] || (elem[expando] = {}); + cache3 = outerCache[type3] || []; + nodeIndex = cache3[0] === dirruns && cache3[1]; + diff2 = nodeIndex; + } + if (diff2 === false) { + while (node2 = ++nodeIndex && node2 && node2[dir3] || (diff2 = nodeIndex = 0) || start3.pop()) { + if ((ofType ? nodeName(node2, name) : node2.nodeType === 1) && ++diff2) { + if (useCache) { + outerCache = node2[expando] || (node2[expando] = {}); + outerCache[type3] = [dirruns, diff2]; + } + if (node2 === elem) { + break; + } + } + } + } + } + diff2 -= last3; + return diff2 === first3 || diff2 % first3 === 0 && diff2 / first3 >= 0; + } + }; + }, + PSEUDO: function(pseudo, argument) { + var args, fn3 = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || find4.error("unsupported pseudo: " + pseudo); + if (fn3[expando]) { + return fn3(argument); + } + if (fn3.length > 1) { + args = [pseudo, pseudo, "", argument]; + return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function(seed, matches35) { + var idx, matched = fn3(seed, argument), i4 = matched.length; + while (i4--) { + idx = indexOf2.call(seed, matched[i4]); + seed[idx] = !(matches35[idx] = matched[i4]); + } + }) : function(elem) { + return fn3(elem, 0, args); + }; + } + return fn3; + } + }, + pseudos: { + // Potentially complex pseudos + not: markFunction(function(selector) { + var input = [], results = [], matcher = compile2(selector.replace(rtrimCSS, "$1")); + return matcher[expando] ? markFunction(function(seed, matches35, _context, xml2) { + var elem, unmatched = matcher(seed, null, xml2, []), i4 = seed.length; + while (i4--) { + if (elem = unmatched[i4]) { + seed[i4] = !(matches35[i4] = elem); + } + } + }) : function(elem, _context, xml2) { + input[0] = elem; + matcher(input, null, xml2, results); + input[0] = null; + return !results.pop(); + }; + }), + has: markFunction(function(selector) { + return function(elem) { + return find4(selector, elem).length > 0; + }; + }), + contains: markFunction(function(text4) { + text4 = text4.replace(runescape, funescape); + return function(elem) { + return (elem.textContent || jQuery.text(elem)).indexOf(text4) > -1; + }; + }), + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // https://www.w3.org/TR/selectors/#lang-pseudo + lang: markFunction(function(lang) { + if (!ridentifier.test(lang || "")) { + find4.error("unsupported lang: " + lang); + } + lang = lang.replace(runescape, funescape).toLowerCase(); + return function(elem) { + var elemLang; + do { + if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) { + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf(lang + "-") === 0; + } + } while ((elem = elem.parentNode) && elem.nodeType === 1); + return false; + }; + }), + // Miscellaneous + target: function(elem) { + var hash2 = window3.location && window3.location.hash; + return hash2 && hash2.slice(1) === elem.id; + }, + root: function(elem) { + return elem === documentElement2; + }, + focus: function(elem) { + return elem === safeActiveElement() && document3.hasFocus() && !!(elem.type || elem.href || ~elem.tabIndex); + }, + // Boolean properties + enabled: createDisabledPseudo(false), + disabled: createDisabledPseudo(true), + checked: function(elem) { + return nodeName(elem, "input") && !!elem.checked || nodeName(elem, "option") && !!elem.selected; + }, + selected: function(elem) { + if (elem.parentNode) { + elem.parentNode.selectedIndex; + } + return elem.selected === true; + }, + // Contents + empty: function(elem) { + for (elem = elem.firstChild; elem; elem = elem.nextSibling) { + if (elem.nodeType < 6) { + return false; + } + } + return true; + }, + parent: function(elem) { + return !Expr.pseudos.empty(elem); + }, + // Element/input types + header: function(elem) { + return rheader.test(elem.nodeName); + }, + input: function(elem) { + return rinputs.test(elem.nodeName); + }, + button: function(elem) { + return nodeName(elem, "input") && elem.type === "button" || nodeName(elem, "button"); + }, + text: function(elem) { + var attr; + return nodeName(elem, "input") && elem.type === "text" && // Support: IE <10 only + // New HTML5 attribute values (e.g., "search") appear + // with elem.type === "text" + ((attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text"); + }, + // Position-in-collection + first: createPositionalPseudo(function() { + return [0]; + }), + last: createPositionalPseudo(function(_matchIndexes, length2) { + return [length2 - 1]; + }), + eq: createPositionalPseudo(function(_matchIndexes, length2, argument) { + return [argument < 0 ? argument + length2 : argument]; + }), + even: createPositionalPseudo(function(matchIndexes, length2) { + var i4 = 0; + for (; i4 < length2; i4 += 2) { + matchIndexes.push(i4); + } + return matchIndexes; + }), + odd: createPositionalPseudo(function(matchIndexes, length2) { + var i4 = 1; + for (; i4 < length2; i4 += 2) { + matchIndexes.push(i4); + } + return matchIndexes; + }), + lt: createPositionalPseudo(function(matchIndexes, length2, argument) { + var i4; + if (argument < 0) { + i4 = argument + length2; + } else if (argument > length2) { + i4 = length2; + } else { + i4 = argument; + } + for (; --i4 >= 0; ) { + matchIndexes.push(i4); + } + return matchIndexes; + }), + gt: createPositionalPseudo(function(matchIndexes, length2, argument) { + var i4 = argument < 0 ? argument + length2 : argument; + for (; ++i4 < length2; ) { + matchIndexes.push(i4); + } + return matchIndexes; + }) + } + }; + Expr.pseudos.nth = Expr.pseudos.eq; + for (i3 in { radio: true, checkbox: true, file: true, password: true, image: true }) { + Expr.pseudos[i3] = createInputPseudo(i3); + } + for (i3 in { submit: true, reset: true }) { + Expr.pseudos[i3] = createButtonPseudo(i3); + } + function setFilters() { + } + setFilters.prototype = Expr.filters = Expr.pseudos; + Expr.setFilters = new setFilters(); + function tokenize3(selector, parseOnly) { + var matched, match3, tokens2, type3, soFar, groups2, preFilters, cached = tokenCache[selector + " "]; + if (cached) { + return parseOnly ? 0 : cached.slice(0); + } + soFar = selector; + groups2 = []; + preFilters = Expr.preFilter; + while (soFar) { + if (!matched || (match3 = rcomma.exec(soFar))) { + if (match3) { + soFar = soFar.slice(match3[0].length) || soFar; + } + groups2.push(tokens2 = []); + } + matched = false; + if (match3 = rleadingCombinator.exec(soFar)) { + matched = match3.shift(); + tokens2.push({ + value: matched, + // Cast descendant combinators to space + type: match3[0].replace(rtrimCSS, " ") + }); + soFar = soFar.slice(matched.length); + } + for (type3 in Expr.filter) { + if ((match3 = matchExpr[type3].exec(soFar)) && (!preFilters[type3] || (match3 = preFilters[type3](match3)))) { + matched = match3.shift(); + tokens2.push({ + value: matched, + type: type3, + matches: match3 + }); + soFar = soFar.slice(matched.length); + } + } + if (!matched) { + break; + } + } + if (parseOnly) { + return soFar.length; + } + return soFar ? find4.error(selector) : ( + // Cache the tokens + tokenCache(selector, groups2).slice(0) + ); + } + function toSelector(tokens2) { + var i4 = 0, len = tokens2.length, selector = ""; + for (; i4 < len; i4++) { + selector += tokens2[i4].value; + } + return selector; + } + function addCombinator(matcher, combinator, base) { + var dir3 = combinator.dir, skip = combinator.next, key = skip || dir3, checkNonElements = base && key === "parentNode", doneName = done++; + return combinator.first ? ( + // Check against closest ancestor/preceding element + function(elem, context2, xml2) { + while (elem = elem[dir3]) { + if (elem.nodeType === 1 || checkNonElements) { + return matcher(elem, context2, xml2); + } + } + return false; + } + ) : ( + // Check against all ancestor/preceding elements + function(elem, context2, xml2) { + var oldCache, outerCache, newCache = [dirruns, doneName]; + if (xml2) { + while (elem = elem[dir3]) { + if (elem.nodeType === 1 || checkNonElements) { + if (matcher(elem, context2, xml2)) { + return true; + } + } + } + } else { + while (elem = elem[dir3]) { + if (elem.nodeType === 1 || checkNonElements) { + outerCache = elem[expando] || (elem[expando] = {}); + if (skip && nodeName(elem, skip)) { + elem = elem[dir3] || elem; + } else if ((oldCache = outerCache[key]) && oldCache[0] === dirruns && oldCache[1] === doneName) { + return newCache[2] = oldCache[2]; + } else { + outerCache[key] = newCache; + if (newCache[2] = matcher(elem, context2, xml2)) { + return true; + } + } + } + } + } + return false; + } + ); + } + function elementMatcher(matchers) { + return matchers.length > 1 ? function(elem, context2, xml2) { + var i4 = matchers.length; + while (i4--) { + if (!matchers[i4](elem, context2, xml2)) { + return false; + } + } + return true; + } : matchers[0]; + } + function multipleContexts(selector, contexts, results) { + var i4 = 0, len = contexts.length; + for (; i4 < len; i4++) { + find4(selector, contexts[i4], results); + } + return results; + } + function condense(unmatched, map8, filter9, context2, xml2) { + var elem, newUnmatched = [], i4 = 0, len = unmatched.length, mapped = map8 != null; + for (; i4 < len; i4++) { + if (elem = unmatched[i4]) { + if (!filter9 || filter9(elem, context2, xml2)) { + newUnmatched.push(elem); + if (mapped) { + map8.push(i4); + } + } + } + } + return newUnmatched; + } + function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) { + if (postFilter && !postFilter[expando]) { + postFilter = setMatcher(postFilter); + } + if (postFinder && !postFinder[expando]) { + postFinder = setMatcher(postFinder, postSelector); + } + return markFunction(function(seed, results, context2, xml2) { + var temp, i4, elem, matcherOut, preMap = [], postMap = [], preexisting = results.length, elems = seed || multipleContexts( + selector || "*", + context2.nodeType ? [context2] : context2, + [] + ), matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context2, xml2) : elems; + if (matcher) { + matcherOut = postFinder || (seed ? preFilter : preexisting || postFilter) ? ( + // ...intermediate processing is necessary + [] + ) : ( + // ...otherwise use results directly + results + ); + matcher(matcherIn, matcherOut, context2, xml2); + } else { + matcherOut = matcherIn; + } + if (postFilter) { + temp = condense(matcherOut, postMap); + postFilter(temp, [], context2, xml2); + i4 = temp.length; + while (i4--) { + if (elem = temp[i4]) { + matcherOut[postMap[i4]] = !(matcherIn[postMap[i4]] = elem); + } + } + } + if (seed) { + if (postFinder || preFilter) { + if (postFinder) { + temp = []; + i4 = matcherOut.length; + while (i4--) { + if (elem = matcherOut[i4]) { + temp.push(matcherIn[i4] = elem); + } + } + postFinder(null, matcherOut = [], temp, xml2); + } + i4 = matcherOut.length; + while (i4--) { + if ((elem = matcherOut[i4]) && (temp = postFinder ? indexOf2.call(seed, elem) : preMap[i4]) > -1) { + seed[temp] = !(results[temp] = elem); + } + } + } + } else { + matcherOut = condense( + matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut + ); + if (postFinder) { + postFinder(null, results, matcherOut, xml2); + } else { + push4.apply(results, matcherOut); + } + } + }); + } + function matcherFromTokens(tokens2) { + var checkContext, matcher, j3, len = tokens2.length, leadingRelative = Expr.relative[tokens2[0].type], implicitRelative = leadingRelative || Expr.relative[" "], i4 = leadingRelative ? 1 : 0, matchContext = addCombinator(function(elem) { + return elem === checkContext; + }, implicitRelative, true), matchAnyContext = addCombinator(function(elem) { + return indexOf2.call(checkContext, elem) > -1; + }, implicitRelative, true), matchers = [function(elem, context2, xml2) { + var ret = !leadingRelative && (xml2 || context2 != outermostContext) || ((checkContext = context2).nodeType ? matchContext(elem, context2, xml2) : matchAnyContext(elem, context2, xml2)); + checkContext = null; + return ret; + }]; + for (; i4 < len; i4++) { + if (matcher = Expr.relative[tokens2[i4].type]) { + matchers = [addCombinator(elementMatcher(matchers), matcher)]; + } else { + matcher = Expr.filter[tokens2[i4].type].apply(null, tokens2[i4].matches); + if (matcher[expando]) { + j3 = ++i4; + for (; j3 < len; j3++) { + if (Expr.relative[tokens2[j3].type]) { + break; + } + } + return setMatcher( + i4 > 1 && elementMatcher(matchers), + i4 > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens2.slice(0, i4 - 1).concat({ value: tokens2[i4 - 2].type === " " ? "*" : "" }) + ).replace(rtrimCSS, "$1"), + matcher, + i4 < j3 && matcherFromTokens(tokens2.slice(i4, j3)), + j3 < len && matcherFromTokens(tokens2 = tokens2.slice(j3)), + j3 < len && toSelector(tokens2) + ); + } + matchers.push(matcher); + } + } + return elementMatcher(matchers); + } + function matcherFromGroupMatchers(elementMatchers, setMatchers) { + var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function(seed, context2, xml2, results, outermost) { + var elem, j3, matcher, matchedCount = 0, i4 = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, elems = seed || byElement && Expr.find.TAG("*", outermost), dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1, len = elems.length; + if (outermost) { + outermostContext = context2 == document3 || context2 || outermost; + } + for (; i4 !== len && (elem = elems[i4]) != null; i4++) { + if (byElement && elem) { + j3 = 0; + if (!context2 && elem.ownerDocument != document3) { + setDocument(elem); + xml2 = !documentIsHTML; + } + while (matcher = elementMatchers[j3++]) { + if (matcher(elem, context2 || document3, xml2)) { + push4.call(results, elem); + break; + } + } + if (outermost) { + dirruns = dirrunsUnique; + } + } + if (bySet) { + if (elem = !matcher && elem) { + matchedCount--; + } + if (seed) { + unmatched.push(elem); + } + } + } + matchedCount += i4; + if (bySet && i4 !== matchedCount) { + j3 = 0; + while (matcher = setMatchers[j3++]) { + matcher(unmatched, setMatched, context2, xml2); + } + if (seed) { + if (matchedCount > 0) { + while (i4--) { + if (!(unmatched[i4] || setMatched[i4])) { + setMatched[i4] = pop.call(results); + } + } + } + setMatched = condense(setMatched); + } + push4.apply(results, setMatched); + if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) { + jQuery.uniqueSort(results); + } + } + if (outermost) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + return unmatched; + }; + return bySet ? markFunction(superMatcher) : superMatcher; + } + function compile2(selector, match3) { + var i4, setMatchers = [], elementMatchers = [], cached = compilerCache[selector + " "]; + if (!cached) { + if (!match3) { + match3 = tokenize3(selector); + } + i4 = match3.length; + while (i4--) { + cached = matcherFromTokens(match3[i4]); + if (cached[expando]) { + setMatchers.push(cached); + } else { + elementMatchers.push(cached); + } + } + cached = compilerCache( + selector, + matcherFromGroupMatchers(elementMatchers, setMatchers) + ); + cached.selector = selector; + } + return cached; + } + function select(selector, context2, results, seed) { + var i4, tokens2, token2, type3, find5, compiled = typeof selector === "function" && selector, match3 = !seed && tokenize3(selector = compiled.selector || selector); + results = results || []; + if (match3.length === 1) { + tokens2 = match3[0] = match3[0].slice(0); + if (tokens2.length > 2 && (token2 = tokens2[0]).type === "ID" && context2.nodeType === 9 && documentIsHTML && Expr.relative[tokens2[1].type]) { + context2 = (Expr.find.ID( + token2.matches[0].replace(runescape, funescape), + context2 + ) || [])[0]; + if (!context2) { + return results; + } else if (compiled) { + context2 = context2.parentNode; + } + selector = selector.slice(tokens2.shift().value.length); + } + i4 = matchExpr.needsContext.test(selector) ? 0 : tokens2.length; + while (i4--) { + token2 = tokens2[i4]; + if (Expr.relative[type3 = token2.type]) { + break; + } + if (find5 = Expr.find[type3]) { + if (seed = find5( + token2.matches[0].replace(runescape, funescape), + rsibling.test(tokens2[0].type) && testContext(context2.parentNode) || context2 + )) { + tokens2.splice(i4, 1); + selector = seed.length && toSelector(tokens2); + if (!selector) { + push4.apply(results, seed); + return results; + } + break; + } + } + } + } + (compiled || compile2(selector, match3))( + seed, + context2, + !documentIsHTML, + results, + !context2 || rsibling.test(selector) && testContext(context2.parentNode) || context2 + ); + return results; + } + support.sortStable = expando.split("").sort(sortOrder).join("") === expando; + setDocument(); + support.sortDetached = assert(function(el) { + return el.compareDocumentPosition(document3.createElement("fieldset")) & 1; + }); + jQuery.find = find4; + jQuery.expr[":"] = jQuery.expr.pseudos; + jQuery.unique = jQuery.uniqueSort; + find4.compile = compile2; + find4.select = select; + find4.setDocument = setDocument; + find4.tokenize = tokenize3; + find4.escape = jQuery.escapeSelector; + find4.getText = jQuery.text; + find4.isXML = jQuery.isXMLDoc; + find4.selectors = jQuery.expr; + find4.support = jQuery.support; + find4.uniqueSort = jQuery.uniqueSort; + })(); + var dir2 = function(elem, dir3, until) { + var matched = [], truncate2 = until !== void 0; + while ((elem = elem[dir3]) && elem.nodeType !== 9) { + if (elem.nodeType === 1) { + if (truncate2 && jQuery(elem).is(until)) { + break; + } + matched.push(elem); + } + } + return matched; + }; + var siblings2 = function(n2, elem) { + var matched = []; + for (; n2; n2 = n2.nextSibling) { + if (n2.nodeType === 1 && n2 !== elem) { + matched.push(n2); + } + } + return matched; + }; + var rneedsContext = jQuery.expr.match.needsContext; + var rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; + function winnow(elements2, qualifier, not2) { + if (isFunction2(qualifier)) { + return jQuery.grep(elements2, function(elem, i3) { + return !!qualifier.call(elem, i3, elem) !== not2; + }); + } + if (qualifier.nodeType) { + return jQuery.grep(elements2, function(elem) { + return elem === qualifier !== not2; + }); + } + if (typeof qualifier !== "string") { + return jQuery.grep(elements2, function(elem) { + return indexOf2.call(qualifier, elem) > -1 !== not2; + }); + } + return jQuery.filter(qualifier, elements2, not2); + } + jQuery.filter = function(expr, elems, not2) { + var elem = elems[0]; + if (not2) { + expr = ":not(" + expr + ")"; + } + if (elems.length === 1 && elem.nodeType === 1) { + return jQuery.find.matchesSelector(elem, expr) ? [elem] : []; + } + return jQuery.find.matches(expr, jQuery.grep(elems, function(elem2) { + return elem2.nodeType === 1; + })); + }; + jQuery.fn.extend({ + find: function(selector) { + var i3, ret, len = this.length, self2 = this; + if (typeof selector !== "string") { + return this.pushStack(jQuery(selector).filter(function() { + for (i3 = 0; i3 < len; i3++) { + if (jQuery.contains(self2[i3], this)) { + return true; + } + } + })); + } + ret = this.pushStack([]); + for (i3 = 0; i3 < len; i3++) { + jQuery.find(selector, self2[i3], ret); + } + return len > 1 ? jQuery.uniqueSort(ret) : ret; + }, + filter: function(selector) { + return this.pushStack(winnow(this, selector || [], false)); + }, + not: function(selector) { + return this.pushStack(winnow(this, selector || [], true)); + }, + is: function(selector) { + return !!winnow( + this, + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], + false + ).length; + } + }); + var rootjQuery, rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, init4 = jQuery.fn.init = function(selector, context2, root3) { + var match3, elem; + if (!selector) { + return this; + } + root3 = root3 || rootjQuery; + if (typeof selector === "string") { + if (selector[0] === "<" && selector[selector.length - 1] === ">" && selector.length >= 3) { + match3 = [null, selector, null]; + } else { + match3 = rquickExpr.exec(selector); + } + if (match3 && (match3[1] || !context2)) { + if (match3[1]) { + context2 = context2 instanceof jQuery ? context2[0] : context2; + jQuery.merge(this, jQuery.parseHTML( + match3[1], + context2 && context2.nodeType ? context2.ownerDocument || context2 : document2, + true + )); + if (rsingleTag.test(match3[1]) && jQuery.isPlainObject(context2)) { + for (match3 in context2) { + if (isFunction2(this[match3])) { + this[match3](context2[match3]); + } else { + this.attr(match3, context2[match3]); + } + } + } + return this; + } else { + elem = document2.getElementById(match3[2]); + if (elem) { + this[0] = elem; + this.length = 1; + } + return this; + } + } else if (!context2 || context2.jquery) { + return (context2 || root3).find(selector); + } else { + return this.constructor(context2).find(selector); + } + } else if (selector.nodeType) { + this[0] = selector; + this.length = 1; + return this; + } else if (isFunction2(selector)) { + return root3.ready !== void 0 ? root3.ready(selector) : ( + // Execute immediately if ready is not present + selector(jQuery) + ); + } + return jQuery.makeArray(selector, this); + }; + init4.prototype = jQuery.fn; + rootjQuery = jQuery(document2); + var rparentsprev = /^(?:parents|prev(?:Until|All))/, guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + jQuery.fn.extend({ + has: function(target) { + var targets = jQuery(target, this), l4 = targets.length; + return this.filter(function() { + var i3 = 0; + for (; i3 < l4; i3++) { + if (jQuery.contains(this, targets[i3])) { + return true; + } + } + }); + }, + closest: function(selectors, context2) { + var cur, i3 = 0, l4 = this.length, matched = [], targets = typeof selectors !== "string" && jQuery(selectors); + if (!rneedsContext.test(selectors)) { + for (; i3 < l4; i3++) { + for (cur = this[i3]; cur && cur !== context2; cur = cur.parentNode) { + if (cur.nodeType < 11 && (targets ? targets.index(cur) > -1 : ( + // Don't pass non-elements to jQuery#find + cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors) + ))) { + matched.push(cur); + break; + } + } + } + } + return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched); + }, + // Determine the position of an element within the set + index: function(elem) { + if (!elem) { + return this[0] && this[0].parentNode ? this.first().prevAll().length : -1; + } + if (typeof elem === "string") { + return indexOf2.call(jQuery(elem), this[0]); + } + return indexOf2.call( + this, + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem + ); + }, + add: function(selector, context2) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge(this.get(), jQuery(selector, context2)) + ) + ); + }, + addBack: function(selector) { + return this.add( + selector == null ? this.prevObject : this.prevObject.filter(selector) + ); + } + }); + function sibling(cur, dir3) { + while ((cur = cur[dir3]) && cur.nodeType !== 1) { + } + return cur; + } + jQuery.each({ + parent: function(elem) { + var parent5 = elem.parentNode; + return parent5 && parent5.nodeType !== 11 ? parent5 : null; + }, + parents: function(elem) { + return dir2(elem, "parentNode"); + }, + parentsUntil: function(elem, _i, until) { + return dir2(elem, "parentNode", until); + }, + next: function(elem) { + return sibling(elem, "nextSibling"); + }, + prev: function(elem) { + return sibling(elem, "previousSibling"); + }, + nextAll: function(elem) { + return dir2(elem, "nextSibling"); + }, + prevAll: function(elem) { + return dir2(elem, "previousSibling"); + }, + nextUntil: function(elem, _i, until) { + return dir2(elem, "nextSibling", until); + }, + prevUntil: function(elem, _i, until) { + return dir2(elem, "previousSibling", until); + }, + siblings: function(elem) { + return siblings2((elem.parentNode || {}).firstChild, elem); + }, + children: function(elem) { + return siblings2(elem.firstChild); + }, + contents: function(elem) { + if (elem.contentDocument != null && // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto(elem.contentDocument)) { + return elem.contentDocument; + } + if (nodeName(elem, "template")) { + elem = elem.content || elem; + } + return jQuery.merge([], elem.childNodes); + } + }, function(name, fn3) { + jQuery.fn[name] = function(until, selector) { + var matched = jQuery.map(this, fn3, until); + if (name.slice(-5) !== "Until") { + selector = until; + } + if (selector && typeof selector === "string") { + matched = jQuery.filter(selector, matched); + } + if (this.length > 1) { + if (!guaranteedUnique[name]) { + jQuery.uniqueSort(matched); + } + if (rparentsprev.test(name)) { + matched.reverse(); + } + } + return this.pushStack(matched); + }; + }); + var rnothtmlwhite = /[^\x20\t\r\n\f]+/g; + function createOptions(options2) { + var object3 = {}; + jQuery.each(options2.match(rnothtmlwhite) || [], function(_3, flag) { + object3[flag] = true; + }); + return object3; + } + jQuery.Callbacks = function(options2) { + options2 = typeof options2 === "string" ? createOptions(options2) : jQuery.extend({}, options2); + var firing, memory, fired, locked, list = [], queue = [], firingIndex = -1, fire = function() { + locked = locked || options2.once; + fired = firing = true; + for (; queue.length; firingIndex = -1) { + memory = queue.shift(); + while (++firingIndex < list.length) { + if (list[firingIndex].apply(memory[0], memory[1]) === false && options2.stopOnFalse) { + firingIndex = list.length; + memory = false; + } + } + } + if (!options2.memory) { + memory = false; + } + firing = false; + if (locked) { + if (memory) { + list = []; + } else { + list = ""; + } + } + }, self2 = { + // Add a callback or a collection of callbacks to the list + add: function() { + if (list) { + if (memory && !firing) { + firingIndex = list.length - 1; + queue.push(memory); + } + (function add6(args) { + jQuery.each(args, function(_3, arg) { + if (isFunction2(arg)) { + if (!options2.unique || !self2.has(arg)) { + list.push(arg); + } + } else if (arg && arg.length && toType(arg) !== "string") { + add6(arg); + } + }); + })(arguments); + if (memory && !firing) { + fire(); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + jQuery.each(arguments, function(_3, arg) { + var index2; + while ((index2 = jQuery.inArray(arg, list, index2)) > -1) { + list.splice(index2, 1); + if (index2 <= firingIndex) { + firingIndex--; + } + } + }); + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function(fn3) { + return fn3 ? jQuery.inArray(fn3, list) > -1 : list.length > 0; + }, + // Remove all callbacks from the list + empty: function() { + if (list) { + list = []; + } + return this; + }, + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if (!memory && !firing) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + // Call all callbacks with the given context and arguments + fireWith: function(context2, args) { + if (!locked) { + args = args || []; + args = [context2, args.slice ? args.slice() : args]; + queue.push(args); + if (!firing) { + fire(); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self2.fireWith(this, arguments); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + return self2; + }; + function Identity(v6) { + return v6; + } + function Thrower(ex) { + throw ex; + } + function adoptValue(value2, resolve2, reject3, noValue) { + var method2; + try { + if (value2 && isFunction2(method2 = value2.promise)) { + method2.call(value2).done(resolve2).fail(reject3); + } else if (value2 && isFunction2(method2 = value2.then)) { + method2.call(value2, resolve2, reject3); + } else { + resolve2.apply(void 0, [value2].slice(noValue)); + } + } catch (value3) { + reject3.apply(void 0, [value3]); + } + } + jQuery.extend({ + Deferred: function(func) { + var tuples = [ + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ + "notify", + "progress", + jQuery.Callbacks("memory"), + jQuery.Callbacks("memory"), + 2 + ], + [ + "resolve", + "done", + jQuery.Callbacks("once memory"), + jQuery.Callbacks("once memory"), + 0, + "resolved" + ], + [ + "reject", + "fail", + jQuery.Callbacks("once memory"), + jQuery.Callbacks("once memory"), + 1, + "rejected" + ] + ], state4 = "pending", promise4 = { + state: function() { + return state4; + }, + always: function() { + deferred.done(arguments).fail(arguments); + return this; + }, + "catch": function(fn3) { + return promise4.then(null, fn3); + }, + // Keep pipe for back-compat + pipe: function() { + var fns = arguments; + return jQuery.Deferred(function(newDefer) { + jQuery.each(tuples, function(_i, tuple) { + var fn3 = isFunction2(fns[tuple[4]]) && fns[tuple[4]]; + deferred[tuple[1]](function() { + var returned = fn3 && fn3.apply(this, arguments); + if (returned && isFunction2(returned.promise)) { + returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject); + } else { + newDefer[tuple[0] + "With"]( + this, + fn3 ? [returned] : arguments + ); + } + }); + }); + fns = null; + }).promise(); + }, + then: function(onFulfilled, onRejected, onProgress) { + var maxDepth = 0; + function resolve2(depth, deferred2, handler, special) { + return function() { + var that = this, args = arguments, mightThrow = function() { + var returned, then2; + if (depth < maxDepth) { + return; + } + returned = handler.apply(that, args); + if (returned === deferred2.promise()) { + throw new TypeError("Thenable self-resolution"); + } + then2 = returned && // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + (typeof returned === "object" || typeof returned === "function") && returned.then; + if (isFunction2(then2)) { + if (special) { + then2.call( + returned, + resolve2(maxDepth, deferred2, Identity, special), + resolve2(maxDepth, deferred2, Thrower, special) + ); + } else { + maxDepth++; + then2.call( + returned, + resolve2(maxDepth, deferred2, Identity, special), + resolve2(maxDepth, deferred2, Thrower, special), + resolve2( + maxDepth, + deferred2, + Identity, + deferred2.notifyWith + ) + ); + } + } else { + if (handler !== Identity) { + that = void 0; + args = [returned]; + } + (special || deferred2.resolveWith)(that, args); + } + }, process2 = special ? mightThrow : function() { + try { + mightThrow(); + } catch (e3) { + if (jQuery.Deferred.exceptionHook) { + jQuery.Deferred.exceptionHook( + e3, + process2.error + ); + } + if (depth + 1 >= maxDepth) { + if (handler !== Thrower) { + that = void 0; + args = [e3]; + } + deferred2.rejectWith(that, args); + } + } + }; + if (depth) { + process2(); + } else { + if (jQuery.Deferred.getErrorHook) { + process2.error = jQuery.Deferred.getErrorHook(); + } else if (jQuery.Deferred.getStackHook) { + process2.error = jQuery.Deferred.getStackHook(); + } + window3.setTimeout(process2); + } + }; + } + return jQuery.Deferred(function(newDefer) { + tuples[0][3].add( + resolve2( + 0, + newDefer, + isFunction2(onProgress) ? onProgress : Identity, + newDefer.notifyWith + ) + ); + tuples[1][3].add( + resolve2( + 0, + newDefer, + isFunction2(onFulfilled) ? onFulfilled : Identity + ) + ); + tuples[2][3].add( + resolve2( + 0, + newDefer, + isFunction2(onRejected) ? onRejected : Thrower + ) + ); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function(obj) { + return obj != null ? jQuery.extend(obj, promise4) : promise4; + } + }, deferred = {}; + jQuery.each(tuples, function(i3, tuple) { + var list = tuple[2], stateString = tuple[5]; + promise4[tuple[1]] = list.add; + if (stateString) { + list.add( + function() { + state4 = stateString; + }, + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[3 - i3][2].disable, + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[3 - i3][3].disable, + // progress_callbacks.lock + tuples[0][2].lock, + // progress_handlers.lock + tuples[0][3].lock + ); + } + list.add(tuple[3].fire); + deferred[tuple[0]] = function() { + deferred[tuple[0] + "With"](this === deferred ? void 0 : this, arguments); + return this; + }; + deferred[tuple[0] + "With"] = list.fireWith; + }); + promise4.promise(deferred); + if (func) { + func.call(deferred, deferred); + } + return deferred; + }, + // Deferred helper + when: function(singleValue) { + var remaining = arguments.length, i3 = remaining, resolveContexts = Array(i3), resolveValues = slice8.call(arguments), primary = jQuery.Deferred(), updateFunc = function(i4) { + return function(value2) { + resolveContexts[i4] = this; + resolveValues[i4] = arguments.length > 1 ? slice8.call(arguments) : value2; + if (!--remaining) { + primary.resolveWith(resolveContexts, resolveValues); + } + }; + }; + if (remaining <= 1) { + adoptValue( + singleValue, + primary.done(updateFunc(i3)).resolve, + primary.reject, + !remaining + ); + if (primary.state() === "pending" || isFunction2(resolveValues[i3] && resolveValues[i3].then)) { + return primary.then(); + } + } + while (i3--) { + adoptValue(resolveValues[i3], updateFunc(i3), primary.reject); + } + return primary.promise(); + } + }); + var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + jQuery.Deferred.exceptionHook = function(error3, asyncError) { + if (window3.console && window3.console.warn && error3 && rerrorNames.test(error3.name)) { + window3.console.warn( + "jQuery.Deferred exception: " + error3.message, + error3.stack, + asyncError + ); + } + }; + jQuery.readyException = function(error3) { + window3.setTimeout(function() { + throw error3; + }); + }; + var readyList = jQuery.Deferred(); + jQuery.fn.ready = function(fn3) { + readyList.then(fn3).catch(function(error3) { + jQuery.readyException(error3); + }); + return this; + }; + jQuery.extend({ + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + // A counter to track how many items to wait for before + // the ready event fires. See trac-6781 + readyWait: 1, + // Handle when the DOM is ready + ready: function(wait) { + if (wait === true ? --jQuery.readyWait : jQuery.isReady) { + return; + } + jQuery.isReady = true; + if (wait !== true && --jQuery.readyWait > 0) { + return; + } + readyList.resolveWith(document2, [jQuery]); + } + }); + jQuery.ready.then = readyList.then; + function completed2() { + document2.removeEventListener("DOMContentLoaded", completed2); + window3.removeEventListener("load", completed2); + jQuery.ready(); + } + if (document2.readyState === "complete" || document2.readyState !== "loading" && !document2.documentElement.doScroll) { + window3.setTimeout(jQuery.ready); + } else { + document2.addEventListener("DOMContentLoaded", completed2); + window3.addEventListener("load", completed2); + } + var access = function(elems, fn3, key, value2, chainable, emptyGet, raw) { + var i3 = 0, len = elems.length, bulk = key == null; + if (toType(key) === "object") { + chainable = true; + for (i3 in key) { + access(elems, fn3, i3, key[i3], true, emptyGet, raw); + } + } else if (value2 !== void 0) { + chainable = true; + if (!isFunction2(value2)) { + raw = true; + } + if (bulk) { + if (raw) { + fn3.call(elems, value2); + fn3 = null; + } else { + bulk = fn3; + fn3 = function(elem, _key, value3) { + return bulk.call(jQuery(elem), value3); + }; + } + } + if (fn3) { + for (; i3 < len; i3++) { + fn3( + elems[i3], + key, + raw ? value2 : value2.call(elems[i3], i3, fn3(elems[i3], key)) + ); + } + } + } + if (chainable) { + return elems; + } + if (bulk) { + return fn3.call(elems); + } + return len ? fn3(elems[0], key) : emptyGet; + }; + var rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g; + function fcamelCase(_all, letter) { + return letter.toUpperCase(); + } + function camelCase2(string3) { + return string3.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase); + } + var acceptData = function(owner) { + return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType; + }; + function Data() { + this.expando = jQuery.expando + Data.uid++; + } + Data.uid = 1; + Data.prototype = { + cache: function(owner) { + var value2 = owner[this.expando]; + if (!value2) { + value2 = {}; + if (acceptData(owner)) { + if (owner.nodeType) { + owner[this.expando] = value2; + } else { + Object.defineProperty(owner, this.expando, { + value: value2, + configurable: true + }); + } + } + } + return value2; + }, + set: function(owner, data6, value2) { + var prop, cache3 = this.cache(owner); + if (typeof data6 === "string") { + cache3[camelCase2(data6)] = value2; + } else { + for (prop in data6) { + cache3[camelCase2(prop)] = data6[prop]; + } + } + return cache3; + }, + get: function(owner, key) { + return key === void 0 ? this.cache(owner) : ( + // Always use camelCase key (gh-2257) + owner[this.expando] && owner[this.expando][camelCase2(key)] + ); + }, + access: function(owner, key, value2) { + if (key === void 0 || key && typeof key === "string" && value2 === void 0) { + return this.get(owner, key); + } + this.set(owner, key, value2); + return value2 !== void 0 ? value2 : key; + }, + remove: function(owner, key) { + var i3, cache3 = owner[this.expando]; + if (cache3 === void 0) { + return; + } + if (key !== void 0) { + if (Array.isArray(key)) { + key = key.map(camelCase2); + } else { + key = camelCase2(key); + key = key in cache3 ? [key] : key.match(rnothtmlwhite) || []; + } + i3 = key.length; + while (i3--) { + delete cache3[key[i3]]; + } + } + if (key === void 0 || jQuery.isEmptyObject(cache3)) { + if (owner.nodeType) { + owner[this.expando] = void 0; + } else { + delete owner[this.expando]; + } + } + }, + hasData: function(owner) { + var cache3 = owner[this.expando]; + return cache3 !== void 0 && !jQuery.isEmptyObject(cache3); + } + }; + var dataPriv = new Data(); + var dataUser = new Data(); + var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /[A-Z]/g; + function getData3(data6) { + if (data6 === "true") { + return true; + } + if (data6 === "false") { + return false; + } + if (data6 === "null") { + return null; + } + if (data6 === +data6 + "") { + return +data6; + } + if (rbrace.test(data6)) { + return JSON.parse(data6); + } + return data6; + } + function dataAttr(elem, key, data6) { + var name; + if (data6 === void 0 && elem.nodeType === 1) { + name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase(); + data6 = elem.getAttribute(name); + if (typeof data6 === "string") { + try { + data6 = getData3(data6); + } catch (e3) { + } + dataUser.set(elem, key, data6); + } else { + data6 = void 0; + } + } + return data6; + } + jQuery.extend({ + hasData: function(elem) { + return dataUser.hasData(elem) || dataPriv.hasData(elem); + }, + data: function(elem, name, data6) { + return dataUser.access(elem, name, data6); + }, + removeData: function(elem, name) { + dataUser.remove(elem, name); + }, + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function(elem, name, data6) { + return dataPriv.access(elem, name, data6); + }, + _removeData: function(elem, name) { + dataPriv.remove(elem, name); + } + }); + jQuery.fn.extend({ + data: function(key, value2) { + var i3, name, data6, elem = this[0], attrs = elem && elem.attributes; + if (key === void 0) { + if (this.length) { + data6 = dataUser.get(elem); + if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) { + i3 = attrs.length; + while (i3--) { + if (attrs[i3]) { + name = attrs[i3].name; + if (name.indexOf("data-") === 0) { + name = camelCase2(name.slice(5)); + dataAttr(elem, name, data6[name]); + } + } + } + dataPriv.set(elem, "hasDataAttrs", true); + } + } + return data6; + } + if (typeof key === "object") { + return this.each(function() { + dataUser.set(this, key); + }); + } + return access(this, function(value3) { + var data7; + if (elem && value3 === void 0) { + data7 = dataUser.get(elem, key); + if (data7 !== void 0) { + return data7; + } + data7 = dataAttr(elem, key); + if (data7 !== void 0) { + return data7; + } + return; + } + this.each(function() { + dataUser.set(this, key, value3); + }); + }, null, value2, arguments.length > 1, null, true); + }, + removeData: function(key) { + return this.each(function() { + dataUser.remove(this, key); + }); + } + }); + jQuery.extend({ + queue: function(elem, type3, data6) { + var queue; + if (elem) { + type3 = (type3 || "fx") + "queue"; + queue = dataPriv.get(elem, type3); + if (data6) { + if (!queue || Array.isArray(data6)) { + queue = dataPriv.access(elem, type3, jQuery.makeArray(data6)); + } else { + queue.push(data6); + } + } + return queue || []; + } + }, + dequeue: function(elem, type3) { + type3 = type3 || "fx"; + var queue = jQuery.queue(elem, type3), startLength = queue.length, fn3 = queue.shift(), hooks = jQuery._queueHooks(elem, type3), next3 = function() { + jQuery.dequeue(elem, type3); + }; + if (fn3 === "inprogress") { + fn3 = queue.shift(); + startLength--; + } + if (fn3) { + if (type3 === "fx") { + queue.unshift("inprogress"); + } + delete hooks.stop; + fn3.call(elem, next3, hooks); + } + if (!startLength && hooks) { + hooks.empty.fire(); + } + }, + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function(elem, type3) { + var key = type3 + "queueHooks"; + return dataPriv.get(elem, key) || dataPriv.access(elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + dataPriv.remove(elem, [type3 + "queue", key]); + }) + }); + } + }); + jQuery.fn.extend({ + queue: function(type3, data6) { + var setter = 2; + if (typeof type3 !== "string") { + data6 = type3; + type3 = "fx"; + setter--; + } + if (arguments.length < setter) { + return jQuery.queue(this[0], type3); + } + return data6 === void 0 ? this : this.each(function() { + var queue = jQuery.queue(this, type3, data6); + jQuery._queueHooks(this, type3); + if (type3 === "fx" && queue[0] !== "inprogress") { + jQuery.dequeue(this, type3); + } + }); + }, + dequeue: function(type3) { + return this.each(function() { + jQuery.dequeue(this, type3); + }); + }, + clearQueue: function(type3) { + return this.queue(type3 || "fx", []); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function(type3, obj) { + var tmp, count3 = 1, defer2 = jQuery.Deferred(), elements2 = this, i3 = this.length, resolve2 = function() { + if (!--count3) { + defer2.resolveWith(elements2, [elements2]); + } + }; + if (typeof type3 !== "string") { + obj = type3; + type3 = void 0; + } + type3 = type3 || "fx"; + while (i3--) { + tmp = dataPriv.get(elements2[i3], type3 + "queueHooks"); + if (tmp && tmp.empty) { + count3++; + tmp.empty.add(resolve2); + } + } + resolve2(); + return defer2.promise(obj); + } + }); + var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source; + var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i"); + var cssExpand = ["Top", "Right", "Bottom", "Left"]; + var documentElement = document2.documentElement; + var isAttached = function(elem) { + return jQuery.contains(elem.ownerDocument, elem); + }, composed = { composed: true }; + if (documentElement.getRootNode) { + isAttached = function(elem) { + return jQuery.contains(elem.ownerDocument, elem) || elem.getRootNode(composed) === elem.ownerDocument; + }; + } + var isHiddenWithinTree = function(elem, el) { + elem = el || elem; + return elem.style.display === "none" || elem.style.display === "" && // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached(elem) && jQuery.css(elem, "display") === "none"; + }; + function adjustCSS(elem, prop, valueParts, tween) { + var adjusted, scale2, maxIterations = 20, currentValue = tween ? function() { + return tween.cur(); + } : function() { + return jQuery.css(elem, prop, ""); + }, initial2 = currentValue(), unit2 = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"), initialInUnit = elem.nodeType && (jQuery.cssNumber[prop] || unit2 !== "px" && +initial2) && rcssNum.exec(jQuery.css(elem, prop)); + if (initialInUnit && initialInUnit[3] !== unit2) { + initial2 = initial2 / 2; + unit2 = unit2 || initialInUnit[3]; + initialInUnit = +initial2 || 1; + while (maxIterations--) { + jQuery.style(elem, prop, initialInUnit + unit2); + if ((1 - scale2) * (1 - (scale2 = currentValue() / initial2 || 0.5)) <= 0) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale2; + } + initialInUnit = initialInUnit * 2; + jQuery.style(elem, prop, initialInUnit + unit2); + valueParts = valueParts || []; + } + if (valueParts) { + initialInUnit = +initialInUnit || +initial2 || 0; + adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2]; + if (tween) { + tween.unit = unit2; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; + } + var defaultDisplayMap = {}; + function getDefaultDisplay(elem) { + var temp, doc = elem.ownerDocument, nodeName2 = elem.nodeName, display = defaultDisplayMap[nodeName2]; + if (display) { + return display; + } + temp = doc.body.appendChild(doc.createElement(nodeName2)); + display = jQuery.css(temp, "display"); + temp.parentNode.removeChild(temp); + if (display === "none") { + display = "block"; + } + defaultDisplayMap[nodeName2] = display; + return display; + } + function showHide(elements2, show2) { + var display, elem, values2 = [], index2 = 0, length2 = elements2.length; + for (; index2 < length2; index2++) { + elem = elements2[index2]; + if (!elem.style) { + continue; + } + display = elem.style.display; + if (show2) { + if (display === "none") { + values2[index2] = dataPriv.get(elem, "display") || null; + if (!values2[index2]) { + elem.style.display = ""; + } + } + if (elem.style.display === "" && isHiddenWithinTree(elem)) { + values2[index2] = getDefaultDisplay(elem); + } + } else { + if (display !== "none") { + values2[index2] = "none"; + dataPriv.set(elem, "display", display); + } + } + } + for (index2 = 0; index2 < length2; index2++) { + if (values2[index2] != null) { + elements2[index2].style.display = values2[index2]; + } + } + return elements2; + } + jQuery.fn.extend({ + show: function() { + return showHide(this, true); + }, + hide: function() { + return showHide(this); + }, + toggle: function(state4) { + if (typeof state4 === "boolean") { + return state4 ? this.show() : this.hide(); + } + return this.each(function() { + if (isHiddenWithinTree(this)) { + jQuery(this).show(); + } else { + jQuery(this).hide(); + } + }); + } + }); + var rcheckableType = /^(?:checkbox|radio)$/i; + var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i; + var rscriptType = /^$|^module$|\/(?:java|ecma)script/i; + (function() { + var fragment = document2.createDocumentFragment(), div = fragment.appendChild(document2.createElement("div")), input = document2.createElement("input"); + input.setAttribute("type", "radio"); + input.setAttribute("checked", "checked"); + input.setAttribute("name", "t"); + div.appendChild(input); + support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked; + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue; + div.innerHTML = ""; + support.option = !!div.lastChild; + })(); + var wrapMap = { + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [1, "", "
"], + col: [2, "", "
"], + tr: [2, "", "
"], + td: [3, "", "
"], + _default: [0, "", ""] + }; + wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; + wrapMap.th = wrapMap.td; + if (!support.option) { + wrapMap.optgroup = wrapMap.option = [1, ""]; + } + function getAll(context2, tag) { + var ret; + if (typeof context2.getElementsByTagName !== "undefined") { + ret = context2.getElementsByTagName(tag || "*"); + } else if (typeof context2.querySelectorAll !== "undefined") { + ret = context2.querySelectorAll(tag || "*"); + } else { + ret = []; + } + if (tag === void 0 || tag && nodeName(context2, tag)) { + return jQuery.merge([context2], ret); + } + return ret; + } + function setGlobalEval(elems, refElements) { + var i3 = 0, l4 = elems.length; + for (; i3 < l4; i3++) { + dataPriv.set( + elems[i3], + "globalEval", + !refElements || dataPriv.get(refElements[i3], "globalEval") + ); + } + } + var rhtml = /<|&#?\w+;/; + function buildFragment(elems, context2, scripts, selection2, ignored) { + var elem, tmp, tag, wrap4, attached, j3, fragment = context2.createDocumentFragment(), nodes5 = [], i3 = 0, l4 = elems.length; + for (; i3 < l4; i3++) { + elem = elems[i3]; + if (elem || elem === 0) { + if (toType(elem) === "object") { + jQuery.merge(nodes5, elem.nodeType ? [elem] : elem); + } else if (!rhtml.test(elem)) { + nodes5.push(context2.createTextNode(elem)); + } else { + tmp = tmp || fragment.appendChild(context2.createElement("div")); + tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase(); + wrap4 = wrapMap[tag] || wrapMap._default; + tmp.innerHTML = wrap4[1] + jQuery.htmlPrefilter(elem) + wrap4[2]; + j3 = wrap4[0]; + while (j3--) { + tmp = tmp.lastChild; + } + jQuery.merge(nodes5, tmp.childNodes); + tmp = fragment.firstChild; + tmp.textContent = ""; + } + } + } + fragment.textContent = ""; + i3 = 0; + while (elem = nodes5[i3++]) { + if (selection2 && jQuery.inArray(elem, selection2) > -1) { + if (ignored) { + ignored.push(elem); + } + continue; + } + attached = isAttached(elem); + tmp = getAll(fragment.appendChild(elem), "script"); + if (attached) { + setGlobalEval(tmp); + } + if (scripts) { + j3 = 0; + while (elem = tmp[j3++]) { + if (rscriptType.test(elem.type || "")) { + scripts.push(elem); + } + } + } + } + return fragment; + } + var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + function returnTrue2() { + return true; + } + function returnFalse2() { + return false; + } + function on3(elem, types, selector, data6, fn3, one4) { + var origFn, type3; + if (typeof types === "object") { + if (typeof selector !== "string") { + data6 = data6 || selector; + selector = void 0; + } + for (type3 in types) { + on3(elem, type3, selector, data6, types[type3], one4); + } + return elem; + } + if (data6 == null && fn3 == null) { + fn3 = selector; + data6 = selector = void 0; + } else if (fn3 == null) { + if (typeof selector === "string") { + fn3 = data6; + data6 = void 0; + } else { + fn3 = data6; + data6 = selector; + selector = void 0; + } + } + if (fn3 === false) { + fn3 = returnFalse2; + } else if (!fn3) { + return elem; + } + if (one4 === 1) { + origFn = fn3; + fn3 = function(event3) { + jQuery().off(event3); + return origFn.apply(this, arguments); + }; + fn3.guid = origFn.guid || (origFn.guid = jQuery.guid++); + } + return elem.each(function() { + jQuery.event.add(this, types, fn3, data6, selector); + }); + } + jQuery.event = { + global: {}, + add: function(elem, types, handler, data6, selector) { + var handleObjIn, eventHandle, tmp, events, t4, handleObj, special, handlers, type3, namespaces, origType, elemData = dataPriv.get(elem); + if (!acceptData(elem)) { + return; + } + if (handler.handler) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + if (selector) { + jQuery.find.matchesSelector(documentElement, selector); + } + if (!handler.guid) { + handler.guid = jQuery.guid++; + } + if (!(events = elemData.events)) { + events = elemData.events = /* @__PURE__ */ Object.create(null); + } + if (!(eventHandle = elemData.handle)) { + eventHandle = elemData.handle = function(e3) { + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e3.type ? jQuery.event.dispatch.apply(elem, arguments) : void 0; + }; + } + types = (types || "").match(rnothtmlwhite) || [""]; + t4 = types.length; + while (t4--) { + tmp = rtypenamespace.exec(types[t4]) || []; + type3 = origType = tmp[1]; + namespaces = (tmp[2] || "").split(".").sort(); + if (!type3) { + continue; + } + special = jQuery.event.special[type3] || {}; + type3 = (selector ? special.delegateType : special.bindType) || type3; + special = jQuery.event.special[type3] || {}; + handleObj = jQuery.extend({ + type: type3, + origType, + data: data6, + handler, + guid: handler.guid, + selector, + needsContext: selector && jQuery.expr.match.needsContext.test(selector), + namespace: namespaces.join(".") + }, handleObjIn); + if (!(handlers = events[type3])) { + handlers = events[type3] = []; + handlers.delegateCount = 0; + if (!special.setup || special.setup.call(elem, data6, namespaces, eventHandle) === false) { + if (elem.addEventListener) { + elem.addEventListener(type3, eventHandle); + } + } + } + if (special.add) { + special.add.call(elem, handleObj); + if (!handleObj.handler.guid) { + handleObj.handler.guid = handler.guid; + } + } + if (selector) { + handlers.splice(handlers.delegateCount++, 0, handleObj); + } else { + handlers.push(handleObj); + } + jQuery.event.global[type3] = true; + } + }, + // Detach an event or set of events from an element + remove: function(elem, types, handler, selector, mappedTypes) { + var j3, origCount, tmp, events, t4, handleObj, special, handlers, type3, namespaces, origType, elemData = dataPriv.hasData(elem) && dataPriv.get(elem); + if (!elemData || !(events = elemData.events)) { + return; + } + types = (types || "").match(rnothtmlwhite) || [""]; + t4 = types.length; + while (t4--) { + tmp = rtypenamespace.exec(types[t4]) || []; + type3 = origType = tmp[1]; + namespaces = (tmp[2] || "").split(".").sort(); + if (!type3) { + for (type3 in events) { + jQuery.event.remove(elem, type3 + types[t4], handler, selector, true); + } + continue; + } + special = jQuery.event.special[type3] || {}; + type3 = (selector ? special.delegateType : special.bindType) || type3; + handlers = events[type3] || []; + tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)"); + origCount = j3 = handlers.length; + while (j3--) { + handleObj = handlers[j3]; + if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) { + handlers.splice(j3, 1); + if (handleObj.selector) { + handlers.delegateCount--; + } + if (special.remove) { + special.remove.call(elem, handleObj); + } + } + } + if (origCount && !handlers.length) { + if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) { + jQuery.removeEvent(elem, type3, elemData.handle); + } + delete events[type3]; + } + } + if (jQuery.isEmptyObject(events)) { + dataPriv.remove(elem, "handle events"); + } + }, + dispatch: function(nativeEvent) { + var i3, j3, ret, matched, handleObj, handlerQueue, args = new Array(arguments.length), event3 = jQuery.event.fix(nativeEvent), handlers = (dataPriv.get(this, "events") || /* @__PURE__ */ Object.create(null))[event3.type] || [], special = jQuery.event.special[event3.type] || {}; + args[0] = event3; + for (i3 = 1; i3 < arguments.length; i3++) { + args[i3] = arguments[i3]; + } + event3.delegateTarget = this; + if (special.preDispatch && special.preDispatch.call(this, event3) === false) { + return; + } + handlerQueue = jQuery.event.handlers.call(this, event3, handlers); + i3 = 0; + while ((matched = handlerQueue[i3++]) && !event3.isPropagationStopped()) { + event3.currentTarget = matched.elem; + j3 = 0; + while ((handleObj = matched.handlers[j3++]) && !event3.isImmediatePropagationStopped()) { + if (!event3.rnamespace || handleObj.namespace === false || event3.rnamespace.test(handleObj.namespace)) { + event3.handleObj = handleObj; + event3.data = handleObj.data; + ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args); + if (ret !== void 0) { + if ((event3.result = ret) === false) { + event3.preventDefault(); + event3.stopPropagation(); + } + } + } + } + } + if (special.postDispatch) { + special.postDispatch.call(this, event3); + } + return event3.result; + }, + handlers: function(event3, handlers) { + var i3, handleObj, sel, matchedHandlers, matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event3.target; + if (delegateCount && // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !(event3.type === "click" && event3.button >= 1)) { + for (; cur !== this; cur = cur.parentNode || this) { + if (cur.nodeType === 1 && !(event3.type === "click" && cur.disabled === true)) { + matchedHandlers = []; + matchedSelectors = {}; + for (i3 = 0; i3 < delegateCount; i3++) { + handleObj = handlers[i3]; + sel = handleObj.selector + " "; + if (matchedSelectors[sel] === void 0) { + matchedSelectors[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length; + } + if (matchedSelectors[sel]) { + matchedHandlers.push(handleObj); + } + } + if (matchedHandlers.length) { + handlerQueue.push({ elem: cur, handlers: matchedHandlers }); + } + } + } + } + cur = this; + if (delegateCount < handlers.length) { + handlerQueue.push({ elem: cur, handlers: handlers.slice(delegateCount) }); + } + return handlerQueue; + }, + addProp: function(name, hook2) { + Object.defineProperty(jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + get: isFunction2(hook2) ? function() { + if (this.originalEvent) { + return hook2(this.originalEvent); + } + } : function() { + if (this.originalEvent) { + return this.originalEvent[name]; + } + }, + set: function(value2) { + Object.defineProperty(this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value2 + }); + } + }); + }, + fix: function(originalEvent) { + return originalEvent[jQuery.expando] ? originalEvent : new jQuery.Event(originalEvent); + }, + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + // Utilize native event to ensure correct state for checkable inputs + setup: function(data6) { + var el = this || data6; + if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) { + leverageNative(el, "click", true); + } + return false; + }, + trigger: function(data6) { + var el = this || data6; + if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) { + leverageNative(el, "click"); + } + return true; + }, + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function(event3) { + var target = event3.target; + return rcheckableType.test(target.type) && target.click && nodeName(target, "input") && dataPriv.get(target, "click") || nodeName(target, "a"); + } + }, + beforeunload: { + postDispatch: function(event3) { + if (event3.result !== void 0 && event3.originalEvent) { + event3.originalEvent.returnValue = event3.result; + } + } + } + } + }; + function leverageNative(el, type3, isSetup) { + if (!isSetup) { + if (dataPriv.get(el, type3) === void 0) { + jQuery.event.add(el, type3, returnTrue2); + } + return; + } + dataPriv.set(el, type3, false); + jQuery.event.add(el, type3, { + namespace: false, + handler: function(event3) { + var result2, saved = dataPriv.get(this, type3); + if (event3.isTrigger & 1 && this[type3]) { + if (!saved) { + saved = slice8.call(arguments); + dataPriv.set(this, type3, saved); + this[type3](); + result2 = dataPriv.get(this, type3); + dataPriv.set(this, type3, false); + if (saved !== result2) { + event3.stopImmediatePropagation(); + event3.preventDefault(); + return result2; + } + } else if ((jQuery.event.special[type3] || {}).delegateType) { + event3.stopPropagation(); + } + } else if (saved) { + dataPriv.set(this, type3, jQuery.event.trigger( + saved[0], + saved.slice(1), + this + )); + event3.stopPropagation(); + event3.isImmediatePropagationStopped = returnTrue2; + } + } + }); + } + jQuery.removeEvent = function(elem, type3, handle) { + if (elem.removeEventListener) { + elem.removeEventListener(type3, handle); + } + }; + jQuery.Event = function(src, props) { + if (!(this instanceof jQuery.Event)) { + return new jQuery.Event(src, props); + } + if (src && src.type) { + this.originalEvent = src; + this.type = src.type; + this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === void 0 && // Support: Android <=2.3 only + src.returnValue === false ? returnTrue2 : returnFalse2; + this.target = src.target && src.target.nodeType === 3 ? src.target.parentNode : src.target; + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + } else { + this.type = src; + } + if (props) { + jQuery.extend(this, props); + } + this.timeStamp = src && src.timeStamp || Date.now(); + this[jQuery.expando] = true; + }; + jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse2, + isPropagationStopped: returnFalse2, + isImmediatePropagationStopped: returnFalse2, + isSimulated: false, + preventDefault: function() { + var e3 = this.originalEvent; + this.isDefaultPrevented = returnTrue2; + if (e3 && !this.isSimulated) { + e3.preventDefault(); + } + }, + stopPropagation: function() { + var e3 = this.originalEvent; + this.isPropagationStopped = returnTrue2; + if (e3 && !this.isSimulated) { + e3.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e3 = this.originalEvent; + this.isImmediatePropagationStopped = returnTrue2; + if (e3 && !this.isSimulated) { + e3.stopImmediatePropagation(); + } + this.stopPropagation(); + } + }; + jQuery.each({ + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true + }, jQuery.event.addProp); + jQuery.each({ focus: "focusin", blur: "focusout" }, function(type3, delegateType) { + function focusMappedHandler(nativeEvent) { + if (document2.documentMode) { + var handle = dataPriv.get(this, "handle"), event3 = jQuery.event.fix(nativeEvent); + event3.type = nativeEvent.type === "focusin" ? "focus" : "blur"; + event3.isSimulated = true; + handle(nativeEvent); + if (event3.target === event3.currentTarget) { + handle(event3); + } + } else { + jQuery.event.simulate( + delegateType, + nativeEvent.target, + jQuery.event.fix(nativeEvent) + ); + } + } + jQuery.event.special[type3] = { + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + var attaches; + leverageNative(this, type3, true); + if (document2.documentMode) { + attaches = dataPriv.get(this, delegateType); + if (!attaches) { + this.addEventListener(delegateType, focusMappedHandler); + } + dataPriv.set(this, delegateType, (attaches || 0) + 1); + } else { + return false; + } + }, + trigger: function() { + leverageNative(this, type3); + return true; + }, + teardown: function() { + var attaches; + if (document2.documentMode) { + attaches = dataPriv.get(this, delegateType) - 1; + if (!attaches) { + this.removeEventListener(delegateType, focusMappedHandler); + dataPriv.remove(this, delegateType); + } else { + dataPriv.set(this, delegateType, attaches); + } + } else { + return false; + } + }, + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function(event3) { + return dataPriv.get(event3.target, type3); + }, + delegateType + }; + jQuery.event.special[delegateType] = { + setup: function() { + var doc = this.ownerDocument || this.document || this, dataHolder = document2.documentMode ? this : doc, attaches = dataPriv.get(dataHolder, delegateType); + if (!attaches) { + if (document2.documentMode) { + this.addEventListener(delegateType, focusMappedHandler); + } else { + doc.addEventListener(type3, focusMappedHandler, true); + } + } + dataPriv.set(dataHolder, delegateType, (attaches || 0) + 1); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, dataHolder = document2.documentMode ? this : doc, attaches = dataPriv.get(dataHolder, delegateType) - 1; + if (!attaches) { + if (document2.documentMode) { + this.removeEventListener(delegateType, focusMappedHandler); + } else { + doc.removeEventListener(type3, focusMappedHandler, true); + } + dataPriv.remove(dataHolder, delegateType); + } else { + dataPriv.set(dataHolder, delegateType, attaches); + } + } + }; + }); + jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" + }, function(orig, fix) { + jQuery.event.special[orig] = { + delegateType: fix, + bindType: fix, + handle: function(event3) { + var ret, target = this, related = event3.relatedTarget, handleObj = event3.handleObj; + if (!related || related !== target && !jQuery.contains(target, related)) { + event3.type = handleObj.origType; + ret = handleObj.handler.apply(this, arguments); + event3.type = fix; + } + return ret; + } + }; + }); + jQuery.fn.extend({ + on: function(types, selector, data6, fn3) { + return on3(this, types, selector, data6, fn3); + }, + one: function(types, selector, data6, fn3) { + return on3(this, types, selector, data6, fn3, 1); + }, + off: function(types, selector, fn3) { + var handleObj, type3; + if (types && types.preventDefault && types.handleObj) { + handleObj = types.handleObj; + jQuery(types.delegateTarget).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if (typeof types === "object") { + for (type3 in types) { + this.off(type3, selector, types[type3]); + } + return this; + } + if (selector === false || typeof selector === "function") { + fn3 = selector; + selector = void 0; + } + if (fn3 === false) { + fn3 = returnFalse2; + } + return this.each(function() { + jQuery.event.remove(this, types, fn3, selector); + }); + } + }); + var rnoInnerhtml = /\s*$/g; + function manipulationTarget(elem, content) { + if (nodeName(elem, "table") && nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr")) { + return jQuery(elem).children("tbody")[0] || elem; + } + return elem; + } + function disableScript(elem) { + elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; + return elem; + } + function restoreScript(elem) { + if ((elem.type || "").slice(0, 5) === "true/") { + elem.type = elem.type.slice(5); + } else { + elem.removeAttribute("type"); + } + return elem; + } + function cloneCopyEvent(src, dest) { + var i3, l4, type3, pdataOld, udataOld, udataCur, events; + if (dest.nodeType !== 1) { + return; + } + if (dataPriv.hasData(src)) { + pdataOld = dataPriv.get(src); + events = pdataOld.events; + if (events) { + dataPriv.remove(dest, "handle events"); + for (type3 in events) { + for (i3 = 0, l4 = events[type3].length; i3 < l4; i3++) { + jQuery.event.add(dest, type3, events[type3][i3]); + } + } + } + } + if (dataUser.hasData(src)) { + udataOld = dataUser.access(src); + udataCur = jQuery.extend({}, udataOld); + dataUser.set(dest, udataCur); + } + } + function fixInput(src, dest) { + var nodeName2 = dest.nodeName.toLowerCase(); + if (nodeName2 === "input" && rcheckableType.test(src.type)) { + dest.checked = src.checked; + } else if (nodeName2 === "input" || nodeName2 === "textarea") { + dest.defaultValue = src.defaultValue; + } + } + function domManip(collection4, args, callback, ignored) { + args = flat(args); + var fragment, first3, scripts, hasScripts, node2, doc, i3 = 0, l4 = collection4.length, iNoClone = l4 - 1, value2 = args[0], valueIsFunction = isFunction2(value2); + if (valueIsFunction || l4 > 1 && typeof value2 === "string" && !support.checkClone && rchecked.test(value2)) { + return collection4.each(function(index2) { + var self2 = collection4.eq(index2); + if (valueIsFunction) { + args[0] = value2.call(this, index2, self2.html()); + } + domManip(self2, args, callback, ignored); + }); + } + if (l4) { + fragment = buildFragment(args, collection4[0].ownerDocument, false, collection4, ignored); + first3 = fragment.firstChild; + if (fragment.childNodes.length === 1) { + fragment = first3; + } + if (first3 || ignored) { + scripts = jQuery.map(getAll(fragment, "script"), disableScript); + hasScripts = scripts.length; + for (; i3 < l4; i3++) { + node2 = fragment; + if (i3 !== iNoClone) { + node2 = jQuery.clone(node2, true, true); + if (hasScripts) { + jQuery.merge(scripts, getAll(node2, "script")); + } + } + callback.call(collection4[i3], node2, i3); + } + if (hasScripts) { + doc = scripts[scripts.length - 1].ownerDocument; + jQuery.map(scripts, restoreScript); + for (i3 = 0; i3 < hasScripts; i3++) { + node2 = scripts[i3]; + if (rscriptType.test(node2.type || "") && !dataPriv.access(node2, "globalEval") && jQuery.contains(doc, node2)) { + if (node2.src && (node2.type || "").toLowerCase() !== "module") { + if (jQuery._evalUrl && !node2.noModule) { + jQuery._evalUrl(node2.src, { + nonce: node2.nonce || node2.getAttribute("nonce") + }, doc); + } + } else { + DOMEval(node2.textContent.replace(rcleanScript, ""), node2, doc); + } + } + } + } + } + } + return collection4; + } + function remove4(elem, selector, keepData) { + var node2, nodes5 = selector ? jQuery.filter(selector, elem) : elem, i3 = 0; + for (; (node2 = nodes5[i3]) != null; i3++) { + if (!keepData && node2.nodeType === 1) { + jQuery.cleanData(getAll(node2)); + } + if (node2.parentNode) { + if (keepData && isAttached(node2)) { + setGlobalEval(getAll(node2, "script")); + } + node2.parentNode.removeChild(node2); + } + } + return elem; + } + jQuery.extend({ + htmlPrefilter: function(html3) { + return html3; + }, + clone: function(elem, dataAndEvents, deepDataAndEvents) { + var i3, l4, srcElements, destElements, clone7 = elem.cloneNode(true), inPage = isAttached(elem); + if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) { + destElements = getAll(clone7); + srcElements = getAll(elem); + for (i3 = 0, l4 = srcElements.length; i3 < l4; i3++) { + fixInput(srcElements[i3], destElements[i3]); + } + } + if (dataAndEvents) { + if (deepDataAndEvents) { + srcElements = srcElements || getAll(elem); + destElements = destElements || getAll(clone7); + for (i3 = 0, l4 = srcElements.length; i3 < l4; i3++) { + cloneCopyEvent(srcElements[i3], destElements[i3]); + } + } else { + cloneCopyEvent(elem, clone7); + } + } + destElements = getAll(clone7, "script"); + if (destElements.length > 0) { + setGlobalEval(destElements, !inPage && getAll(elem, "script")); + } + return clone7; + }, + cleanData: function(elems) { + var data6, elem, type3, special = jQuery.event.special, i3 = 0; + for (; (elem = elems[i3]) !== void 0; i3++) { + if (acceptData(elem)) { + if (data6 = elem[dataPriv.expando]) { + if (data6.events) { + for (type3 in data6.events) { + if (special[type3]) { + jQuery.event.remove(elem, type3); + } else { + jQuery.removeEvent(elem, type3, data6.handle); + } + } + } + elem[dataPriv.expando] = void 0; + } + if (elem[dataUser.expando]) { + elem[dataUser.expando] = void 0; + } + } + } + } + }); + jQuery.fn.extend({ + detach: function(selector) { + return remove4(this, selector, true); + }, + remove: function(selector) { + return remove4(this, selector); + }, + text: function(value2) { + return access(this, function(value3) { + return value3 === void 0 ? jQuery.text(this) : this.empty().each(function() { + if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { + this.textContent = value3; + } + }); + }, null, value2, arguments.length); + }, + append: function() { + return domManip(this, arguments, function(elem) { + if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { + var target = manipulationTarget(this, elem); + target.appendChild(elem); + } + }); + }, + prepend: function() { + return domManip(this, arguments, function(elem) { + if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { + var target = manipulationTarget(this, elem); + target.insertBefore(elem, target.firstChild); + } + }); + }, + before: function() { + return domManip(this, arguments, function(elem) { + if (this.parentNode) { + this.parentNode.insertBefore(elem, this); + } + }); + }, + after: function() { + return domManip(this, arguments, function(elem) { + if (this.parentNode) { + this.parentNode.insertBefore(elem, this.nextSibling); + } + }); + }, + empty: function() { + var elem, i3 = 0; + for (; (elem = this[i3]) != null; i3++) { + if (elem.nodeType === 1) { + jQuery.cleanData(getAll(elem, false)); + elem.textContent = ""; + } + } + return this; + }, + clone: function(dataAndEvents, deepDataAndEvents) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + return this.map(function() { + return jQuery.clone(this, dataAndEvents, deepDataAndEvents); + }); + }, + html: function(value2) { + return access(this, function(value3) { + var elem = this[0] || {}, i3 = 0, l4 = this.length; + if (value3 === void 0 && elem.nodeType === 1) { + return elem.innerHTML; + } + if (typeof value3 === "string" && !rnoInnerhtml.test(value3) && !wrapMap[(rtagName.exec(value3) || ["", ""])[1].toLowerCase()]) { + value3 = jQuery.htmlPrefilter(value3); + try { + for (; i3 < l4; i3++) { + elem = this[i3] || {}; + if (elem.nodeType === 1) { + jQuery.cleanData(getAll(elem, false)); + elem.innerHTML = value3; + } + } + elem = 0; + } catch (e3) { + } + } + if (elem) { + this.empty().append(value3); + } + }, null, value2, arguments.length); + }, + replaceWith: function() { + var ignored = []; + return domManip(this, arguments, function(elem) { + var parent5 = this.parentNode; + if (jQuery.inArray(this, ignored) < 0) { + jQuery.cleanData(getAll(this)); + if (parent5) { + parent5.replaceChild(elem, this); + } + } + }, ignored); + } + }); + jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" + }, function(name, original) { + jQuery.fn[name] = function(selector) { + var elems, ret = [], insert = jQuery(selector), last3 = insert.length - 1, i3 = 0; + for (; i3 <= last3; i3++) { + elems = i3 === last3 ? this : this.clone(true); + jQuery(insert[i3])[original](elems); + push3.apply(ret, elems.get()); + } + return this.pushStack(ret); + }; + }); + var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i"); + var rcustomProp = /^--/; + var getStyles20 = function(elem) { + var view = elem.ownerDocument.defaultView; + if (!view || !view.opener) { + view = window3; + } + return view.getComputedStyle(elem); + }; + var swap = function(elem, options2, callback) { + var ret, name, old = {}; + for (name in options2) { + old[name] = elem.style[name]; + elem.style[name] = options2[name]; + } + ret = callback.call(elem); + for (name in options2) { + elem.style[name] = old[name]; + } + return ret; + }; + var rboxStyle = new RegExp(cssExpand.join("|"), "i"); + (function() { + function computeStyleTests() { + if (!div) { + return; + } + container2.style.cssText = "position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0"; + div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%"; + documentElement.appendChild(container2).appendChild(div); + var divStyle = window3.getComputedStyle(div); + pixelPositionVal = divStyle.top !== "1%"; + reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12; + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36; + boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36; + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures(div.offsetWidth / 3) === 12; + documentElement.removeChild(container2); + div = null; + } + function roundPixelMeasures(measure) { + return Math.round(parseFloat(measure)); + } + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, reliableTrDimensionsVal, reliableMarginLeftVal, container2 = document2.createElement("div"), div = document2.createElement("div"); + if (!div.style) { + return; + } + div.style.backgroundClip = "content-box"; + div.cloneNode(true).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + jQuery.extend(support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if (reliableTrDimensionsVal == null) { + table = document2.createElement("table"); + tr = document2.createElement("tr"); + trChild = document2.createElement("div"); + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "box-sizing:content-box;border:1px solid"; + tr.style.height = "1px"; + trChild.style.height = "9px"; + trChild.style.display = "block"; + documentElement.appendChild(table).appendChild(tr).appendChild(trChild); + trStyle = window3.getComputedStyle(tr); + reliableTrDimensionsVal = parseInt(trStyle.height, 10) + parseInt(trStyle.borderTopWidth, 10) + parseInt(trStyle.borderBottomWidth, 10) === tr.offsetHeight; + documentElement.removeChild(table); + } + return reliableTrDimensionsVal; + } + }); + })(); + function curCSS(elem, name, computed) { + var width3, minWidth, maxWidth2, ret, isCustomProp = rcustomProp.test(name), style3 = elem.style; + computed = computed || getStyles20(elem); + if (computed) { + ret = computed.getPropertyValue(name) || computed[name]; + if (isCustomProp && ret) { + ret = ret.replace(rtrimCSS, "$1") || void 0; + } + if (ret === "" && !isAttached(elem)) { + ret = jQuery.style(elem, name); + } + if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) { + width3 = style3.width; + minWidth = style3.minWidth; + maxWidth2 = style3.maxWidth; + style3.minWidth = style3.maxWidth = style3.width = ret; + ret = computed.width; + style3.width = width3; + style3.minWidth = minWidth; + style3.maxWidth = maxWidth2; + } + } + return ret !== void 0 ? ( + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" + ) : ret; + } + function addGetHookIf(conditionFn, hookFn) { + return { + get: function() { + if (conditionFn()) { + delete this.get; + return; + } + return (this.get = hookFn).apply(this, arguments); + } + }; + } + var cssPrefixes = ["Webkit", "Moz", "ms"], emptyStyle = document2.createElement("div").style, vendorProps = {}; + function vendorPropName(name) { + var capName = name[0].toUpperCase() + name.slice(1), i3 = cssPrefixes.length; + while (i3--) { + name = cssPrefixes[i3] + capName; + if (name in emptyStyle) { + return name; + } + } + } + function finalPropName(name) { + var final = jQuery.cssProps[name] || vendorProps[name]; + if (final) { + return final; + } + if (name in emptyStyle) { + return name; + } + return vendorProps[name] = vendorPropName(name) || name; + } + var rdisplayswap = /^(none|table(?!-c[ea]).+)/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + function setPositiveNumber(_elem, value2, subtract2) { + var matches34 = rcssNum.exec(value2); + return matches34 ? ( + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max(0, matches34[2] - (subtract2 || 0)) + (matches34[3] || "px") + ) : value2; + } + function boxModelAdjustment(elem, dimension, box, isBorderBox, styles4, computedVal) { + var i3 = dimension === "width" ? 1 : 0, extra = 0, delta = 0, marginDelta = 0; + if (box === (isBorderBox ? "border" : "content")) { + return 0; + } + for (; i3 < 4; i3 += 2) { + if (box === "margin") { + marginDelta += jQuery.css(elem, box + cssExpand[i3], true, styles4); + } + if (!isBorderBox) { + delta += jQuery.css(elem, "padding" + cssExpand[i3], true, styles4); + if (box !== "padding") { + delta += jQuery.css(elem, "border" + cssExpand[i3] + "Width", true, styles4); + } else { + extra += jQuery.css(elem, "border" + cssExpand[i3] + "Width", true, styles4); + } + } else { + if (box === "content") { + delta -= jQuery.css(elem, "padding" + cssExpand[i3], true, styles4); + } + if (box !== "margin") { + delta -= jQuery.css(elem, "border" + cssExpand[i3] + "Width", true, styles4); + } + } + } + if (!isBorderBox && computedVal >= 0) { + delta += Math.max(0, Math.ceil( + elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - computedVal - delta - extra - 0.5 + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + )) || 0; + } + return delta + marginDelta; + } + function getWidthOrHeight(elem, dimension, extra) { + var styles4 = getStyles20(elem), boxSizingNeeded = !support.boxSizingReliable() || extra, isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles4) === "border-box", valueIsBorderBox = isBorderBox, val = curCSS(elem, dimension, styles4), offsetProp = "offset" + dimension[0].toUpperCase() + dimension.slice(1); + if (rnumnonpx.test(val)) { + if (!extra) { + return val; + } + val = "auto"; + } + if ((!support.boxSizingReliable() && isBorderBox || // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName(elem, "tr") || // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat(val) && jQuery.css(elem, "display", false, styles4) === "inline") && // Make sure the element is visible & connected + elem.getClientRects().length) { + isBorderBox = jQuery.css(elem, "boxSizing", false, styles4) === "border-box"; + valueIsBorderBox = offsetProp in elem; + if (valueIsBorderBox) { + val = elem[offsetProp]; + } + } + val = parseFloat(val) || 0; + return val + boxModelAdjustment( + elem, + dimension, + extra || (isBorderBox ? "border" : "content"), + valueIsBorderBox, + styles4, + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + "px"; + } + jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function(elem, computed) { + if (computed) { + var ret = curCSS(elem, "opacity"); + return ret === "" ? "1" : ret; + } + } + } + }, + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + animationIterationCount: true, + aspectRatio: true, + borderImageSlice: true, + columnCount: true, + flexGrow: true, + flexShrink: true, + fontWeight: true, + gridArea: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnStart: true, + gridRow: true, + gridRowEnd: true, + gridRowStart: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + scale: true, + widows: true, + zIndex: true, + zoom: true, + // SVG-related + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeMiterlimit: true, + strokeOpacity: true + }, + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + // Get and set the style property on a DOM Node + style: function(elem, name, value2, extra) { + if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) { + return; + } + var ret, type3, hooks, origName = camelCase2(name), isCustomProp = rcustomProp.test(name), style3 = elem.style; + if (!isCustomProp) { + name = finalPropName(origName); + } + hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; + if (value2 !== void 0) { + type3 = typeof value2; + if (type3 === "string" && (ret = rcssNum.exec(value2)) && ret[1]) { + value2 = adjustCSS(elem, name, ret); + type3 = "number"; + } + if (value2 == null || value2 !== value2) { + return; + } + if (type3 === "number" && !isCustomProp) { + value2 += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px"); + } + if (!support.clearCloneStyle && value2 === "" && name.indexOf("background") === 0) { + style3[name] = "inherit"; + } + if (!hooks || !("set" in hooks) || (value2 = hooks.set(elem, value2, extra)) !== void 0) { + if (isCustomProp) { + style3.setProperty(name, value2); + } else { + style3[name] = value2; + } + } + } else { + if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== void 0) { + return ret; + } + return style3[name]; + } + }, + css: function(elem, name, extra, styles4) { + var val, num, hooks, origName = camelCase2(name), isCustomProp = rcustomProp.test(name); + if (!isCustomProp) { + name = finalPropName(origName); + } + hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; + if (hooks && "get" in hooks) { + val = hooks.get(elem, true, extra); + } + if (val === void 0) { + val = curCSS(elem, name, styles4); + } + if (val === "normal" && name in cssNormalTransform) { + val = cssNormalTransform[name]; + } + if (extra === "" || extra) { + num = parseFloat(val); + return extra === true || isFinite(num) ? num || 0 : val; + } + return val; + } + }); + jQuery.each(["height", "width"], function(_i, dimension) { + jQuery.cssHooks[dimension] = { + get: function(elem, computed, extra) { + if (computed) { + return rdisplayswap.test(jQuery.css(elem, "display")) && // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + (!elem.getClientRects().length || !elem.getBoundingClientRect().width) ? swap(elem, cssShow, function() { + return getWidthOrHeight(elem, dimension, extra); + }) : getWidthOrHeight(elem, dimension, extra); + } + }, + set: function(elem, value2, extra) { + var matches34, styles4 = getStyles20(elem), scrollboxSizeBuggy = !support.scrollboxSize() && styles4.position === "absolute", boxSizingNeeded = scrollboxSizeBuggy || extra, isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles4) === "border-box", subtract2 = extra ? boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles4 + ) : 0; + if (isBorderBox && scrollboxSizeBuggy) { + subtract2 -= Math.ceil( + elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - parseFloat(styles4[dimension]) - boxModelAdjustment(elem, dimension, "border", false, styles4) - 0.5 + ); + } + if (subtract2 && (matches34 = rcssNum.exec(value2)) && (matches34[3] || "px") !== "px") { + elem.style[dimension] = value2; + value2 = jQuery.css(elem, dimension); + } + return setPositiveNumber(elem, value2, subtract2); + } + }; + }); + jQuery.cssHooks.marginLeft = addGetHookIf( + support.reliableMarginLeft, + function(elem, computed) { + if (computed) { + return (parseFloat(curCSS(elem, "marginLeft")) || elem.getBoundingClientRect().left - swap(elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + })) + "px"; + } + } + ); + jQuery.each({ + margin: "", + padding: "", + border: "Width" + }, function(prefix2, suffix) { + jQuery.cssHooks[prefix2 + suffix] = { + expand: function(value2) { + var i3 = 0, expanded = {}, parts = typeof value2 === "string" ? value2.split(" ") : [value2]; + for (; i3 < 4; i3++) { + expanded[prefix2 + cssExpand[i3] + suffix] = parts[i3] || parts[i3 - 2] || parts[0]; + } + return expanded; + } + }; + if (prefix2 !== "margin") { + jQuery.cssHooks[prefix2 + suffix].set = setPositiveNumber; + } + }); + jQuery.fn.extend({ + css: function(name, value2) { + return access(this, function(elem, name2, value3) { + var styles4, len, map8 = {}, i3 = 0; + if (Array.isArray(name2)) { + styles4 = getStyles20(elem); + len = name2.length; + for (; i3 < len; i3++) { + map8[name2[i3]] = jQuery.css(elem, name2[i3], false, styles4); + } + return map8; + } + return value3 !== void 0 ? jQuery.style(elem, name2, value3) : jQuery.css(elem, name2); + }, name, value2, arguments.length > 1); + } + }); + function Tween(elem, options2, prop, end2, easing) { + return new Tween.prototype.init(elem, options2, prop, end2, easing); + } + jQuery.Tween = Tween; + Tween.prototype = { + constructor: Tween, + init: function(elem, options2, prop, end2, easing, unit2) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options2; + this.start = this.now = this.cur(); + this.end = end2; + this.unit = unit2 || (jQuery.cssNumber[prop] ? "" : "px"); + }, + cur: function() { + var hooks = Tween.propHooks[this.prop]; + return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this); + }, + run: function(percent) { + var eased, hooks = Tween.propHooks[this.prop]; + if (this.options.duration) { + this.pos = eased = jQuery.easing[this.easing]( + percent, + this.options.duration * percent, + 0, + 1, + this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = (this.end - this.start) * eased + this.start; + if (this.options.step) { + this.options.step.call(this.elem, this.now, this); + } + if (hooks && hooks.set) { + hooks.set(this); + } else { + Tween.propHooks._default.set(this); + } + return this; + } + }; + Tween.prototype.init.prototype = Tween.prototype; + Tween.propHooks = { + _default: { + get: function(tween) { + var result2; + if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) { + return tween.elem[tween.prop]; + } + result2 = jQuery.css(tween.elem, tween.prop, ""); + return !result2 || result2 === "auto" ? 0 : result2; + }, + set: function(tween) { + if (jQuery.fx.step[tween.prop]) { + jQuery.fx.step[tween.prop](tween); + } else if (tween.elem.nodeType === 1 && (jQuery.cssHooks[tween.prop] || tween.elem.style[finalPropName(tween.prop)] != null)) { + jQuery.style(tween.elem, tween.prop, tween.now + tween.unit); + } else { + tween.elem[tween.prop] = tween.now; + } + } + } + }; + Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function(tween) { + if (tween.elem.nodeType && tween.elem.parentNode) { + tween.elem[tween.prop] = tween.now; + } + } + }; + jQuery.easing = { + linear: function(p3) { + return p3; + }, + swing: function(p3) { + return 0.5 - Math.cos(p3 * Math.PI) / 2; + }, + _default: "swing" + }; + jQuery.fx = Tween.prototype.init; + jQuery.fx.step = {}; + var fxNow, inProgress, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/; + function schedule() { + if (inProgress) { + if (document2.hidden === false && window3.requestAnimationFrame) { + window3.requestAnimationFrame(schedule); + } else { + window3.setTimeout(schedule, jQuery.fx.interval); + } + jQuery.fx.tick(); + } + } + function createFxNow() { + window3.setTimeout(function() { + fxNow = void 0; + }); + return fxNow = Date.now(); + } + function genFx(type3, includeWidth) { + var which, i3 = 0, attrs = { height: type3 }; + includeWidth = includeWidth ? 1 : 0; + for (; i3 < 4; i3 += 2 - includeWidth) { + which = cssExpand[i3]; + attrs["margin" + which] = attrs["padding" + which] = type3; + } + if (includeWidth) { + attrs.opacity = attrs.width = type3; + } + return attrs; + } + function createTween(value2, prop, animation2) { + var tween, collection4 = (Animation3.tweeners[prop] || []).concat(Animation3.tweeners["*"]), index2 = 0, length2 = collection4.length; + for (; index2 < length2; index2++) { + if (tween = collection4[index2].call(animation2, prop, value2)) { + return tween; + } + } + } + function defaultPrefilter(elem, props, opts) { + var prop, value2, toggle, hooks, oldfire, propTween, restoreDisplay, display, isBox = "width" in props || "height" in props, anim = this, orig = {}, style3 = elem.style, hidden = elem.nodeType && isHiddenWithinTree(elem), dataShow = dataPriv.get(elem, "fxshow"); + if (!opts.queue) { + hooks = jQuery._queueHooks(elem, "fx"); + if (hooks.unqueued == null) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if (!hooks.unqueued) { + oldfire(); + } + }; + } + hooks.unqueued++; + anim.always(function() { + anim.always(function() { + hooks.unqueued--; + if (!jQuery.queue(elem, "fx").length) { + hooks.empty.fire(); + } + }); + }); + } + for (prop in props) { + value2 = props[prop]; + if (rfxtypes.test(value2)) { + delete props[prop]; + toggle = toggle || value2 === "toggle"; + if (value2 === (hidden ? "hide" : "show")) { + if (value2 === "show" && dataShow && dataShow[prop] !== void 0) { + hidden = true; + } else { + continue; + } + } + orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop); + } + } + propTween = !jQuery.isEmptyObject(props); + if (!propTween && jQuery.isEmptyObject(orig)) { + return; + } + if (isBox && elem.nodeType === 1) { + opts.overflow = [style3.overflow, style3.overflowX, style3.overflowY]; + restoreDisplay = dataShow && dataShow.display; + if (restoreDisplay == null) { + restoreDisplay = dataPriv.get(elem, "display"); + } + display = jQuery.css(elem, "display"); + if (display === "none") { + if (restoreDisplay) { + display = restoreDisplay; + } else { + showHide([elem], true); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css(elem, "display"); + showHide([elem]); + } + } + if (display === "inline" || display === "inline-block" && restoreDisplay != null) { + if (jQuery.css(elem, "float") === "none") { + if (!propTween) { + anim.done(function() { + style3.display = restoreDisplay; + }); + if (restoreDisplay == null) { + display = style3.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style3.display = "inline-block"; + } + } + } + if (opts.overflow) { + style3.overflow = "hidden"; + anim.always(function() { + style3.overflow = opts.overflow[0]; + style3.overflowX = opts.overflow[1]; + style3.overflowY = opts.overflow[2]; + }); + } + propTween = false; + for (prop in orig) { + if (!propTween) { + if (dataShow) { + if ("hidden" in dataShow) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access(elem, "fxshow", { display: restoreDisplay }); + } + if (toggle) { + dataShow.hidden = !hidden; + } + if (hidden) { + showHide([elem], true); + } + anim.done(function() { + if (!hidden) { + showHide([elem]); + } + dataPriv.remove(elem, "fxshow"); + for (prop in orig) { + jQuery.style(elem, prop, orig[prop]); + } + }); + } + propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim); + if (!(prop in dataShow)) { + dataShow[prop] = propTween.start; + if (hidden) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } + } + function propFilter(props, specialEasing) { + var index2, name, easing, value2, hooks; + for (index2 in props) { + name = camelCase2(index2); + easing = specialEasing[name]; + value2 = props[index2]; + if (Array.isArray(value2)) { + easing = value2[1]; + value2 = props[index2] = value2[0]; + } + if (index2 !== name) { + props[name] = value2; + delete props[index2]; + } + hooks = jQuery.cssHooks[name]; + if (hooks && "expand" in hooks) { + value2 = hooks.expand(value2); + delete props[name]; + for (index2 in value2) { + if (!(index2 in props)) { + props[index2] = value2[index2]; + specialEasing[index2] = easing; + } + } + } else { + specialEasing[name] = easing; + } + } + } + function Animation3(elem, properties, options2) { + var result2, stopped, index2 = 0, length2 = Animation3.prefilters.length, deferred = jQuery.Deferred().always(function() { + delete tick.elem; + }), tick = function() { + if (stopped) { + return false; + } + var currentTime2 = fxNow || createFxNow(), remaining = Math.max(0, animation2.startTime + animation2.duration - currentTime2), temp = remaining / animation2.duration || 0, percent = 1 - temp, index3 = 0, length3 = animation2.tweens.length; + for (; index3 < length3; index3++) { + animation2.tweens[index3].run(percent); + } + deferred.notifyWith(elem, [animation2, percent, remaining]); + if (percent < 1 && length3) { + return remaining; + } + if (!length3) { + deferred.notifyWith(elem, [animation2, 1, 0]); + } + deferred.resolveWith(elem, [animation2]); + return false; + }, animation2 = deferred.promise({ + elem, + props: jQuery.extend({}, properties), + opts: jQuery.extend(true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options2), + originalProperties: properties, + originalOptions: options2, + startTime: fxNow || createFxNow(), + duration: options2.duration, + tweens: [], + createTween: function(prop, end2) { + var tween = jQuery.Tween( + elem, + animation2.opts, + prop, + end2, + animation2.opts.specialEasing[prop] || animation2.opts.easing + ); + animation2.tweens.push(tween); + return tween; + }, + stop: function(gotoEnd) { + var index3 = 0, length3 = gotoEnd ? animation2.tweens.length : 0; + if (stopped) { + return this; + } + stopped = true; + for (; index3 < length3; index3++) { + animation2.tweens[index3].run(1); + } + if (gotoEnd) { + deferred.notifyWith(elem, [animation2, 1, 0]); + deferred.resolveWith(elem, [animation2, gotoEnd]); + } else { + deferred.rejectWith(elem, [animation2, gotoEnd]); + } + return this; + } + }), props = animation2.props; + propFilter(props, animation2.opts.specialEasing); + for (; index2 < length2; index2++) { + result2 = Animation3.prefilters[index2].call(animation2, elem, props, animation2.opts); + if (result2) { + if (isFunction2(result2.stop)) { + jQuery._queueHooks(animation2.elem, animation2.opts.queue).stop = result2.stop.bind(result2); + } + return result2; + } + } + jQuery.map(props, createTween, animation2); + if (isFunction2(animation2.opts.start)) { + animation2.opts.start.call(elem, animation2); + } + animation2.progress(animation2.opts.progress).done(animation2.opts.done, animation2.opts.complete).fail(animation2.opts.fail).always(animation2.opts.always); + jQuery.fx.timer( + jQuery.extend(tick, { + elem, + anim: animation2, + queue: animation2.opts.queue + }) + ); + return animation2; + } + jQuery.Animation = jQuery.extend(Animation3, { + tweeners: { + "*": [function(prop, value2) { + var tween = this.createTween(prop, value2); + adjustCSS(tween.elem, prop, rcssNum.exec(value2), tween); + return tween; + }] + }, + tweener: function(props, callback) { + if (isFunction2(props)) { + callback = props; + props = ["*"]; + } else { + props = props.match(rnothtmlwhite); + } + var prop, index2 = 0, length2 = props.length; + for (; index2 < length2; index2++) { + prop = props[index2]; + Animation3.tweeners[prop] = Animation3.tweeners[prop] || []; + Animation3.tweeners[prop].unshift(callback); + } + }, + prefilters: [defaultPrefilter], + prefilter: function(callback, prepend) { + if (prepend) { + Animation3.prefilters.unshift(callback); + } else { + Animation3.prefilters.push(callback); + } + } + }); + jQuery.speed = function(speed, easing, fn3) { + var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : { + complete: fn3 || !fn3 && easing || isFunction2(speed) && speed, + duration: speed, + easing: fn3 && easing || easing && !isFunction2(easing) && easing + }; + if (jQuery.fx.off) { + opt.duration = 0; + } else { + if (typeof opt.duration !== "number") { + if (opt.duration in jQuery.fx.speeds) { + opt.duration = jQuery.fx.speeds[opt.duration]; + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + if (opt.queue == null || opt.queue === true) { + opt.queue = "fx"; + } + opt.old = opt.complete; + opt.complete = function() { + if (isFunction2(opt.old)) { + opt.old.call(this); + } + if (opt.queue) { + jQuery.dequeue(this, opt.queue); + } + }; + return opt; + }; + jQuery.fn.extend({ + fadeTo: function(speed, to, easing, callback) { + return this.filter(isHiddenWithinTree).css("opacity", 0).show().end().animate({ opacity: to }, speed, easing, callback); + }, + animate: function(prop, speed, easing, callback) { + var empty3 = jQuery.isEmptyObject(prop), optall = jQuery.speed(speed, easing, callback), doAnimation = function() { + var anim = Animation3(this, jQuery.extend({}, prop), optall); + if (empty3 || dataPriv.get(this, "finish")) { + anim.stop(true); + } + }; + doAnimation.finish = doAnimation; + return empty3 || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation); + }, + stop: function(type3, clearQueue2, gotoEnd) { + var stopQueue = function(hooks) { + var stop5 = hooks.stop; + delete hooks.stop; + stop5(gotoEnd); + }; + if (typeof type3 !== "string") { + gotoEnd = clearQueue2; + clearQueue2 = type3; + type3 = void 0; + } + if (clearQueue2) { + this.queue(type3 || "fx", []); + } + return this.each(function() { + var dequeue = true, index2 = type3 != null && type3 + "queueHooks", timers = jQuery.timers, data6 = dataPriv.get(this); + if (index2) { + if (data6[index2] && data6[index2].stop) { + stopQueue(data6[index2]); + } + } else { + for (index2 in data6) { + if (data6[index2] && data6[index2].stop && rrun.test(index2)) { + stopQueue(data6[index2]); + } + } + } + for (index2 = timers.length; index2--; ) { + if (timers[index2].elem === this && (type3 == null || timers[index2].queue === type3)) { + timers[index2].anim.stop(gotoEnd); + dequeue = false; + timers.splice(index2, 1); + } + } + if (dequeue || !gotoEnd) { + jQuery.dequeue(this, type3); + } + }); + }, + finish: function(type3) { + if (type3 !== false) { + type3 = type3 || "fx"; + } + return this.each(function() { + var index2, data6 = dataPriv.get(this), queue = data6[type3 + "queue"], hooks = data6[type3 + "queueHooks"], timers = jQuery.timers, length2 = queue ? queue.length : 0; + data6.finish = true; + jQuery.queue(this, type3, []); + if (hooks && hooks.stop) { + hooks.stop.call(this, true); + } + for (index2 = timers.length; index2--; ) { + if (timers[index2].elem === this && timers[index2].queue === type3) { + timers[index2].anim.stop(true); + timers.splice(index2, 1); + } + } + for (index2 = 0; index2 < length2; index2++) { + if (queue[index2] && queue[index2].finish) { + queue[index2].finish.call(this); + } + } + delete data6.finish; + }); + } + }); + jQuery.each(["toggle", "show", "hide"], function(_i, name) { + var cssFn = jQuery.fn[name]; + jQuery.fn[name] = function(speed, easing, callback) { + return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback); + }; + }); + jQuery.each({ + slideDown: genFx("show"), + slideUp: genFx("hide"), + slideToggle: genFx("toggle"), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } + }, function(name, props) { + jQuery.fn[name] = function(speed, easing, callback) { + return this.animate(props, speed, easing, callback); + }; + }); + jQuery.timers = []; + jQuery.fx.tick = function() { + var timer3, i3 = 0, timers = jQuery.timers; + fxNow = Date.now(); + for (; i3 < timers.length; i3++) { + timer3 = timers[i3]; + if (!timer3() && timers[i3] === timer3) { + timers.splice(i3--, 1); + } + } + if (!timers.length) { + jQuery.fx.stop(); + } + fxNow = void 0; + }; + jQuery.fx.timer = function(timer3) { + jQuery.timers.push(timer3); + jQuery.fx.start(); + }; + jQuery.fx.interval = 13; + jQuery.fx.start = function() { + if (inProgress) { + return; + } + inProgress = true; + schedule(); + }; + jQuery.fx.stop = function() { + inProgress = null; + }; + jQuery.fx.speeds = { + slow: 600, + fast: 200, + // Default speed + _default: 400 + }; + jQuery.fn.delay = function(time4, type3) { + time4 = jQuery.fx ? jQuery.fx.speeds[time4] || time4 : time4; + type3 = type3 || "fx"; + return this.queue(type3, function(next3, hooks) { + var timeout2 = window3.setTimeout(next3, time4); + hooks.stop = function() { + window3.clearTimeout(timeout2); + }; + }); + }; + (function() { + var input = document2.createElement("input"), select = document2.createElement("select"), opt = select.appendChild(document2.createElement("option")); + input.type = "checkbox"; + support.checkOn = input.value !== ""; + support.optSelected = opt.selected; + input = document2.createElement("input"); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; + })(); + var boolHook, attrHandle = jQuery.expr.attrHandle; + jQuery.fn.extend({ + attr: function(name, value2) { + return access(this, jQuery.attr, name, value2, arguments.length > 1); + }, + removeAttr: function(name) { + return this.each(function() { + jQuery.removeAttr(this, name); + }); + } + }); + jQuery.extend({ + attr: function(elem, name, value2) { + var ret, hooks, nType = elem.nodeType; + if (nType === 3 || nType === 8 || nType === 2) { + return; + } + if (typeof elem.getAttribute === "undefined") { + return jQuery.prop(elem, name, value2); + } + if (nType !== 1 || !jQuery.isXMLDoc(elem)) { + hooks = jQuery.attrHooks[name.toLowerCase()] || (jQuery.expr.match.bool.test(name) ? boolHook : void 0); + } + if (value2 !== void 0) { + if (value2 === null) { + jQuery.removeAttr(elem, name); + return; + } + if (hooks && "set" in hooks && (ret = hooks.set(elem, value2, name)) !== void 0) { + return ret; + } + elem.setAttribute(name, value2 + ""); + return value2; + } + if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { + return ret; + } + ret = jQuery.find.attr(elem, name); + return ret == null ? void 0 : ret; + }, + attrHooks: { + type: { + set: function(elem, value2) { + if (!support.radioValue && value2 === "radio" && nodeName(elem, "input")) { + var val = elem.value; + elem.setAttribute("type", value2); + if (val) { + elem.value = val; + } + return value2; + } + } + } + }, + removeAttr: function(elem, value2) { + var name, i3 = 0, attrNames = value2 && value2.match(rnothtmlwhite); + if (attrNames && elem.nodeType === 1) { + while (name = attrNames[i3++]) { + elem.removeAttribute(name); + } + } + } + }); + boolHook = { + set: function(elem, value2, name) { + if (value2 === false) { + jQuery.removeAttr(elem, name); + } else { + elem.setAttribute(name, name); + } + return name; + } + }; + jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function(_i, name) { + var getter = attrHandle[name] || jQuery.find.attr; + attrHandle[name] = function(elem, name2, isXML) { + var ret, handle, lowercaseName = name2.toLowerCase(); + if (!isXML) { + handle = attrHandle[lowercaseName]; + attrHandle[lowercaseName] = ret; + ret = getter(elem, name2, isXML) != null ? lowercaseName : null; + attrHandle[lowercaseName] = handle; + } + return ret; + }; + }); + var rfocusable = /^(?:input|select|textarea|button)$/i, rclickable = /^(?:a|area)$/i; + jQuery.fn.extend({ + prop: function(name, value2) { + return access(this, jQuery.prop, name, value2, arguments.length > 1); + }, + removeProp: function(name) { + return this.each(function() { + delete this[jQuery.propFix[name] || name]; + }); + } + }); + jQuery.extend({ + prop: function(elem, name, value2) { + var ret, hooks, nType = elem.nodeType; + if (nType === 3 || nType === 8 || nType === 2) { + return; + } + if (nType !== 1 || !jQuery.isXMLDoc(elem)) { + name = jQuery.propFix[name] || name; + hooks = jQuery.propHooks[name]; + } + if (value2 !== void 0) { + if (hooks && "set" in hooks && (ret = hooks.set(elem, value2, name)) !== void 0) { + return ret; + } + return elem[name] = value2; + } + if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { + return ret; + } + return elem[name]; + }, + propHooks: { + tabIndex: { + get: function(elem) { + var tabindex = jQuery.find.attr(elem, "tabindex"); + if (tabindex) { + return parseInt(tabindex, 10); + } + if (rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href) { + return 0; + } + return -1; + } + } + }, + propFix: { + "for": "htmlFor", + "class": "className" + } + }); + if (!support.optSelected) { + jQuery.propHooks.selected = { + get: function(elem) { + var parent5 = elem.parentNode; + if (parent5 && parent5.parentNode) { + parent5.parentNode.selectedIndex; + } + return null; + }, + set: function(elem) { + var parent5 = elem.parentNode; + if (parent5) { + parent5.selectedIndex; + if (parent5.parentNode) { + parent5.parentNode.selectedIndex; + } + } + } + }; + } + jQuery.each([ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" + ], function() { + jQuery.propFix[this.toLowerCase()] = this; + }); + function stripAndCollapse(value2) { + var tokens2 = value2.match(rnothtmlwhite) || []; + return tokens2.join(" "); + } + function getClass(elem) { + return elem.getAttribute && elem.getAttribute("class") || ""; + } + function classesToArray(value2) { + if (Array.isArray(value2)) { + return value2; + } + if (typeof value2 === "string") { + return value2.match(rnothtmlwhite) || []; + } + return []; + } + jQuery.fn.extend({ + addClass: function(value2) { + var classNames, cur, curValue, className, i3, finalValue; + if (isFunction2(value2)) { + return this.each(function(j3) { + jQuery(this).addClass(value2.call(this, j3, getClass(this))); + }); + } + classNames = classesToArray(value2); + if (classNames.length) { + return this.each(function() { + curValue = getClass(this); + cur = this.nodeType === 1 && " " + stripAndCollapse(curValue) + " "; + if (cur) { + for (i3 = 0; i3 < classNames.length; i3++) { + className = classNames[i3]; + if (cur.indexOf(" " + className + " ") < 0) { + cur += className + " "; + } + } + finalValue = stripAndCollapse(cur); + if (curValue !== finalValue) { + this.setAttribute("class", finalValue); + } + } + }); + } + return this; + }, + removeClass: function(value2) { + var classNames, cur, curValue, className, i3, finalValue; + if (isFunction2(value2)) { + return this.each(function(j3) { + jQuery(this).removeClass(value2.call(this, j3, getClass(this))); + }); + } + if (!arguments.length) { + return this.attr("class", ""); + } + classNames = classesToArray(value2); + if (classNames.length) { + return this.each(function() { + curValue = getClass(this); + cur = this.nodeType === 1 && " " + stripAndCollapse(curValue) + " "; + if (cur) { + for (i3 = 0; i3 < classNames.length; i3++) { + className = classNames[i3]; + while (cur.indexOf(" " + className + " ") > -1) { + cur = cur.replace(" " + className + " ", " "); + } + } + finalValue = stripAndCollapse(cur); + if (curValue !== finalValue) { + this.setAttribute("class", finalValue); + } + } + }); + } + return this; + }, + toggleClass: function(value2, stateVal) { + var classNames, className, i3, self2, type3 = typeof value2, isValidValue = type3 === "string" || Array.isArray(value2); + if (isFunction2(value2)) { + return this.each(function(i4) { + jQuery(this).toggleClass( + value2.call(this, i4, getClass(this), stateVal), + stateVal + ); + }); + } + if (typeof stateVal === "boolean" && isValidValue) { + return stateVal ? this.addClass(value2) : this.removeClass(value2); + } + classNames = classesToArray(value2); + return this.each(function() { + if (isValidValue) { + self2 = jQuery(this); + for (i3 = 0; i3 < classNames.length; i3++) { + className = classNames[i3]; + if (self2.hasClass(className)) { + self2.removeClass(className); + } else { + self2.addClass(className); + } + } + } else if (value2 === void 0 || type3 === "boolean") { + className = getClass(this); + if (className) { + dataPriv.set(this, "__className__", className); + } + if (this.setAttribute) { + this.setAttribute( + "class", + className || value2 === false ? "" : dataPriv.get(this, "__className__") || "" + ); + } + } + }); + }, + hasClass: function(selector) { + var className, elem, i3 = 0; + className = " " + selector + " "; + while (elem = this[i3++]) { + if (elem.nodeType === 1 && (" " + stripAndCollapse(getClass(elem)) + " ").indexOf(className) > -1) { + return true; + } + } + return false; + } + }); + var rreturn = /\r/g; + jQuery.fn.extend({ + val: function(value2) { + var hooks, ret, valueIsFunction, elem = this[0]; + if (!arguments.length) { + if (elem) { + hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()]; + if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== void 0) { + return ret; + } + ret = elem.value; + if (typeof ret === "string") { + return ret.replace(rreturn, ""); + } + return ret == null ? "" : ret; + } + return; + } + valueIsFunction = isFunction2(value2); + return this.each(function(i3) { + var val; + if (this.nodeType !== 1) { + return; + } + if (valueIsFunction) { + val = value2.call(this, i3, jQuery(this).val()); + } else { + val = value2; + } + if (val == null) { + val = ""; + } else if (typeof val === "number") { + val += ""; + } else if (Array.isArray(val)) { + val = jQuery.map(val, function(value3) { + return value3 == null ? "" : value3 + ""; + }); + } + hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()]; + if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === void 0) { + this.value = val; + } + }); + } + }); + jQuery.extend({ + valHooks: { + option: { + get: function(elem) { + var val = jQuery.find.attr(elem, "value"); + return val != null ? val : ( + // Support: IE <=10 - 11 only + // option.text throws exceptions (trac-14686, trac-14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse(jQuery.text(elem)) + ); + } + }, + select: { + get: function(elem) { + var value2, option2, i3, options2 = elem.options, index2 = elem.selectedIndex, one4 = elem.type === "select-one", values2 = one4 ? null : [], max10 = one4 ? index2 + 1 : options2.length; + if (index2 < 0) { + i3 = max10; + } else { + i3 = one4 ? index2 : 0; + } + for (; i3 < max10; i3++) { + option2 = options2[i3]; + if ((option2.selected || i3 === index2) && // Don't return options that are disabled or in a disabled optgroup + !option2.disabled && (!option2.parentNode.disabled || !nodeName(option2.parentNode, "optgroup"))) { + value2 = jQuery(option2).val(); + if (one4) { + return value2; + } + values2.push(value2); + } + } + return values2; + }, + set: function(elem, value2) { + var optionSet, option2, options2 = elem.options, values2 = jQuery.makeArray(value2), i3 = options2.length; + while (i3--) { + option2 = options2[i3]; + if (option2.selected = jQuery.inArray(jQuery.valHooks.option.get(option2), values2) > -1) { + optionSet = true; + } + } + if (!optionSet) { + elem.selectedIndex = -1; + } + return values2; + } + } + } + }); + jQuery.each(["radio", "checkbox"], function() { + jQuery.valHooks[this] = { + set: function(elem, value2) { + if (Array.isArray(value2)) { + return elem.checked = jQuery.inArray(jQuery(elem).val(), value2) > -1; + } + } + }; + if (!support.checkOn) { + jQuery.valHooks[this].get = function(elem) { + return elem.getAttribute("value") === null ? "on" : elem.value; + }; + } + }); + var location2 = window3.location; + var nonce = { guid: Date.now() }; + var rquery = /\?/; + jQuery.parseXML = function(data6) { + var xml2, parserErrorElem; + if (!data6 || typeof data6 !== "string") { + return null; + } + try { + xml2 = new window3.DOMParser().parseFromString(data6, "text/xml"); + } catch (e3) { + } + parserErrorElem = xml2 && xml2.getElementsByTagName("parsererror")[0]; + if (!xml2 || parserErrorElem) { + jQuery.error("Invalid XML: " + (parserErrorElem ? jQuery.map(parserErrorElem.childNodes, function(el) { + return el.textContent; + }).join("\n") : data6)); + } + return xml2; + }; + var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, stopPropagationCallback = function(e3) { + e3.stopPropagation(); + }; + jQuery.extend(jQuery.event, { + trigger: function(event3, data6, elem, onlyHandlers) { + var i3, cur, tmp, bubbleType, ontype, handle, special, lastElement, eventPath = [elem || document2], type3 = hasOwn.call(event3, "type") ? event3.type : event3, namespaces = hasOwn.call(event3, "namespace") ? event3.namespace.split(".") : []; + cur = lastElement = tmp = elem = elem || document2; + if (elem.nodeType === 3 || elem.nodeType === 8) { + return; + } + if (rfocusMorph.test(type3 + jQuery.event.triggered)) { + return; + } + if (type3.indexOf(".") > -1) { + namespaces = type3.split("."); + type3 = namespaces.shift(); + namespaces.sort(); + } + ontype = type3.indexOf(":") < 0 && "on" + type3; + event3 = event3[jQuery.expando] ? event3 : new jQuery.Event(type3, typeof event3 === "object" && event3); + event3.isTrigger = onlyHandlers ? 2 : 3; + event3.namespace = namespaces.join("."); + event3.rnamespace = event3.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null; + event3.result = void 0; + if (!event3.target) { + event3.target = elem; + } + data6 = data6 == null ? [event3] : jQuery.makeArray(data6, [event3]); + special = jQuery.event.special[type3] || {}; + if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data6) === false) { + return; + } + if (!onlyHandlers && !special.noBubble && !isWindow(elem)) { + bubbleType = special.delegateType || type3; + if (!rfocusMorph.test(bubbleType + type3)) { + cur = cur.parentNode; + } + for (; cur; cur = cur.parentNode) { + eventPath.push(cur); + tmp = cur; + } + if (tmp === (elem.ownerDocument || document2)) { + eventPath.push(tmp.defaultView || tmp.parentWindow || window3); + } + } + i3 = 0; + while ((cur = eventPath[i3++]) && !event3.isPropagationStopped()) { + lastElement = cur; + event3.type = i3 > 1 ? bubbleType : special.bindType || type3; + handle = (dataPriv.get(cur, "events") || /* @__PURE__ */ Object.create(null))[event3.type] && dataPriv.get(cur, "handle"); + if (handle) { + handle.apply(cur, data6); + } + handle = ontype && cur[ontype]; + if (handle && handle.apply && acceptData(cur)) { + event3.result = handle.apply(cur, data6); + if (event3.result === false) { + event3.preventDefault(); + } + } + } + event3.type = type3; + if (!onlyHandlers && !event3.isDefaultPrevented()) { + if ((!special._default || special._default.apply(eventPath.pop(), data6) === false) && acceptData(elem)) { + if (ontype && isFunction2(elem[type3]) && !isWindow(elem)) { + tmp = elem[ontype]; + if (tmp) { + elem[ontype] = null; + } + jQuery.event.triggered = type3; + if (event3.isPropagationStopped()) { + lastElement.addEventListener(type3, stopPropagationCallback); + } + elem[type3](); + if (event3.isPropagationStopped()) { + lastElement.removeEventListener(type3, stopPropagationCallback); + } + jQuery.event.triggered = void 0; + if (tmp) { + elem[ontype] = tmp; + } + } + } + } + return event3.result; + }, + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function(type3, elem, event3) { + var e3 = jQuery.extend( + new jQuery.Event(), + event3, + { + type: type3, + isSimulated: true + } + ); + jQuery.event.trigger(e3, null, elem); + } + }); + jQuery.fn.extend({ + trigger: function(type3, data6) { + return this.each(function() { + jQuery.event.trigger(type3, data6, this); + }); + }, + triggerHandler: function(type3, data6) { + var elem = this[0]; + if (elem) { + return jQuery.event.trigger(type3, data6, elem, true); + } + } + }); + var rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, rsubmittable = /^(?:input|select|textarea|keygen)/i; + function buildParams(prefix2, obj, traditional, add6) { + var name; + if (Array.isArray(obj)) { + jQuery.each(obj, function(i3, v6) { + if (traditional || rbracket.test(prefix2)) { + add6(prefix2, v6); + } else { + buildParams( + prefix2 + "[" + (typeof v6 === "object" && v6 != null ? i3 : "") + "]", + v6, + traditional, + add6 + ); + } + }); + } else if (!traditional && toType(obj) === "object") { + for (name in obj) { + buildParams(prefix2 + "[" + name + "]", obj[name], traditional, add6); + } + } else { + add6(prefix2, obj); + } + } + jQuery.param = function(a3, traditional) { + var prefix2, s3 = [], add6 = function(key, valueOrFunction) { + var value2 = isFunction2(valueOrFunction) ? valueOrFunction() : valueOrFunction; + s3[s3.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value2 == null ? "" : value2); + }; + if (a3 == null) { + return ""; + } + if (Array.isArray(a3) || a3.jquery && !jQuery.isPlainObject(a3)) { + jQuery.each(a3, function() { + add6(this.name, this.value); + }); + } else { + for (prefix2 in a3) { + buildParams(prefix2, a3[prefix2], traditional, add6); + } + } + return s3.join("&"); + }; + jQuery.fn.extend({ + serialize: function() { + return jQuery.param(this.serializeArray()); + }, + serializeArray: function() { + return this.map(function() { + var elements2 = jQuery.prop(this, "elements"); + return elements2 ? jQuery.makeArray(elements2) : this; + }).filter(function() { + var type3 = this.type; + return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type3) && (this.checked || !rcheckableType.test(type3)); + }).map(function(_i, elem) { + var val = jQuery(this).val(); + if (val == null) { + return null; + } + if (Array.isArray(val)) { + return jQuery.map(val, function(val2) { + return { name: elem.name, value: val2.replace(rCRLF, "\r\n") }; + }); + } + return { name: elem.name, value: val.replace(rCRLF, "\r\n") }; + }).get(); + } + }); + var r20 = /%20/g, rhash = /#.*$/, rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, prefilters = {}, transports = {}, allTypes = "*/".concat("*"), originAnchor = document2.createElement("a"); + originAnchor.href = location2.href; + function addToPrefiltersOrTransports(structure) { + return function(dataTypeExpression, func) { + if (typeof dataTypeExpression !== "string") { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + var dataType, i3 = 0, dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || []; + if (isFunction2(func)) { + while (dataType = dataTypes[i3++]) { + if (dataType[0] === "+") { + dataType = dataType.slice(1) || "*"; + (structure[dataType] = structure[dataType] || []).unshift(func); + } else { + (structure[dataType] = structure[dataType] || []).push(func); + } + } + } + }; + } + function inspectPrefiltersOrTransports(structure, options2, originalOptions, jqXHR) { + var inspected = {}, seekingTransport = structure === transports; + function inspect(dataType) { + var selected; + inspected[dataType] = true; + jQuery.each(structure[dataType] || [], function(_3, prefilterOrFactory) { + var dataTypeOrTransport = prefilterOrFactory(options2, originalOptions, jqXHR); + if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) { + options2.dataTypes.unshift(dataTypeOrTransport); + inspect(dataTypeOrTransport); + return false; + } else if (seekingTransport) { + return !(selected = dataTypeOrTransport); + } + }); + return selected; + } + return inspect(options2.dataTypes[0]) || !inspected["*"] && inspect("*"); + } + function ajaxExtend(target, src) { + var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {}; + for (key in src) { + if (src[key] !== void 0) { + (flatOptions[key] ? target : deep || (deep = {}))[key] = src[key]; + } + } + if (deep) { + jQuery.extend(true, target, deep); + } + return target; + } + function ajaxHandleResponses(s3, jqXHR, responses) { + var ct, type3, finalDataType, firstDataType, contents = s3.contents, dataTypes = s3.dataTypes; + while (dataTypes[0] === "*") { + dataTypes.shift(); + if (ct === void 0) { + ct = s3.mimeType || jqXHR.getResponseHeader("Content-Type"); + } + } + if (ct) { + for (type3 in contents) { + if (contents[type3] && contents[type3].test(ct)) { + dataTypes.unshift(type3); + break; + } + } + } + if (dataTypes[0] in responses) { + finalDataType = dataTypes[0]; + } else { + for (type3 in responses) { + if (!dataTypes[0] || s3.converters[type3 + " " + dataTypes[0]]) { + finalDataType = type3; + break; + } + if (!firstDataType) { + firstDataType = type3; + } + } + finalDataType = finalDataType || firstDataType; + } + if (finalDataType) { + if (finalDataType !== dataTypes[0]) { + dataTypes.unshift(finalDataType); + } + return responses[finalDataType]; + } + } + function ajaxConvert(s3, response, jqXHR, isSuccess) { + var conv2, current, conv, tmp, prev2, converters = {}, dataTypes = s3.dataTypes.slice(); + if (dataTypes[1]) { + for (conv in s3.converters) { + converters[conv.toLowerCase()] = s3.converters[conv]; + } + } + current = dataTypes.shift(); + while (current) { + if (s3.responseFields[current]) { + jqXHR[s3.responseFields[current]] = response; + } + if (!prev2 && isSuccess && s3.dataFilter) { + response = s3.dataFilter(response, s3.dataType); + } + prev2 = current; + current = dataTypes.shift(); + if (current) { + if (current === "*") { + current = prev2; + } else if (prev2 !== "*" && prev2 !== current) { + conv = converters[prev2 + " " + current] || converters["* " + current]; + if (!conv) { + for (conv2 in converters) { + tmp = conv2.split(" "); + if (tmp[1] === current) { + conv = converters[prev2 + " " + tmp[0]] || converters["* " + tmp[0]]; + if (conv) { + if (conv === true) { + conv = converters[conv2]; + } else if (converters[conv2] !== true) { + current = tmp[0]; + dataTypes.unshift(tmp[1]); + } + break; + } + } + } + } + if (conv !== true) { + if (conv && s3.throws) { + response = conv(response); + } else { + try { + response = conv(response); + } catch (e3) { + return { + state: "parsererror", + error: conv ? e3 : "No conversion from " + prev2 + " to " + current + }; + } + } + } + } + } + } + return { state: "success", data: response }; + } + jQuery.extend({ + // Counter for holding the number of active queries + active: 0, + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + ajaxSettings: { + url: location2.href, + type: "GET", + isLocal: rlocalProtocol.test(location2.protocol), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + // Convert anything to text + "* text": String, + // Text to html (true = no transformation) + "text html": true, + // Evaluate text as a json expression + "text json": JSON.parse, + // Parse text as xml + "text xml": jQuery.parseXML + }, + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function(target, settings) { + return settings ? ( + // Building a settings object + ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) + ) : ( + // Extending ajaxSettings + ajaxExtend(jQuery.ajaxSettings, target) + ); + }, + ajaxPrefilter: addToPrefiltersOrTransports(prefilters), + ajaxTransport: addToPrefiltersOrTransports(transports), + // Main method + ajax: function(url, options2) { + if (typeof url === "object") { + options2 = url; + url = void 0; + } + options2 = options2 || {}; + var transport, cacheURL, responseHeadersString, responseHeaders, timeoutTimer, urlAnchor, completed3, fireGlobals, i3, uncached, s3 = jQuery.ajaxSetup({}, options2), callbackContext4 = s3.context || s3, globalEventContext = s3.context && (callbackContext4.nodeType || callbackContext4.jquery) ? jQuery(callbackContext4) : jQuery.event, deferred = jQuery.Deferred(), completeDeferred = jQuery.Callbacks("once memory"), statusCode = s3.statusCode || {}, requestHeaders = {}, requestHeadersNames = {}, strAbort = "canceled", jqXHR = { + readyState: 0, + // Builds headers hashtable if needed + getResponseHeader: function(key) { + var match3; + if (completed3) { + if (!responseHeaders) { + responseHeaders = {}; + while (match3 = rheaders.exec(responseHeadersString)) { + responseHeaders[match3[1].toLowerCase() + " "] = (responseHeaders[match3[1].toLowerCase() + " "] || []).concat(match3[2]); + } + } + match3 = responseHeaders[key.toLowerCase() + " "]; + } + return match3 == null ? null : match3.join(", "); + }, + // Raw string + getAllResponseHeaders: function() { + return completed3 ? responseHeadersString : null; + }, + // Caches the header + setRequestHeader: function(name, value2) { + if (completed3 == null) { + name = requestHeadersNames[name.toLowerCase()] = requestHeadersNames[name.toLowerCase()] || name; + requestHeaders[name] = value2; + } + return this; + }, + // Overrides response content-type header + overrideMimeType: function(type3) { + if (completed3 == null) { + s3.mimeType = type3; + } + return this; + }, + // Status-dependent callbacks + statusCode: function(map8) { + var code; + if (map8) { + if (completed3) { + jqXHR.always(map8[jqXHR.status]); + } else { + for (code in map8) { + statusCode[code] = [statusCode[code], map8[code]]; + } + } + } + return this; + }, + // Cancel the request + abort: function(statusText) { + var finalText = statusText || strAbort; + if (transport) { + transport.abort(finalText); + } + done(0, finalText); + return this; + } + }; + deferred.promise(jqXHR); + s3.url = ((url || s3.url || location2.href) + "").replace(rprotocol, location2.protocol + "//"); + s3.type = options2.method || options2.type || s3.method || s3.type; + s3.dataTypes = (s3.dataType || "*").toLowerCase().match(rnothtmlwhite) || [""]; + if (s3.crossDomain == null) { + urlAnchor = document2.createElement("a"); + try { + urlAnchor.href = s3.url; + urlAnchor.href = urlAnchor.href; + s3.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host; + } catch (e3) { + s3.crossDomain = true; + } + } + if (s3.data && s3.processData && typeof s3.data !== "string") { + s3.data = jQuery.param(s3.data, s3.traditional); + } + inspectPrefiltersOrTransports(prefilters, s3, options2, jqXHR); + if (completed3) { + return jqXHR; + } + fireGlobals = jQuery.event && s3.global; + if (fireGlobals && jQuery.active++ === 0) { + jQuery.event.trigger("ajaxStart"); + } + s3.type = s3.type.toUpperCase(); + s3.hasContent = !rnoContent.test(s3.type); + cacheURL = s3.url.replace(rhash, ""); + if (!s3.hasContent) { + uncached = s3.url.slice(cacheURL.length); + if (s3.data && (s3.processData || typeof s3.data === "string")) { + cacheURL += (rquery.test(cacheURL) ? "&" : "?") + s3.data; + delete s3.data; + } + if (s3.cache === false) { + cacheURL = cacheURL.replace(rantiCache, "$1"); + uncached = (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce.guid++ + uncached; + } + s3.url = cacheURL + uncached; + } else if (s3.data && s3.processData && (s3.contentType || "").indexOf("application/x-www-form-urlencoded") === 0) { + s3.data = s3.data.replace(r20, "+"); + } + if (s3.ifModified) { + if (jQuery.lastModified[cacheURL]) { + jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]); + } + if (jQuery.etag[cacheURL]) { + jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]); + } + } + if (s3.data && s3.hasContent && s3.contentType !== false || options2.contentType) { + jqXHR.setRequestHeader("Content-Type", s3.contentType); + } + jqXHR.setRequestHeader( + "Accept", + s3.dataTypes[0] && s3.accepts[s3.dataTypes[0]] ? s3.accepts[s3.dataTypes[0]] + (s3.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s3.accepts["*"] + ); + for (i3 in s3.headers) { + jqXHR.setRequestHeader(i3, s3.headers[i3]); + } + if (s3.beforeSend && (s3.beforeSend.call(callbackContext4, jqXHR, s3) === false || completed3)) { + return jqXHR.abort(); + } + strAbort = "abort"; + completeDeferred.add(s3.complete); + jqXHR.done(s3.success); + jqXHR.fail(s3.error); + transport = inspectPrefiltersOrTransports(transports, s3, options2, jqXHR); + if (!transport) { + done(-1, "No Transport"); + } else { + jqXHR.readyState = 1; + if (fireGlobals) { + globalEventContext.trigger("ajaxSend", [jqXHR, s3]); + } + if (completed3) { + return jqXHR; + } + if (s3.async && s3.timeout > 0) { + timeoutTimer = window3.setTimeout(function() { + jqXHR.abort("timeout"); + }, s3.timeout); + } + try { + completed3 = false; + transport.send(requestHeaders, done); + } catch (e3) { + if (completed3) { + throw e3; + } + done(-1, e3); + } + } + function done(status, nativeStatusText, responses, headers) { + var isSuccess, success, error3, response, modified, statusText = nativeStatusText; + if (completed3) { + return; + } + completed3 = true; + if (timeoutTimer) { + window3.clearTimeout(timeoutTimer); + } + transport = void 0; + responseHeadersString = headers || ""; + jqXHR.readyState = status > 0 ? 4 : 0; + isSuccess = status >= 200 && status < 300 || status === 304; + if (responses) { + response = ajaxHandleResponses(s3, jqXHR, responses); + } + if (!isSuccess && jQuery.inArray("script", s3.dataTypes) > -1 && jQuery.inArray("json", s3.dataTypes) < 0) { + s3.converters["text script"] = function() { + }; + } + response = ajaxConvert(s3, response, jqXHR, isSuccess); + if (isSuccess) { + if (s3.ifModified) { + modified = jqXHR.getResponseHeader("Last-Modified"); + if (modified) { + jQuery.lastModified[cacheURL] = modified; + } + modified = jqXHR.getResponseHeader("etag"); + if (modified) { + jQuery.etag[cacheURL] = modified; + } + } + if (status === 204 || s3.type === "HEAD") { + statusText = "nocontent"; + } else if (status === 304) { + statusText = "notmodified"; + } else { + statusText = response.state; + success = response.data; + error3 = response.error; + isSuccess = !error3; + } + } else { + error3 = statusText; + if (status || !statusText) { + statusText = "error"; + if (status < 0) { + status = 0; + } + } + } + jqXHR.status = status; + jqXHR.statusText = (nativeStatusText || statusText) + ""; + if (isSuccess) { + deferred.resolveWith(callbackContext4, [success, statusText, jqXHR]); + } else { + deferred.rejectWith(callbackContext4, [jqXHR, statusText, error3]); + } + jqXHR.statusCode(statusCode); + statusCode = void 0; + if (fireGlobals) { + globalEventContext.trigger( + isSuccess ? "ajaxSuccess" : "ajaxError", + [jqXHR, s3, isSuccess ? success : error3] + ); + } + completeDeferred.fireWith(callbackContext4, [jqXHR, statusText]); + if (fireGlobals) { + globalEventContext.trigger("ajaxComplete", [jqXHR, s3]); + if (!--jQuery.active) { + jQuery.event.trigger("ajaxStop"); + } + } + } + return jqXHR; + }, + getJSON: function(url, data6, callback) { + return jQuery.get(url, data6, callback, "json"); + }, + getScript: function(url, callback) { + return jQuery.get(url, void 0, callback, "script"); + } + }); + jQuery.each(["get", "post"], function(_i, method2) { + jQuery[method2] = function(url, data6, callback, type3) { + if (isFunction2(data6)) { + type3 = type3 || callback; + callback = data6; + data6 = void 0; + } + return jQuery.ajax(jQuery.extend({ + url, + type: method2, + dataType: type3, + data: data6, + success: callback + }, jQuery.isPlainObject(url) && url)); + }; + }); + jQuery.ajaxPrefilter(function(s3) { + var i3; + for (i3 in s3.headers) { + if (i3.toLowerCase() === "content-type") { + s3.contentType = s3.headers[i3] || ""; + } + } + }); + jQuery._evalUrl = function(url, options2, doc) { + return jQuery.ajax({ + url, + // Make this explicit, since user can override this through ajaxSetup (trac-11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() { + } + }, + dataFilter: function(response) { + jQuery.globalEval(response, options2, doc); + } + }); + }; + jQuery.fn.extend({ + wrapAll: function(html3) { + var wrap4; + if (this[0]) { + if (isFunction2(html3)) { + html3 = html3.call(this[0]); + } + wrap4 = jQuery(html3, this[0].ownerDocument).eq(0).clone(true); + if (this[0].parentNode) { + wrap4.insertBefore(this[0]); + } + wrap4.map(function() { + var elem = this; + while (elem.firstElementChild) { + elem = elem.firstElementChild; + } + return elem; + }).append(this); + } + return this; + }, + wrapInner: function(html3) { + if (isFunction2(html3)) { + return this.each(function(i3) { + jQuery(this).wrapInner(html3.call(this, i3)); + }); + } + return this.each(function() { + var self2 = jQuery(this), contents = self2.contents(); + if (contents.length) { + contents.wrapAll(html3); + } else { + self2.append(html3); + } + }); + }, + wrap: function(html3) { + var htmlIsFunction = isFunction2(html3); + return this.each(function(i3) { + jQuery(this).wrapAll(htmlIsFunction ? html3.call(this, i3) : html3); + }); + }, + unwrap: function(selector) { + this.parent(selector).not("body").each(function() { + jQuery(this).replaceWith(this.childNodes); + }); + return this; + } + }); + jQuery.expr.pseudos.hidden = function(elem) { + return !jQuery.expr.pseudos.visible(elem); + }; + jQuery.expr.pseudos.visible = function(elem) { + return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); + }; + jQuery.ajaxSettings.xhr = function() { + try { + return new window3.XMLHttpRequest(); + } catch (e3) { + } + }; + var xhrSuccessStatus = { + // File protocol always yields status code 0, assume 200 + 0: 200, + // Support: IE <=9 only + // trac-1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, xhrSupported = jQuery.ajaxSettings.xhr(); + support.cors = !!xhrSupported && "withCredentials" in xhrSupported; + support.ajax = xhrSupported = !!xhrSupported; + jQuery.ajaxTransport(function(options2) { + var callback, errorCallback; + if (support.cors || xhrSupported && !options2.crossDomain) { + return { + send: function(headers, complete) { + var i3, xhr = options2.xhr(); + xhr.open( + options2.type, + options2.url, + options2.async, + options2.username, + options2.password + ); + if (options2.xhrFields) { + for (i3 in options2.xhrFields) { + xhr[i3] = options2.xhrFields[i3]; + } + } + if (options2.mimeType && xhr.overrideMimeType) { + xhr.overrideMimeType(options2.mimeType); + } + if (!options2.crossDomain && !headers["X-Requested-With"]) { + headers["X-Requested-With"] = "XMLHttpRequest"; + } + for (i3 in headers) { + xhr.setRequestHeader(i3, headers[i3]); + } + callback = function(type3) { + return function() { + if (callback) { + callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null; + if (type3 === "abort") { + xhr.abort(); + } else if (type3 === "error") { + if (typeof xhr.status !== "number") { + complete(0, "error"); + } else { + complete( + // File: protocol always yields status 0; see trac-8605, trac-14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[xhr.status] || xhr.status, + xhr.statusText, + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + (xhr.responseType || "text") !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback("error"); + if (xhr.onabort !== void 0) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + if (xhr.readyState === 4) { + window3.setTimeout(function() { + if (callback) { + errorCallback(); + } + }); + } + }; + } + callback = callback("abort"); + try { + xhr.send(options2.hasContent && options2.data || null); + } catch (e3) { + if (callback) { + throw e3; + } + } + }, + abort: function() { + if (callback) { + callback(); + } + } + }; + } + }); + jQuery.ajaxPrefilter(function(s3) { + if (s3.crossDomain) { + s3.contents.script = false; + } + }); + jQuery.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function(text4) { + jQuery.globalEval(text4); + return text4; + } + } + }); + jQuery.ajaxPrefilter("script", function(s3) { + if (s3.cache === void 0) { + s3.cache = false; + } + if (s3.crossDomain) { + s3.type = "GET"; + } + }); + jQuery.ajaxTransport("script", function(s3) { + if (s3.crossDomain || s3.scriptAttrs) { + var script, callback; + return { + send: function(_3, complete) { + script = jQuery(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<nil> Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Documentation +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Select product

+
+ +
+ + +
+
+
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

+ + + + + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

MongoDB Input Plugin

+

This plugin collects metrics about MongoDB server instances by +running database commands.

+ +
+ + +

This plugin supports all versions marked as supported in the +MongoDB Software Lifecycle Schedules.

+
+

Introduced in: Telegraf v0.1.5 +Tags: datastore +OS support: all

+

Global configuration options

+

Plugins support additional global and plugin configuration settings for tasks +such as modifying metrics, tags, and fields, creating aliases, and configuring +plugin ordering. See CONFIGURATION.md for more details.

+

Configuration

+ + +
# Read metrics from one or many MongoDB servers
+[[inputs.mongodb]]
+  ## An array of URLs of the form:
+  ##   "mongodb://" [user ":" pass "@"] host [ ":" port]
+  ## For example:
+  ##   mongodb://user:auth_key@10.10.3.30:27017,
+  ##   mongodb://10.10.3.33:18832,
+  ##
+  ## If connecting to a cluster, users must include the "?connect=direct" in
+  ## the URL to ensure that the connection goes directly to the specified node
+  ## and not have all connections passed to the master node.
+  servers = ["mongodb://127.0.0.1:27017/?connect=direct"]
+
+  ## When true, collect cluster status.
+  ## Note that the query that counts jumbo chunks triggers a COLLSCAN, which
+  ## may have an impact on performance.
+  # gather_cluster_status = true
+
+  ## When true, collect per database stats
+  # gather_perdb_stats = false
+
+  ## When true, collect per collection stats
+  # gather_col_stats = false
+
+  ## When true, collect usage statistics for each collection
+  ## (insert, update, queries, remove, getmore, commands etc...).
+  # gather_top_stat = false
+
+  ## List of db where collections stats are collected
+  ## If empty, all db are concerned
+  # col_stats_dbs = ["local"]
+
+  ## Optional TLS Config
+  ## Set to true/false to enforce TLS being enabled/disabled. If not set,
+  ## enable TLS only if any of the other options are specified.
+  # tls_enable =
+  ## Trusted root certificates for server
+  # tls_ca = "/path/to/cafile"
+  ## Used for TLS client certificate authentication
+  # tls_cert = "/path/to/certfile"
+  ## Used for TLS client certificate authentication
+  # tls_key = "/path/to/keyfile"
+  ## Password for the key file if it is encrypted
+  # tls_key_pwd = ""
+  ## Send the specified TLS server name via SNI
+  # tls_server_name = "kubernetes.example.com"
+  ## Minimal TLS version to accept by the client
+  # tls_min_version = "TLS12"
+  ## List of ciphers to accept, by default all secure ciphers will be accepted
+  ## See https://pkg.go.dev/crypto/tls#pkg-constants for supported values.
+  ## Use "all", "secure" and "insecure" to add all support ciphers, secure
+  ## suites or insecure suites respectively.
+  # tls_cipher_suites = ["secure"]
+  ## Renegotiation method, "never", "once" or "freely"
+  # tls_renegotiation_method = "never"
+  ## Use TLS but skip chain & host verification
+  # insecure_skip_verify = false
+
+  ## Specifies plugin behavior regarding disconnected servers
+  ## Available choices :
+  ##   - error: telegraf will return an error on startup if one the servers is unreachable
+  ##   - skip: telegraf will skip unreachable servers on both startup and gather
+  # disconnected_servers_behavior = "error"
+

Permissions

+

If your MongoDB instance has access control enabled you will need to connect +as a user with sufficient rights.

+

With MongoDB 3.4 and higher, the clusterMonitor role can be used. In +version 3.2 you may also need these additional permissions:

+ + +
db.grantRolesToUser("user", [{role: "read", actions: "find", db: "local"}])
+

If the user is missing required privileges you may see an error in the +Telegraf logs similar to:

+ + +
Error in input [mongodb]: not authorized on admin to execute command { serverStatus: 1, recordStats: 0 }
+

Some permission related errors are logged at debug level, you can check these +messages by setting debug = true in the agent section of the configuration or +by running Telegraf with the --debug argument.

+

Metrics

+
    +
  • +

    mongodb

    +
      +
    • tags: +
        +
      • hostname
      • +
      • node_type
      • +
      • rs_name
      • +
      +
    • +
    • fields: +
        +
      • active_reads (integer)
      • +
      • active_writes (integer)
      • +
      • aggregate_command_failed (integer)
      • +
      • aggregate_command_total (integer)
      • +
      • assert_msg (integer)
      • +
      • assert_regular (integer)
      • +
      • assert_rollovers (integer)
      • +
      • assert_user (integer)
      • +
      • assert_warning (integer)
      • +
      • available_reads (integer)
      • +
      • available_writes (integer)
      • +
      • commands (integer)
      • +
      • connections_available (integer)
      • +
      • connections_current (integer)
      • +
      • connections_total_created (integer)
      • +
      • count_command_failed (integer)
      • +
      • count_command_total (integer)
      • +
      • cursor_no_timeout_count (integer)
      • +
      • cursor_pinned_count (integer)
      • +
      • cursor_timed_out_count (integer)
      • +
      • cursor_total_count (integer)
      • +
      • delete_command_failed (integer)
      • +
      • delete_command_total (integer)
      • +
      • deletes (integer)
      • +
      • distinct_command_failed (integer)
      • +
      • distinct_command_total (integer)
      • +
      • document_deleted (integer)
      • +
      • document_inserted (integer)
      • +
      • document_returned (integer)
      • +
      • document_updated (integer)
      • +
      • find_and_modify_command_failed (integer)
      • +
      • find_and_modify_command_total (integer)
      • +
      • find_command_failed (integer)
      • +
      • find_command_total (integer)
      • +
      • flushes (integer)
      • +
      • flushes_total_time_ns (integer)
      • +
      • get_more_command_failed (integer)
      • +
      • get_more_command_total (integer)
      • +
      • getmores (integer)
      • +
      • insert_command_failed (integer)
      • +
      • insert_command_total (integer)
      • +
      • inserts (integer)
      • +
      • jumbo_chunks (integer)
      • +
      • latency_commands_count (integer)
      • +
      • latency_commands (integer)
      • +
      • latency_reads_count (integer)
      • +
      • latency_reads (integer)
      • +
      • latency_writes_count (integer)
      • +
      • latency_writes (integer)
      • +
      • member_status (string)
      • +
      • net_in_bytes_count (integer)
      • +
      • net_out_bytes_count (integer)
      • +
      • open_connections (integer)
      • +
      • operation_scan_and_order (integer)
      • +
      • operation_write_conflicts (integer)
      • +
      • page_faults (integer)
      • +
      • percent_cache_dirty (float)
      • +
      • percent_cache_used (float)
      • +
      • queries (integer)
      • +
      • queued_reads (integer)
      • +
      • queued_writes (integer)
      • +
      • repl_apply_batches_num (integer)
      • +
      • repl_apply_batches_total_millis (integer)
      • +
      • repl_apply_ops (integer)
      • +
      • repl_buffer_count (integer)
      • +
      • repl_buffer_size_bytes (integer)
      • +
      • repl_commands (integer)
      • +
      • repl_deletes (integer)
      • +
      • repl_executor_pool_in_progress_count (integer)
      • +
      • repl_executor_queues_network_in_progress (integer)
      • +
      • repl_executor_queues_sleepers (integer)
      • +
      • repl_executor_unsignaled_events (integer)
      • +
      • repl_getmores (integer)
      • +
      • repl_inserts (integer)
      • +
      • repl_lag (integer)
      • +
      • repl_network_bytes (integer)
      • +
      • repl_network_getmores_num (integer)
      • +
      • repl_network_getmores_total_millis (integer)
      • +
      • repl_network_ops (integer)
      • +
      • repl_queries (integer)
      • +
      • repl_updates (integer)
      • +
      • repl_oplog_window_sec (integer)
      • +
      • repl_state (integer)
      • +
      • repl_member_health (integer)
      • +
      • repl_health_avg (float)
      • +
      • resident_megabytes (integer)
      • +
      • state (string)
      • +
      • storage_freelist_search_bucket_exhausted (integer)
      • +
      • storage_freelist_search_requests (integer)
      • +
      • storage_freelist_search_scanned (integer)
      • +
      • tcmalloc_central_cache_free_bytes (integer)
      • +
      • tcmalloc_current_allocated_bytes (integer)
      • +
      • tcmalloc_current_total_thread_cache_bytes (integer)
      • +
      • tcmalloc_heap_size (integer)
      • +
      • tcmalloc_max_total_thread_cache_bytes (integer)
      • +
      • tcmalloc_pageheap_commit_count (integer)
      • +
      • tcmalloc_pageheap_committed_bytes (integer)
      • +
      • tcmalloc_pageheap_decommit_count (integer)
      • +
      • tcmalloc_pageheap_free_bytes (integer)
      • +
      • tcmalloc_pageheap_reserve_count (integer)
      • +
      • tcmalloc_pageheap_scavenge_count (integer)
      • +
      • tcmalloc_pageheap_total_commit_bytes (integer)
      • +
      • tcmalloc_pageheap_total_decommit_bytes (integer)
      • +
      • tcmalloc_pageheap_total_reserve_bytes (integer)
      • +
      • tcmalloc_pageheap_unmapped_bytes (integer)
      • +
      • tcmalloc_spinlock_total_delay_ns (integer)
      • +
      • tcmalloc_thread_cache_free_bytes (integer)
      • +
      • tcmalloc_total_free_bytes (integer)
      • +
      • tcmalloc_transfer_cache_free_bytes (integer)
      • +
      • total_available (integer)
      • +
      • total_created (integer)
      • +
      • total_docs_scanned (integer)
      • +
      • total_in_use (integer)
      • +
      • total_keys_scanned (integer)
      • +
      • total_refreshing (integer)
      • +
      • total_tickets_reads (integer)
      • +
      • total_tickets_writes (integer)
      • +
      • ttl_deletes (integer)
      • +
      • ttl_passes (integer)
      • +
      • update_command_failed (integer)
      • +
      • update_command_total (integer)
      • +
      • updates (integer)
      • +
      • uptime_ns (integer)
      • +
      • version (string)
      • +
      • vsize_megabytes (integer)
      • +
      • wt_connection_files_currently_open (integer)
      • +
      • wt_data_handles_currently_active (integer)
      • +
      • wtcache_app_threads_page_read_count (integer)
      • +
      • wtcache_app_threads_page_read_time (integer)
      • +
      • wtcache_app_threads_page_write_count (integer)
      • +
      • wtcache_bytes_read_into (integer)
      • +
      • wtcache_bytes_written_from (integer)
      • +
      • wtcache_pages_read_into (integer)
      • +
      • wtcache_pages_requested_from (integer)
      • +
      • wtcache_current_bytes (integer)
      • +
      • wtcache_max_bytes_configured (integer)
      • +
      • wtcache_internal_pages_evicted (integer)
      • +
      • wtcache_modified_pages_evicted (integer)
      • +
      • wtcache_unmodified_pages_evicted (integer)
      • +
      • wtcache_pages_evicted_by_app_thread (integer)
      • +
      • wtcache_pages_queued_for_eviction (integer)
      • +
      • wtcache_server_evicting_pages (integer)
      • +
      • wtcache_tracked_dirty_bytes (integer)
      • +
      • wtcache_worker_thread_evictingpages (integer)
      • +
      • commands_per_sec (integer, deprecated in 1.10; use commands))
      • +
      • cursor_no_timeout (integer, opened/sec, deprecated in 1.10; use cursor_no_timeout_count))
      • +
      • cursor_pinned (integer, opened/sec, deprecated in 1.10; use cursor_pinned_count))
      • +
      • cursor_timed_out (integer, opened/sec, deprecated in 1.10; use cursor_timed_out_count))
      • +
      • cursor_total (integer, opened/sec, deprecated in 1.10; use cursor_total_count))
      • +
      • deletes_per_sec (integer, deprecated in 1.10; use deletes))
      • +
      • flushes_per_sec (integer, deprecated in 1.10; use flushes))
      • +
      • getmores_per_sec (integer, deprecated in 1.10; use getmores))
      • +
      • inserts_per_sec (integer, deprecated in 1.10; use inserts))
      • +
      • net_in_bytes (integer, bytes/sec, deprecated in 1.10; use net_out_bytes_count))
      • +
      • net_out_bytes (integer, bytes/sec, deprecated in 1.10; use net_out_bytes_count))
      • +
      • queries_per_sec (integer, deprecated in 1.10; use queries))
      • +
      • repl_commands_per_sec (integer, deprecated in 1.10; use repl_commands))
      • +
      • repl_deletes_per_sec (integer, deprecated in 1.10; use repl_deletes)
      • +
      • repl_getmores_per_sec (integer, deprecated in 1.10; use repl_getmores)
      • +
      • repl_inserts_per_sec (integer, deprecated in 1.10; use repl_inserts))
      • +
      • repl_queries_per_sec (integer, deprecated in 1.10; use repl_queries))
      • +
      • repl_updates_per_sec (integer, deprecated in 1.10; use repl_updates))
      • +
      • ttl_deletes_per_sec (integer, deprecated in 1.10; use ttl_deletes))
      • +
      • ttl_passes_per_sec (integer, deprecated in 1.10; use ttl_passes))
      • +
      • updates_per_sec (integer, deprecated in 1.10; use updates))
      • +
      +
    • +
    +
  • +
  • +

    mongodb_db_stats

    +
      +
    • tags: +
        +
      • db_name
      • +
      • hostname
      • +
      +
    • +
    • fields: +
        +
      • avg_obj_size (float)
      • +
      • collections (integer)
      • +
      • data_size (integer)
      • +
      • index_size (integer)
      • +
      • indexes (integer)
      • +
      • num_extents (integer)
      • +
      • objects (integer)
      • +
      • ok (integer)
      • +
      • storage_size (integer)
      • +
      • type (string)
      • +
      • fs_used_size (integer)
      • +
      • fs_total_size (integer)
      • +
      +
    • +
    +
  • +
  • +

    mongodb_col_stats

    +
      +
    • tags: +
        +
      • hostname
      • +
      • collection
      • +
      • db_name
      • +
      +
    • +
    • fields: +
        +
      • size (integer)
      • +
      • avg_obj_size (integer)
      • +
      • storage_size (integer)
      • +
      • total_index_size (integer)
      • +
      • ok (integer)
      • +
      • count (integer)
      • +
      • type (string)
      • +
      +
    • +
    +
  • +
  • +

    mongodb_shard_stats

    +
      +
    • tags: +
        +
      • hostname
      • +
      +
    • +
    • fields: +
        +
      • in_use (integer)
      • +
      • available (integer)
      • +
      • created (integer)
      • +
      • refreshing (integer)
      • +
      +
    • +
    +
  • +
  • +

    mongodb_top_stats

    +
      +
    • tags: +
        +
      • collection
      • +
      +
    • +
    • fields: +
        +
      • total_time (integer)
      • +
      • total_count (integer)
      • +
      • read_lock_time (integer)
      • +
      • read_lock_count (integer)
      • +
      • write_lock_time (integer)
      • +
      • write_lock_count (integer)
      • +
      • queries_time (integer)
      • +
      • queries_count (integer)
      • +
      • get_more_time (integer)
      • +
      • get_more_count (integer)
      • +
      • insert_time (integer)
      • +
      • insert_count (integer)
      • +
      • update_time (integer)
      • +
      • update_count (integer)
      • +
      • remove_time (integer)
      • +
      • remove_count (integer)
      • +
      • commands_time (integer)
      • +
      • commands_count (integer)
      • +
      +
    • +
    +
  • +
+

Example Output

+ + +
mongodb,hostname=127.0.0.1:27017 active_reads=1i,active_writes=0i,aggregate_command_failed=0i,aggregate_command_total=0i,assert_msg=0i,assert_regular=0i,assert_rollovers=0i,assert_user=0i,assert_warning=0i,available_reads=127i,available_writes=128i,commands=65i,commands_per_sec=4i,connections_available=51199i,connections_current=1i,connections_total_created=5i,count_command_failed=0i,count_command_total=7i,cursor_no_timeout=0i,cursor_no_timeout_count=0i,cursor_pinned=0i,cursor_pinned_count=0i,cursor_timed_out=0i,cursor_timed_out_count=0i,cursor_total=0i,cursor_total_count=0i,delete_command_failed=0i,delete_command_total=1i,deletes=1i,deletes_per_sec=0i,distinct_command_failed=0i,distinct_command_total=0i,document_deleted=0i,document_inserted=0i,document_returned=0i,document_updated=0i,find_and_modify_command_failed=0i,find_and_modify_command_total=0i,find_command_failed=0i,find_command_total=1i,flushes=52i,flushes_per_sec=0i,flushes_total_time_ns=364000000i,get_more_command_failed=0i,get_more_command_total=0i,getmores=0i,getmores_per_sec=0i,insert_command_failed=0i,insert_command_total=0i,inserts=0i,inserts_per_sec=0i,jumbo_chunks=0i,latency_commands=5740i,latency_commands_count=46i,latency_reads=348i,latency_reads_count=7i,latency_writes=0i,latency_writes_count=0i,net_in_bytes=296i,net_in_bytes_count=4262i,net_out_bytes=29322i,net_out_bytes_count=242103i,open_connections=1i,operation_scan_and_order=0i,operation_write_conflicts=0i,page_faults=1i,percent_cache_dirty=0,percent_cache_used=0,queries=1i,queries_per_sec=0i,queued_reads=0i,queued_writes=0i,resident_megabytes=33i,storage_freelist_search_bucket_exhausted=0i,storage_freelist_search_requests=0i,storage_freelist_search_scanned=0i,tcmalloc_central_cache_free_bytes=0i,tcmalloc_current_allocated_bytes=0i,tcmalloc_current_total_thread_cache_bytes=0i,tcmalloc_heap_size=0i,tcmalloc_max_total_thread_cache_bytes=0i,tcmalloc_pageheap_commit_count=0i,tcmalloc_pageheap_committed_bytes=0i,tcmalloc_pageheap_decommit_count=0i,tcmalloc_pageheap_free_bytes=0i,tcmalloc_pageheap_reserve_count=0i,tcmalloc_pageheap_scavenge_count=0i,tcmalloc_pageheap_total_commit_bytes=0i,tcmalloc_pageheap_total_decommit_bytes=0i,tcmalloc_pageheap_total_reserve_bytes=0i,tcmalloc_pageheap_unmapped_bytes=0i,tcmalloc_spinlock_total_delay_ns=0i,tcmalloc_thread_cache_free_bytes=0i,tcmalloc_total_free_bytes=0i,tcmalloc_transfer_cache_free_bytes=0i,total_available=0i,total_created=0i,total_docs_scanned=0i,total_in_use=0i,total_keys_scanned=0i,total_refreshing=0i,total_tickets_reads=128i,total_tickets_writes=128i,ttl_deletes=0i,ttl_deletes_per_sec=0i,ttl_passes=51i,ttl_passes_per_sec=0i,update_command_failed=0i,update_command_total=0i,updates=0i,updates_per_sec=0i,uptime_ns=6135152000000i,version="4.0.19",vsize_megabytes=5088i,wt_connection_files_currently_open=13i,wt_data_handles_currently_active=18i,wtcache_app_threads_page_read_count=99i,wtcache_app_threads_page_read_time=44528i,wtcache_app_threads_page_write_count=19i,wtcache_bytes_read_into=3248195i,wtcache_bytes_written_from=170612i,wtcache_current_bytes=3648788i,wtcache_internal_pages_evicted=0i,wtcache_max_bytes_configured=8053063680i,wtcache_modified_pages_evicted=0i,wtcache_pages_evicted_by_app_thread=0i,wtcache_pages_queued_for_eviction=0i,wtcache_pages_read_into=234i,wtcache_pages_requested_from=18235i,wtcache_server_evicting_pages=0i,wtcache_tracked_dirty_bytes=0i,wtcache_unmodified_pages_evicted=0i,wtcache_worker_thread_evictingpages=0i 1595691605000000000
+mongodb,hostname=127.0.0.1:27017,node_type=PRI,rs_name=rs0 active_reads=1i,active_writes=0i,aggregate_command_failed=0i,aggregate_command_total=0i,assert_msg=0i,assert_regular=0i,assert_rollovers=0i,assert_user=25i,assert_warning=0i,available_reads=127i,available_writes=128i,commands=345i,commands_per_sec=4i,connections_available=838853i,connections_current=7i,connections_total_created=13i,count_command_failed=0i,count_command_total=5i,cursor_no_timeout=0i,cursor_no_timeout_count=0i,cursor_pinned=0i,cursor_pinned_count=2i,cursor_timed_out=0i,cursor_timed_out_count=0i,cursor_total=0i,cursor_total_count=4i,delete_command_failed=0i,delete_command_total=0i,deletes=0i,deletes_per_sec=0i,distinct_command_failed=0i,distinct_command_total=0i,document_deleted=0i,document_inserted=2i,document_returned=56i,document_updated=0i,find_and_modify_command_failed=0i,find_and_modify_command_total=0i,find_command_failed=0i,find_command_total=23i,flushes=4i,flushes_per_sec=0i,flushes_total_time_ns=43000000i,get_more_command_failed=0i,get_more_command_total=88i,getmores=88i,getmores_per_sec=0i,insert_command_failed=0i,insert_command_total=2i,inserts=2i,inserts_per_sec=0i,jumbo_chunks=0i,latency_commands=82532i,latency_commands_count=337i,latency_reads=30633i,latency_reads_count=111i,latency_writes=0i,latency_writes_count=0i,member_status="PRI",net_in_bytes=636i,net_in_bytes_count=172300i,net_out_bytes=38849i,net_out_bytes_count=335459i,open_connections=7i,operation_scan_and_order=1i,operation_write_conflicts=0i,page_faults=1i,percent_cache_dirty=0,percent_cache_used=0,queries=23i,queries_per_sec=2i,queued_reads=0i,queued_writes=0i,repl_apply_batches_num=0i,repl_apply_batches_total_millis=0i,repl_apply_ops=0i,repl_buffer_count=0i,repl_buffer_size_bytes=0i,repl_commands=0i,repl_commands_per_sec=0i,repl_deletes=0i,repl_deletes_per_sec=0i,repl_executor_pool_in_progress_count=0i,repl_executor_queues_network_in_progress=0i,repl_executor_queues_sleepers=3i,repl_executor_unsignaled_events=0i,repl_getmores=0i,repl_getmores_per_sec=0i,repl_inserts=0i,repl_inserts_per_sec=0i,repl_lag=0i,repl_network_bytes=0i,repl_network_getmores_num=0i,repl_network_getmores_total_millis=0i,repl_network_ops=0i,repl_oplog_window_sec=140i,repl_queries=0i,repl_queries_per_sec=0i,repl_state=1i,repl_updates=0i,repl_updates_per_sec=0i,resident_megabytes=81i,state="PRIMARY",storage_freelist_search_bucket_exhausted=0i,storage_freelist_search_requests=0i,storage_freelist_search_scanned=0i,tcmalloc_central_cache_free_bytes=322128i,tcmalloc_current_allocated_bytes=143566680i,tcmalloc_current_total_thread_cache_bytes=1098968i,tcmalloc_heap_size=181317632i,tcmalloc_max_total_thread_cache_bytes=260046848i,tcmalloc_pageheap_commit_count=53i,tcmalloc_pageheap_committed_bytes=149106688i,tcmalloc_pageheap_decommit_count=1i,tcmalloc_pageheap_free_bytes=3244032i,tcmalloc_pageheap_reserve_count=51i,tcmalloc_pageheap_scavenge_count=1i,tcmalloc_pageheap_total_commit_bytes=183074816i,tcmalloc_pageheap_total_decommit_bytes=33968128i,tcmalloc_pageheap_total_reserve_bytes=181317632i,tcmalloc_pageheap_unmapped_bytes=32210944i,tcmalloc_spinlock_total_delay_ns=0i,tcmalloc_thread_cache_free_bytes=1098968i,tcmalloc_total_free_bytes=2295976i,tcmalloc_transfer_cache_free_bytes=874880i,total_available=0i,total_created=0i,total_docs_scanned=56i,total_in_use=0i,total_keys_scanned=2i,total_refreshing=0i,total_tickets_reads=128i,total_tickets_writes=128i,ttl_deletes=0i,ttl_deletes_per_sec=0i,ttl_passes=2i,ttl_passes_per_sec=0i,update_command_failed=0i,update_command_total=0i,updates=0i,updates_per_sec=0i,uptime_ns=166481000000i,version="4.0.19",vsize_megabytes=1482i,wt_connection_files_currently_open=26i,wt_data_handles_currently_active=44i,wtcache_app_threads_page_read_count=0i,wtcache_app_threads_page_read_time=0i,wtcache_app_threads_page_write_count=56i,wtcache_bytes_read_into=0i,wtcache_bytes_written_from=130403i,wtcache_current_bytes=100312i,wtcache_internal_pages_evicted=0i,wtcache_max_bytes_configured=506462208i,wtcache_modified_pages_evicted=0i,wtcache_pages_evicted_by_app_thread=0i,wtcache_pages_queued_for_eviction=0i,wtcache_pages_read_into=0i,wtcache_pages_requested_from=2085i,wtcache_server_evicting_pages=0i,wtcache_tracked_dirty_bytes=63929i,wtcache_unmodified_pages_evicted=0i,wtcache_worker_thread_evictingpages=0i 1595691605000000000
+mongodb_db_stats,db_name=admin,hostname=127.0.0.1:27017 avg_obj_size=241,collections=2i,data_size=723i,index_size=49152i,indexes=3i,num_extents=0i,objects=3i,ok=1i,storage_size=53248i,type="db_stat" 1547159491000000000
+mongodb_db_stats,db_name=local,hostname=127.0.0.1:27017 avg_obj_size=813.9705882352941,collections=6i,data_size=55350i,index_size=102400i,indexes=5i,num_extents=0i,objects=68i,ok=1i,storage_size=204800i,type="db_stat" 1547159491000000000
+mongodb_col_stats,collection=foo,db_name=local,hostname=127.0.0.1:27017 size=375005928i,avg_obj_size=5494,type="col_stat",storage_size=249307136i,total_index_size=2138112i,ok=1i,count=68251i 1547159491000000000
+mongodb_shard_stats,hostname=127.0.0.1:27017,in_use=3i,available=3i,created=4i,refreshing=0i 1522799074000000000
+mongodb_top_stats,collection=foo,total_time=1471,total_count=158,read_lock_time=49614,read_lock_count=657,write_lock_time=49125456,write_lock_count=9841,queries_time=174,queries_count=495,get_more_time=498,get_more_count=46,insert_time=2651,insert_count=1265,update_time=0,update_count=0,remove_time=0,remove_count=0,commands_time=498611,commands_count=4615
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Was this page helpful?

+
+ + + +
+
+

Thank you for your feedback!

+
+
+
+
+
+
+ + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ +

New in InfluxDB 3.8

+
+ +
+

Key enhancements in InfluxDB 3.8 and the InfluxDB 3 Explorer 1.6.

+

See the Blog Post

+ +
+ + +
+

InfluxDB 3.8 is now available for both Core and Enterprise, alongside the +1.6 release of the InfluxDB 3 Explorer UI. This release is focused on +operational maturity and making InfluxDB easier to deploy, manage, and run +reliably in production.

+

For more information, check out:

+ + +
+ + +
+ +
+
+
+ +

InfluxDB Docker latest tag changing to InfluxDB 3 Core

+
+ +
+ On May 27, 2026, the latest tag for InfluxDB Docker images will +point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version +tags in your Docker deployments. +
+ + +
+

If using Docker to install and run InfluxDB, the latest tag will point to +InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in +your Docker deployments. For example, if using Docker to run InfluxDB v2, +replace the latest version tag with a specific version tag in your Docker +pull command–for example:

+ + +
docker pull influxdb:2
+
+ + +
+ +
+ + + + + + + + + + + + + + +