diff --git a/pr-preview/pr-19/_/css/site.css b/pr-preview/pr-19/_/css/site.css deleted file mode 100644 index c39da22..0000000 --- a/pr-preview/pr-19/_/css/site.css +++ /dev/null @@ -1,2608 +0,0 @@ -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 400; - src: url(../font/roboto-latin-400-normal.woff2) format("woff2"), url(../font/roboto-latin-400-normal.woff) format("woff"); - unicode-range: U+00??, U+0131, U+0152-0153, U+02bb-02bc, U+02c6, U+02da, U+02dc, U+2000-206f, U+2074, U+20ac, U+2122, U+2191, U+2193, U+2212, U+2215, U+feff, U+fffd -} - -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 400; - src: url(../font/roboto-latin-400-italic.woff2) format("woff2"), url(../font/roboto-latin-400-italic.woff) format("woff"); - unicode-range: U+00??, U+0131, U+0152-0153, U+02bb-02bc, U+02c6, U+02da, U+02dc, U+2000-206f, U+2074, U+20ac, U+2122, U+2191, U+2193, U+2212, U+2215, U+feff, U+fffd -} - -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 500; - src: url(../font/roboto-latin-500-normal.woff2) format("woff2"), url(../font/roboto-latin-500-normal.woff) format("woff"); - unicode-range: U+00??, U+0131, U+0152-0153, U+02bb-02bc, U+02c6, U+02da, U+02dc, U+2000-206f, U+2074, U+20ac, U+2122, U+2191, U+2193, U+2212, U+2215, U+feff, U+fffd -} - -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 500; - src: url(../font/roboto-latin-500-italic.woff2) format("woff2"), url(../font/roboto-latin-500-italic.woff) format("woff"); - unicode-range: U+00??, U+0131, U+0152-0153, U+02bb-02bc, U+02c6, U+02da, U+02dc, U+2000-206f, U+2074, U+20ac, U+2122, U+2191, U+2193, U+2212, U+2215, U+feff, U+fffd -} - -@font-face { - font-family: Roboto Mono; - font-style: normal; - font-weight: 400; - src: url(../font/roboto-mono-latin-400-normal.woff2) format("woff2"), url(../font/roboto-mono-latin-400-normal.woff) format("woff"); - unicode-range: U+00??, U+0131, U+0152-0153, U+02bb-02bc, U+02c6, U+02da, U+02dc, U+2000-206f, U+2074, U+20ac, U+2122, U+2191, U+2193, U+2212, U+2215, U+feff, U+fffd -} - -@font-face { - font-family: Roboto Mono; - font-style: normal; - font-weight: 500; - src: url(../font/roboto-mono-latin-500-normal.woff2) format("woff2"), url(../font/roboto-mono-latin-500-normal.woff) format("woff"); - unicode-range: U+00??, U+0131, U+0152-0153, U+02bb-02bc, U+02c6, U+02da, U+02dc, U+2000-206f, U+2074, U+20ac, U+2122, U+2191, U+2193, U+2212, U+2215, U+feff, U+fffd -} - -*, -::after, -::before { - -webkit-box-sizing: inherit; - box-sizing: inherit -} - -html { - -webkit-box-sizing: border-box; - box-sizing: border-box; - font-size: 1.0625em; - height: 100%; - scroll-behavior: smooth -} - -@media screen and (min-width:1024px) { - html { - font-size: 1.125em - } -} - -body { - background: #fff; - color: #222; - font-family: Roboto, sans-serif; - line-height: 1.15; - margin: 0; - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - word-wrap: anywhere -} - -a { - text-decoration: none -} - -a:hover { - text-decoration: underline -} - -a:active { - background-color: none -} - -code, -kbd, -pre { - font-family: Roboto Mono, monospace -} - -b, -dt, -strong, -th { - font-weight: 500 -} - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline -} - -sub { - bottom: -.25em -} - -sup { - top: -.5em -} - -em em { - font-style: normal -} - -strong strong { - font-weight: 400 -} - -button { - cursor: pointer; - font-family: inherit; - font-size: 1em; - line-height: 1.15; - margin: 0 -} - -button::-moz-focus-inner { - border: none; - padding: 0 -} - -summary { - cursor: pointer; - -webkit-tap-highlight-color: transparent; - outline: none -} - -table { - border-collapse: collapse; - word-wrap: normal -} - -object[type="image/svg+xml"]:not([width]) { - width: -webkit-fit-content; - width: -moz-fit-content; - width: fit-content -} - -::-webkit-input-placeholder { - opacity: .5 -} - -::-moz-placeholder { - opacity: .5 -} - -:-ms-input-placeholder { - opacity: .5 -} - -::-ms-input-placeholder { - opacity: .5 -} - -::placeholder { - opacity: .5 -} - -@media (pointer:fine) { - @supports (scrollbar-width:thin) { - html { - scrollbar-color: #c1c1c1 #fafafa - } - - body * { - scrollbar-width: thin; - scrollbar-color: #c1c1c1 transparent - } - } - - html::-webkit-scrollbar { - background-color: #fafafa; - height: 12px; - width: 12px - } - - body ::-webkit-scrollbar { - height: 6px; - width: 6px - } - - ::-webkit-scrollbar-thumb { - background-clip: padding-box; - background-color: #c1c1c1; - border: 3px solid transparent; - border-radius: 12px - } - - body ::-webkit-scrollbar-thumb { - border-width: 1.75px; - border-radius: 6px - } - - ::-webkit-scrollbar-thumb:hover { - background-color: #9c9c9c - } -} - -@media screen and (min-width:1024px) { - .body { - display: -webkit-box; - display: -ms-flexbox; - display: flex - } -} - -.nav-container { - position: fixed; - top: 3.5rem; - left: 0; - width: 100%; - font-size: .94444rem; - z-index: 1; - visibility: hidden -} - -@media screen and (min-width:769px) { - .nav-container { - width: 15rem - } -} - -@media screen and (min-width:1024px) { - .nav-container { - font-size: .86111rem; - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - position: static; - top: 0; - visibility: visible - } -} - -.nav-container.is-active { - visibility: visible -} - -.nav { - background: #fafafa; - position: relative; - top: 2.5rem; - height: calc(100vh - 6rem) -} - -@media screen and (min-width:769px) { - .nav { - -webkit-box-shadow: .5px 0 3px #c1c1c1; - box-shadow: .5px 0 3px #c1c1c1 - } -} - -@media screen and (min-width:1024px) { - .nav { - top: 3.5rem; - -webkit-box-shadow: none; - box-shadow: none; - position: sticky; - height: calc(100vh - 3.5rem) - } -} - -.nav a { - color: inherit -} - -.nav .panels { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - height: inherit -} - -html.is-clipped--nav { - overflow-y: hidden -} - -.nav-panel-menu { - overflow-y: scroll; - -ms-scroll-chaining: none; - overscroll-behavior: none; - height: calc(100% - 2.5rem) -} - -.nav-panel-menu:not(.is-active) .nav-menu { - opacity: .75 -} - -.nav-panel-menu:not(.is-active)::after { - content: ""; - background: rgba(0, 0, 0, .5); - display: block; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0 -} - -.nav-menu { - min-height: 100%; - padding: .5rem .75rem; - line-height: 1.35; - position: relative -} - -.nav-menu h3.title { - color: #424242; - font-size: inherit; - font-weight: 500; - margin: 0; - padding: .25em 0 .125em -} - -.nav-list { - list-style: none; - margin: 0 0 0 .75rem; - padding: 0 -} - -.nav-menu>.nav-list+.nav-list { - margin-top: .5rem -} - -.nav-item { - margin-top: .5em -} - -.nav-item-toggle~.nav-list { - padding-bottom: .125rem -} - -.nav-item[data-depth="0"]>.nav-list:first-child { - display: block; - margin: 0 -} - -.nav-item:not(.is-active)>.nav-list { - display: none -} - -.nav-item-toggle { - background: transparent url(../img/caret.svg) no-repeat 50%/50%; - border: none; - outline: none; - line-height: inherit; - padding: 0; - position: absolute; - height: 1.35em; - width: 1.35em; - margin-top: -.05em; - margin-left: -1.35em -} - -.nav-item.is-active>.nav-item-toggle { - -webkit-transform: rotate(90deg); - transform: rotate(90deg) -} - -.is-current-page>.nav-link, -.is-current-page>.nav-text { - font-weight: 500 -} - -.nav-panel-explore { - background: #fafafa; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0 -} - -.nav-panel-explore:not(:first-child) { - top: auto; - max-height: calc(50% + 2.5rem) -} - -.nav-panel-explore .context { - font-size: .83333rem; - -ms-flex-negative: 0; - flex-shrink: 0; - color: #5d5d5d; - -webkit-box-shadow: 0 -1px 0 #e1e1e1; - box-shadow: 0 -1px 0 #e1e1e1; - padding: 0 .5rem; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - line-height: 1; - height: 2.5rem -} - -.nav-panel-explore:not(:first-child) .context { - cursor: pointer -} - -.nav-panel-explore .context .version { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: inherit; - -ms-flex-align: inherit; - align-items: inherit -} - -.nav-panel-explore .context .version::after { - content: ""; - background: url(../img/chevron.svg) no-repeat 100%/auto 100%; - width: 1.25em; - height: .75em -} - -.nav-panel-explore .components { - line-height: 1.6; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -webkit-box-shadow: inset 0 1px 5px #e1e1e1; - box-shadow: inset 0 1px 5px #e1e1e1; - background: #f0f0f0; - padding: .5rem .75rem 0; - margin: 0; - overflow-y: scroll; - -ms-scroll-chaining: none; - overscroll-behavior: none; - max-height: 100%; - display: block -} - -.nav-panel-explore:not(.is-active) .components { - display: none -} - -.nav-panel-explore .component { - display: block -} - -.nav-panel-explore .component+.component { - margin-top: .5rem -} - -.nav-panel-explore .component:last-child { - margin-bottom: .75rem -} - -.nav-panel-explore .component .title { - font-weight: 500 -} - -.nav-panel-explore .versions { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - padding-left: 0; - margin-top: -.25rem; - line-height: 1; - list-style: none -} - -.nav-panel-explore .component .version { - margin: .375rem .375rem 0 0 -} - -.nav-panel-explore .component .version a { - border: 1px solid #c1c1c1; - border-radius: .25rem; - opacity: .75; - white-space: nowrap; - padding: .125em .25em; - display: inherit -} - -.nav-panel-explore .component .is-current a { - border-color: currentColor; - opacity: .9; - font-weight: 500 -} - -@media screen and (max-width:1023.5px) { - aside.toc.sidebar { - display: none - } - - main>.content { - overflow-x: auto - } -} - -@media screen and (min-width:1024px) { - main { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - min-width: 0 - } - - main>.content { - display: -webkit-box; - display: -ms-flexbox; - display: flex - } - - aside.toc.embedded { - display: none - } - - aside.toc.sidebar { - -webkit-box-flex: 0; - -ms-flex: 0 0 9rem; - flex: 0 0 9rem; - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1 - } -} - -@media screen and (min-width:1216px) { - aside.toc.sidebar { - -ms-flex-preferred-size: 12rem; - flex-basis: 12rem - } -} - -.toolbar { - color: #5d5d5d; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - background-color: #fafafa; - -webkit-box-shadow: 0 1px 0 #e1e1e1; - box-shadow: 0 1px 0 #e1e1e1; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - font-size: .83333rem; - height: 2.5rem; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - position: sticky; - top: 3.5rem; - z-index: 2 -} - -.toolbar a { - color: inherit -} - -.nav-toggle { - background: url(../img/menu.svg) no-repeat 50% 47.5%; - background-size: 49%; - border: none; - outline: none; - line-height: inherit; - padding: 0; - height: 2.5rem; - width: 2.5rem; - margin-right: -.25rem -} - -@media screen and (min-width:1024px) { - .nav-toggle { - display: none - } -} - -.nav-toggle.is-active { - background-image: url(../img/back.svg); - background-size: 41.5% -} - -.home-link { - display: block; - background: url(../img/home-o.svg) no-repeat 50%; - height: 1.25rem; - width: 1.25rem; - margin: .625rem -} - -.home-link.is-current, -.home-link:hover { - background-image: url(../img/home.svg) -} - -.edit-this-page { - display: none; - padding-right: .5rem -} - -@media screen and (min-width:1024px) { - .edit-this-page { - display: block - } -} - -.toolbar .edit-this-page a { - color: #8e8e8e -} - -.breadcrumbs { - display: none; - -webkit-box-flex: 1; - -ms-flex: 1 1; - flex: 1 1; - padding: 0 .5rem 0 .75rem; - line-height: 1.35 -} - -@media screen and (min-width:1024px) { - .breadcrumbs { - display: block - } -} - -a+.breadcrumbs { - padding-left: .05rem -} - -.breadcrumbs ul { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - margin: 0; - padding: 0; - list-style: none -} - -.breadcrumbs li { - display: inline; - margin: 0 -} - -.breadcrumbs li::after { - content: "/"; - padding: 0 .5rem -} - -.breadcrumbs li:last-of-type::after { - content: none -} - -.page-versions { - margin: 0 .2rem 0 auto; - position: relative; - line-height: 1 -} - -@media screen and (min-width:1024px) { - .page-versions { - margin-right: .7rem - } -} - -.page-versions .version-menu-toggle { - color: inherit; - background: url(../img/chevron.svg) no-repeat; - background-position: right .5rem top 50%; - background-size: auto .75em; - border: none; - outline: none; - line-height: inherit; - padding: .5rem 1.5rem .5rem .5rem; - position: relative; - z-index: 3 -} - -.page-versions .version-menu { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - min-width: 100%; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-align: end; - -ms-flex-align: end; - align-items: flex-end; - background: -webkit-gradient(linear, left top, left bottom, from(#f0f0f0), to(#f0f0f0)) no-repeat; - background: linear-gradient(180deg, #f0f0f0 0, #f0f0f0) no-repeat; - padding: 1.375rem 1.5rem .5rem .5rem; - position: absolute; - top: 0; - right: 0; - white-space: nowrap -} - -.page-versions:not(.is-active) .version-menu { - display: none -} - -.page-versions .version { - display: block; - padding-top: .5rem -} - -.page-versions .version.is-current { - display: none -} - -.page-versions .version.is-missing { - color: #8e8e8e; - font-style: italic; - text-decoration: none -} - -.toc-menu { - color: #5d5d5d -} - -.toc.sidebar .toc-menu { - margin-right: .75rem; - position: sticky; - top: 6rem -} - -.toc .toc-menu h3 { - color: #333; - font-size: .88889rem; - font-weight: 500; - line-height: 1.3; - margin: 0 -.5px; - padding-bottom: .25rem -} - -.toc.sidebar .toc-menu h3 { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - height: 2.5rem; - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end -} - -.toc .toc-menu ul { - font-size: .83333rem; - line-height: 1.2; - list-style: none; - margin: 0; - padding: 0 -} - -.toc.sidebar .toc-menu ul { - max-height: calc(100vh - 8.5rem); - overflow-y: auto; - -ms-scroll-chaining: none; - overscroll-behavior: none -} - -@supports (scrollbar-width:none) { - .toc.sidebar .toc-menu ul { - scrollbar-width: none - } -} - -.toc .toc-menu ul::-webkit-scrollbar { - width: 0; - height: 0 -} - -@media screen and (min-width:1024px) { - .toc .toc-menu h3 { - font-size: .83333rem - } - - .toc .toc-menu ul { - font-size: .75rem - } -} - -.toc .toc-menu li { - margin: 0 -} - -.toc .toc-menu li[data-level="2"] a { - padding-left: 1.25rem -} - -.toc .toc-menu li[data-level="3"] a { - padding-left: 2rem -} - -.toc .toc-menu a { - color: inherit; - border-left: 2px solid #e1e1e1; - display: inline-block; - padding: .25rem 0 .25rem .5rem; - text-decoration: none -} - -.sidebar.toc .toc-menu a { - display: block; - outline: none -} - -.toc .toc-menu a:hover { - color: #1565c0 -} - -.toc .toc-menu a.is-active { - border-left-color: #1565c0; - color: #333 -} - -.sidebar.toc .toc-menu a:focus { - background: #fafafa -} - -.toc .toc-menu .is-hidden-toc { - display: none !important -} - -.doc { - color: #333; - font-size: inherit; - -webkit-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; - line-height: 1.6; - margin: 0 auto; - max-width: 40rem; - padding: 0 1rem 4rem -} - -@media screen and (min-width:1024px) { - .doc { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - font-size: .94444rem; - margin: 0 2rem; - max-width: 46rem; - min-width: 0 - } -} - -.doc h1, -.doc h2, -.doc h3, -.doc h4, -.doc h5, -.doc h6 { - color: #191919; - font-weight: 400; - -webkit-hyphens: none; - -ms-hyphens: none; - hyphens: none; - line-height: 1.3; - margin: 1rem 0 0 -} - -.doc>h1.page:first-child { - font-size: 2rem; - margin: 1.5rem 0 -} - -@media screen and (min-width:769px) { - .doc>h1.page:first-child { - margin-top: 2.5rem - } -} - -.doc>h1.page:first-child+aside.toc.embedded { - margin-top: -.5rem -} - -.doc>h2#name+.sectionbody { - margin-top: 1rem -} - -#preamble+.sect1, -.doc .sect1+.sect1 { - margin-top: 2rem -} - -.doc h1.sect0 { - background: #f0f0f0; - font-size: 1.8em; - margin: 1.5rem -1rem 0; - padding: .5rem 1rem -} - -.doc h2:not(.discrete) { - border-bottom: 1px solid #e1e1e1; - margin-left: -1rem; - margin-right: -1rem; - padding: .4rem 1rem .1rem -} - -.doc h3:not(.discrete), -.doc h4:not(.discrete) { - font-weight: 500 -} - -.doc h1 .anchor, -.doc h2 .anchor, -.doc h3 .anchor, -.doc h4 .anchor, -.doc h5 .anchor, -.doc h6 .anchor { - position: absolute; - text-decoration: none; - width: 1.75ex; - margin-left: -1.5ex; - visibility: hidden; - font-size: .8em; - font-weight: 400; - padding-top: .05em -} - -.doc h1 .anchor::before, -.doc h2 .anchor::before, -.doc h3 .anchor::before, -.doc h4 .anchor::before, -.doc h5 .anchor::before, -.doc h6 .anchor::before { - content: "\00a7" -} - -.doc h1:hover .anchor, -.doc h2:hover .anchor, -.doc h3:hover .anchor, -.doc h4:hover .anchor, -.doc h5:hover .anchor, -.doc h6:hover .anchor { - visibility: visible -} - -.doc dl, -.doc p { - margin: 0 -} - -.doc a { - color: #1565c0 -} - -.doc a:hover { - color: #104d92 -} - -.doc a.bare { - -webkit-hyphens: none; - -ms-hyphens: none; - hyphens: none -} - -.doc a.unresolved { - color: #d32f2f -} - -.doc i.fa { - -webkit-hyphens: none; - -ms-hyphens: none; - hyphens: none; - font-style: normal -} - -.doc .colist>table code, -.doc p code, -.doc thead code { - color: #222; - background: #fafafa; - border-radius: .25em; - font-size: .95em; - padding: .125em .25em -} - -.doc code, -.doc pre { - -webkit-hyphens: none; - -ms-hyphens: none; - hyphens: none -} - -.doc pre { - font-size: .88889rem; - line-height: 1.5; - margin: 0 -} - -.doc blockquote { - margin: 0 -} - -.doc .paragraph.lead>p { - font-size: 1rem -} - -.doc .right { - float: right -} - -.doc .left { - float: left -} - -.doc .float-gap.right { - margin: 0 1rem 1rem 0 -} - -.doc .float-gap.left { - margin: 0 0 1rem 1rem -} - -.doc .float-group::after { - content: ""; - display: table; - clear: both -} - -.doc .stretch { - width: 100% -} - -.doc .underline { - text-decoration: underline -} - -.doc .line-through { - text-decoration: line-through -} - -.doc .dlist, -.doc .exampleblock, -.doc .hdlist, -.doc .imageblock, -.doc .listingblock, -.doc .literalblock, -.doc .olist, -.doc .paragraph, -.doc .partintro, -.doc .quoteblock, -.doc .sidebarblock, -.doc .tabs, -.doc .ulist, -.doc .verseblock, -.doc .videoblock, -.doc details, -.doc hr { - margin: 1rem 0 0 -} - -.doc table.tableblock { - font-size: .83333rem -} - -.doc .tablecontainer, -.doc .tablecontainer+*, -.doc :not(.tablecontainer)>table.tableblock, -.doc :not(.tablecontainer)>table.tableblock+* { - margin-top: 1.5rem -} - -.doc p.tableblock+p.tableblock { - margin-top: .5rem -} - -.doc td.tableblock>.content>:first-child { - margin-top: 0 -} - -.doc table.tableblock td, -.doc table.tableblock th { - padding: .5rem -} - -.doc table.tableblock, -.doc table.tableblock>*>tr>* { - border: 0 solid #e1e1e1 -} - -.doc table.grid-all>*>tr>* { - border-width: 1px -} - -.doc table.grid-cols>*>tr>* { - border-width: 0 1px -} - -.doc table.grid-rows>*>tr>* { - border-width: 1px 0 -} - -.doc table.grid-all>thead th, -.doc table.grid-rows>thead th { - border-bottom-width: 2.5px -} - -.doc table.frame-all { - border-width: 1px -} - -.doc table.frame-ends { - border-width: 1px 0 -} - -.doc table.frame-sides { - border-width: 0 1px -} - -.doc table.frame-none>colgroup+*>:first-child>*, -.doc table.frame-sides>colgroup+*>:first-child>* { - border-top-width: 0 -} - -.doc table.frame-sides>:last-child>:last-child>* { - border-bottom-width: 0 -} - -.doc table.frame-ends>*>tr>:first-child, -.doc table.frame-none>*>tr>:first-child { - border-left-width: 0 -} - -.doc table.frame-ends>*>tr>:last-child, -.doc table.frame-none>*>tr>:last-child { - border-right-width: 0 -} - -.doc table.stripes-all>tbody>tr, -.doc table.stripes-even>tbody>tr:nth-of-type(2n), -.doc table.stripes-hover>tbody>tr:hover, -.doc table.stripes-odd>tbody>tr:nth-of-type(odd) { - background: #fafafa -} - -.doc table.tableblock>tfoot { - background: -webkit-gradient(linear, left top, left bottom, from(#f0f0f0), to(#fff)); - background: linear-gradient(180deg, #f0f0f0 0, #fff) -} - -.doc .halign-left { - text-align: left -} - -.doc .halign-right { - text-align: right -} - -.doc .halign-center { - text-align: center -} - -.doc .valign-top { - vertical-align: top -} - -.doc .valign-bottom { - vertical-align: bottom -} - -.doc .valign-middle { - vertical-align: middle -} - -.doc .admonitionblock { - margin: 1.4rem 0 0 -} - -.doc .admonitionblock p, -.doc .admonitionblock td.content { - font-size: .88889rem -} - -.doc .admonitionblock td.content>.title+*, -.doc .admonitionblock td.content>:not(.title):first-child { - margin-top: 0 -} - -.doc .admonitionblock pre { - font-size: .83333rem -} - -.doc .admonitionblock>table { - table-layout: fixed; - position: relative; - width: 100% -} - -.doc .admonitionblock td.content { - padding: 1rem 1rem .75rem; - background: #fafafa; - width: 100%; - word-wrap: anywhere -} - -.doc .admonitionblock .icon { - position: absolute; - top: 0; - left: 0; - font-size: .83333rem; - padding: 0 .5rem; - height: 1.25rem; - line-height: 1; - font-weight: 500; - text-transform: uppercase; - border-radius: .45rem; - -webkit-transform: translate(-.5rem, -50%); - transform: translate(-.5rem, -50%) -} - -.doc .admonitionblock.caution .icon { - background-color: #a0439c; - color: #fff -} - -.doc .admonitionblock.important .icon { - background-color: #d32f2f; - color: #fff -} - -.doc .admonitionblock.note .icon { - background-color: #217ee7; - color: #fff -} - -.doc .admonitionblock.tip .icon { - background-color: #41af46; - color: #fff -} - -.doc .admonitionblock.warning .icon { - background-color: #e18114; - color: #fff -} - -.doc .admonitionblock .icon i { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - height: 100% -} - -.doc .admonitionblock .icon i::after { - content: attr(title) -} - -.doc .imageblock, -.doc .videoblock { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center -} - -.doc .imageblock.text-left, -.doc .videoblock.text-left { - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start -} - -.doc .imageblock.text-right, -.doc .videoblock.text-right { - -webkit-box-align: end; - -ms-flex-align: end; - align-items: flex-end -} - -.doc .image>img, -.doc .image>object, -.doc .image>svg, -.doc .imageblock img, -.doc .imageblock object, -.doc .imageblock svg { - display: inline-block; - height: auto; - max-width: 100%; - vertical-align: middle -} - -.doc .image:not(.left):not(.right)>img { - margin-top: -.2em -} - -.doc .videoblock iframe { - max-width: 100%; - vertical-align: middle -} - -#preamble .abstract blockquote { - background: #f0f0f0; - border-left: 5px solid #e1e1e1; - color: #4a4a4a; - font-size: .88889rem; - padding: .75em 1em -} - -.doc .quoteblock, -.doc .verseblock { - background: #fafafa; - border-left: 5px solid #5d5d5d; - color: #5d5d5d -} - -.doc .quoteblock { - padding: .25rem 2rem 1.25rem -} - -.doc .quoteblock .attribution { - color: #8e8e8e; - font-size: .83333rem; - margin-top: .75rem -} - -.doc .quoteblock blockquote { - margin-top: 1rem -} - -.doc .quoteblock .paragraph { - font-style: italic -} - -.doc .quoteblock cite { - padding-left: 1em -} - -.doc .verseblock { - font-size: 1.15em; - padding: 1rem 2rem -} - -.doc .verseblock pre { - font-family: inherit; - font-size: inherit -} - -.doc ol, -.doc ul { - margin: 0; - padding: 0 0 0 2rem -} - -.doc ol.none, -.doc ol.unnumbered, -.doc ol.unstyled, -.doc ul.checklist, -.doc ul.no-bullet, -.doc ul.none, -.doc ul.unstyled { - list-style-type: none -} - -.doc ol.unnumbered, -.doc ul.no-bullet { - padding-left: 1.25rem -} - -.doc ol.unstyled, -.doc ul.unstyled { - padding-left: 0 -} - -.doc ul.circle { - list-style-type: circle -} - -.doc ul.disc { - list-style-type: disc -} - -.doc ul.square { - list-style-type: square -} - -.doc ul.circle ul:not([class]), -.doc ul.disc ul:not([class]), -.doc ul.square ul:not([class]) { - list-style: inherit -} - -.doc ol.arabic { - list-style-type: decimal -} - -.doc ol.decimal { - list-style-type: decimal-leading-zero -} - -.doc ol.loweralpha { - list-style-type: lower-alpha -} - -.doc ol.upperalpha { - list-style-type: upper-alpha -} - -.doc ol.lowerroman { - list-style-type: lower-roman -} - -.doc ol.upperroman { - list-style-type: upper-roman -} - -.doc ol.lowergreek { - list-style-type: lower-greek -} - -.doc ul.checklist { - padding-left: 1.75rem -} - -.doc ul.checklist p>i.fa-check-square-o:first-child, -.doc ul.checklist p>i.fa-square-o:first-child { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - width: 1.25rem; - margin-left: -1.25rem -} - -.doc ul.checklist i.fa-check-square-o::before { - content: "\2713" -} - -.doc ul.checklist i.fa-square-o::before { - content: "\274f" -} - -.doc .dlist .dlist, -.doc .dlist .olist, -.doc .dlist .ulist, -.doc .olist .dlist, -.doc .olist .olist, -.doc .olist .ulist, -.doc .olist li+li, -.doc .ulist .dlist, -.doc .ulist .olist, -.doc .ulist .ulist, -.doc .ulist li+li { - margin-top: .5rem -} - -.doc .admonitionblock .listingblock, -.doc .olist .listingblock, -.doc .ulist .listingblock { - padding: 0 -} - -.doc .admonitionblock .title, -.doc .exampleblock .title, -.doc .imageblock .title, -.doc .listingblock .title, -.doc .literalblock .title, -.doc .openblock .title, -.doc .tableblock caption, -.doc .videoblock .title { - color: #5d5d5d; - font-size: .88889rem; - font-style: italic; - font-weight: 500; - -webkit-hyphens: none; - -ms-hyphens: none; - hyphens: none; - letter-spacing: .01em; - padding-bottom: .075rem -} - -.doc .tableblock caption { - text-align: left -} - -.doc .olist .title, -.doc .ulist .title { - font-style: italic; - font-weight: 500; - margin-bottom: .25rem -} - -.doc .imageblock .title { - margin-top: .5rem; - padding-bottom: 0 -} - -.doc details { - margin-left: 1rem -} - -.doc details>summary { - display: block; - position: relative; - line-height: 1.6; - margin-bottom: .5rem -} - -.doc details>summary::-webkit-details-marker { - display: none -} - -.doc details>summary::before { - content: ""; - border: solid transparent; - border-left: solid; - border-width: .3em 0 .3em .5em; - position: absolute; - top: .5em; - left: -1rem; - -webkit-transform: translateX(15%); - transform: translateX(15%) -} - -.doc details[open]>summary::before { - border-color: currentColor transparent transparent; - border-width: .5rem .3rem 0; - -webkit-transform: translateY(15%); - transform: translateY(15%) -} - -.doc details>summary::after { - content: ""; - width: 1rem; - height: 1em; - position: absolute; - top: .3em; - left: -1rem -} - -.doc details.result { - margin-top: .25rem -} - -.doc details.result>summary { - color: #5d5d5d; - font-style: italic; - margin-bottom: 0 -} - -.doc details.result>.content { - margin-left: -1rem -} - -.doc .exampleblock>.content, -.doc details.result>.content { - background: #fff; - border: .25rem solid #5d5d5d; - border-radius: .5rem; - padding: .75rem -} - -.doc .exampleblock>.content::after, -.doc details.result>.content::after { - content: ""; - display: table; - clear: both -} - -.doc .exampleblock>.content>:first-child, -.doc details>.content>:first-child { - margin-top: 0 -} - -.doc .sidebarblock { - background: #e1e1e1; - border-radius: .75rem; - padding: .75rem 1.5rem -} - -.doc .sidebarblock>.content>.title { - font-size: 1.25rem; - font-weight: 500; - line-height: 1.3; - margin-bottom: -.3em; - text-align: center -} - -.doc .sidebarblock>.content>:not(.title):first-child { - margin-top: 0 -} - -.doc .listingblock.wrap pre, -.doc .tableblock pre { - white-space: pre-wrap -} - -.doc .listingblock pre:not(.highlight), -.doc .literalblock pre, -.doc pre.highlight code { - background: #fafafa; - -webkit-box-shadow: inset 0 0 1.75px #e1e1e1; - box-shadow: inset 0 0 1.75px #e1e1e1; - display: block; - overflow-x: auto; - padding: .875em -} - -.doc .listingblock>.content { - position: relative -} - -.doc .source-toolbox { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - visibility: hidden; - position: absolute; - top: .25rem; - right: .5rem; - color: grey; - font-family: Roboto, sans-serif; - font-size: .72222rem; - line-height: 1; - white-space: nowrap; - z-index: 1 -} - -.doc .listingblock:hover .source-toolbox { - visibility: visible -} - -.doc .source-toolbox .source-lang { - text-transform: uppercase; - letter-spacing: .075em -} - -.doc .source-toolbox>:not(:last-child)::after { - content: "|"; - letter-spacing: 0; - padding: 0 1ch -} - -.doc .source-toolbox .copy-button { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - background: none; - border: none; - color: inherit; - outline: none; - padding: 0; - font-size: inherit; - line-height: inherit; - width: 1em; - height: 1em -} - -.doc .source-toolbox .copy-icon { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: inherit; - height: inherit -} - -.doc .source-toolbox img.copy-icon { - -webkit-filter: invert(50.2%); - filter: invert(50.2%) -} - -.doc .source-toolbox svg.copy-icon { - fill: currentColor -} - -.doc .source-toolbox .copy-toast { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - position: relative; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - margin-top: 1em; - background-color: #333; - border-radius: .25em; - padding: .5em; - color: #fff; - cursor: auto; - opacity: 0; - -webkit-transition: opacity .5s ease .5s; - transition: opacity .5s ease .5s -} - -.doc .source-toolbox .copy-toast::after { - content: ""; - position: absolute; - top: 0; - width: 1em; - height: 1em; - border: .55em solid transparent; - border-left-color: #333; - -webkit-transform: rotate(-90deg) translateX(50%) translateY(50%); - transform: rotate(-90deg) translateX(50%) translateY(50%); - -webkit-transform-origin: left; - transform-origin: left -} - -.doc .source-toolbox .copy-button.clicked .copy-toast { - opacity: 1; - -webkit-transition: none; - transition: none -} - -.doc .language-console .hljs-meta { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none -} - -.doc .dlist dt { - font-style: italic -} - -.doc .dlist dd { - margin: 0 0 .25rem 1.5rem -} - -.doc .dlist dd:last-of-type { - margin-bottom: 0 -} - -.doc td.hdlist1, -.doc td.hdlist2 { - padding: .5rem 0 0; - vertical-align: top -} - -.doc tr:first-child>.hdlist1, -.doc tr:first-child>.hdlist2 { - padding-top: 0 -} - -.doc td.hdlist1 { - font-weight: 500; - padding-right: .25rem -} - -.doc td.hdlist2 { - padding-left: .25rem -} - -.doc .colist { - font-size: .88889rem; - margin: .25rem 0 -.25rem -} - -.doc .colist>table>tbody>tr>:first-child, -.doc .colist>table>tr>:first-child { - padding: .25em .5rem 0; - vertical-align: top -} - -.doc .colist>table>tbody>tr>:last-child, -.doc .colist>table>tr>:last-child { - padding: .25rem 0 -} - -.doc .conum[data-value] { - border: 1px solid; - border-radius: 100%; - display: inline-block; - font-family: Roboto, sans-serif; - font-size: .75rem; - font-style: normal; - line-height: 1.2; - text-align: center; - width: 1.25em; - height: 1.25em; - letter-spacing: -.25ex; - text-indent: -.25ex -} - -.doc .conum[data-value]::after { - content: attr(data-value) -} - -.doc .conum[data-value]+b { - display: none -} - -.doc hr { - border: solid #e1e1e1; - border-width: 2px 0 0; - height: 0 -} - -.doc b.button { - white-space: nowrap -} - -.doc b.button::before { - content: "["; - padding-right: .25em -} - -.doc b.button::after { - content: "]"; - padding-left: .25em -} - -.doc kbd { - display: inline-block; - font-size: .66667rem; - background: #fafafa; - border: 1px solid #c1c1c1; - border-radius: .25em; - -webkit-box-shadow: 0 1px 0 #c1c1c1, 0 0 0 .1em #fff inset; - box-shadow: 0 1px 0 #c1c1c1, inset 0 0 0 .1em #fff; - padding: .25em .5em; - vertical-align: text-bottom; - white-space: nowrap -} - -.doc .keyseq, -.doc kbd { - line-height: 1 -} - -.doc .keyseq { - font-size: .88889rem -} - -.doc .keyseq kbd { - margin: 0 .125em -} - -.doc .keyseq kbd:first-child { - margin-left: 0 -} - -.doc .keyseq kbd:last-child { - margin-right: 0 -} - -.doc .menuseq, -.doc .path { - -webkit-hyphens: none; - -ms-hyphens: none; - hyphens: none -} - -.doc .menuseq i.caret::before { - content: "\203a"; - font-size: 1.1em; - font-weight: 500; - line-height: .90909 -} - -.doc :not(pre).nowrap { - white-space: nowrap -} - -.doc .nobreak { - -webkit-hyphens: none; - -ms-hyphens: none; - hyphens: none; - word-wrap: normal -} - -#footnotes { - font-size: .85em; - line-height: 1.5; - margin: 2rem -.5rem 0 -} - -.doc td.tableblock>.content #footnotes { - margin: 2rem 0 0 -} - -#footnotes hr { - border-top-width: 1px; - margin-top: 0; - width: 20% -} - -#footnotes .footnote { - margin: .5em 0 0 1em -} - -#footnotes .footnote+.footnote { - margin-top: .25em -} - -#footnotes .footnote>a:first-of-type { - display: inline-block; - margin-left: -2em; - text-align: right; - width: 1.5em -} - -nav.pagination { - border-top: 1px solid #e1e1e1; - line-height: 1; - margin: 2rem -1rem -1rem; - padding: .75rem 1rem 0 -} - -nav.pagination, -nav.pagination span { - display: -webkit-box; - display: -ms-flexbox; - display: flex -} - -nav.pagination span { - -webkit-box-flex: 50%; - -ms-flex: 50%; - flex: 50%; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column -} - -nav.pagination .prev { - padding-right: .5rem -} - -nav.pagination .next { - margin-left: auto; - padding-left: .5rem; - text-align: right -} - -nav.pagination span::before { - color: #8e8e8e; - font-size: .75em; - padding-bottom: .1em -} - -nav.pagination .prev::before { - content: "Prev" -} - -nav.pagination .next::before { - content: "Next" -} - -nav.pagination a { - font-weight: 500; - line-height: 1.3; - position: relative -} - -nav.pagination a::after, -nav.pagination a::before { - color: #8e8e8e; - font-weight: 400; - font-size: 1.5em; - line-height: .75; - position: absolute; - top: 0; - width: 1rem -} - -nav.pagination .prev a::before { - content: "\2039"; - -webkit-transform: translateX(-100%); - transform: translateX(-100%) -} - -nav.pagination .next a::after { - content: "\203a" -} - -html.is-clipped--navbar { - overflow-y: hidden -} - -body { - padding-top: 3.5rem -} - -.navbar { - background: #191919; - color: #fff; - font-size: .88889rem; - height: 3.5rem; - position: fixed; - top: 0; - width: 100%; - z-index: 4 -} - -.navbar a { - text-decoration: none -} - -.navbar-brand { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - padding-left: 1rem -} - -.navbar-brand .navbar-item { - color: #fff -} - -.navbar-brand .navbar-item:first-child { - -ms-flex-item-align: center; - align-self: center; - padding: 0; - font-size: 1.22222rem; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - line-height: 1 -} - -.navbar-brand .navbar-item:first-child a { - color: inherit; - word-wrap: normal -} - -.navbar-brand .navbar-item:first-child :not(:last-child) { - padding-right: .375rem -} - -.navbar-brand .navbar-item.search { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end -} - -#search-input { - color: #333; - font-family: inherit; - font-size: .95rem; - width: 150px; - border: 1px solid #dbdbdb; - border-radius: .1em; - line-height: 1.5; - padding: 0 .25em -} - -#search-input:disabled { - background-color: #dbdbdb; - cursor: not-allowed; - pointer-events: all !important -} - -#search-input:disabled::-webkit-input-placeholder { - color: #4c4c4c -} - -#search-input:disabled::-moz-placeholder { - color: #4c4c4c -} - -#search-input:disabled:-ms-input-placeholder { - color: #4c4c4c -} - -#search-input:disabled::-ms-input-placeholder { - color: #4c4c4c -} - -#search-input:disabled::placeholder { - color: #4c4c4c -} - -#search-input:focus { - outline: none -} - -.navbar-burger { - background: none; - border: none; - outline: none; - line-height: 1; - position: relative; - width: 3rem; - padding: 0; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - margin-left: auto; - min-width: 0 -} - -.navbar-burger span { - background-color: #fff; - height: 1.5px; - width: 1rem -} - -.navbar-burger:not(.is-active) span { - -webkit-transition: opacity 0s .25s, margin-top .25s ease-out .25s, -webkit-transform .25s ease-out; - transition: opacity 0s .25s, margin-top .25s ease-out .25s, -webkit-transform .25s ease-out; - transition: transform .25s ease-out, opacity 0s .25s, margin-top .25s ease-out .25s; - transition: transform .25s ease-out, opacity 0s .25s, margin-top .25s ease-out .25s, -webkit-transform .25s ease-out -} - -.navbar-burger span+span { - margin-top: .25rem -} - -.navbar-burger.is-active span+span { - margin-top: -1.5px -} - -.navbar-burger.is-active span:first-child { - -webkit-transform: rotate(45deg); - transform: rotate(45deg) -} - -.navbar-burger.is-active span:nth-child(2) { - opacity: 0 -} - -.navbar-burger.is-active span:nth-child(3) { - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg) -} - -.navbar-item, -.navbar-link { - color: #222; - display: block; - line-height: 1.6; - padding: .5rem 1rem -} - -.navbar-item.has-dropdown { - padding: 0 -} - -.navbar-item .icon { - width: 1.25rem; - height: 1.25rem; - display: block -} - -.navbar-item .icon img, -.navbar-item .icon svg { - fill: currentColor; - width: inherit; - height: inherit -} - -.navbar-link { - padding-right: 2.5em -} - -.navbar-dropdown .navbar-item { - padding-left: 1.5rem; - padding-right: 1.5rem -} - -.navbar-dropdown .navbar-item.has-label { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between -} - -.navbar-dropdown .navbar-item small { - color: #8e8e8e; - font-size: .66667rem -} - -.navbar-divider { - background-color: #e1e1e1; - border: none; - height: 1px; - margin: .25rem 0 -} - -.navbar .button { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - background: #fff; - border: 1px solid #e1e1e1; - border-radius: .15rem; - height: 1.75rem; - color: #222; - padding: 0 .75em; - white-space: nowrap -} - -@media screen and (max-width:768.5px) { - .navbar-brand .navbar-item.search { - padding-left: 0; - padding-right: 0 - } -} - -@media screen and (min-width:769px) { - #search-input { - width: 200px - } -} - -@media screen and (max-width:1023.5px) { - .navbar-brand { - height: inherit - } - - .navbar-brand .navbar-item { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -ms-flexbox; - display: flex - } - - .navbar-menu { - background: #fff; - -webkit-box-shadow: 0 8px 16px rgba(10, 10, 10, .1); - box-shadow: 0 8px 16px rgba(10, 10, 10, .1); - max-height: calc(100vh - 3.5rem); - overflow-y: auto; - -ms-scroll-chaining: none; - overscroll-behavior: none; - padding: .5rem 0 - } - - .navbar-menu:not(.is-active) { - display: none - } - - .navbar-menu .navbar-link:hover, - .navbar-menu a.navbar-item:hover { - background: #f5f5f5 - } -} - -@media screen and (min-width:1024px) { - .navbar-burger { - display: none - } - - .navbar, - .navbar-end, - .navbar-item, - .navbar-link, - .navbar-menu { - display: -webkit-box; - display: -ms-flexbox; - display: flex - } - - .navbar-item, - .navbar-link { - position: relative; - -webkit-box-flex: 0; - -ms-flex: none; - flex: none - } - - .navbar-item:not(.has-dropdown), - .navbar-link { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center - } - - .navbar-item.is-hoverable:hover .navbar-dropdown { - display: block - } - - .navbar-link::after { - border-width: 0 0 1px 1px; - border-style: solid; - content: ""; - display: block; - height: .5em; - pointer-events: none; - position: absolute; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - width: .5em; - margin-top: -.375em; - right: 1.125em; - top: 50% - } - - .navbar-end .navbar-link, - .navbar-end>.navbar-item { - color: #fff - } - - .navbar-end .navbar-item.has-dropdown:hover .navbar-link, - .navbar-end .navbar-link:hover, - .navbar-end>a.navbar-item:hover { - background: #000; - color: #fff - } - - .navbar-end .navbar-link::after { - border-color: currentColor - } - - .navbar-dropdown { - background: #fff; - border: 1px solid #e1e1e1; - border-top: none; - border-radius: 0 0 .25rem .25rem; - display: none; - top: 100%; - left: 0; - min-width: 100%; - position: absolute - } - - .navbar-dropdown .navbar-item { - padding: .5rem 3rem .5rem 1rem; - white-space: nowrap - } - - .navbar-dropdown .navbar-item small { - position: relative; - right: -2rem - } - - .navbar-dropdown .navbar-item:last-child { - border-radius: inherit - } - - .navbar-dropdown.is-right { - left: auto; - right: 0 - } - - .navbar-dropdown a.navbar-item:hover { - background: #f5f5f5 - } -} - -footer.footer { - background-color: #e1e1e1; - color: #5d5d5d; - font-size: .83333rem; - line-height: 1.6; - padding: 1.5rem -} - -.footer p { - margin: .5rem 0 -} - -.footer a { - color: #191919 -} - -/*! Adapted from the GitHub style by Vasily Polovnyov */ -.hljs-comment, -.hljs-quote { - color: #998; - font-style: italic -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-subst { - color: #333; - font-weight: 500 -} - -.hljs-literal, -.hljs-number, -.hljs-tag .hljs-attr, -.hljs-template-variable, -.hljs-variable { - color: teal -} - -.hljs-doctag, -.hljs-string { - color: #d14 -} - -.hljs-section, -.hljs-selector-id, -.hljs-title { - color: #900; - font-weight: 500 -} - -.hljs-subst { - font-weight: 400 -} - -.hljs-class .hljs-title, -.hljs-type { - color: #458; - font-weight: 500 -} - -.hljs-attribute, -.hljs-name, -.hljs-tag { - color: navy; - font-weight: 400 -} - -.hljs-link, -.hljs-regexp { - color: #009926 -} - -.hljs-bullet, -.hljs-symbol { - color: #990073 -} - -.hljs-built_in, -.hljs-builtin-name { - color: #0086b3 -} - -.hljs-meta { - color: #999; - font-weight: 500 -} - -.hljs-deletion { - background: #fdd -} - -.hljs-addition { - background: #dfd -} - -.hljs-emphasis { - font-style: italic -} - -.hljs-strong { - font-weight: 500 -} - -@page { - margin: .5in -} - -@media print { - .hide-for-print { - display: none !important - } - - html { - font-size: .9375em - } - - a { - color: inherit !important; - text-decoration: underline - } - - a.bare, - a[href^="#"], - a[href^="mailto:"] { - text-decoration: none - } - - img, - object, - svg, - tr { - page-break-inside: avoid - } - - thead { - display: table-header-group - } - - pre { - -webkit-hyphens: none; - -ms-hyphens: none; - hyphens: none; - white-space: pre-wrap - } - - body { - padding-top: 2rem - } - - .navbar { - background: none; - color: inherit; - position: absolute - } - - .navbar * { - color: inherit !important - } - - .nav-container, - .navbar>:not(.navbar-brand), - .toolbar, - aside.toc, - nav.pagination { - display: none - } - - .doc { - color: inherit; - margin: auto; - max-width: none; - padding-bottom: 2rem - } - - .doc .admonitionblock td.icon { - -webkit-print-color-adjust: exact; - color-adjust: exact - } - - .doc .listingblock code[data-lang]::before { - display: block - } - - footer.footer { - background: none; - border-top: 1px solid #e1e1e1; - color: #8e8e8e; - padding: .25rem .5rem 0 - } - - .footer * { - color: inherit - } -} \ No newline at end of file diff --git a/pr-preview/pr-19/_/font/roboto-latin-400-italic.woff b/pr-preview/pr-19/_/font/roboto-latin-400-italic.woff deleted file mode 100644 index ebee16b..0000000 Binary files a/pr-preview/pr-19/_/font/roboto-latin-400-italic.woff and /dev/null differ diff --git a/pr-preview/pr-19/_/font/roboto-latin-400-italic.woff2 b/pr-preview/pr-19/_/font/roboto-latin-400-italic.woff2 deleted file mode 100644 index e1b7a79..0000000 Binary files a/pr-preview/pr-19/_/font/roboto-latin-400-italic.woff2 and /dev/null differ diff --git a/pr-preview/pr-19/_/font/roboto-latin-400-normal.woff b/pr-preview/pr-19/_/font/roboto-latin-400-normal.woff deleted file mode 100644 index 9eaa94f..0000000 Binary files a/pr-preview/pr-19/_/font/roboto-latin-400-normal.woff and /dev/null differ diff --git a/pr-preview/pr-19/_/font/roboto-latin-400-normal.woff2 b/pr-preview/pr-19/_/font/roboto-latin-400-normal.woff2 deleted file mode 100644 index 020729e..0000000 Binary files a/pr-preview/pr-19/_/font/roboto-latin-400-normal.woff2 and /dev/null differ diff --git a/pr-preview/pr-19/_/font/roboto-latin-500-italic.woff b/pr-preview/pr-19/_/font/roboto-latin-500-italic.woff deleted file mode 100644 index b6ad1c5..0000000 Binary files a/pr-preview/pr-19/_/font/roboto-latin-500-italic.woff and /dev/null differ diff --git a/pr-preview/pr-19/_/font/roboto-latin-500-italic.woff2 b/pr-preview/pr-19/_/font/roboto-latin-500-italic.woff2 deleted file mode 100644 index ae1933f..0000000 Binary files a/pr-preview/pr-19/_/font/roboto-latin-500-italic.woff2 and /dev/null differ diff --git a/pr-preview/pr-19/_/font/roboto-latin-500-normal.woff b/pr-preview/pr-19/_/font/roboto-latin-500-normal.woff deleted file mode 100644 index d39bb52..0000000 Binary files a/pr-preview/pr-19/_/font/roboto-latin-500-normal.woff and /dev/null differ diff --git a/pr-preview/pr-19/_/font/roboto-latin-500-normal.woff2 b/pr-preview/pr-19/_/font/roboto-latin-500-normal.woff2 deleted file mode 100644 index 29342a8..0000000 Binary files a/pr-preview/pr-19/_/font/roboto-latin-500-normal.woff2 and /dev/null differ diff --git a/pr-preview/pr-19/_/font/roboto-mono-latin-400-normal.woff b/pr-preview/pr-19/_/font/roboto-mono-latin-400-normal.woff deleted file mode 100644 index be3eb4c..0000000 Binary files a/pr-preview/pr-19/_/font/roboto-mono-latin-400-normal.woff and /dev/null differ diff --git a/pr-preview/pr-19/_/font/roboto-mono-latin-400-normal.woff2 b/pr-preview/pr-19/_/font/roboto-mono-latin-400-normal.woff2 deleted file mode 100644 index f8894ba..0000000 Binary files a/pr-preview/pr-19/_/font/roboto-mono-latin-400-normal.woff2 and /dev/null differ diff --git a/pr-preview/pr-19/_/font/roboto-mono-latin-500-normal.woff b/pr-preview/pr-19/_/font/roboto-mono-latin-500-normal.woff deleted file mode 100644 index 43ca6a1..0000000 Binary files a/pr-preview/pr-19/_/font/roboto-mono-latin-500-normal.woff and /dev/null differ diff --git a/pr-preview/pr-19/_/font/roboto-mono-latin-500-normal.woff2 b/pr-preview/pr-19/_/font/roboto-mono-latin-500-normal.woff2 deleted file mode 100644 index b4f2bf8..0000000 Binary files a/pr-preview/pr-19/_/font/roboto-mono-latin-500-normal.woff2 and /dev/null differ diff --git a/pr-preview/pr-19/_/img/back.svg b/pr-preview/pr-19/_/img/back.svg deleted file mode 100644 index bf7d30e..0000000 --- a/pr-preview/pr-19/_/img/back.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pr-preview/pr-19/_/img/caret.svg b/pr-preview/pr-19/_/img/caret.svg deleted file mode 100644 index 1af41bc..0000000 --- a/pr-preview/pr-19/_/img/caret.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pr-preview/pr-19/_/img/chevron.svg b/pr-preview/pr-19/_/img/chevron.svg deleted file mode 100644 index 40e962a..0000000 --- a/pr-preview/pr-19/_/img/chevron.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pr-preview/pr-19/_/img/hat-logo.png b/pr-preview/pr-19/_/img/hat-logo.png deleted file mode 100644 index 47128f4..0000000 Binary files a/pr-preview/pr-19/_/img/hat-logo.png and /dev/null differ diff --git a/pr-preview/pr-19/_/img/home-o.svg b/pr-preview/pr-19/_/img/home-o.svg deleted file mode 100644 index 95d193b..0000000 --- a/pr-preview/pr-19/_/img/home-o.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pr-preview/pr-19/_/img/home.svg b/pr-preview/pr-19/_/img/home.svg deleted file mode 100644 index 4e96b35..0000000 --- a/pr-preview/pr-19/_/img/home.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pr-preview/pr-19/_/img/menu.svg b/pr-preview/pr-19/_/img/menu.svg deleted file mode 100644 index 8b43b2e..0000000 --- a/pr-preview/pr-19/_/img/menu.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pr-preview/pr-19/_/img/octicons-16.svg b/pr-preview/pr-19/_/img/octicons-16.svg deleted file mode 100644 index e3b4e20..0000000 --- a/pr-preview/pr-19/_/img/octicons-16.svg +++ /dev/null @@ -1 +0,0 @@ -Octicons v11.2.0 by GitHub - https://primer.style/octicons/ - License: MIT \ No newline at end of file diff --git a/pr-preview/pr-19/_/img/redhat-logo.png b/pr-preview/pr-19/_/img/redhat-logo.png deleted file mode 100644 index a9cf250..0000000 Binary files a/pr-preview/pr-19/_/img/redhat-logo.png and /dev/null differ diff --git a/pr-preview/pr-19/_/img/rhl-logo-red.png b/pr-preview/pr-19/_/img/rhl-logo-red.png deleted file mode 100644 index 954ab68..0000000 Binary files a/pr-preview/pr-19/_/img/rhl-logo-red.png and /dev/null differ diff --git a/pr-preview/pr-19/_/js/site.js b/pr-preview/pr-19/_/js/site.js deleted file mode 100644 index 74a8b5f..0000000 --- a/pr-preview/pr-19/_/js/site.js +++ /dev/null @@ -1,6 +0,0 @@ -!function(){"use strict";var e,o,r,s=/^sect(\d)$/,i=document.querySelector(".nav-container"),a=document.querySelector(".nav-toggle"),c=i.querySelector(".nav"),l=(a.addEventListener("click",function(e){if(a.classList.contains("is-active"))return u(e);v(e);var e=document.documentElement,t=(e.classList.add("is-clipped--nav"),a.classList.add("is-active"),i.classList.add("is-active"),c.getBoundingClientRect()),n=window.innerHeight-Math.round(t.top);Math.round(t.height)!==n&&(c.style.height=n+"px");e.addEventListener("click",u)}),i.addEventListener("click",v),i.querySelector("[data-panel=menu]"));function t(){var e,t,n=window.location.hash;if(n&&(n.indexOf("%")&&(n=decodeURIComponent(n)),!(e=l.querySelector('.nav-link[href="'+n+'"]')))){n=document.getElementById(n.slice(1));if(n)for(var i=n,a=document.querySelector("article.doc");(i=i.parentNode)&&i!==a;){var c=i.id;if((c=c||(c=s.test(i.className))&&(i.firstElementChild||{}).id)&&(e=l.querySelector('.nav-link[href="#'+c+'"]')))break}}if(e)t=e.parentNode;else{if(!r)return;e=(t=r).querySelector(".nav-link")}t!==o&&(h(l,".nav-item.is-active").forEach(function(e){e.classList.remove("is-active","is-current-path","is-current-page")}),t.classList.add("is-current-page"),d(o=t),p(l,e))}function d(e){for(var t,n=e.parentNode;!(t=n.classList).contains("nav-menu");)"LI"===n.tagName&&t.contains("nav-item")&&t.add("is-active","is-current-path"),n=n.parentNode;e.classList.add("is-active")}function n(){var e,t,n,i;this.classList.toggle("is-active")&&(e=parseFloat(window.getComputedStyle(this).marginTop),t=this.getBoundingClientRect(),n=l.getBoundingClientRect(),0<(i=(t.bottom-n.top-n.height+e).toFixed()))&&(l.scrollTop+=Math.min((t.top-n.top-e).toFixed(),i))}function u(e){v(e);e=document.documentElement;e.classList.remove("is-clipped--nav"),a.classList.remove("is-active"),i.classList.remove("is-active"),e.removeEventListener("click",u)}function v(e){e.stopPropagation()}function p(e,t){var n=e.getBoundingClientRect(),i=n.height,a=window.getComputedStyle(c);"sticky"===a.position&&(i-=n.top-parseFloat(a.top)),e.scrollTop=Math.max(0,.5*(t.getBoundingClientRect().height-i)+t.offsetTop)}function h(e,t){return[].slice.call(e.querySelectorAll(t))}l&&(e=i.querySelector("[data-panel=explore]"),o=l.querySelector(".is-current-page"),(r=o)?(d(o),p(l,o.querySelector(".nav-link"))):l.scrollTop=0,h(l,".nav-item-toggle").forEach(function(e){var t=e.parentElement,e=(e.addEventListener("click",n.bind(t)),function(e,t){e=e.nextElementSibling;return(!e||!t||e[e.matches?"matches":"msMatchesSelector"](t))&&e}(e,".nav-text"));e&&(e.style.cursor="pointer",e.addEventListener("click",n.bind(t)))}),e&&e.querySelector(".context").addEventListener("click",function(){h(c,"[data-panel]").forEach(function(e){e.classList.toggle("is-active")})}),l.addEventListener("mousedown",function(e){1":"")+".sect"+c);r.push("h"+(i+1)+"[id]")}else r.push("h1[id].sect0");n.push(r.join(">"))}m=n.join(","),f=d.parentNode;var a,s=[].slice.call((f||document).querySelectorAll(m));if(!s.length)return e.parentNode.removeChild(e);var l={},u=s.reduce(function(e,t){var o=document.createElement("a"),n=(o.textContent=t.textContent,l[o.href="#"+t.id]=o,document.createElement("li"));return n.dataset.level=parseInt(t.nodeName.slice(1),10)-1,n.appendChild(o),e.appendChild(n),e},document.createElement("ul")),f=e.querySelector(".toc-menu"),m=(f||((f=document.createElement("div")).className="toc-menu"),document.createElement("h3")),e=(m.textContent=e.dataset.title||"Contents",f.appendChild(m),f.appendChild(u),!document.getElementById("toc")&&d.querySelector("h1.page ~ :not(.is-before-toc)"));e&&((m=document.createElement("aside")).className="toc embedded",m.appendChild(f.cloneNode(!0)),e.parentNode.insertBefore(m,e)),window.addEventListener("load",function(){p(),window.addEventListener("scroll",p)})}}function p(){var n,i,t,e=window.pageYOffset,o=1.15*h(document.documentElement,"fontSize"),r=d.offsetTop;e&&window.innerHeight+e+2>=document.documentElement.scrollHeight?(a=Array.isArray(a)?a:Array(a||0),n=[],i=s.length-1,s.forEach(function(e,t){var o="#"+e.id;t===i||e.getBoundingClientRect().top+h(e,"paddingTop")>r?(n.push(o),a.indexOf(o)<0&&l[o].classList.add("is-active")):~a.indexOf(o)&&l[a.shift()].classList.remove("is-active")}),u.scrollTop=u.scrollHeight-u.offsetHeight,a=1r)return!0;t="#"+e.id}),t?t!==a&&(a&&l[a].classList.remove("is-active"),(e=l[t]).classList.add("is-active"),u.scrollHeight>u.offsetHeight&&(u.scrollTop=Math.max(0,e.offsetTop+e.offsetHeight-u.offsetHeight)),a=t):a&&(l[a].classList.remove("is-active"),a=void 0))}function h(e,t){return parseFloat(window.getComputedStyle(e)[t])}}(); -!function(){"use strict";var o=document.querySelector("article.doc"),t=document.querySelector(".toolbar");function i(e){return e&&(~e.indexOf("%")?decodeURIComponent(e):e).slice(1)}function r(e){if(e){if(e.altKey||e.ctrlKey)return;window.location.hash="#"+this.id,e.preventDefault()}window.scrollTo(0,function e(t,n){return o.contains(t)?e(t.offsetParent,t.offsetTop+n):n}(this,0)-t.getBoundingClientRect().bottom)}window.addEventListener("load",function e(t){var n;(n=i(window.location.hash))&&(n=document.getElementById(n))&&(r.bind(n)(),setTimeout(r.bind(n),0)),window.removeEventListener("load",e)}),Array.prototype.slice.call(document.querySelectorAll('a[href^="#"]')).forEach(function(e){var t;(t=i(e.hash))&&(t=document.getElementById(t))&&e.addEventListener("click",r.bind(t))})}(); -!function(){"use strict";var t,e=document.querySelector(".page-versions .version-menu-toggle");e&&(t=document.querySelector(".page-versions"),e.addEventListener("click",function(e){t.classList.toggle("is-active"),e.stopPropagation()}),document.documentElement.addEventListener("click",function(){t.classList.remove("is-active")}))}(); -!function(){"use strict";var t=document.querySelector(".navbar-burger");t&&t.addEventListener("click",function(t){t.stopPropagation(),document.documentElement.classList.toggle("is-clipped--navbar"),this.classList.toggle("is-active");t=document.getElementById(this.dataset.target);{var e;t.classList.toggle("is-active")&&(t.style.maxHeight="",e=window.innerHeight-Math.round(t.getBoundingClientRect().top),parseInt(window.getComputedStyle(t).maxHeight,10)!==e)&&(t.style.maxHeight=e+"px")}}.bind(t))}(); -!function(){"use strict";var o=/^\$ (\S[^\\\n]*(\\\n(?!\$ )[^\\\n]*)*)(?=\n|$)/gm,s=/( ) *\\\n *|\\\n( ?) */g,l=/ +$/gm,e=(document.getElementById("site-script")||{dataset:{}}).dataset,d=null==e.uiRootPath?".":e.uiRootPath,r=e.svgAs,p=window.navigator.clipboard;[].slice.call(document.querySelectorAll(".doc pre.highlight, .doc .literalblock pre")).forEach(function(e){var t,n,a,c;if(e.classList.contains("highlight"))(i=(t=e.querySelector("code")).dataset.lang)&&"console"!==i&&((a=document.createElement("span")).className="source-lang",a.appendChild(document.createTextNode(i)));else{if(!e.innerText.startsWith("$ "))return;var i=e.parentNode.parentNode;i.classList.remove("literalblock"),i.classList.add("listingblock"),e.classList.add("highlightjs","highlight"),(t=document.createElement("code")).className="language-console hljs",t.dataset.lang="console",t.appendChild(e.firstChild),e.appendChild(t)}(i=document.createElement("div")).className="source-toolbox",a&&i.appendChild(a),p&&((n=document.createElement("button")).className="copy-button",n.setAttribute("title","Copy to clipboard"),"svg"===r?((a=document.createElementNS("http://www.w3.org/2000/svg","svg")).setAttribute("class","copy-icon"),(c=document.createElementNS("http://www.w3.org/2000/svg","use")).setAttribute("href",d+"/img/octicons-16.svg#icon-clippy"),a.appendChild(c),n.appendChild(a)):((c=document.createElement("img")).src=d+"/img/octicons-16.svg#view-clippy",c.alt="copy icon",c.className="copy-icon",n.appendChild(c)),(a=document.createElement("span")).className="copy-toast",a.appendChild(document.createTextNode("Copied!")),n.appendChild(a),i.appendChild(n)),e.parentNode.appendChild(i),n&&n.addEventListener("click",function(e){var t=e.innerText.replace(l,"");"console"===e.dataset.lang&&t.startsWith("$ ")&&(t=function(e){var t,n=[];for(;t=o.exec(e);)n.push(t[1].replace(s,"$1$2"));return n.join(" && ")}(t));window.navigator.clipboard.writeText(t).then(function(){this.classList.add("clicked"),this.offsetHeight,this.classList.remove("clicked")}.bind(this),function(){})}.bind(n,t))})}(); \ No newline at end of file diff --git a/pr-preview/pr-19/_/js/vendor/highlight.js b/pr-preview/pr-19/_/js/vendor/highlight.js deleted file mode 100644 index f0be714..0000000 --- a/pr-preview/pr-19/_/js/vendor/highlight.js +++ /dev/null @@ -1 +0,0 @@ -!function(){function e(e){return{aliases:["adoc"],contains:[e.COMMENT("^/{4,}\\n","\\n/{4,}$",{relevance:10}),e.COMMENT("^//","$",{relevance:0}),{className:"title",begin:"^\\.\\w.*$"},{begin:"^[=\\*]{4,}\\n",end:"\\n^[=\\*]{4,}$",relevance:10},{className:"section",relevance:10,variants:[{begin:"^(={1,5}) .+?( \\1)?$"},{begin:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$"}]},{className:"meta",begin:"^:.+?:",end:"\\s",excludeEnd:!0,relevance:10},{className:"meta",begin:"^\\[.+?\\]$",relevance:0},{className:"quote",begin:"^_{4,}\\n",end:"\\n_{4,}$",relevance:10},{className:"code",begin:"^[\\-\\.]{4,}\\n",end:"\\n[\\-\\.]{4,}$",relevance:10},{begin:"^\\+{4,}\\n",end:"\\n\\+{4,}$",contains:[{begin:"<",end:">",subLanguage:"xml",relevance:0}],relevance:10},{className:"bullet",begin:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{className:"symbol",begin:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",relevance:10},{className:"strong",begin:"\\B\\*(?![\\*\\s])",end:"(\\n{2}|\\*)",contains:[{begin:"\\\\*\\w",relevance:0}]},{className:"emphasis",begin:"\\B'(?!['\\s])",end:"(\\n{2}|')",contains:[{begin:"\\\\'\\w",relevance:0}],relevance:0},{className:"emphasis",begin:"_(?![_\\s])",end:"(\\n{2}|_)",relevance:0},{className:"string",variants:[{begin:"``.+?''"},{begin:"`.+?'"}]},{className:"code",begin:"(`.+?`|\\+.+?\\+)",relevance:0},{className:"code",begin:"^[ \\t]",end:"$",relevance:0},{begin:"^'{3,}[ \\t]*$",relevance:10},{begin:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",returnBegin:!0,contains:[{begin:"(link|image:?):",relevance:0},{className:"link",begin:"\\w",end:"[^\\[]+",relevance:0},{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0,relevance:0}],relevance:10}]}}function n(e){var n={className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{(.*?)}/}]},a={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,n,{className:"variable",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]}]};return{aliases:["sh","zsh"],lexemes:/\b-?[a-z\._]+\b/,keywords:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[{className:"meta",begin:/^#![^\n]+sh\s*$/,relevance:10},{className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},e.HASH_COMMENT_MODE,a,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},n]}}function a(e){var n={begin:u="["+(u="a-zA-Z_\\-!.?+*=<>&#'")+"]["+u+"0-9/;:]*",relevance:0},a={className:"number",begin:"[-+]?\\d+(\\.\\d+)?",relevance:0},t=e.inherit(e.QUOTE_STRING_MODE,{illegal:null}),i=e.COMMENT(";","$",{relevance:0}),s={className:"literal",begin:/\b(true|false|nil)\b/},r={begin:"[\\[\\{]",end:"[\\]\\}]"},l={className:"comment",begin:"\\^"+u},o=e.COMMENT("\\^\\{","\\}"),c={className:"symbol",begin:"[:]{1,2}"+u},d={begin:"\\(",end:"\\)"},g={endsWithParent:!0,relevance:0},u={keywords:{"builtin-name":"def defonce cond apply if-not if-let if not not= = < > <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"},lexemes:u,className:"name",begin:u,starts:g},n=[d,t,l,o,i,c,r,a,s,n];return d.contains=[e.COMMENT("comment",""),u,g],g.contains=n,r.contains=n,o.contains=[r],{aliases:["clj"],illegal:/\S/,contains:[d,t,l,o,i,c,r,a,s]}}function t(e){function n(e){return"(?:"+e+")?"}var a="decltype\\(auto\\)",t="[a-zA-Z_]\\w*::",i={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},{begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\((?:.|\n)*?\)\1"/}]},r={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(s,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:n(t)+e.IDENT_RE,relevance:0},t=n(t)+e.IDENT_RE+"\\s*\\(",c={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_tshort reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,r,s],g={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:c,contains:d.concat([{begin:/\(/,end:/\)/,keywords:c,contains:d.concat(["self"]),relevance:0}]),relevance:0},a={className:"function",begin:"((decltype\\(auto\\)|(?:[a-zA-Z_]\\w*::)?[a-zA-Z_]\\w*(?:<.*?>)?)[\\*&\\s]+)+"+t,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:c,illegal:/[^\w\s\*&:<>]/,contains:[{begin:a,keywords:c,relevance:0},{begin:t,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:c,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,r,i,{begin:/\(/,end:/\)/,keywords:c,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,r,i]}]},i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:c,illegal:"",keywords:c,contains:["self",i]},{begin:e.IDENT_RE+"::",keywords:c},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin://,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:l,strings:s,keywords:c}}}function i(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},t={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},i=e.inherit(t,{illegal:/\n/}),s={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(s,{illegal:/\n/}),l={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},s]},c=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]}),s=(s.contains=[o,l,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})],{variants:[o,l,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]}),r=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?";return{aliases:["csharp","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},s,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[e.TITLE_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+r+"\\s+)+"+e.IDENT_RE+"\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[s,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]}]}}function s(e){var n={className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}};return{case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,{begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[n]}]}]}}function r(e){return{aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}function l(e){return{aliases:["docker"],case_insensitive:!0,keywords:"from maintainer expose env arg user onbuild stopsignal",contains:[e.HASH_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{beginKeywords:"run cmd entrypoint volume add copy workdir label healthcheck shell",starts:{end:/[^\\]$/,subLanguage:"bash"}}],illegal:"/}]}]}]},s={className:"string",begin:"~[A-Z](?="+s+")",contains:[{begin:/"/,end:/"/},{begin:/'/,end:/'/},{begin:/\//,end:/\//},{begin:/\|/,end:/\|/},{begin:/\(/,end:/\)/},{begin:/\[/,end:/\]/},{begin:/\{/,end:/\}/},{begin:/\/}]},r={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/'''/,end:/'''/},{begin:/~S"""/,end:/"""/,contains:[]},{begin:/~S"/,end:/"/,contains:[]},{begin:/~S'''/,end:/'''/,contains:[]},{begin:/~S'/,end:/'/,contains:[]},{begin:/'/,end:/'/},{begin:/"/,end:/"/}]},l={className:"function",beginKeywords:"def defp defmacro",end:/\B\b/,contains:[e.inherit(e.TITLE_MODE,{begin:n,endsParent:!0})]},o=e.inherit(l,{className:"class",beginKeywords:"defimpl defmodule defprotocol defrecord",end:/\bdo\b|$|;/}),s=[r,s,i,e.HASH_COMMENT_MODE,o,l,{begin:"::"},{className:"symbol",begin:":(?![\\s:])",contains:[r,{begin:"[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?"}],relevance:0},{className:"symbol",begin:n+":(?!:)",relevance:0},{className:"number",begin:"(\\b0o[0-7_]+)|(\\b0b[01_]+)|(\\b0x[0-9a-fA-F_]+)|(-?\\b[1-9][0-9_]*(.[0-9_]+([eE][-+]?[0-9]+)?)?)",relevance:0},{className:"variable",begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{begin:"->"},{begin:"("+e.RE_STARTERS_RE+")\\s*",contains:[e.HASH_COMMENT_MODE,{className:"regexp",illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}],relevance:0}];return{lexemes:n,keywords:a,contains:t.contains=s}}function c(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],keywords:n,illegal:"|<-"}]}}function u(e){var n="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",a={className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0};return{aliases:["jsp"],keywords:n,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:n,relevance:0,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},a,{className:"meta",begin:"@[A-Za-z]+"}]}}function _(e){var n="<>",a="",t=/<[A-Za-z0-9\\._:-]+/,i=/\/[A-Za-z0-9\\._:-]+>|\/>/,s="[A-Za-z$_][0-9A-Za-z$_]*",r={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:e.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:r,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},d={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,o],subLanguage:"css"}},g={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,o]},o=(o.contains=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,c,d,g,l,e.REGEXP_MODE],o.contains.concat([e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]));return{aliases:["js","jsx","mjs","cjs"],keywords:r,contains:[{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},{className:"meta",begin:/^#!/,end:/$/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,c,d,g,e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:s+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,l,{begin:/[{,\n]\s*/,relevance:0,contains:[{begin:s+"\\s*:",returnBegin:!0,relevance:0,contains:[{className:"attr",begin:s,relevance:0}]}]},{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.REGEXP_MODE,{className:"function",begin:"(\\(.*?\\)|"+s+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:s},{begin:/\(\s*\)/},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:r,contains:o}]}]},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:n,end:a},{begin:t,end:i}],subLanguage:"xml",contains:[{begin:t,end:i,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:s}),{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:o}],illegal:/\[|%/},{begin:/\$[(.]/},e.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor get set",end:/\{/,excludeEnd:!0}],illegal:/#(?!!)/}}function m(e){var n={literal:"true false null"},a=[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],t=[e.QUOTE_STRING_MODE,e.C_NUMBER_MODE],i={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:n},s={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE],illegal:"\\n"},e.inherit(i,{begin:/:/})].concat(a),illegal:"\\S"},e={begin:"\\[",end:"\\]",contains:[e.inherit(i)],illegal:"\\S"};return t.push(s,e),a.forEach(function(e){t.push(e)}),{contains:t,keywords:n,illegal:"\\S"}}function b(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},t={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},i={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[i={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,i,t]}]},t=(t.contains.push(i),{className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"}),s={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(i,{className:"meta-string"})]}]},r={className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0},l=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},c=o;return c.variants[1].contains=[o],o.variants[1].contains=[c],{aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,l,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,t,s,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,l],relevance:0},e.C_LINE_COMMENT_MODE,l,t,s,i,e.C_NUMBER_MODE]},l]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},t,s]},i,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},r]}}function p(e){var n="\\[=*\\[",a="\\]=*\\]",t={begin:n,end:a,contains:["self"]},i=[e.COMMENT("--(?!"+n+")","$"),e.COMMENT("--"+n,a,{contains:[t],relevance:10})];return{lexemes:e.UNDERSCORE_IDENT_RE,keywords:{literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstringmodule next pairs pcall print rawequal rawget rawset require select setfenvsetmetatable tonumber tostring type unpack xpcall arg selfcoroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:i}].concat(i)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:n,end:a,contains:[t],relevance:5}])}}function f(e){return{aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$"},{begin:"^.+?\\n[=-]{2,}$"}]},{begin:"<",end:">",subLanguage:"xml",relevance:0},{className:"bullet",begin:"^\\s*([*+-]|(\\d+\\.))\\s+"},{className:"strong",begin:"[*_]{2}.+?[*_]{2}"},{className:"emphasis",variants:[{begin:"\\*.+?\\*"},{begin:"_.+?_",relevance:0}]},{className:"quote",begin:"^>\\s+",end:"$"},{className:"code",variants:[{begin:"^```\\w*\\s*$",end:"^```[ ]*$"},{begin:"`.+?`"},{begin:"^( {4}|\\t)",end:"$",relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},{begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}function E(e){var n={keyword:"rec with let in inherit assert if else then",literal:"true false or and null",built_in:"import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation"},a={className:"subst",begin:/\$\{/,end:/}/,keywords:n},e=[e.NUMBER_MODE,e.HASH_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"string",contains:[a],variants:[{begin:"''",end:"''"},{begin:'"',end:'"'}]},{begin:/[a-zA-Z0-9-_]+(\s*=)/,returnBegin:!0,relevance:0,contains:[{className:"attr",begin:/\S+/}]}];return{aliases:["nixos"],keywords:n,contains:a.contains=e}}function N(e){return{disableAutodetect:!0}}function h(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,a="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],keywords:{keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},lexemes:n,illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+a.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:a,lexemes:n,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}function v(e){var n="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",a={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},t={begin:"->{",end:"}"},i={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},s=[e.BACKSLASH_ESCAPE,a,i],i=[i,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),t,{className:"string",contains:s,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return a.contains=i,{aliases:["pl","pm"],lexemes:/[\w\.]+/,keywords:n,contains:t.contains=i}}function y(e){var n={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},a={className:"meta",begin:/<\?(php)?|\?>/},t={className:"string",contains:[e.BACKSLASH_ESCAPE,a],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},i={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[a]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler",lexemes:e.UNDERSCORE_IDENT_RE}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},a,{className:"keyword",begin:/\$this\b/},n,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"function",end:/[;{]/,excludeEnd:!0,illegal:"\\$|\\[|%",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",contains:["self",n,e.C_BLOCK_COMMENT_MODE,t,i]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},t,i]}}function w(e){var n="[ \\t\\f]*",a="("+n+"[:=]"+n+"|[ \\t\\f]+)",t="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",i="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:a,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:t+a,returnBegin:!0,contains:[{className:"attr",begin:t,endsParent:!0,relevance:0}],starts:s},{begin:i+a,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:i,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:i+n+"$"}]}}function O(e){var n=e.COMMENT("#","$"),a="([A-Za-z_]|::)(\\w|::)*",t=e.inherit(e.TITLE_MODE,{begin:a}),a={className:"variable",begin:"\\$"+a},i={className:"string",contains:[e.BACKSLASH_ESCAPE,a],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/}]};return{aliases:["pp"],contains:[n,a,i,{beginKeywords:"class",end:"\\{|;",illegal:/=/,contains:[t,n]},{beginKeywords:"define",end:/\{/,contains:[{className:"section",begin:e.IDENT_RE,endsParent:!0}]},{begin:e.IDENT_RE+"\\s+\\{",returnBegin:!0,end:/\S/,contains:[{className:"keyword",begin:e.IDENT_RE},{begin:/\{/,end:/\}/,keywords:{keyword:"and case default else elsif false if in import enherits node or true undef unless main settings $string ",literal:"alias audit before loglevel noop require subscribe tag owner ensure group mode name|0 changes context force incl lens load_path onlyif provider returns root show_diff type_check en_address ip_address realname command environment hour monute month monthday special target weekday creates cwd ogoutput refresh refreshonly tries try_sleep umask backup checksum content ctime force ignore links mtime purge recurse recurselimit replace selinux_ignore_defaults selrange selrole seltype seluser source souirce_permissions sourceselect validate_cmd validate_replacement allowdupe attribute_membership auth_membership forcelocal gid ia_load_module members system host_aliases ip allowed_trunk_vlans description device_url duplex encapsulation etherchannel native_vlan speed principals allow_root auth_class auth_type authenticate_user k_of_n mechanisms rule session_owner shared options device fstype enable hasrestart directory present absent link atboot blockdevice device dump pass remounts poller_tag use message withpath adminfile allow_virtual allowcdrom category configfiles flavor install_options instance package_settings platform responsefile status uninstall_options vendor unless_system_user unless_uid binary control flags hasstatus manifest pattern restart running start stop allowdupe auths expiry gid groups home iterations key_membership keys managehome membership password password_max_age password_min_age profile_membership profiles project purge_ssh_keys role_membership roles salt shell uid baseurl cost descr enabled enablegroups exclude failovermethod gpgcheck gpgkey http_caching include includepkgs keepalive metadata_expire metalink mirrorlist priority protect proxy proxy_password proxy_username repo_gpgcheck s3_enabled skip_if_unavailable sslcacert sslclientcert sslclientkey sslverify mounted",built_in:"architecture augeasversion blockdevices boardmanufacturer boardproductname boardserialnumber cfkey dhcp_servers domain ec2_ ec2_userdata facterversion filesystems ldom fqdn gid hardwareisa hardwaremodel hostname id|0 interfaces ipaddress ipaddress_ ipaddress6 ipaddress6_ iphostnumber is_virtual kernel kernelmajversion kernelrelease kernelversion kernelrelease kernelversion lsbdistcodename lsbdistdescription lsbdistid lsbdistrelease lsbmajdistrelease lsbminordistrelease lsbrelease macaddress macaddress_ macosx_buildversion macosx_productname macosx_productversion macosx_productverson_major macosx_productversion_minor manufacturer memoryfree memorysize netmask metmask_ network_ operatingsystem operatingsystemmajrelease operatingsystemrelease osfamily partitions path physicalprocessorcount processor processorcount productname ps puppetversion rubysitedir rubyversion selinux selinux_config_mode selinux_config_policy selinux_current_mode selinux_current_mode selinux_enforced selinux_policyversion serialnumber sp_ sshdsakey sshecdsakey sshrsakey swapencrypted swapfree swapsize timezone type uniqueid uptime uptime_days uptime_hours uptime_seconds uuid virtual vlans xendomains zfs_version zonenae zones zpool_version"},relevance:0,contains:[i,n,{begin:"[a-zA-Z_]+\\s*=>",returnBegin:!0,end:"=>",contains:[{className:"attr",begin:e.IDENT_RE}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},a]}],relevance:0}]}}function M(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},t={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},i={begin:/\{\{/,relevance:0},i={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,i,t]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,i,t]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,i,t]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i,t]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},s={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},r={className:"params",begin:/\(/,end:/\)/,contains:["self",a,s,i,e.HASH_COMMENT_MODE]};return t.contains=[i,s,a],{aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,s,{beginKeywords:"if",relevance:0},i,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,r,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}function x(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},t={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},t=[e.COMMENT("#","$",{contains:[t]}),e.COMMENT("^\\=begin","^\\=end",{contains:[t],relevance:10}),e.COMMENT("^__END__","\\n$")],s={className:"subst",begin:"#\\{",end:"}",keywords:a},r={className:"string",contains:[e.BACKSLASH_ESCAPE,s],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},{begin:/\w+/,endSameAsBegin:!0,contains:[e.BACKSLASH_ESCAPE,s]}]}]},l={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},r=[r,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(t)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),l].concat(t)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[r,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,s],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(t),relevance:0}].concat(t);return s.contains=r,{aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:t.concat([{begin:/^\s*=>/,starts:{end:"$",contains:l.contains=r}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:r}}]).concat(r)}}function C(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",a="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{aliases:["rs"],keywords:{keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:a},lexemes:e.IDENT_RE+"!?",illegal:""}]}}function S(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},n={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},a={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0};return{keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,n,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},a,{className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]},{className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[a]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[a]},t]},e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}function T(e){return{aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}function k(e){var n=e.COMMENT("--","$");return{case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,lexemes:/[\w\.]+/,keywords:{keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,n,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,n,e.HASH_COMMENT_MODE]}}function A(e){var n={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},a=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:n,contains:[]},i={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},s={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[s],{keywords:n,contains:[i,e.C_LINE_COMMENT_MODE,a,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},s,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin://},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,contains:["self",s,i,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:n,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,a]}]}}function R(e){var n={className:"symbol",begin:"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;"},a={begin:"\\s",contains:[{className:"meta-keyword",begin:"#?[a-z_][a-z1-9_-]+",illegal:"\\n"}]},t=e.inherit(a,{begin:"\\(",end:"\\)"}),i=e.inherit(e.APOS_STRING_MODE,{className:"meta-string"}),s=e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),r={endsWithParent:!0,illegal:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"",relevance:10,contains:[a,s,i,t,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"",contains:[a,t,s,i]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{begin:/<\?(php)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]},{className:"tag",begin:")",end:">",keywords:{name:"style"},contains:[r],starts:{end:"",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:")",end:">",keywords:{name:"script"},contains:[r],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["actionscript","javascript","handlebars","xml"]}},{className:"tag",begin:"",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},r]}]}}function B(e){var n="true false yes no null",a={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]};return{case_insensitive:!0,aliases:["yml","YAML","yaml"],contains:[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!"+e.UNDERSCORE_IDENT_RE},{className:"type",begin:"!!"+e.UNDERSCORE_IDENT_RE},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:e.C_NUMBER_RE+"\\b"},a]}}var D,L,I={};D=function(t){var a,g=[],s=Object.keys,w=Object.create(null),r=Object.create(null),O=!0,n=/^(no-?highlight|plain|text)$/i,l=/\blang(?:uage)?-([\w-]+)\b/i,i=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,M="",x="Could not find the language '{}', did you forget to load/include a language module?",C={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},o="of and for in not or if then".split(" ");function S(e){return e.replace(/&/g,"&").replace(//g,">")}function u(e){return e.nodeName.toLowerCase()}function c(e){return n.test(e)}function d(e){var n,a={},t=Array.prototype.slice.call(arguments,1);for(n in e)a[n]=e[n];return t.forEach(function(e){for(n in e)a[n]=e[n]}),a}function _(e){var i=[];return function e(n,a){for(var t=n.firstChild;t;t=t.nextSibling)3===t.nodeType?a+=t.nodeValue.length:1===t.nodeType&&(i.push({event:"start",offset:a,node:t}),a=e(t,a),u(t).match(/br|hr|img|input/)||i.push({event:"stop",offset:a,node:t}));return a}(e,0),i}function m(e,n,a){var t=0,i="",s=[];function r(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function o(e){i+=""}function c(e){("start"===e.event?l:o)(e.node)}for(;e.length||n.length;){var d=r();if(i+=S(a.substring(t,d[0].offset)),t=d[0].offset,d===e){for(s.reverse().forEach(o);c(d.splice(0,1)[0]),(d=r())===e&&d.length&&d[0].offset===t;);s.reverse().forEach(l)}else"start"===d[0].event?s.push(d[0].node):s.pop(),c(d.splice(0,1)[0])}return i+S(a.substr(t))}function b(n){return n.variants&&!n.cached_variants&&(n.cached_variants=n.variants.map(function(e){return d(n,{variants:null},e)})),n.cached_variants||(function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(n)?[d(n,{starts:n.starts?d(n.starts):null})]:Object.isFrozen(n)?[d(n)]:[n])}function p(e){if(a&&!e.langApiRestored){for(var n in e.langApiRestored=!0,a)e[n]&&(e[a[n]]=e[n]);(e.contains||[]).concat(e.variants||[]).forEach(p)}}function f(n,t){var i={};return"string"==typeof n?a("keyword",n):s(n).forEach(function(e){a(e,n[e])}),i;function a(a,e){(e=t?e.toLowerCase():e).split(" ").forEach(function(e){var n,e=e.split("|");i[e[0]]=[a,(n=e[0],(e=e[1])?Number(e):function(e){return-1!=o.indexOf(e.toLowerCase())}(n)?0:1)]})}}function T(t){function d(e){return e&&e.source||e}function g(e,n){return new RegExp(d(e),"m"+(t.case_insensitive?"i":"")+(n?"g":""))}function i(i){var s={},r=[],l={},a=1;function e(e,n){s[a]=e,r.push([e,n]),a+=new RegExp(n.toString()+"|").exec("").length-1+1}for(var n=0;n')+n+(a?"":M)):n:""}function r(){var e,n,a,t,i;if(!m.keywords)return S(E);for(a="",m.lexemesRe.lastIndex=e=0,n=m.lexemesRe.exec(E);n;)a+=S(E.substring(e,n.index)),t=m,i=n,i=_.case_insensitive?i[0].toLowerCase():i[0],(t=t.keywords.hasOwnProperty(i)&&t.keywords[i])?(N+=t[1],a+=s(t[0],S(n[0]))):a+=S(n[0]),e=m.lexemesRe.lastIndex,n=m.lexemesRe.exec(E);return a+S(E.substr(e))}function l(){var e,n;p+=null!=m.subLanguage?(n="string"==typeof m.subLanguage)&&!w[m.subLanguage]?S(E):(e=n?k(m.subLanguage,E,!0,b[m.subLanguage]):A(E,m.subLanguage.length?m.subLanguage:void 0),0")+'"');if("end"===n.type){e=d(n);if(null!=e)return e}return E+=a,a.length}var _=R(n);if(!_)throw console.error(x.replace("{}",n)),new Error('Unknown language: "'+n+'"');T(_);for(var m=a||_,b={},p="",f=m;f!==_;f=f.parent)f.className&&(p=s(f.className,"",!0)+p);var E="",N=0;try{for(var h,v,y=0;;){if(m.terminators.lastIndex=y,!(h=m.terminators.exec(i)))break;v=u(i.substring(y,h.index),h),y=h.index+v}for(u(i.substr(y)),f=m;f.parent;f=f.parent)f.className&&(p+=M);return{relevance:N,value:p,illegal:!1,language:n,top:m}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{illegal:!0,relevance:0,value:S(i)};if(O)return{relevance:0,value:S(i),language:n,top:m,errorRaised:e};throw e}}function A(a,e){e=e||C.languages||s(w);var t={relevance:0,value:S(a)},i=t;return e.filter(R).filter(y).forEach(function(e){var n=k(e,a,!1);n.language=e,n.relevance>i.relevance&&(i=n),n.relevance>t.relevance&&(i=t,t=n)}),i.language&&(t.second_best=i),t}function E(e){return C.tabReplace||C.useBR?e.replace(i,function(e,n){return C.useBR&&"\n"===e?"
":C.tabReplace?n.replace(/\t/g,C.tabReplace):""}):e}function N(e){var n,a,t,i,s=function(e){var n,a,t,i,s,r=e.className+" ";if(r+=e.parentNode?e.parentNode.className:"",a=l.exec(r))return(s=R(a[1]))||(console.warn(x.replace("{}",a[1])),console.warn("Falling back to no-highlight mode for this block.",e)),s?a[1]:"no-highlight";for(n=0,t=(r=r.split(/\s+/)).length;n/g,"\n"):a=e,i=a.textContent,n=s?k(s,i,!0):A(i),(a=_(a)).length&&((t=document.createElement("div")).innerHTML=n.value,n.value=m(a,_(t),i)),n.value=E(n.value),e.innerHTML=n.value,e.className=(a=e.className,t=s,i=n.language,t=t?r[t]:i,i=[a.trim()],a.match(/\bhljs\b/)||i.push("hljs"),-1===a.indexOf(t)&&i.push(t),i.join(" ").trim()),e.result={language:n.language,re:n.relevance},n.second_best&&(e.second_best={language:n.second_best.language,re:n.second_best.relevance}))}function h(){var e;h.called||(h.called=!0,e=document.querySelectorAll("pre code"),g.forEach.call(e,N))}var v={disableAutodetect:!0};function R(e){return e=(e||"").toLowerCase(),w[e]||w[r[e]]}function y(e){e=R(e);return e&&!e.disableAutodetect}return t.highlight=k,t.highlightAuto=A,t.fixMarkup=E,t.highlightBlock=N,t.configure=function(e){C=d(C,e)},t.initHighlighting=h,t.initHighlightingOnLoad=function(){window.addEventListener("DOMContentLoaded",h,!1),window.addEventListener("load",h,!1)},t.registerLanguage=function(n,e){var a;try{a=e(t)}catch(e){if(console.error("Language definition for '{}' could not be registered.".replace("{}",n)),!O)throw e;console.error(e),a=v}p(w[n]=a),a.rawDefinition=e.bind(null,t),a.aliases&&a.aliases.forEach(function(e){r[e]=n})},t.listLanguages=function(){return s(w)},t.getLanguage=R,t.requireLanguage=function(e){var n=R(e);if(n)return n;throw new Error("The '{}' language is required, but not loaded.".replace("{}",e))},t.autoDetection=y,t.inherit=d,t.debugMode=function(){O=!1},t.IDENT_RE="[a-zA-Z]\\w*",t.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",t.NUMBER_RE="\\b\\d+(\\.\\d+)?",t.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BINARY_NUMBER_RE="\\b(0b[01]+)",t.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BACKSLASH_ESCAPE={begin:"\\\\[\\s\\S]",relevance:0},t.APOS_STRING_MODE={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[t.BACKSLASH_ESCAPE]},t.QUOTE_STRING_MODE={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[t.BACKSLASH_ESCAPE]},t.PHRASAL_WORDS_MODE={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},t.COMMENT=function(e,n,a){e=t.inherit({className:"comment",begin:e,end:n,contains:[]},a||{});return e.contains.push(t.PHRASAL_WORDS_MODE),e.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|XXX):",relevance:0}),e},t.C_LINE_COMMENT_MODE=t.COMMENT("//","$"),t.C_BLOCK_COMMENT_MODE=t.COMMENT("/\\*","\\*/"),t.HASH_COMMENT_MODE=t.COMMENT("#","$"),t.NUMBER_MODE={className:"number",begin:t.NUMBER_RE,relevance:0},t.C_NUMBER_MODE={className:"number",begin:t.C_NUMBER_RE,relevance:0},t.BINARY_NUMBER_MODE={className:"number",begin:t.BINARY_NUMBER_RE,relevance:0},t.CSS_NUMBER_MODE={className:"number",begin:t.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},t.REGEXP_MODE={className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[t.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0,contains:[t.BACKSLASH_ESCAPE]}]},t.TITLE_MODE={className:"title",begin:t.IDENT_RE,relevance:0},t.UNDERSCORE_TITLE_MODE={className:"title",begin:t.UNDERSCORE_IDENT_RE,relevance:0},t.METHOD_GUARD={begin:"\\.\\s*"+t.UNDERSCORE_IDENT_RE,relevance:0},[t.BACKSLASH_ESCAPE,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,t.PHRASAL_WORDS_MODE,t.COMMENT,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.HASH_COMMENT_MODE,t.NUMBER_MODE,t.C_NUMBER_MODE,t.BINARY_NUMBER_MODE,t.CSS_NUMBER_MODE,t.REGEXP_MODE,t.TITLE_MODE,t.UNDERSCORE_TITLE_MODE,t.METHOD_GUARD].forEach(function(e){!function n(a){Object.freeze(a);var t="function"==typeof a;Object.getOwnPropertyNames(a).forEach(function(e){!a.hasOwnProperty(e)||null===a[e]||"object"!=typeof a[e]&&"function"!=typeof a[e]||t&&("caller"===e||"callee"===e||"arguments"===e)||Object.isFrozen(a[e])||n(a[e])});return a}(e)}),t},L="object"==typeof window&&window||"object"==typeof self&&self,void 0===I||I.nodeType?L&&(L.hljs=D({}),"function"==typeof define)&&define.amd&&define([],function(){return L.hljs}):D(I);!function(){"use strict";I.registerLanguage("asciidoc",e),I.registerLanguage("bash",n),I.registerLanguage("clojure",a),I.registerLanguage("cpp",t),I.registerLanguage("cs",i),I.registerLanguage("css",s),I.registerLanguage("diff",r),I.registerLanguage("dockerfile",l),I.registerLanguage("elixir",o),I.registerLanguage("go",c),I.registerLanguage("groovy",d),I.registerLanguage("haskell",g),I.registerLanguage("java",u),I.registerLanguage("javascript",_),I.registerLanguage("json",m),I.registerLanguage("kotlin",b),I.registerLanguage("lua",p),I.registerLanguage("markdown",f),I.registerLanguage("nix",E),I.registerLanguage("none",N),I.registerLanguage("objectivec",h),I.registerLanguage("perl",v),I.registerLanguage("php",y),I.registerLanguage("properties",w),I.registerLanguage("puppet",O),I.registerLanguage("python",M),I.registerLanguage("ruby",x),I.registerLanguage("rust",C),I.registerLanguage("scala",S),I.registerLanguage("shell",T),I.registerLanguage("sql",k),I.registerLanguage("swift",A),I.registerLanguage("xml",R),I.registerLanguage("yaml",B),[].slice.call(document.querySelectorAll("pre code.hljs[data-lang]")).forEach(function(e){I.highlightBlock(e)})}()}(); \ No newline at end of file diff --git a/pr-preview/pr-19/index.html b/pr-preview/pr-19/index.html deleted file mode 100644 index e2536b0..0000000 --- a/pr-preview/pr-19/index.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - -Redirect Notice -

Redirect Notice

-

The page you requested has been relocated to model-serving/1.1/index.html.

diff --git a/pr-preview/pr-19/model-serving/1.1/_images/demo_platform_catalog.gif b/pr-preview/pr-19/model-serving/1.1/_images/demo_platform_catalog.gif deleted file mode 100644 index a49dfa4..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/_images/demo_platform_catalog.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/_images/demohub_resources_v4.mp4 b/pr-preview/pr-19/model-serving/1.1/_images/demohub_resources_v4.mp4 deleted file mode 100644 index 3950201..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/_images/demohub_resources_v4.mp4 and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/_images/intro_v5.mp4 b/pr-preview/pr-19/model-serving/1.1/_images/intro_v5.mp4 deleted file mode 100644 index 8ebff2a..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/_images/intro_v5.mp4 and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/appendix/appendix.html b/pr-preview/pr-19/model-serving/1.1/appendix/appendix.html deleted file mode 100644 index 74d9e25..0000000 --- a/pr-preview/pr-19/model-serving/1.1/appendix/appendix.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - Knowledge Check :: Serving an LLM using OpenShift AI - - - - - -
- -
- -
- -
- -
-

Knowledge Check

-
-

Quiz Section

-
-
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/appendix/section1.html b/pr-preview/pr-19/model-serving/1.1/appendix/section1.html deleted file mode 100644 index 76678c0..0000000 --- a/pr-preview/pr-19/model-serving/1.1/appendix/section1.html +++ /dev/null @@ -1,301 +0,0 @@ - - - - - - Quiz: Components of Red Hat OpenShift AI :: Serving an LLM using OpenShift AI - - - - - -
- -
- -
- -
- -
-

Quiz: Components of Red Hat OpenShift AI

-
-
-
-
-
Objective
-
-

Identify components of the Red Hat OpenStack AI on OpenShift product and how a Red Hat OpenShift AI Deploys Resources to support AI/ML Development

-
-
-
-
- - - - - -
- - -Pending review. -
-
-
-
-
-

Questions

-
-
-
    -
  1. -

    Which of the following Operator components are required to enable Red Hat OpenShift AI on OpenShift with Single Model Serving Platform capabilities ?

    -
    -
      -
    • -

      Red Hat OpenShift serverless operator

      -
    • -
    • -

      Red Hat OpenShift service mesh operator

      -
    • -
    • -

      Red Hat OpenShift pipelines operator

      -
    • -
    • -

      Red Hat OpenShift node feature discovery operator

      -
    • -
    • -

      Red Hat OpenShift Nvidia gpu operator

      -
    • -
    • -

      Red Hat OpenShift gitOps operator

      -
    • -
    • -

      Red Hat OpenShift smart gateway operator

      -
    • -
    -
    -
  2. -
  3. -

    After the installation of OpenShift AI Operator via Operator Hub, which of the following actions are required to enable the OpenShift AI console or dashboard ?

    -
    -
      -
    • -

      Create a new OpenShift AI data science project

      -
    • -
    • -

      Modify the data science cluster YAML file to use custom TLS certificates

      -
    • -
    • -

      Create a new OpenShift AI data science cluster

      -
    • -
    • -

      Create a new data science project workbench

      -
    • -
    • -

      A third-party vendor operator is required by Red Hat OpenShift AI.

      -
    • -
    -
    -
  4. -
  5. -

    What resources / services are available in a new OpenShift AI data science project ?

    -
    -
      -
    • -

      Workbench

      -
    • -
    • -

      Data connections

      -
    • -
    • -

      Pipelines

      -
    • -
    • -

      Model serving

      -
    • -
    • -

      Workloads

      -
    • -
    • -

      Routes

      -
    • -
    • -

      Permissions

      -
    • -
    • -

      Accelerator profiles

      -
    • -
    • -

      Operator Hub

      -
    • -
    -
    -
  6. -
  7. -

    When deploying a Model Server in an OpenShift AI workbench, what other workbench resources must be preconfigured ?

    -
    -
      -
    • -

      Data connection

      -
    • -
    • -

      Pipelines

      -
    • -
    • -

      Serving Runtimes

      -
    • -
    • -

      Workbench

      -
    • -
    • -

      Data science project

      -
    • -
    • -

      Model files located in S3 comptabile object storage

      -
    • -
    -
    -
  8. -
-
-
-
-
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/appendix/section2.html b/pr-preview/pr-19/model-serving/1.1/appendix/section2.html deleted file mode 100644 index 43b3a81..0000000 --- a/pr-preview/pr-19/model-serving/1.1/appendix/section2.html +++ /dev/null @@ -1,306 +0,0 @@ - - - - - - Answers to the Quiz :: Serving an LLM using OpenShift AI - - - - - -
- -
- -
- -
- -
-

Answers to the Quiz

-
-
-
- - - - - -
- - -Pending review. -
-
-
-
-
-

Components of Red Hat OpenShift AI

-
-
-
    -
  1. -

    Which of the following Operator components are either are required to enable Red Hat OpenShift AI on OpenShift with Single Model Serving Platform capabilities ?

    -
    -
      -
    • -

      Red Hat OpenShift serverless operator
      -Correct

      -
    • -
    • -

      Red Hat OpenShift service mesh operator
      -Correct

      -
    • -
    • -

      Red Hat OpenShift pipelines operator
      -Correct

      -
    • -
    • -

      Red Hat OpenShift node feature discovery operator

      -
    • -
    • -

      Red Hat OpenShift Nvidia gpu operator

      -
    • -
    • -

      Red Hat OpenShift gitOps operator

      -
    • -
    • -

      Red Hat OpenShift smart gateway operator

      -
    • -
    -
    -
  2. -
  3. -

    After the installation of OpenShift AI Operator via Operator Hub, which of the following actions are required to enable the OpenShift AI console or dashboard ?

    -
    -
      -
    • -

      Create a new OpenShift AI data science project

      -
    • -
    • -

      Modify the data science cluster YAML file to use custom TLS certificates

      -
    • -
    • -

      Create a new OpenShift AI data science cluster
      -Correct

      -
    • -
    • -

      Create a new data science project workbench

      -
    • -
    • -

      A third-party vendor operator is required by Red Hat OpenShift AI.

      -
    • -
    -
    -
  4. -
  5. -

    What resources / services are available in a new OpenShift AI data science project ?

    -
    -
      -
    • -

      Workbench
      -Correct

      -
    • -
    • -

      Data connections
      -Correct

      -
    • -
    • -

      Pipelines
      -Correct

      -
    • -
    • -

      Model serving
      -Correct

      -
    • -
    • -

      Workloads

      -
    • -
    • -

      Routes

      -
    • -
    • -

      Permissions
      -Correct

      -
    • -
    • -

      Accelerator profiles

      -
    • -
    • -

      Operator Hub

      -
    • -
    -
    -
  6. -
  7. -

    When deploying a Model Server in an OpenShift AI workbench, what other workbench resources must be preconfigured ?

    -
    -
      -
    • -

      Data connection
      -Correct

      -
    • -
    • -

      Pipelines

      -
    • -
    • -

      Serving Runtimes
      -Correct

      -
    • -
    • -

      Workbench

      -
    • -
    • -

      Data science project
      -Correct

      -
    • -
    • -

      Model files located in S3 comptabile object storage
      -Correct

      -
    • -
    -
    -
  8. -
-
-
-
-
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter1/_images/redhatllm.gif b/pr-preview/pr-19/model-serving/1.1/chapter1/_images/redhatllm.gif deleted file mode 100644 index 0fa6ad0..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter1/_images/redhatllm.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter1/index.html b/pr-preview/pr-19/model-serving/1.1/chapter1/index.html deleted file mode 100644 index 4608f83..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter1/index.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - Technical Component Intoduction :: Serving an LLM using OpenShift AI - - - - - - - -
- -
- -
- -
- -
-

Technical Component Intoduction

-
-
-
- - - - - -
- - -This unit of the journey provides context around the technologies we encounter & a few analogies to facilitate understanding the purpose of guided lab in the next section. Feel free to skip ahead if you just want to get started. -
-
-
-
-
-

Why this technical course?

-
-
-

A Formula One Driver doesn’t need to know how to build an engine to be an F1 champion. However, she/he needs to have a mechanical sympathy, which is understanding of the car’s mechanics to drive it effectively and get the best out of it.

-
-
-

The same applies to AI. We don’t need to be AI experts to harness the power of large language models, but we do need to develop a certain level of "technological awareness" about how LLM Models are trained, selected, operationalized, delivered, inferred from, fined-tuned, augmented and kept up-to-date. Not just as users, but as aficionados who understand the underlying components to effectively communicate with clients, partners, and co-workers.

-
-
-

The true power lies in the platform that enables us to harness a diverse range of AI models, tools, infrastructure and operationalize our ML projects.

-
-
-

That platform, OpenShift AI, is what we learn to create, configure, and utilize to Serve LLM Models in this quick course.

-
-
-
- -
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter1/section1.html b/pr-preview/pr-19/model-serving/1.1/chapter1/section1.html deleted file mode 100644 index 59c31fa..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter1/section1.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - Red Hat OpenShift AI :: Serving an LLM using OpenShift AI - - - - - - - -
- -
- -
- -
- -
-

Red Hat OpenShift AI

-
-

Kubernetes & OpenShift

-
-
-

OpenShift builds upon Kubernetes by providing an enhanced platform with additional capabilities. It simplifies the deployment and management of Kubernetes clusters while adding enterprise features, developer tools, and security enhancements.

-
-
-

In addition, Openshift provides a Graphic User Interface for Kubernetes. Openshift AI runs on Openshift; therefore, the engine under the hood of both products is Kubernetes.

-
-
-

Most workloads are deployed in kubernetes via YAML files. A Kubernetes YAML manifest file is a configuration file written in YAML (YAML Ain’t Markup Language) that defines the desired state of a Kubernetes deployment. These YAML files are used to create, update, or delete deployments in Kubernetes / OpenShift clusters.

-
-
-

Don’t worry about needing to know how to write these files. That’s what OpenShift & OpenShift AI will take care of for us. In this course, we will just need to select the options we want in the UI. OpenShift and OpenShift AI will take care of creating the YAML deployment files.

-
-
-

We will have to perform a few YAML file copy-and-paste operations; instructions are provided in the course.

-
-
-

Just know, YAML files create resources directly in the Kubernetes platform. We primarily use the OpenShift AI UI to perform these tasks to deliver our LLM.

-
-
-
- -
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter1/section2.html b/pr-preview/pr-19/model-serving/1.1/chapter1/section2.html deleted file mode 100644 index ee7285b..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter1/section2.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - Large Language Models :: Serving an LLM using OpenShift AI - - - - - - - -
- -
- -
- -
- -
-

Large Language Models

-
-

Large Language Models

-
-
-

Large Language Models (LLMs) can generate new stories, summarize texts, and even perform advanced tasks like reasoning and problem solving, which is not only impressive but also remarkable due to their accessibility and easy integration into applications.

-
-
-

As you probably already know, training large language models is expensive, time consuming, and most importantly requires a vast amount of data fed into the model.

-
-
-

The common outcome from this training is a Foundation model: an LLM designed to generate and understand natural language text across a wide range of use cases.

-
-
-

The key to this powerful language processing architecture is the Transformer! A helpful definition of a Transformer is a set of neural networks that consist of an encoder and a decoder with self-attention capabilities. The Transformer was created by Google and started as a language translation algorithm. It analyzes relationships between words in text, which is crucial for LLMs to understand and generate language.

-
-
-

This is how LLMs are able to predict the next words, by using the transformer neural network & attention mechanism to focus in on keywords to determine context. Then use that context and knowledge from all the data ingested to predict the next word after a sequence of words.

-
-
-

Modifications to LLMs

-
-

As mentioned above, LLMs are normally large, require GPU or accelerator chips, and costly compute resources to load the model into memory.

-
-
-

However, there are techniques for compressing large LLM models, making them smaller and faster to run on devices with limited resources.

-
-
-
    -
  • -

    Quantization reduces the precision of numerical representations in large language models to make them more memory-efficient during deployment.

    -
  • -
  • -

    Reducing the precision of LLM parameters to save computational resources without sacrificing performance. Trimming surplus connections or parameters to make LLMs smaller and faster yet performant.

    -
  • -
-
-
-

In this course, we will be using quantized versions of the Mistral and Llama3 Large Language Models. Instead of requiring 24Gb of memory and graphics processing unit to simulate the neural network, we are going to run our model with 4 CPUs and 8GB of ram, burstable to 8 CPU with 10Gb ram max.

-
-
-
-
-
-

The Ollama Model Framework

-
-
-

There are hundreds of popular LLMs, nonetheless, their operation remains the same: users provide instructions or tasks in natural language, and the LLM generates a response based on what the model "thinks" could be the continuation of the prompt.

-
-
-

Ollama is not an LLM Model - Ollama is a relatively new but powerful open-source framework designed for serving machine learning models. It’s designed to be efficient, scalable, and easy to use; making it an attractive option for developers and organizations looking to deploy their AI models into production.

-
-
-

How does Ollama work?

-
-

At its core, Ollama simplifies the process of downloading, installing, and interacting with a wide range of LLMs, empowering users to explore their capabilities without the need for extensive technical expertise or reliance on cloud-based platforms.

-
-
-

In this course, we will focus on two LLMs, Mistra and Llama3 run on the Ollama Framework. However, with the understanding of the Ollama Framework, we will be able to work with a variety of large language models utilizing the exact same configuration. Vist the Ollama library for details on supported Models.

-
-
-

You will be able to switch models in minutes, all running on the same platform. This will enable you to test, compare, and evaluate multiple models with the skills gained in the course.

-
-
-
-
- -
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_install.gif b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_install.gif deleted file mode 100644 index ae95c93..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_install.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_install1.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_install1.png deleted file mode 100644 index 0fbf4d8..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_install1.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_install2.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_install2.png deleted file mode 100644 index 0eff97f..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_install2.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_install3.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_install3.png deleted file mode 100644 index b3c8e92..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_install3.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_install4.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_install4.png deleted file mode 100644 index b115bbf..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_install4.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_search.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_search.png deleted file mode 100644 index 0e22a7b..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/authorino_operator_search.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/createDSC.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/createDSC.png deleted file mode 100644 index 4d1dfee..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/createDSC.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/createsecret.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/createsecret.png deleted file mode 100644 index 8501da0..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/createsecret.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/data_science_project.gif b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/data_science_project.gif deleted file mode 100644 index 237e319..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/data_science_project.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/dsc_cert_example.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/dsc_cert_example.png deleted file mode 100644 index e0dd5d8..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/dsc_cert_example.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/dsc_deploy_complete.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/dsc_deploy_complete.png deleted file mode 100644 index c482a09..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/dsc_deploy_complete.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/dsc_install_214.gif b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/dsc_install_214.gif deleted file mode 100644 index 9328521..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/dsc_install_214.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/dsp_create_214.gif b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/dsp_create_214.gif deleted file mode 100644 index 387e367..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/dsp_create_214.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/llm_dsc_v3.mp4 b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/llm_dsc_v3.mp4 deleted file mode 100644 index 7f8baaa..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/llm_dsc_v3.mp4 and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/llm_tls_v3.mp4 b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/llm_tls_v3.mp4 deleted file mode 100644 index f60f351..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/llm_tls_v3.mp4 and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/ocp_ingress_cert_yaml.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/ocp_ingress_cert_yaml.png deleted file mode 100644 index 690971f..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/ocp_ingress_cert_yaml.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/ocp_istio_cert.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/ocp_istio_cert.png deleted file mode 100644 index 33efd57..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/ocp_istio_cert.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshift_ai_dsc_cluster2.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshift_ai_dsc_cluster2.png deleted file mode 100644 index 5bf3665..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshift_ai_dsc_cluster2.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshift_ai_operator_install4.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshift_ai_operator_install4.png deleted file mode 100644 index ecc018f..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshift_ai_operator_install4.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshift_ai_operator_search.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshift_ai_operator_search.png deleted file mode 100644 index dbcafeb..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshift_ai_operator_search.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshift_ai_v210.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshift_ai_v210.png deleted file mode 100644 index 3d93dce..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshift_ai_v210.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshiftai_install_214.gif b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshiftai_install_214.gif deleted file mode 100644 index 3f7ec0c..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshiftai_install_214.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshiftai_operator.mp4 b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshiftai_operator.mp4 deleted file mode 100644 index 470a1d2..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshiftai_operator.mp4 and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshiftai_operator.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshiftai_operator.png deleted file mode 100644 index cbc85de..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshiftai_operator.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshiftingress_project.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshiftingress_project.png deleted file mode 100644 index 0206934..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/openshiftingress_project.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/redhatllm.gif b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/redhatllm.gif deleted file mode 100644 index 0fa6ad0..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/redhatllm.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator.gif b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator.gif deleted file mode 100644 index bee12a6..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator.png deleted file mode 100644 index ea34e50..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_install1.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_install1.png deleted file mode 100644 index c2e28a4..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_install1.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_install2.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_install2.png deleted file mode 100644 index f0c498c..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_install2.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_install3.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_install3.png deleted file mode 100644 index 084cdb1..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_install3.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_install4.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_install4.png deleted file mode 100644 index 0105437..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_install4.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_search.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_search.png deleted file mode 100644 index 0f940e2..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/serverless_operator_search.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_install.gif b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_install.gif deleted file mode 100644 index 7b7c62f..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_install.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_install1.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_install1.png deleted file mode 100644 index d449044..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_install1.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_install2.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_install2.png deleted file mode 100644 index b8247e1..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_install2.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_install3.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_install3.png deleted file mode 100644 index 8ab0022..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_install3.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_install4.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_install4.png deleted file mode 100644 index 375118f..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_install4.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_search.png b/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_search.png deleted file mode 100644 index c18844a..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter2/_images/servicemesh_operator_search.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/index.html b/pr-preview/pr-19/model-serving/1.1/chapter2/index.html deleted file mode 100644 index 91f0baa..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter2/index.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - OpenShift AI Initialization :: Serving an LLM using OpenShift AI - - - - - - - -
- -
- -
- -
- -
-

OpenShift AI Initialization

-
-

Supported configurations

-
-
-

OpenShift AI is supported in two configurations:

-
-
-
    -
  • -

    A managed cloud service add-on for Red Hat OpenShift Service on Amazon Web Services (ROSA, with a Customer Cloud Subscription for AWS) or Red Hat OpenShift Dedicated (GCP). -For information about OpenShift AI on a Red Hat managed environment, see Product Documentation for Red Hat OpenShift AI Cloud Service.

    -
  • -
  • -

    Self-managed software that you can install on-premise or on the public cloud in a self-managed environment, such as OpenShift Container Platform. -For information about OpenShift AI as self-managed software on your OpenShift cluster in a connected or a disconnected environment, see Product Documentation for Red Hat OpenShift AI Self-Managed 2.14.

    -
  • -
-
-
-

In this course we cover installation of Red Hat OpenShift AI self-managed using the OpenShift Web Console.

-
-
-
-
-

Applicable Operators

-
-
-
-
-

The product name has been recently changed to Red Hat OpenShift AI (RHOAI) (old name Red Hat OpenShift Data Science). In this course, most references to the product use the new name. However, references to some UI elements might still use the previous name.

-
-
-
-
-

In addition to the Red Hat OpenShift AI Operator there are additional operators that you may need to install depending on which features and components of Red Hat OpenShift AI you want to utilize.

-
-
-
-
Red Hat OpenShift Serverless Operator
-
-

The Red Hat OpenShift Serverless operator provides a collection of APIs that enables containers, microservices and functions to run "serverless". The Red Hat OpenShift Serverless Operator is required if you want to install the Single-model serving platform component.

-
-
Red Hat OpenShift Service Mesh Operator
-
-

Red Hat OpenShift Service Mesh operator provides an easy way to create a network of deployed services that provides discovery, load balancing, service-to-service authentication, failure recovery, metrics, and monitoring. The Red Hat OpenShift Serverless Operator is required if you want to install the Single-model serving platform component.

-
-
Red Hat Authorino (technical preview) Operator
-
-

Red Hat Authorino is an open source, Kubernetes-native external authorization service to protect APIs. The Red Hat Authorino Operator is required to support enforcing authentication policies in Red Hat OpenShift AI.

-
-
-
-
-
-
-

The following Operators are required to support the use of Nvidia GPUs (accelerators) with OpenShift AI:

-
-
-
-
-
-
Node Feature Discovery Operator
-
-

The Node Feature Discovery Operator is a prerequisite for the NVIDIA GPU Operator.

-
-
NVIDIA GPU Operator
-
-

The NVIDIA GPU Operator is required for GPU support in Red Hat OpenShift AI.

-
-
-
-
-
- -
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/rhoai_install_guide.html b/pr-preview/pr-19/model-serving/1.1/chapter2/rhoai_install_guide.html deleted file mode 100644 index f11c8c1..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter2/rhoai_install_guide.html +++ /dev/null @@ -1,492 +0,0 @@ - - - - - - OpenShift AI Using the Web Console :: Serving an LLM using OpenShift AI - - - - - - - -
- -
- -
- -
- -
-

OpenShift AI Using the Web Console

-
-
-
-

Red Hat OpenShift AI is available as an operator via the OpenShift Operator Hub. You will install the Red Hat OpenShift AI operator and dependencies using the OpenShift web console in this section.

-
-
-
-
-

Lab Exercise: Installation of Red Hat OpenShift AI

-
-
-

This section will discuss the process for installing the dependent operators using the OpenShift Web Console. ( ~15 minutes )

-
-
- - - - - -
- - -The installation requires a user with the cluster-admin role -
-
-
-

This exercise uses the Red Hat Demo Platform; specifically the OpenShift Container Cluster Platform Resource. If you haven’t already you’ll need to launch the lab environment before continuing.

-
-
-
    -
  1. -

    Login to the Red Hat OpenShift using a user who has the cluster-admin role assigned.

    -
  2. -
  3. -

    Navigate to OperatorsOperatorHub and search for each of the following Operators individually. For this lab, you can skip the installation of the optional operators.

    -
  4. -
-
-
-

[*] You do not have to wait for the previous Operator to complete before installing the next. For this lab you can skip the installation of the optional operators as there is no accelerator required.

-
-
-
    -
  • -

    Red Hat OpenShift Serverless

    -
  • -
  • -

    Red Hat OpenShift Service Mesh

    -
  • -
  • -

    Red Hat Authorino technical preview

    -
  • -
  • -

    GPU Support

    -
    -
      -
    • -

      Node Feature Discovery Operator (optional)

      -
    • -
    • -

      NVIDIA GPU Operator (optional)

      -
    • -
    -
    -
  • -
-
-
-

Installation of Red Hat OpenShift Serverless Operator

-
-

The following section discusses installing the Red Hat OpenShift Serverless operator.

-
-
-
-serverless operator -
-
Figure 1. Animated - Operator Hub installation of Serverless Operator in OpenShift
-
-
-
    -
  1. -

    Login to Red Hat OpenShift using a user who has the cluster-admin role assigned.

    -
  2. -
  3. -

    Navigate to OperatorsOperatorHub and search for Red Hat OpenShift Serverless.

    -
  4. -
  5. -

    Click on the Red Hat OpenShift Serverless operator. In the pop-up window, select the stable channel and the most recent version of the serverless operator. Click on Install to open the operator’s installation view.

    -
  6. -
  7. -

    In the Install Operator page, select the default values for all the fields and click Install.

    -
  8. -
  9. -

    A window showing the installation progress will pop up.

    -
  10. -
  11. -

    When the installation finishes the operator is ready to be used by Red Hat OpenShift AI.

    -
  12. -
-
-
-

Red Hat OpenShift Serverless is now successfully installed.

-
-
-
-

Installation of Red Hat OpenShift Service Mesh Operator

-
-

The following section discusses installing the Red Hat OpenShift Service Mesh operator.

-
-
-
-servicemesh install -
-
Figure 2. Animated - Operator Hub installation of Service Mesh Operator in OpenShift
-
-
-
    -
  1. -

    Login to Red Hat OpenShift using a user who has the cluster-admin role assigned.

    -
  2. -
  3. -

    Navigate to OperatorsOperatorHub and search for Red Hat OpenShift Service Mesh.

    -
  4. -
  5. -

    Click on the Red Hat OpenShift Service Mesh operator. In the pop-up window, select the stable channel and the most recent version of the server mesh operator. Click on Install to open the operator’s installation view.

    -
  6. -
  7. -

    In the Install Operator page, select the default values for all the fields and click Install.

    -
  8. -
  9. -

    A window showing the installation progress will pop up.

    -
  10. -
  11. -

    When the installation finishes the operator is ready to be used by Red Hat OpenShift AI.

    -
  12. -
-
-
-

Red Hat OpenShift Service Mesh is now successfully installed.

-
-
-
-

Installation of Red Hat Authorino Operator

-
-

The following section discusses installing the Red Hat - Authorino operator.

-
-
-
-authorino install -
-
Figure 3. Animated - Operator Hub installation of Authorino (tech preview) Operator in OpenShift
-
-
-
    -
  1. -

    Login to Red Hat OpenShift using a user who has the cluster-admin role assigned.

    -
  2. -
  3. -

    Navigate to OperatorsOperatorHub and search for *Red Hat Authorino.

    -
  4. -
  5. -

    Click on the Red Hat Authorino *operator. In the pop-up window, select the tech-preview-v1 channel and the most recent version of the operator. Click on Install to open the operator’s installation view.

    -
  6. -
  7. -

    In the Install Operator page, select the default values for all the fields and click Install.

    -
  8. -
  9. -

    A window showing the installation progress will pop-up.

    -
  10. -
  11. -

    When the installation finishes the operator is ready to be used by Red Hat OpenShift AI.

    -
  12. -
-
-
-

Red Hat Authorino is now successfully installed.

-
-
- - - - - -
- - - Installing these Operators prior to the installation of the OpenShift AI Operator increases the speed in OpenShift AI acknowledging the availability of these components and adjusting the initial configuration to shift management of these components to OpenShift AI. -
-
-
-
-
-
-

Installation of Red Hat OpenShift AI Operator

-
-
-
-openshiftai install 214 -
-
Figure 4. Animated - Operator Hub installation of OpenShift AI Operator on OpenShift
-
-
-
    -
  • -

    Navigate to OperatorsOperatorHub and search for OpenShift AI.

    -
    -
      -
    1. -

      Click on the Red Hat OpenShift AI operator. In the pop-up window that opens, ensure you select the latest version in the fast channel. Any version equal to or greater than 2.14 and click on Install to open the operator’s installation view.

      -
    2. -
    3. -

      In the Install Operator page, leave all of the options as default and click on the Install button to start the installation.

      -
    4. -
    5. -

      The operator Installation progress window will pop up. The installation may take a couple of minutes.

      -
    6. -
    -
    -
  • -
-
-
-
-
-

Create OpenShift AI Data Science Cluster

-
-
-

The next step is to create an OpenShift AI Data Science Cluster (DSC).

-
-
-

A DataScienceCluster is the plan in the form of an YAML outline for Data Science Cluster API deployment. Manually editing the YAML configuration can adjust the settings of the OpenShift AI DSC.

-
-
-
-dsc install 214 -
-
Figure 5. Animated - Create Data Science Cluster to enable OpenShift AI on OpenShift
-
-
-

Return to the OpenShift Navigation Menu, Select Installed Operators, and click on the OpenShift AI Operator name to open the operator.

-
-
-
    -
  1. -

    Select the option to create a Data Science Cluster.

    -
  2. -
  3. -

    Click Create to deploy the Data Science Cluster.

    -
  4. -
-
-
-
-
-

OpenShift AI install Summary

-
-
-

Congratulations, you have successfully completed the installation of OpenShift AI on an OpenShift Container Cluster. OpenShift AI is now running on a new Dashboard!

-
-
-
    -
  • -

    We installed the required OpenShift AI Operators

    -
    -
      -
    • -

      Red Hat OpenShift Serverless

      -
    • -
    • -

      Red Hat OpenShift ServiceMesh

      -
    • -
    • -

      Red Hat Authorino (technical preview)

      -
    • -
    • -

      OpenShift AI Operator

      -
    • -
    -
    -
  • -
-
-
-
-
-

Create a Data Science Project

-
-
-

Navigate to the menu selector, located at the top right of the OCP dashboard. Select the grid of squares, then select OpenShift AI. At the login screen, use the OCP admin credentials to login to OpenShift AI.

-
-
-
-data science project -
-
Figure 6. Animated - Create data science project from OpenShift AI dashboard
-
-
-

Explore the dashboard navigation menus to familiarize yourself with the options.

-
-
-

Navigate to & select the Data Science Projects section.

-
-
-
    -
  1. -

    Select the Create Data Science Project button.

    -
  2. -
  3. -

    Enter a name for your project, such as ollama-model. (differs from animated example)

    -
  4. -
  5. -

    The resource name should be populated automatically.

    -
  6. -
  7. -

    Optionally add a description to the data science project.

    -
  8. -
  9. -

    Select Create.

    -
  10. -
-
-
-

Once complete, you should be on the landing page of the "ollama-model" Data Science Project section of the OpenShift AI Console / Dashboard.

-
-
-
- -
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/section1old.html b/pr-preview/pr-19/model-serving/1.1/chapter2/section1old.html deleted file mode 100644 index e9741dd..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter2/section1old.html +++ /dev/null @@ -1,498 +0,0 @@ - - - - - - Installing Red Hat OpenShift AI Using the Web Console :: Serving an LLM using OpenShift AI - - - - - -
- -
- -
- -
- -
-

Installing Red Hat OpenShift AI Using the Web Console

-
-
-
-

Red Hat OpenShift AI is available as an operator via the OpenShift Operator Hub. You will install the Red Hat OpenShift AI operator and dependencies using the OpenShift web console in this section.

-
-
-
-
-

Lab: Installation of Red Hat OpenShift AI

-
-
- - - - - -
- - -The installation requires a user with the cluster-admin role -
-
-
-

This exercise uses the Red Hat Demo Platform; specifically the OpenShift Container Cluster Platform Resource. If you haven’t already you’ll need to launch the lab environment before continuing.

-
-
-
    -
  1. -

    Login to the Red Hat OpenShift using a user which has the cluster-admin role assigned.

    -
  2. -
  3. -

    It’s sufficient to install all prerequisite operators with default settings, no additional configuration is necessary.

    -
  4. -
  5. -

    Navigate to OperatorsOperatorHub and search for each of the following Operators individually. Click on the button or tile for each. In the pop up window that opens, ensure you select the latest version in the "specified within instructions" channel and click on Install to open the operator’s installation view. For this lab you can skip the installation of the optional operators.

    -
  6. -
-
-
-

[*] You do not have to wait for the previous Operator to complete before installing the next. For this lab you can skip the installation of the optional operators as there is no accelerator required.

-
-
-
    -
  • -

    Red Hat OpenShift Serverless

    -
  • -
  • -

    Red Hat OpenShift Service Mesh

    -
  • -
  • -

    Red Hat Authorino technical preview

    -
  • -
  • -

    GPU Support

    -
    -
      -
    • -

      Node Feature Discovery Operator (optional)

      -
    • -
    • -

      NVIDIA GPU Operator (optional)

      -
    • -
    -
    -
  • -
-
-
-

This section will discuss the process for installing the dependent operators using the OpenShift Web Console.

-
-
-

Installation of Red Hat OpenShift Serverless Operator

-
-

The following section discusses installing the Red Hat OpenShift Serverless operator.

-
-
-
-serverless operator -
-
Figure 1. Animated - Operator Hub installation of Serverless Operator in OpenShift
-
-
-
    -
  1. -

    Login to Red Hat OpenShift using a user who has the cluster-admin role assigned.

    -
  2. -
  3. -

    Navigate to OperatorsOperatorHub and search for Red Hat OpenShift Serverless.

    -
  4. -
  5. -

    Click on the Red Hat OpenShift Serverless operator. In the pop-up window, select the stable channel and the most recent version of the serverless operator. Click on Install to open the operator’s installation view.

    -
  6. -
  7. -

    In the Install Operator page, select the default values for all the fields and click Install.

    -
  8. -
  9. -

    A window showing the installation progress will pop up.

    -
  10. -
  11. -

    When the installation finishes the operator is ready to be used by Red Hat OpenShift AI.

    -
  12. -
-
-
-

Red Hat OpenShift Serverless is now successfully installed.

-
-
-
-

Installation of Red Hat OpenShift Service Mesh Operator

-
-

The following section discusses installing the Red Hat OpenShift Service Mesh operator.

-
-
-
-servicemesh install -
-
Figure 2. Animated - Operator Hub installation of Service Mesh Operator in OpenShift
-
-
-
    -
  1. -

    Login to Red Hat OpenShift using a user who has the cluster-admin role assigned.

    -
  2. -
  3. -

    Navigate to OperatorsOperatorHub and search for Red Hat OpenShift Service Mesh.

    -
  4. -
  5. -

    Click on the Red Hat OpenShift Service Mesh operator. In the pop-up window, select the stable channel and the most recent version of the server mesh operator. Click on Install to open the operator’s installation view.

    -
  6. -
  7. -

    In the Install Operator page, select the default values for all the fields and click Install.

    -
  8. -
  9. -

    A window showing the installation progress will pop up.

    -
  10. -
  11. -

    When the installation finishes the operator is ready to be used by Red Hat OpenShift AI.

    -
  12. -
-
-
-

Red Hat OpenShift Service Mesh is now successfully installed.

-
-
-
-

Installation of Red Hat Authorino Operator

-
-

The following section discusses installing the Red Hat - Authorino operator.

-
-
-
-authorino install -
-
Figure 3. Animated - Operator Hub installation of Authorino (tech preview) Operator in OpenShift
-
-
-
    -
  1. -

    Login to Red Hat OpenShift using a user who has the cluster-admin role assigned.

    -
  2. -
  3. -

    Navigate to OperatorsOperatorHub and search for *Red Hat Authorino.

    -
  4. -
  5. -

    Click on the Red Hat Authorino operator. In the pop-up window, select the tech-preview-v1 channel and the most recent version of the serverless operator. Click on Install to open the operator’s installation view.

    -
  6. -
  7. -

    In the Install Operator page, select the default values for all the fields and click Install.

    -
  8. -
  9. -

    A window showing the installation progress will pop-up.

    -
  10. -
  11. -

    When the installation finishes the operator is ready to be used by Red Hat OpenShift AI.

    -
  12. -
-
-
-

Red Hat Authorino is now successfully installed.

-
-
- - - - - -
- - - Installing these Operators prior to the installation of the OpenShift AI Operator increases the speed in OpenShift AI acknowledging the availability of these components and adjusting the initial configuration to shift management of these components to OpenShift AI. -
-
-
-
-
-
-

Installation of Red Hat OpenShift AI Operator

-
-
-
-openshiftai install 214 -
-
Figure 4. Animated - Operator Hub installation of OpenShift AI Operator on OpenShift
-
-
-
    -
  • -

    Navigate to OperatorsOperatorHub and search for OpenShift AI.

    -
    -
      -
    1. -

      Click on the Red Hat OpenShift AI operator. In the pop-up window that opens, ensure you select the latest version in the fast channel. Any version equal to or greater than 2.14 and click on Install to open the operator’s installation view.

      -
    2. -
    3. -

      In the Install Operator page, leave all of the options as default and click on the Install button to start the installation.

      -
    4. -
    5. -

      The operator Installation progress window will pop up. The installation may take a couple of minutes.

      -
    6. -
    -
    -
  • -
-
-
-
-
-

Create OpenShift AI Data Science Cluster

-
-
-

The next step is to create an OpenShift AI Data Science Cluster (DSC).

-
-
-

A DataScienceCluster is the plan in the form of an YAML outline for Data Science Cluster API deployment. Manually editing the YAML configuration can adjust the settings of the OpenShift AI DSC.

-
-
-
-dsc install 214 -
-
Figure 5. Animated - Create Data Science Cluster to enable OpenShift AI on OpenShift
-
-
-

Return to the OpenShift Navigation Menu, Select Installed Operators, and click on the OpenShift AI Operator name to open the operator.

-
-
-
    -
  1. -

    Select the option to create a Data Science Cluster.

    -
  2. -
  3. -

    Click Create to deploy the Data Science Cluster.

    -
  4. -
-
-
-

This takes ~5 minutes to complete, once the DSC becomes Ready, use the navigation menu at the top right to drop down the menu and select Red Hat OpenShift AI. Use the same credentials as used log into OpenShift.

-
-
-
-
-

OpenShift AI install Summary

-
-
-

Congratulations, you have successfully completed the installation of OpenShift AI on an OpenShift Container Cluster. OpenShift AI is now running on a new Dashboard!

-
-
-
    -
  • -

    We installed the required OpenShift AI Operators

    -
    -
      -
    • -

      Red Hat OpenShift Serverless

      -
    • -
    • -

      Red Hat OpenShift ServiceMesh

      -
    • -
    • -

      Red Hat Authorino (technical preview)

      -
    • -
    • -

      OpenShift AI Operator

      -
    • -
    -
    -
  • -
-
-
-
-
-

Create a Data Science Project

-
-
-

Navigate to the menu selector, located at the top right of the OCP dashboard. Select the grid of squares, then select OpenShift AI. At the login screen, use the OCP admin credentials to login to OpenShift AI.

-
-
-
-data science project -
-
Figure 6. Animated - Create data science project from OpenShift AI dashboard
-
-
-

Explore the dashboard navigation menus to familiarize yourself with the options.

-
-
-

Navigate to & select the Data Science Projects section.

-
-
-
    -
  1. -

    Select the Create Data Science Project button.

    -
  2. -
  3. -

    Enter a name for your project, such as ollama-model.

    -
    -
      -
    1. -

      (the animated example shows fraud-detection entered for the data science project, for this course use the ollama-model to follow along with rest of the labs)

      -
    2. -
    -
    -
  4. -
  5. -

    The resource name should be populated automatically.

    -
  6. -
  7. -

    Optionally add a description to the data science project.

    -
  8. -
  9. -

    Select Create.

    -
  10. -
-
-
-

Once complete, you should be on the landing page of the "ollama-model" Data Science Project section of the OpenShift AI Console / Dashboard.

-
-
-
-
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/section2old.html b/pr-preview/pr-19/model-serving/1.1/chapter2/section2old.html deleted file mode 100644 index 058f313..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter2/section2old.html +++ /dev/null @@ -1,306 +0,0 @@ - - - - - - Modifying the OpenShift AI TLS Certificate :: Serving an LLM using OpenShift AI - - - - - -
- -
- -
- -
- -
-

Modifying the OpenShift AI TLS Certificate

-
-
-
- - - - - -
- - -An SSL/TLS certificate is a digital object that allows systems to verify the identity & subsequently establish an encrypted network connection to another system using the Secure Sockets Layer/Transport Layer Security (SSL/TLS) protocol. -
-
-
-

By default, the Single Model Serving Platform in Openshift AI v2.10 uses a self-signed certificate generated during installation for the endpoints that are created when deploying a Model server.

-
-
-

This can be counterintuitive because the OCP Cluster already has certificates configured which will be used by default for endpoints like Routes.

-
-
-

This following procedure explains how to use the same certificate from the OpenShift Container cluster for OpenShift AI.

-
-
-
-
-

Use OpenShift Certificates for Ingress Routes

-
-
- - - - - -
- - -Most customers will not use the self-signed certificates, opting instead to use certificates generated by their own authority. Therefore, this step of adding secrets to OpenShift & OpenShift AI is a common process during installation. -
-
-
-

Navigate to the OpenShift Container Cluster Dashboard

-
- - - - - -
- - -The content of the Secret (data) should contain two items, tls.cert and tls.key. They are the certificate and key that are used for all the OpenShift Routes. The actual name will include the term cert, but could be different from the example. -
-
-
-
-

Collect the Secret YAML Text:

-
-
    -
  1. -

    In the Navigation pane on the left, click on the Workloads section, then Secrets under Workloads.

    -
  2. -
  3. -

    From the Project dropdown, toggle the show default projects radial button to on.

    -
  4. -
  5. -

    Select the openshift-ingress project from the list.

    -
  6. -
-
-
-
-openshiftingress project -
-
-
-
    -
  1. -

    Locate the file named cert-manager-ingress-cert, type should be kubernetes.io/tls

    -
  2. -
  3. -

    Click on the filename to open the secret, select the YAML Tab

    -
  4. -
  5. -

    Copy all the text from the window, and ensure that you scroll down. (CTL-A should work).

    -
  6. -
-
-
-
-ocp ingress cert yaml -
-
-
-
-

Clean & Deploy the Secret YAML Text:

-
-
    -
  • -

    Click on the Project dropdown again, select the Istio-system project

    -
  • -
  • -

    Select the Create button on the right, then Select the from YAML option.

    -
  • -
  • -

    Delete the text from the Window, and paste the copied Secret text

    -
  • -
  • -

    Cleanup the YAML Text to just keep the relevant content. It should look like the YAML file below (the name of the secret will be different, it’s normally tied to the date the RDHP Cluster was deployed).

    -
  • -
-
-
-
-
kind: Secret
-apiVersion: v1
-metadata:
-name: cert-manager-ingress-cert
-data:
-  tls.crt: >-
-    LS0tLS1CRUd...
-  tls.key: >-
-    LS0tLS1CRUd...
-type: kubernetes.io/tls
-
-
-
-
-ocp istio cert -
-
-
-
    -
  • -

    Copy the name of the secret from line 4, just the name (optional, but helpful)

    -
  • -
  • -

    Click create to apply this YAML into the istio-system project (namespace).

    -
  • -
-
-
-

We have copied the Secret used by OCP & made it available to be used by OAI.

-
-
-
-
-
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter2/section3old.html b/pr-preview/pr-19/model-serving/1.1/chapter2/section3old.html deleted file mode 100644 index a786a12..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter2/section3old.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - Configure the OpenShift AI Data Science Cluster :: Serving an LLM using OpenShift AI - - - - - -
- -
- -
- -
- -
-

Configure the OpenShift AI Data Science Cluster

-
-
-
-
- -
-
-
-
-
-

Create OpenShift AI Data Science Cluster

-
-
-

With our secrets in place, the next step is to create an OpenShift AI Data Science Cluster.

-
-
-

A DataScienceCluster is the plan in the form of an YAML outline for Data Science Cluster API deployment.

-
-
-

Return to the OpenShift Navigation Menu, Select Installed Operators, and Click on the OpenShift AI Operator name to open the operator.

-
-
-
    -
  1. -

    Select the Option to create a Data Science Cluster.

    -
  2. -
  3. -

    Select the radial button to switch to the YAML view.

    -
  4. -
  5. -

    Find the section below in the YAML file, in the Kserve Section find the Serving/Certificate area; add the line: secretName: followed by the name of the secret name that we deployed in the istio-system project. In addition, change the type from SelfSigned to Provided. See below for the example.

    -
  6. -
-
-
-
-
kserve:
-  managementState: Managed
-  serving:
-    ingressGateway:
-      certificate:
-        secretName: cert-manager-ingress-cert
-        type: Provided
-    managementState: Managed
-    name: knative-serving
-
-
-
-
-dsc cert example -
-
-
-

Once you have made those changes to the YAML file, Click Create to Deploy the Data Science Cluster.

-
-
-
-dsc deploy complete -
-
-
-

Single Model Serve Platform will now be deployed to expose ingress connections with the same certificate as OpenShift Routes. Endpoints will be accessible using TLS without having to ignore error messages or create special configurations.

-
-
-
-
-

OpenShift AI install summary

-
-
-

Congratulations, you have successfully completed the installation of OpenShift AI on an OpenShift Container Cluster. OpenShift AI is now running on a new Dashboard!

-
-
-
    -
  • -

    We installed the required OpenShift AI Operators

    -
    -
      -
    • -

      Red Hat OpenShift Serverless

      -
    • -
    • -

      Red Hat OpenShift ServiceMesh

      -
    • -
    • -

      Red Hat Authorino (technical preview)

      -
    • -
    • -

      OpenShift AI Operator

      -
    • -
    -
    -
  • -
-
-
-

Additionally, we took this installation a step further by sharing TLS certificates from the OpenShift Cluster with OpenShift AI.

-
-
-

We will pick up working with the OpenShift AI UI in the next Chapter.

-
-
-
-
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_attachments/emptyfile.txt b/pr-preview/pr-19/model-serving/1.1/chapter3/_attachments/emptyfile.txt deleted file mode 100644 index e69de29..0000000 diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/add_dataconnection2.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/add_dataconnection2.png deleted file mode 100644 index 9da4f51..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/add_dataconnection2.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/add_yaml_minio.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/add_yaml_minio.png deleted file mode 100644 index 25eb80d..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/add_yaml_minio.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/create_workbench.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/create_workbench.png deleted file mode 100644 index f8670e2..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/create_workbench.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/dataconnection_models.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/dataconnection_models.png deleted file mode 100644 index b79b42c..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/dataconnection_models.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/dataconnections.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/dataconnections.png deleted file mode 100644 index 66e3b4a..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/dataconnections.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/deploy_model1.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/deploy_model1.png deleted file mode 100644 index b59dab1..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/deploy_model1.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/deploy_model_2.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/deploy_model_2.png deleted file mode 100644 index 7a0ec52..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/deploy_model_2.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/dsp_create.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/dsp_create.png deleted file mode 100644 index a811792..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/dsp_create.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/llm_dataconn_v3.mp4 b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/llm_dataconn_v3.mp4 deleted file mode 100644 index bb34cc9..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/llm_dataconn_v3.mp4 and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/llm_dsp_v3.mp4 b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/llm_dsp_v3.mp4 deleted file mode 100644 index fc6971f..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/llm_dsp_v3.mp4 and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/llm_minio_v3.mp4 b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/llm_minio_v3.mp4 deleted file mode 100644 index e7bbcb4..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/llm_minio_v3.mp4 and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio2.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio2.png deleted file mode 100644 index 06a705b..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio2.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_emptyfile_view.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_emptyfile_view.png deleted file mode 100644 index a1fe7cb..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_emptyfile_view.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_file_upload.gif b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_file_upload.gif deleted file mode 100644 index 91c7839..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_file_upload.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_install.gif b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_install.gif deleted file mode 100644 index 80d8222..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_install.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_routes.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_routes.png deleted file mode 100644 index d291778..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_routes.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_setup.gif b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_setup.gif deleted file mode 100644 index 3a73310..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_setup.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_yaml_deploy.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_yaml_deploy.png deleted file mode 100644 index 43df2df..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/minio_yaml_deploy.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/model_served.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/model_served.png deleted file mode 100644 index 968ef56..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/model_served.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/oai_model_deploy.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/oai_model_deploy.png deleted file mode 100644 index 491bf12..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/oai_model_deploy.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/ollama_model_deploy.gif b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/ollama_model_deploy.gif deleted file mode 100644 index 6ddbbcf..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/ollama_model_deploy.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/ollama_model_project.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/ollama_model_project.png deleted file mode 100644 index 5ee5f18..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/ollama_model_project.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/ollama_runtime.gif b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/ollama_runtime.gif deleted file mode 100644 index 0b3aea3..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/ollama_runtime.gif and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/openshiftai_setup_part3.mp4 b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/openshiftai_setup_part3.mp4 deleted file mode 100644 index 990c4a4..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/openshiftai_setup_part3.mp4 and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/serving_runtime.png b/pr-preview/pr-19/model-serving/1.1/chapter3/_images/serving_runtime.png deleted file mode 100644 index ab93d51..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter3/_images/serving_runtime.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/index.html b/pr-preview/pr-19/model-serving/1.1/chapter3/index.html deleted file mode 100644 index a052784..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter3/index.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - OpenShift AI Configuration :: Serving an LLM using OpenShift AI - - - - - - - -
- -
- -
- -
- -
-

OpenShift AI Configuration

-
-

This chapter begins with running and configured OpenShift AI environment. If you don’t already have your environment running, head over to Chapter 2.

-
-
-

There’s a lot to cover in this section, we add the Ollama custom Runtime, setup MinIO storage, create a workbench, and finally serve the Ollama Framework, utilizing the Single Model Serving Platform to deliver our model to our Notebook Application.

-
-
-

Let’s get started!

-
- -
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/section1.html b/pr-preview/pr-19/model-serving/1.1/chapter3/section1.html deleted file mode 100644 index d670b9f..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter3/section1.html +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - Creating OpenShift AI Resources - 1 :: Serving an LLM using OpenShift AI - - - - - - - -
- -
- -
- -
- -
-

Creating OpenShift AI Resources - 1

-
-

Model Serving Runtimes

-
-
-

A model-serving runtime provides integration with a specified model server and the model frameworks that it supports. By default, Red Hat OpenShift AI includes the following model serving runtimes:

-
-
-
    -
  • -

    Multi-model

    -
    -
      -
    • -

      OpenVINO Model Server

      -
    • -
    -
    -
  • -
  • -

    Single-model

    -
    -
      -
    • -

      OpenVINO Model Server

      -
    • -
    • -

      Caikit Standalone ServingRuntime for KServe

      -
    • -
    • -

      Caikit ServingRuntime TGIS for KServe

      -
    • -
    • -

      TGIS Standalone ServingRuntime for KServe

      -
    • -
    • -

      vLLMServingRuntime For KServe

      -
    • -
    -
    -
  • -
-
-
-

However, if these runtimes do not meet your needs (if they don’t support a particular model framework, for example), you might want to add your own custom runtimes.

-
-
-

As an administrator, you can use the OpenShift AI interface to add and enable custom model-serving runtimes. You can then choose from your enabled runtimes when you create a new model server.

-
-
-

This exercise will guide you through the steps necessary to deploy a custom Serving Runtime in order to serve a model using the Ollama Model Serving Framework.

-
-
- - - - - -
- - -
-

While RHOAI supports the ability to add your own runtime, it is up to you to configure, adjust, and maintain your custom runtimes.

-
-
-
-
-
-
-

Add The Ollama Custom Runtime

-
-
-
-ollama runtime -
-
Figure 1. Animated - Add Ollama serving runtime
-
-
-
    -
  1. -

    Log in to RHOAI with a user who is part of the RHOAI admin group, for this lab we will be using the admin account.

    -
  2. -
  3. -

    In the RHOAI Console, Navigate to the Settings menu, then select Serving Runtimes

    -
  4. -
  5. -

    Select: the Add Serving Runtime button

    -
  6. -
  7. -

    For the model serving platform runtime, select: Single-Model Serving Platform

    -
  8. -
  9. -

    For API protocol this runtime supports, select: REST

    -
  10. -
  11. -

    Click on: Start from scratch in the window that opens up, paste the following YAML

    -
    -
    -
    apiVersion: serving.kserve.io/v1alpha1
    -kind: ServingRuntime
    -labels:
    -  opendatahub.io/dashboard: "true"
    -metadata:
    -  annotations:
    -    openshift.io/display-name: Ollama
    -  name: ollama
    -spec:
    -  builtInAdapter:
    -    modelLoadingTimeoutMillis: 90000
    -  containers:
    -    - image: quay.io/rh-aiservices-bu/ollama-ubi9:0.1.45
    -      env:
    -        - name: OLLAMA_MODELS
    -          value: /.ollama/models
    -        - name: OLLAMA_HOST
    -          value: 0.0.0.0
    -        - name: OLLAMA_KEEP_ALIVE
    -          value: '-1m'
    -      name: kserve-container
    -      ports:
    -        - containerPort: 11434
    -          name: http1
    -          protocol: TCP
    -  multiModel: false
    -  supportedModelFormats:
    -    - autoSelect: true
    -      name: any
    -
    -
    -
  12. -
  13. -

    After clicking the Create button at the bottom of the input area, you will see the new Ollama Runtime in the list. We can re-order the list as needed (the order chosen here is the order in which the users will see these choices).

    -
  14. -
-
-
-
-

The next step is to create a Data Connection in our Data Science Project. Before we can create our Data Connection, we will setup MinIO as our S3 compatible storage for this Lab.

-
-
-

Continue to the next section to deploy and configure Minio.

-
-
-
- -
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/section1old.html b/pr-preview/pr-19/model-serving/1.1/chapter3/section1old.html deleted file mode 100644 index 752157d..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter3/section1old.html +++ /dev/null @@ -1,498 +0,0 @@ - - - - - - Installing Red Hat OpenShift AI Using the Web Console :: Serving an LLM using OpenShift AI - - - - - -
- -
- -
- -
- -
-

Installing Red Hat OpenShift AI Using the Web Console

-
-
-
-

Red Hat OpenShift AI is available as an operator via the OpenShift Operator Hub. You will install the Red Hat OpenShift AI operator and dependencies using the OpenShift web console in this section.

-
-
-
-
-

Lab: Installation of Red Hat OpenShift AI

-
-
- - - - - -
- - -The installation requires a user with the cluster-admin role -
-
-
-

This exercise uses the Red Hat Demo Platform; specifically the OpenShift Container Cluster Platform Resource. If you haven’t already you’ll need to launch the lab environment before continuing.

-
-
-
    -
  1. -

    Login to the Red Hat OpenShift using a user which has the cluster-admin role assigned.

    -
  2. -
  3. -

    It’s sufficient to install all prerequisite operators with default settings, no additional configuration is necessary.

    -
  4. -
  5. -

    Navigate to OperatorsOperatorHub and search for each of the following Operators individually. Click on the button or tile for each. In the pop up window that opens, ensure you select the latest version in the "specified within instructions" channel and click on Install to open the operator’s installation view. For this lab you can skip the installation of the optional operators.

    -
  6. -
-
-
-

[*] You do not have to wait for the previous Operator to complete before installing the next. For this lab you can skip the installation of the optional operators as there is no accelerator required.

-
-
-
    -
  • -

    Red Hat OpenShift Serverless

    -
  • -
  • -

    Red Hat OpenShift Service Mesh

    -
  • -
  • -

    Red Hat Authorino technical preview

    -
  • -
  • -

    GPU Support

    -
    -
      -
    • -

      Node Feature Discovery Operator (optional)

      -
    • -
    • -

      NVIDIA GPU Operator (optional)

      -
    • -
    -
    -
  • -
-
-
-

This section will discuss the process for installing the dependent operators using the OpenShift Web Console.

-
-
-

Installation of Red Hat OpenShift Serverless Operator

-
-

The following section discusses installing the Red Hat OpenShift Serverless operator.

-
-
-
-serverless operator -
-
Figure 1. Animated - Operator Hub installation of Serverless Operator in OpenShift
-
-
-
    -
  1. -

    Login to Red Hat OpenShift using a user who has the cluster-admin role assigned.

    -
  2. -
  3. -

    Navigate to OperatorsOperatorHub and search for Red Hat OpenShift Serverless.

    -
  4. -
  5. -

    Click on the Red Hat OpenShift Serverless operator. In the pop-up window, select the stable channel and the most recent version of the serverless operator. Click on Install to open the operator’s installation view.

    -
  6. -
  7. -

    In the Install Operator page, select the default values for all the fields and click Install.

    -
  8. -
  9. -

    A window showing the installation progress will pop up.

    -
  10. -
  11. -

    When the installation finishes the operator is ready to be used by Red Hat OpenShift AI.

    -
  12. -
-
-
-

Red Hat OpenShift Serverless is now successfully installed.

-
-
-
-

Installation of Red Hat OpenShift Service Mesh Operator

-
-

The following section discusses installing the Red Hat OpenShift Service Mesh operator.

-
-
-
-servicemesh install -
-
Figure 2. Animated - Operator Hub installation of Service Mesh Operator in OpenShift
-
-
-
    -
  1. -

    Login to Red Hat OpenShift using a user who has the cluster-admin role assigned.

    -
  2. -
  3. -

    Navigate to OperatorsOperatorHub and search for Red Hat OpenShift Service Mesh.

    -
  4. -
  5. -

    Click on the Red Hat OpenShift Service Mesh operator. In the pop-up window, select the stable channel and the most recent version of the server mesh operator. Click on Install to open the operator’s installation view.

    -
  6. -
  7. -

    In the Install Operator page, select the default values for all the fields and click Install.

    -
  8. -
  9. -

    A window showing the installation progress will pop up.

    -
  10. -
  11. -

    When the installation finishes the operator is ready to be used by Red Hat OpenShift AI.

    -
  12. -
-
-
-

Red Hat OpenShift Service Mesh is now successfully installed.

-
-
-
-

Installation of Red Hat Authorino Operator

-
-

The following section discusses installing the Red Hat - Authorino operator.

-
-
-
-authorino install -
-
Figure 3. Animated - Operator Hub installation of Authorino (tech preview) Operator in OpenShift
-
-
-
    -
  1. -

    Login to Red Hat OpenShift using a user who has the cluster-admin role assigned.

    -
  2. -
  3. -

    Navigate to OperatorsOperatorHub and search for *Red Hat Authorino.

    -
  4. -
  5. -

    Click on the Red Hat Authorino operator. In the pop-up window, select the tech-preview-v1 channel and the most recent version of the serverless operator. Click on Install to open the operator’s installation view.

    -
  6. -
  7. -

    In the Install Operator page, select the default values for all the fields and click Install.

    -
  8. -
  9. -

    A window showing the installation progress will pop-up.

    -
  10. -
  11. -

    When the installation finishes the operator is ready to be used by Red Hat OpenShift AI.

    -
  12. -
-
-
-

Red Hat Authorino is now successfully installed.

-
-
- - - - - -
- - - Installing these Operators prior to the installation of the OpenShift AI Operator increases the speed in OpenShift AI acknowledging the availability of these components and adjusting the initial configuration to shift management of these components to OpenShift AI. -
-
-
-
-
-
-

Installation of Red Hat OpenShift AI Operator

-
-
-
-openshiftai install 214 -
-
Figure 4. Animated - Operator Hub installation of OpenShift AI Operator on OpenShift
-
-
-
    -
  • -

    Navigate to OperatorsOperatorHub and search for OpenShift AI.

    -
    -
      -
    1. -

      Click on the Red Hat OpenShift AI operator. In the pop-up window that opens, ensure you select the latest version in the fast channel. Any version equal to or greater than 2.14 and click on Install to open the operator’s installation view.

      -
    2. -
    3. -

      In the Install Operator page, leave all of the options as default and click on the Install button to start the installation.

      -
    4. -
    5. -

      The operator Installation progress window will pop up. The installation may take a couple of minutes.

      -
    6. -
    -
    -
  • -
-
-
-
-
-

Create OpenShift AI Data Science Cluster

-
-
-

The next step is to create an OpenShift AI Data Science Cluster (DSC).

-
-
-

A DataScienceCluster is the plan in the form of an YAML outline for Data Science Cluster API deployment. Manually editing the YAML configuration can adjust the settings of the OpenShift AI DSC.

-
-
-
-dsc install 214 -
-
Figure 5. Animated - Create Data Science Cluster to enable OpenShift AI on OpenShift
-
-
-

Return to the OpenShift Navigation Menu, Select Installed Operators, and click on the OpenShift AI Operator name to open the operator.

-
-
-
    -
  1. -

    Select the option to create a Data Science Cluster.

    -
  2. -
  3. -

    Click Create to deploy the Data Science Cluster.

    -
  4. -
-
-
-

This takes ~5 minutes to complete, once the DSC becomes Ready, use the navigation menu at the top right to drop down the menu and select Red Hat OpenShift AI. Use the same credentials as used log into OpenShift.

-
-
-
-
-

OpenShift AI install Summary

-
-
-

Congratulations, you have successfully completed the installation of OpenShift AI on an OpenShift Container Cluster. OpenShift AI is now running on a new Dashboard!

-
-
-
    -
  • -

    We installed the required OpenShift AI Operators

    -
    -
      -
    • -

      Red Hat OpenShift Serverless

      -
    • -
    • -

      Red Hat OpenShift ServiceMesh

      -
    • -
    • -

      Red Hat Authorino (technical preview)

      -
    • -
    • -

      OpenShift AI Operator

      -
    • -
    -
    -
  • -
-
-
-
-
-

Create a Data Science Project

-
-
-

Navigate to the menu selector, located at the top right of the OCP dashboard. Select the grid of squares, then select OpenShift AI. At the login screen, use the OCP admin credentials to login to OpenShift AI.

-
-
-
-data science project -
-
Figure 6. Animated - Create data science project from OpenShift AI dashboard
-
-
-

Explore the dashboard navigation menus to familiarize yourself with the options.

-
-
-

Navigate to & select the Data Science Projects section.

-
-
-
    -
  1. -

    Select the Create Data Science Project button.

    -
  2. -
  3. -

    Enter a name for your project, such as ollama-model.

    -
    -
      -
    1. -

      (the animated example shows fraud-detection entered for the data science project, for this course use the ollama-model to follow along with rest of the labs)

      -
    2. -
    -
    -
  4. -
  5. -

    The resource name should be populated automatically.

    -
  6. -
  7. -

    Optionally add a description to the data science project.

    -
  8. -
  9. -

    Select Create.

    -
  10. -
-
-
-

Once complete, you should be on the landing page of the "ollama-model" Data Science Project section of the OpenShift AI Console / Dashboard.

-
-
-
-
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/section2.html b/pr-preview/pr-19/model-serving/1.1/chapter3/section2.html deleted file mode 100644 index 036dc02..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter3/section2.html +++ /dev/null @@ -1,523 +0,0 @@ - - - - - - MinIO S3 Compatible Storage Setup :: Serving an LLM using OpenShift AI - - - - - - - -
- -
- -
- -
- -
-

MinIO S3 Compatible Storage Setup

-
-

Deploy MinIO as S3 compatible storage

-
-
-

MinIO overview

-
-

MinIO is a high-performance, S3-compatible object store. It can be deployed on a wide variety of platforms, and it comes in multiple flavors.

-
-
-

This segment describes a very quick way of deploying the community version of MinIO in order to quickly setup a fully standalone Object Store, in an OpenShift Cluster. This can then be used for various prototyping tasks that require Object Storage.

-
-
- - - - - -
- - -This version of MinIO should not be used in production-grade environments. Additionally, MinIO is not included in RHOAI, and Red Hat does not provide support for MinIO. -
-
-
-
-

MinIO Deployment

-
-

To Deploy MinIO, we will utilize the OpenShift Dashboard.

-
-
-
-minio install -
-
Figure 1. Animated - Minio Deployment steps for OpenShift
-
-
-
    -
  1. -

    Then Select the + (plus) icon from the top right of the dashboard.

    -
  2. -
  3. -

    In the new window, we will paste the following YAML file. In the YAML below its recommended to change the default user name & password.

    -
  4. -
  5. -

    Click on the Project Selection list dropdown and select the ollama-model project or the data science project you created in the previous step.

    -
  6. -
  7. -

    Select the create button to deploy the Minio software.

    -
  8. -
-
-
-
-

Minio Deployment Code

-
-Click to view and copy Minio deployment code. -
-
-
-
kind: PersistentVolumeClaim
-apiVersion: v1
-metadata:
-  name: minio-pvc
-spec:
-  accessModes:
-    - ReadWriteOnce
-  resources:
-    requests:
-      storage: 40Gi
-  volumeMode: Filesystem
----
-kind: Secret
-apiVersion: v1
-metadata:
-  name: minio-secret
-stringData:
-  # change the username and password to your own values.
-  # ensure that the user is at least 3 characters long and the password at least 8
-  minio_root_user: minio
-  minio_root_password: minio321!
----
-kind: Deployment
-apiVersion: apps/v1
-metadata:
-  name: minio
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: minio
-  template:
-    metadata:
-      creationTimestamp: null
-      labels:
-        app: minio
-    spec:
-      volumes:
-        - name: data
-          persistentVolumeClaim:
-            claimName: minio-pvc
-      containers:
-        - resources:
-            limits:
-              cpu: 250m
-              memory: 1Gi
-            requests:
-              cpu: 20m
-              memory: 100Mi
-          readinessProbe:
-            tcpSocket:
-              port: 9000
-            initialDelaySeconds: 5
-            timeoutSeconds: 1
-            periodSeconds: 5
-            successThreshold: 1
-            failureThreshold: 3
-          terminationMessagePath: /dev/termination-log
-          name: minio
-          livenessProbe:
-            tcpSocket:
-              port: 9000
-            initialDelaySeconds: 30
-            timeoutSeconds: 1
-            periodSeconds: 5
-            successThreshold: 1
-            failureThreshold: 3
-          env:
-            - name: MINIO_ROOT_USER
-              valueFrom:
-                secretKeyRef:
-                  name: minio-secret
-                  key: minio_root_user
-            - name: MINIO_ROOT_PASSWORD
-              valueFrom:
-                secretKeyRef:
-                  name: minio-secret
-                  key: minio_root_password
-          ports:
-            - containerPort: 9000
-              protocol: TCP
-            - containerPort: 9090
-              protocol: TCP
-          imagePullPolicy: IfNotPresent
-          volumeMounts:
-            - name: data
-              mountPath: /data
-              subPath: minio
-          terminationMessagePolicy: File
-          image: >-
-            quay.io/minio/minio:RELEASE.2023-06-19T19-52-50Z
-          args:
-            - server
-            - /data
-            - --console-address
-            - :9090
-      restartPolicy: Always
-      terminationGracePeriodSeconds: 30
-      dnsPolicy: ClusterFirst
-      securityContext: {}
-      schedulerName: default-scheduler
-  strategy:
-    type: Recreate
-  revisionHistoryLimit: 10
-  progressDeadlineSeconds: 600
----
-kind: Service
-apiVersion: v1
-metadata:
-  name: minio-service
-spec:
-  ipFamilies:
-    - IPv4
-  ports:
-    - name: api
-      protocol: TCP
-      port: 9000
-      targetPort: 9000
-    - name: ui
-      protocol: TCP
-      port: 9090
-      targetPort: 9090
-  internalTrafficPolicy: Cluster
-  type: ClusterIP
-  ipFamilyPolicy: SingleStack
-  sessionAffinity: None
-  selector:
-    app: minio
----
-kind: Route
-apiVersion: route.openshift.io/v1
-metadata:
-  name: minio-api
-spec:
-  to:
-    kind: Service
-    name: minio-service
-    weight: 100
-  port:
-    targetPort: api
-  wildcardPolicy: None
-  tls:
-    termination: edge
-    insecureEdgeTerminationPolicy: Redirect
----
-kind: Route
-apiVersion: route.openshift.io/v1
-metadata:
-  name: minio-ui
-spec:
-  to:
-    kind: Service
-    name: minio-service
-    weight: 100
-  port:
-    targetPort: ui
-  wildcardPolicy: None
-  tls:
-    termination: edge
-    insecureEdgeTerminationPolicy: Redirect
-
-
-
-
-
-

This should finish in a few seconds. Now it’s time to deploy our storage buckets.

-
-
-
-
-

MinIO Storage Bucket Creation

-
-

From the OCP Dashboard:

-
-
-
-minio setup -
-
Figure 2. Animated - Accessing Minio dashboard and Bucket creation
-
-
-
    -
  1. -

    Select Networking / Routes from the navigation menu.

    -
  2. -
  3. -

    This will display two routes, one for the UI & another for the API. (if the routes are not visible, make sure you have the project selected that matches your data sicence project created earlier)

    -
  4. -
  5. -

    For the first step, select the UI route and paste it or open in a new browser tab or window.

    -
  6. -
  7. -

    If you see a landing page with the message application not available, refresh the page a few times as the service is still loading.

    -
  8. -
  9. -

    The displayed page is the MinIO Dashboard. Log in with the username/password combination you set, or the defaults listed below.

    -
    -
      -
    1. -

      username = minio

      -
    2. -
    3. -

      password = minio321!

      -
    4. -
    -
    -
  10. -
-
-
-

Once logged into the MinIO Console:

-
-
-
    -
  1. -

    Click Create Bucket to get started.

    -
  2. -
  3. -

    Create two Buckets:

    -
    -
      -
    1. -

      models

      -
    2. -
    3. -

      storage (optional)

      -
    4. -
    -
    -
  4. -
-
-
- - - - - -
- - - When serving an LLM or other model, Openshift AI expects to search within a directory. Therefore, we need at least one subdirectory under the models folder. -
-
-
-
    -
  1. -

    Via the Navigation menu, select object browser, then click on the Model Bucket.

    -
  2. -
  3. -

    From the models bucket page, click add path, and type ollama as the name of the sub-folder or path.

    -
  4. -
-
-
- - - - - -
- - -In most cases, to serve a model, the trained model would be uploaded into this sub-directory. However, Ollama is a special case, as it can download and manage Several LLM models as part of the runtime. -
-
-
-
    -
  1. -

    We still need a file available in this folder for the model deployment workflow to succeed.

    -
  2. -
  3. -

    So we will copy an emptyfile.txt file to the ollama subdirectory.

    -
  4. -
-
-
-

You can download the file from this location(use right click, save link as). Alternatively, you can create your own file called emptyfile.txt and upload it.

-
-
-
    -
  1. -

    Once you have this file ready, upload it into the Ollama path in the model bucket by clicking the upload button and selecting the file from your local desktop.

    -
  2. -
-
-
-
-minio file upload -
-
Figure 3. Animated - Upload emptyfile.txt to models/ollama
-
-
-

With our S3 Compatible ready to go and our "model files" uploaded. Let’s head back to the OpenShift AI Web UI and continue configuring resources.

-
-
-
-
- -
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/section2old.html b/pr-preview/pr-19/model-serving/1.1/chapter3/section2old.html deleted file mode 100644 index dacd958..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter3/section2old.html +++ /dev/null @@ -1,306 +0,0 @@ - - - - - - Modifying the OpenShift AI TLS Certificate :: Serving an LLM using OpenShift AI - - - - - -
- -
- -
- -
- -
-

Modifying the OpenShift AI TLS Certificate

-
-
-
- - - - - -
- - -An SSL/TLS certificate is a digital object that allows systems to verify the identity & subsequently establish an encrypted network connection to another system using the Secure Sockets Layer/Transport Layer Security (SSL/TLS) protocol. -
-
-
-

By default, the Single Model Serving Platform in Openshift AI v2.10 uses a self-signed certificate generated during installation for the endpoints that are created when deploying a Model server.

-
-
-

This can be counterintuitive because the OCP Cluster already has certificates configured which will be used by default for endpoints like Routes.

-
-
-

This following procedure explains how to use the same certificate from the OpenShift Container cluster for OpenShift AI.

-
-
-
-
-

Use OpenShift Certificates for Ingress Routes

-
-
- - - - - -
- - -Most customers will not use the self-signed certificates, opting instead to use certificates generated by their own authority. Therefore, this step of adding secrets to OpenShift & OpenShift AI is a common process during installation. -
-
-
-

Navigate to the OpenShift Container Cluster Dashboard

-
- - - - - -
- - -The content of the Secret (data) should contain two items, tls.cert and tls.key. They are the certificate and key that are used for all the OpenShift Routes. The actual name will include the term cert, but could be different from the example. -
-
-
-
-

Collect the Secret YAML Text:

-
-
    -
  1. -

    In the Navigation pane on the left, click on the Workloads section, then Secrets under Workloads.

    -
  2. -
  3. -

    From the Project dropdown, toggle the show default projects radial button to on.

    -
  4. -
  5. -

    Select the openshift-ingress project from the list.

    -
  6. -
-
-
-
-openshiftingress project -
-
-
-
    -
  1. -

    Locate the file named cert-manager-ingress-cert, type should be kubernetes.io/tls

    -
  2. -
  3. -

    Click on the filename to open the secret, select the YAML Tab

    -
  4. -
  5. -

    Copy all the text from the window, and ensure that you scroll down. (CTL-A should work).

    -
  6. -
-
-
-
-ocp ingress cert yaml -
-
-
-
-

Clean & Deploy the Secret YAML Text:

-
-
    -
  • -

    Click on the Project dropdown again, select the Istio-system project

    -
  • -
  • -

    Select the Create button on the right, then Select the from YAML option.

    -
  • -
  • -

    Delete the text from the Window, and paste the copied Secret text

    -
  • -
  • -

    Cleanup the YAML Text to just keep the relevant content. It should look like the YAML file below (the name of the secret will be different, it’s normally tied to the date the RDHP Cluster was deployed).

    -
  • -
-
-
-
-
kind: Secret
-apiVersion: v1
-metadata:
-name: cert-manager-ingress-cert
-data:
-  tls.crt: >-
-    LS0tLS1CRUd...
-  tls.key: >-
-    LS0tLS1CRUd...
-type: kubernetes.io/tls
-
-
-
-
-ocp istio cert -
-
-
-
    -
  • -

    Copy the name of the secret from line 4, just the name (optional, but helpful)

    -
  • -
  • -

    Click create to apply this YAML into the istio-system project (namespace).

    -
  • -
-
-
-

We have copied the Secret used by OCP & made it available to be used by OAI.

-
-
-
-
-
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/section3.html b/pr-preview/pr-19/model-serving/1.1/chapter3/section3.html deleted file mode 100644 index 24a6ce6..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter3/section3.html +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - OpenShift AI Resources - 2 :: Serving an LLM using OpenShift AI - - - - - - - -
- -
- -
- -
- -
-

OpenShift AI Resources - 2

-
-
-
-
- -
-
-
-
-
-

Create Data Connection

-
-
-

Navigate to the Data Science Project section of the OpenShift AI Console /Dashboard. Select the Ollama-model project.

-
-
-
    -
  1. -

    Select the Data Connection menu, followed by create data connection

    -
  2. -
  3. -

    Provide the following values:

    -
    -
      -
    1. -

      Name: models

      -
    2. -
    3. -

      Access Key: use the minio_root_user value from previous section’s YAML file

      -
    4. -
    5. -

      Secret Key: use the minio_root_password value from previous section’s YAML File

      -
    6. -
    7. -

      Endpoint: use the MinIO API URL from the Routes page in Openshift Dashboard

      -
    8. -
    9. -

      Region: This is required for AWS storage & cannot be blank, set value to "no-region-minio"

      -
    10. -
    11. -

      Bucket: use the Minio Storage bucket name: models

      -
    12. -
    -
    -
  4. -
-
-
-
-dataconnection models -
-
-
-

Repeat the same process for the Storage data connection, using storage for the "Name" & "Bucket".

-
-
-
-
-

Creating a WorkBench

-
-
-

Navigate to the Data Science Project section of the OpenShift AI Console /Dashboard. Select the Ollama-model project.

-
-
-
-create workbench -
-
-
-
    -
  1. -

    Select the WorkBench button, then click create workbench

    -
    -
      -
    1. -

      Name: ollama-model

      -
    2. -
    3. -

      Notebook Image: Minimal Python

      -
    4. -
    5. -

      Leave the remaining options default.

      -
    6. -
    7. -

      Optionally, scroll to the bottom, check the Use data connection box.

      -
    8. -
    9. -

      Select storage from the dropdown to attach the storage bucket to the workbench.

      -
    10. -
    -
    -
  2. -
  3. -

    Select the Create Workbench option.

    -
  4. -
-
-
- - - - - -
- - -Depending on the notebook image selected, it can take between 2-20 minutes for the container image to be fully deployed. The Open Link will be available when our container is fully deployed. -
-
-
-
-
-

Creating The Model Server

-
-
-

From the ollama-model WorkBench Dashboard in the ollama-model project, navigate to the Models section, and select Deploy Model from the Single Model Serving Platform Button.

-
-
-
-ollama model deploy -
-
Figure 1. Animated - Single model deployment walkthrough
-
-
-

Create the model server with the following values:

-
-
-
    -
  1. -

    Model name: ollama-mistral (differs from animated deployment, use this name)

    -
  2. -
  3. -

    Serving Runtime: Ollama

    -
  4. -
  5. -

    Model framework: Any

    -
  6. -
  7. -

    Model Server Size: Medium

    -
  8. -
  9. -

    Model Route: Check the box to make models available via an external route.

    -
  10. -
  11. -

    Token Authentication: Uncheck the box that requires token authentication.

    -
  12. -
  13. -

    Model location data connection: models

    -
  14. -
  15. -

    Model location path: /ollama

    -
  16. -
-
-
-

After clicking the Deploy button at the bottom of the form, the model is added to our Models & Model Server list. When the model is available, the inference endpoint will populate & the status will indicate a green checkmark.

-
-
-

We are now ready to interact with our newly deployed LLM Model. Join me in the next section to explore Mistral running on OpenShift AI using Jupyter Notebooks.

-
-
-
- -
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter3/section3old.html b/pr-preview/pr-19/model-serving/1.1/chapter3/section3old.html deleted file mode 100644 index 1e4e6e1..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter3/section3old.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - Configure the OpenShift AI Data Science Cluster :: Serving an LLM using OpenShift AI - - - - - -
- -
- -
- -
- -
-

Configure the OpenShift AI Data Science Cluster

-
-
-
-
- -
-
-
-
-
-

Create OpenShift AI Data Science Cluster

-
-
-

With our secrets in place, the next step is to create an OpenShift AI Data Science Cluster.

-
-
-

A DataScienceCluster is the plan in the form of an YAML outline for Data Science Cluster API deployment.

-
-
-

Return to the OpenShift Navigation Menu, Select Installed Operators, and Click on the OpenShift AI Operator name to open the operator.

-
-
-
    -
  1. -

    Select the Option to create a Data Science Cluster.

    -
  2. -
  3. -

    Select the radial button to switch to the YAML view.

    -
  4. -
  5. -

    Find the section below in the YAML file, in the Kserve Section find the Serving/Certificate area; add the line: secretName: followed by the name of the secret name that we deployed in the istio-system project. In addition, change the type from SelfSigned to Provided. See below for the example.

    -
  6. -
-
-
-
-
kserve:
-  managementState: Managed
-  serving:
-    ingressGateway:
-      certificate:
-        secretName: cert-manager-ingress-cert
-        type: Provided
-    managementState: Managed
-    name: knative-serving
-
-
-
-
-dsc cert example -
-
-
-

Once you have made those changes to the YAML file, Click Create to Deploy the Data Science Cluster.

-
-
-
-dsc deploy complete -
-
-
-

Single Model Serve Platform will now be deployed to expose ingress connections with the same certificate as OpenShift Routes. Endpoints will be accessible using TLS without having to ignore error messages or create special configurations.

-
-
-
-
-

OpenShift AI install summary

-
-
-

Congratulations, you have successfully completed the installation of OpenShift AI on an OpenShift Container Cluster. OpenShift AI is now running on a new Dashboard!

-
-
-
    -
  • -

    We installed the required OpenShift AI Operators

    -
    -
      -
    • -

      Red Hat OpenShift Serverless

      -
    • -
    • -

      Red Hat OpenShift ServiceMesh

      -
    • -
    • -

      Red Hat Authorino (technical preview)

      -
    • -
    • -

      OpenShift AI Operator

      -
    • -
    -
    -
  • -
-
-
-

Additionally, we took this installation a step further by sharing TLS certificates from the OpenShift Cluster with OpenShift AI.

-
-
-

We will pick up working with the OpenShift AI UI in the next Chapter.

-
-
-
-
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/add_a_cell.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/add_a_cell.png deleted file mode 100644 index 7316060..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/add_a_cell.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/clone_a_repo.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/clone_a_repo.png deleted file mode 100644 index 2dcb493..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/clone_a_repo.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/copy_llama3_endpoint.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/copy_llama3_endpoint.png deleted file mode 100644 index 73835aa..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/copy_llama3_endpoint.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/curl_command.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/curl_command.png deleted file mode 100644 index 8aca6c2..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/curl_command.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/deploy_llama3_model.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/deploy_llama3_model.png deleted file mode 100644 index ab49ab5..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/deploy_llama3_model.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/deploy_llama3_model2.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/deploy_llama3_model2.png deleted file mode 100644 index 85db8da..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/deploy_llama3_model2.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/execute_cell.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/execute_cell.png deleted file mode 100644 index 4b8cf7a..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/execute_cell.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/execute_cell2.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/execute_cell2.png deleted file mode 100644 index 055db6f..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/execute_cell2.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/experiment.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/experiment.png deleted file mode 100644 index ecd1633..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/experiment.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/experiment1.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/experiment1.png deleted file mode 100644 index eeae0df..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/experiment1.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/experiment_setup.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/experiment_setup.png deleted file mode 100644 index 2ade95c..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/experiment_setup.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/first_input.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/first_input.png deleted file mode 100644 index 0a22772..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/first_input.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/first_input_response.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/first_input_response.png deleted file mode 100644 index 564a153..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/first_input_response.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/inference_endpoint.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/inference_endpoint.png deleted file mode 100644 index 602ba50..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/inference_endpoint.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/inference_server_url.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/inference_server_url.png deleted file mode 100644 index 1ccf9f4..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/inference_server_url.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llama3_llm.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llama3_llm.png deleted file mode 100644 index d290ade..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llama3_llm.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llama3_url.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llama3_url.png deleted file mode 100644 index d9910cb..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llama3_url.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llama_llm.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llama_llm.png deleted file mode 100644 index 65c5634..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llama_llm.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llm_jupyter_v3.mp4 b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llm_jupyter_v3.mp4 deleted file mode 100644 index e5071c9..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llm_jupyter_v3.mp4 and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llm_model_v3.mp4 b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llm_model_v3.mp4 deleted file mode 100644 index 61a4beb..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/llm_model_v3.mp4 and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/london.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/london.png deleted file mode 100644 index 81d2a10..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/london.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/mistral_config.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/mistral_config.png deleted file mode 100644 index c126263..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/mistral_config.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/model_deletion.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/model_deletion.png deleted file mode 100644 index f988f65..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/model_deletion.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/navigate_ollama_notebook.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/navigate_ollama_notebook.png deleted file mode 100644 index 6c6cca1..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/navigate_ollama_notebook.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/oai_open_jupyter.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/oai_open_jupyter.png deleted file mode 100644 index 20283d6..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/oai_open_jupyter.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/openshiftai_notebook.mp4 b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/openshiftai_notebook.mp4 deleted file mode 100644 index 88738cd..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/openshiftai_notebook.mp4 and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/paris.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/paris.png deleted file mode 100644 index 07d9aed..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/paris.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/replaced_endpoints.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/replaced_endpoints.png deleted file mode 100644 index 2f09d0b..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/replaced_endpoints.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/replaced_endpoints2.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/replaced_endpoints2.png deleted file mode 100644 index ddea4c5..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/replaced_endpoints2.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/second_example_response.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/second_example_response.png deleted file mode 100644 index 1f1c197..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/second_example_response.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/second_input.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/second_input.png deleted file mode 100644 index c2379b0..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/second_input.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/serverurl.png b/pr-preview/pr-19/model-serving/1.1/chapter4/_images/serverurl.png deleted file mode 100644 index f00548f..0000000 Binary files a/pr-preview/pr-19/model-serving/1.1/chapter4/_images/serverurl.png and /dev/null differ diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/index.html b/pr-preview/pr-19/model-serving/1.1/chapter4/index.html deleted file mode 100644 index 01d5525..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter4/index.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - Jupyter Notebooks & LLMs :: Serving an LLM using OpenShift AI - - - - - - - -
- -
- -
- -
- -
-

Jupyter Notebooks & LLMs

-
-

This chapter begins with running and configured OpenShift AI environment. If you don’t already have your environment running, head over to OpenShift AI Initialization.

-
-
-

In section, we will explore using the Jupyter Notebook from our workbench to infer data from the Mistral and Llama3 Large Language Models. While less technical than previous sections of this hands-on course, there are some steps to download the Model when updating our notebook with an inference endpoints that requires code modifications.

-
-
-

Let’s get started!

-
- -
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/section1.html b/pr-preview/pr-19/model-serving/1.1/chapter4/section1.html deleted file mode 100644 index 20e774e..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter4/section1.html +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - Jupyter Notebooks :: Serving an LLM using OpenShift AI - - - - - - - -
- -
- -
- -
- -
-

Jupyter Notebooks

-
-

Open JupyterLab

-
-
-

JupyterLab enables you to work with documents and activities such as Jupyter notebooks, text editors, terminals, and custom components in a flexible, integrated, and extensible manner. For a demonstration of JupyterLab and its features, you can view this video.

-
-
-

Return to the ollama-model workbench dashboard in the OpenShift AI console.

-
-
-
    -
  1. -

    Select the Open link to the right of the status section.

    -
    -
    -oai open jupyter -
    -
    -
  2. -
  3. -

    When the new window opens, use the OpenShift admin user & password to login to JupyterLab.

    -
  4. -
  5. -

    Click the Allow selected permissions button to complete login to the notebook.

    -
  6. -
-
-
- - - - - -
- - -If the Open link for the notebook is grayed out, the notebook container is still starting. This process can take a few minutes & up to 20+ minutes depending on the notebook image we opted to choose. -
-
-
-
-
-

Inside JupyterLab

-
-
-

This takes us to the JupyterLab screen where we can select multiple options / tools / to begin our data science experimentation.

-
-
-

Our first action is to clone a git repository that contains a collection of LLM projects including the notebook we are going to use to interact with the LLM.

-
-
-

Clone the github repository to interact with the Ollama Framework from this location: -https://github.com/rh-aiservices-bu/llm-on-openshift.git

-
-
-
    -
  1. -

    Copy the URL link above

    -
  2. -
  3. -

    Click on the Clone a Repo Icon above explorer section window.

    -
    -
    -clone a repo -
    -
    -
  4. -
  5. -

    Paste the link into the clone a repo pop up, make sure the included submodules are checked, then click the clone.

    -
  6. -
  7. -

    Navigate to the llm-on-openshift/examples/notebooks/langchain folder:

    -
  8. -
  9. -

    Then open the file: Langchain-Ollama-Prompt-memory.ipynb

    -
    -
    -navigate ollama notebook -
    -
    -
  10. -
  11. -

    Explore the notebook, and then continue.

    -
  12. -
-
-
-

Configure the Ollama Framework with a Large Language Model

-
-
    -
  1. -

    From the Notebook page, add a new cell above the inference url

    -
    -
    -add a cell -
    -
    -
  2. -
-
-
-

The Ollama Model Runtime we deployed using the Single Model Serving Platform in OpenShift AI is a Framework that can host various large language models. It is currently running, but is waiting for the command to instruct the framework on which model to download and serve.

-
-
-
    -
  1. -

    To load the mistral model, we are going to use the following python code to instruct the runtime to download and serve a quantized 4 bit version of the mistral large language model.

    -
  2. -
  3. -

    Copy the code below and paste this code in the new cell added to the notebook in the previous step.

    -
  4. -
-
-
-
-
import requests
-
-headers = {
-    # Already added when you pass json=
-    # 'Content-Type': 'application/json',
-}
-
-json_data = {
-    'name': 'mistral',
-}
-
-response = requests.post('https://your-endpoint/api/pull', headers=headers, json=json_data, verify=False)
-
-
-
-
-inference server url -
-
-
-

We’ll need to modify the url in the bottom line beginning with response = in the next step.

-
-
-
-

Update the Inference Endpoints

-
-

Head back to the RHOAI ollama-model workbench dashboard, from the models tab, copy the inference endpoint for the ollama-mistral model.

-
-
-
-inference endpoint -
-
-
-

Return the Jupyter notebook

-
-
-

We will be updating two cells with the inference endpoint.

-
-
-
    -
  1. -

    Replace "https://your-endopint" from python code we copied into the new cell. Ensure you leave the /api/pull portion appended to the url.

    -
  2. -
  3. -

    Replace the red text inside the quotation marks for the inference_server_url with the same inference endpoint url.

    -
  4. -
-
-
-
-replaced endpoints2 -
-
-
-
-

Execute cell code to assemble the langchain components

-
-
    -
  1. -

    We can now start executing the code in the cells, beginning with the new cell added to the top. Click on the cell to activate the blue indicator to the left of the cell. Next click on the play icon to run the selected cells and advance to the next. While the cell is executing, an * (asterisk icon) will appear in the brackets, when complete this will change to a number.

    -
    -
    -execute cell2 -
    -
    -
    -
      -
    1. -

      You will receive a message about an Unverified HTTPs request. This is because we didn’t use authentication for this application. You can ignore this for this lab experience, but in production we would enable authentication using Authorino secured connections.

      -
    2. -
    3. -

      The mistral model files are now being downloaded to the Ollama Framework. This may take a few minutes, the * will change to a number when complete.

      -
    4. -
    -
    -
  2. -
  3. -

    Continue executing through the cells.

    -
  4. -
  5. -

    Next we run the cell: !pip install -q langchain==0.1.14 ; there is a notice to update pip; ignore and continue.

    -
  6. -
  7. -

    The next cell imports the langchain components that provide the libraries and programming files to interact with our LLM.

    -
  8. -
  9. -

    This "Create the LLM instance" cell sets the variables that determine how we are going to interact with our model and how it should respond - sets that into an array using the llm variable.

    -
  10. -
  11. -

    Next run the "Create the prompt" cell. Here we are setting the template variable with the details of how the model operates, including constraints and boundaries when generating the response. We often do not experience the system message when interacting with an LLM, but this is a standard field that is included along with the user prompt.

    -
  12. -
  13. -

    Continue executing the cells, "memory for the conversation" keeps the previous context / conversation history so the full history of the chat conversation is sent as part of the prompt.

    -
  14. -
  15. -

    The create the chain cell, combines each of previous variables: llm, prompt, memory, and adds a verbose boolean to create the conversation variable, which will be sent to Models inference endpoint running in OpenShift AI. The verbose option set to true displays the entire conversation sent to the Model in the notebook before the Models (AI’s) response.

    -
  16. -
-
-
-

In the next section, we’ll send our first input to the running Mistral Large Language Model.

-
-
-
-
- -
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/section2.html b/pr-preview/pr-19/model-serving/1.1/chapter4/section2.html deleted file mode 100644 index ef8f823..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter4/section2.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - Mistral LLM Model Inference :: Serving an LLM using OpenShift AI - - - - - - - -
- -
- -
- -
- -
-

Mistral LLM Model Inference

-
-

Let’s Talk with the LLM

-
-
-

The blue indicator on the left should now be located at the first input cell. If you have not executed or run all the cells above, please do so now.

-
-
-
-first input -
-
-
-

First Input

-
-

The first input cell sent via the notebook to the Mistral model askes it to describe: "Paris in 100 words or less". Go ahead and run this cell.

-
-
-

Immediately, green text is shown in the notebook, this is the entire prompt that is sent along with the single sentence question. There are three parts to the prompt:

-
-
-
    -
  1. -

    The System message which describes to the model how to consider and respond to the question

    -
  2. -
  3. -

    The current conversation section, which describes the prompt or question to consider

    -
  4. -
  5. -

    The response from Mistral Model, which is currently processing and will appear in black text

    -
  6. -
-
-
-

It takes a few seconds for the OpenShift AI model to respond with the first words of the reply. The response answered the question in a well-considered informative paragraph that meets the requirement of less than 100 words in length.

-
-
-
-first input response -
-
-
-
-

Second Input

-
-

The Second input - "Is there a River" - does not specify where the location is. Due to the conversation history being passed with the second input, there is no need to specify any additional information. Shown in the current conversation section below, notice the first input and the response was included with the second input.

-
-
-
-second input -
-
-
-
-
-
-

Second Example

-
-
-

Before we continue with the London example, we execute a cell to change the conversation mode to non-verbose. This eliminates the context of the prompt displayed in the notebook to instead just show the model’s reply.

-
-
-

We also execute a cell to clear memory, or the conversation history regarding Paris.

-
-
-

We did not disable the memory, or the verbosity of the conversation; we simply hid that section from being visible in the notebook.

-
-
-

Go ahead, run the second example cells and evaluate the responses from the model.

-
-
-
-second example response -
-
-
-
-
-

Experiment with Mistral

-
-
-

There are multiple different types of large language models, while we can read about them, using them first hand is the best way to experience how they perform.

-
-
-

So now it’s time to experiment on your own, or optionally continue to follow along with this guide.

-
-
-

Add a few new cells to the bottom of the Notebook.

-
-
-
-experiment setup -
-
-
-
    -
  1. -

    Experiment by copying the clear conversation cell text, paste the contents into one of the new cells

    -
  2. -
  3. -

    Next copy one of the input statements, replace the prompt / question for the model. Then run or execute those cells to learn more about the models capabilities

    -
  4. -
-
-
-

I used the following examples:

-
-
-
    -
  1. -

    Are you an AI model ?

    -
  2. -
  3. -

    Tell me a joke please ?

    -
  4. -
-
-
-

Then I asked one of my standard questions across models to determine it’s knowledge of history:

-
-
-

Was George Washington Married?

-
-
-

Why I ask this question is because several models say GW was married twice. I believed the first one, and this had me thinking several of the next models were wrong. It’s critical that we evaluate models to determine their viability for business use cases. The Mistral model was wrong in this instance.

-
-
-
-experiment1 -
-
-
-

Try clearing the memory again and asking more of your own questions to continue to experiment with the Mistral model.

-
-
-

When you’re ready, move to the next section, where we evaluate a different large language model.

-
-
-
- -
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/chapter4/section3.html b/pr-preview/pr-19/model-serving/1.1/chapter4/section3.html deleted file mode 100644 index c8abdf5..0000000 --- a/pr-preview/pr-19/model-serving/1.1/chapter4/section3.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - Llama3 LLM Model Inference :: Serving an LLM using OpenShift AI - - - - - - -
- -
- -
- -
- -
-

Llama3 LLM Model Inference

-
-
-
- - - - - -
- - -The Ollama Model Runtime we deployed using the Single Model Serving Platform in OpenShift AI is a framework that can host various large language models. You can view the available models in the ollama library here. -
-
-
-
-
-

Lab: Switch to the Llama3 large language model

-
-
-

Meta Llama 3, a family of models developed by Meta Inc. are new state-of-the-art , available in both 8B and 70B parameter sizes (pre-trained or instruction-tuned).

-
-
-

Llama 3 instruction-tuned models are fine-tuned and optimized for dialogue/chat use cases and outperform many of the available open-source chat models on common benchmarks.

-
-
-

In this Lab, we experiment with a quantized version of the base Llama3 model

-
-
-
-
-

Delete existing deployed model

-
-
-

Return to the OpenShift AI Dashboard and ollama-model workbench

-
-
-
    -
  1. -

    Head to the Model section of the workbench

    -
  2. -
  3. -

    To the right of the ollama-mistral model there are three stacked dots, select the dots, then delete from the menu

    -
    -
    -model deletion -
    -
    -
  4. -
  5. -

    You need to type in the ollama-mistral model name to confirm the deletion.

    -
  6. -
  7. -

    No need to wait, continue onto the next section.

    -
  8. -
-
-
-
-
-

Creating The Model Server

-
-
-

From the ollama-model WorkBench Dashboard in the ollama-model project, navigate to the Models section, and select Deploy Model.

-
-
-

Create the model server with the following values:

-
-
-
    -
  1. -

    Model name: ollama-llama3

    -
  2. -
  3. -

    Serving Runtime: Ollama

    -
  4. -
  5. -

    Model framework: Any

    -
  6. -
  7. -

    Model Server Size: Medium

    -
  8. -
  9. -

    Model location data connection: models

    -
  10. -
  11. -

    Model location path: /ollama

    -
    -
    -deploy llama3 model -
    -
    -
    -
    -deploy llama3 model2 -
    -
    -
  12. -
-
-
-

After clicking the Deploy button at the bottom of the form, the model is added to our Models & Model Server list. When the model is available, the inference endpoint will populate & the status will indicate a green checkmark.

-
-
-
-copy llama3 endpoint -
-
-
-

Copy the Inference endpoint for the newly deployed model, we need to replace the original inference endpoints used in our notebook’s top two cells.

-
-
-

Update the inference endpoints & change the model name

-
-
    -
  1. -

    Return to the jupyter notebook

    -
  2. -
  3. -

    Replace the both previous inference endpoints with the ollama-llama3 endpoint url.

    -
    -
    -llama3 url -
    -
    -
  4. -
  5. -

    In the python code cell, or first cell under set the inference server url heading. We need to change the name of the large language model in the json_data section from "mistral" to "llama3"

    -
  6. -
  7. -

    The final edit we need to change is to rename mistal to llama3 in the create the llm instance cell

    -
  8. -
-
-
-
-llama3 llm -
-
-
-
-

Execute the cells again

-
-
    -
  1. -

    We can now start executing the code in the cells, beginning from the top at Set inference server cell. Click to the left of the cell to activate the orange indicator next to the cell. Orange indicates the cell code has been modified, blue will still highlight for unmodified cells.

    -
    -
      -
    1. -

      You will again receive the message about an unverified HTTPs request. This is because we didn’t use authentication for this application.

      -
    2. -
    3. -

      The llama3 model files are now being downloaded to the Ollama Framework.

      -
    4. -
    -
    -
  2. -
  3. -

    Continue executing the cells in the notebook.

    -
  4. -
-
-
-

When you arrive at the "Let’s Talk" cells, re-read the mistral responses before executing the cells as answers will replaced with the llama3 responses.

-
-
-

When you reach the bottom of the notebook, feel free to experiment with the Llama3 model by creating your own more complex prompts.

-
-
-
-
-
-

Experiment with Llama3

-
-
-

Instead of editing the questions try experimenting with system prompt:

-
-
-
    -
  • -

    edit the create the prompt cell system message to alter the personality of the large language model responses. Instruct the model to: use humor, respond like I’m five years old, or perhaps like an historian.

    -
  • -
-
-
-

Try adjusting the top_p, temperature, repeat penalty values in the "create an LLM instance" cell

-
-
-
    -
  1. -

    Edit the create the LLM instance cell to adjust the values set for the model tuning parameters to explore the difference in answers.

    -
  2. -
-
-
-

Deploy a different large language model

-
-
-
    -
  1. -

    Vist the Ollama Model Library and deploy a new model on your own. Perhaps the granite-code model from IBM for code intelligence.

    -
  2. -
-
-
-

Once you complete your learning, don’t forget to return to Red Hat Demo Hub to stop the environment if you plan to return. Delete the environment when you’re finished.

-
-
-

Thanks for completing this course!

-
-
-
- -
-
-
-
-
- Red Hat -
- - - diff --git a/pr-preview/pr-19/model-serving/1.1/index.html b/pr-preview/pr-19/model-serving/1.1/index.html deleted file mode 100644 index ca9d0b8..0000000 --- a/pr-preview/pr-19/model-serving/1.1/index.html +++ /dev/null @@ -1,333 +0,0 @@ - - - - - - Serving an LLM using OpenShift AI :: Serving an LLM using OpenShift AI - - - - - - -
- -
- -
- -
- -
-

Serving an LLM using OpenShift AI

-
-
-
-
- -
-
-
-

Welcome to this quick course on Serving an LLM using OpenShift AI.

-
-
-

This program was designed to guide you through the process of installing an OpenShift AI Platform using the OpenShift Container Platform Web Console UI. We get hands-on experience in each component needed to enable a RHOAI Platform using an Openshift Container Platform Cluster.

-
-
-

Once we have an operational OpenShift AI Platform, we will login and begin the configuration of: model runtimes, data science projects, data connections, & finally use a jupyter notebook to infer the answers to easy questions.

-
-
-

There will be some challenges along the way, all designed to teach us about a component, or give us the knowledge needed to utilize OpenShift AI and host a Large Language Model.

-
-
-

If you’re ready, let’s get started!

-
-
- - - - - -
- - -The hands-on labs in this course were updated to and tested with RHOAI v2.14. Labs should work without any changes in minor dot release upgrades of the product. Please open issues in this repository if you face any problem or feel free to send me a note on slack. -
-
-
-
-
-

Authors

-
-
-

The PTL team acknowledges the valuable contributions of the following Red Hat associates:

-
-
-
    -
  • -

    Christopher Nuland

    -
  • -
  • -

    Vijay Chebolu

    -
  • -
  • -

    Noel O’Conner

    -
  • -
  • -

    Hunter Gerlach

    -
  • -
  • -

    Karlos Knox

    -
  • -
-
-
-
-
-

Classroom Environment

-
-
-

We will use the Red Hat OpenShift Container Platform Cluster (AWS) catalog item in the Red Hat Demo Platform (RHDP) to run the hands-on exercises in this course.

-
-
- - - - - -
- - -If you are planning on starting this course now, go ahead and launch the lab environment. It takes ~45 minutes to provision it, enough time to read through to understand the concepts, then follow along on the second pass. -
-
-
-
-demo platform catalog -
-
Figure 1. Animated - Walkthrough of Demo Hub order selections.
-
-
-

When ordering this catalog item in RHDP:

-
-
-
    -
  1. -

    Select Red Hat OpenShift Container Platform Cluster (AWS) catalog item.

    -
  2. -
  3. -

    Select order from the pop up lab menu page.

    -
  4. -
  5. -

    Select Practice/Enablement for the Activity field.

    -
  6. -
  7. -

    Select Learning about the Product for the Purpose field.

    -
  8. -
  9. -

    Leave the Salesforce ID field blank.

    -
  10. -
  11. -

    Scroll to the bottom, read the usage cost section, then check the box to confirm acceptance of terms and conditions.

    -
  12. -
  13. -

    Click order.

    -
  14. -
-
-
-

For Red Hat partners who do not have access to RHDP, provision an environment using the Red Hat Hybrid Cloud Console. Unfortunately, the labs will NOT work on the trial sandbox environment. You need to provision an OpenShift AI cluster on-premises, or in the supported cloud environments by following the Product Documentation for installing Red Hat OpenShift AI 2.14.

-
-
-
-
-

Prerequisites

-
-
-
    -
  • -

    Basic experience with Red Hat OpenShift Container Platform is recommended but is not mandatory.

    -
  • -
  • -

    We will encounter & modify code segments, deploy resources using YAML files, & modify launch configurations; but we will not have to write code.

    -
  • -
-
-
-
-
-

Objectives

-
-
-

The overall objectives of this course include:

-
-
-
    -
  • -

    Utilize Red Hat OpenShift AI to serve & interact with an LLM.

    -
  • -
  • -

    Install Red Hat OpenShift AI operators & dependencies.

    -
  • -
  • -

    Add a custom model serving runtime.

    -
  • -
  • -

    Create a data science project, workbench & data connections.

    -
  • -
  • -

    Load an LLM model into the Ollama runtime framework.

    -
  • -
  • -

    Import (from git repositories), interact with LLM model via Jupyter Notebooks.

    -
  • -
  • -

    Experiment with the Mistral LLM and Llama3 large language models.

    -
  • -
-
-
-
- -
-
-
-
-
- Red Hat -
- - -