{"id":2275,"date":"2026-02-17T14:56:20","date_gmt":"2026-02-17T12:56:20","guid":{"rendered":"https:\/\/lightrest.codeline.fr\/?page_id=2275"},"modified":"2026-02-25T19:14:13","modified_gmt":"2026-02-25T17:14:13","slug":"la-classe-lrserver","status":"publish","type":"page","link":"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver\/","title":{"rendered":"La classe lrServer"},"content":{"rendered":"<div class=\"page-injector lr-doc\" data-deeplink=\"1\" data-trace=\"0\" data-source=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver\/\" style=\"zoom:1.5;\">\n<!-- Page Injector: scoped CSS -->\n\n<style>\n.lr-doc{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}\n<\/style>\n\n<style>\n@charset \"UTF-8\";.lr-doc{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}.lr-doc *, .lr-doc :after, .lr-doc :before{box-sizing:inherit}@media (prefers-reduced-motion){.lr-doc *, .lr-doc :after, .lr-doc :before{transition:none!important}}.lr-doc{margin:0}.lr-doc a, .lr-doc button, .lr-doc input, .lr-doc label{-webkit-tap-highlight-color:transparent}.lr-doc a{color:inherit;text-decoration:none}.lr-doc hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}.lr-doc small{font-size:80%}.lr-doc sub, .lr-doc sup{line-height:1em}.lr-doc img{border-style:none}.lr-doc table{border-collapse:initial;border-spacing:0}.lr-doc td, .lr-doc th{font-weight:400;vertical-align:top}.lr-doc button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}.lr-doc input{border:0;outline:none}.lr-doc{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}.lr-doc [data-md-color-scheme=default]{color-scheme:light}.lr-doc [data-md-color-scheme=default] img[src$=\"#gh-dark-mode-only\"], .lr-doc [data-md-color-scheme=default] img[src$=\"#only-dark\"]{display:none}.lr-doc, .lr-doc [data-md-color-scheme=default]{--md-hue:225deg;--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-bg-color--light:#f5f5f5b3;--md-code-bg-color--lighter:#f5f5f54d;--md-code-hl-color:#4287ff;--md-code-hl-color--light:#4287ff1a;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-mark-color:#ffff0080;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.lr-doc .md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}.lr-doc{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}.lr-doc aside, .lr-doc, .lr-doc input{font-feature-settings:\"kern\",\"liga\";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}.lr-doc code, .lr-doc kbd, .lr-doc pre{font-feature-settings:\"kern\";font-family:var(--md-code-font-family)}.lr-doc{--md-typeset-table-sort-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"m18 21-4-4h3V7h-3l4-4 4 4h-3v10h3M2 19v-2h10v2M2 13v-2h7v2M2 7V5h4v2z\"\/><\/svg>');--md-typeset-table-sort-icon--asc:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 17h3l-4 4-4-4h3V3h2M2 17h10v2H2M6 5v2H2V5m0 6h7v2H2z\"\/><\/svg>');--md-typeset-table-sort-icon--desc:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 7h3l-4-4-4 4h3v14h2M2 17h10v2H2M6 5v2H2V5m0 6h7v2H2z\"\/><\/svg>')}.lr-doc .md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6;overflow-wrap:break-word}@media print{.lr-doc .md-typeset{font-size:.68rem}}.lr-doc .md-typeset blockquote, .lr-doc .md-typeset dl, .lr-doc .md-typeset figure, .lr-doc .md-typeset ol, .lr-doc .md-typeset pre, .lr-doc .md-typeset ul{margin-bottom:1em;margin-top:1em}.lr-doc .md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.lr-doc .md-typeset h1, .lr-doc .md-typeset h2{font-weight:300;letter-spacing:-.01em}.lr-doc .md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.lr-doc .md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.lr-doc .md-typeset h2+h3{margin-top:.8em}.lr-doc .md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.lr-doc .md-typeset h5, .lr-doc .md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.lr-doc .md-typeset h5{text-transform:uppercase}.lr-doc .md-typeset h5 code{text-transform:none}.lr-doc .md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.lr-doc .md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.lr-doc .md-typeset a, .lr-doc .md-typeset a:before{transition:color 125ms}.lr-doc .md-typeset a:focus, .lr-doc .md-typeset a:hover{color:var(--md-accent-fg-color)}.lr-doc .md-typeset a:focus code, .lr-doc .md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.lr-doc .md-typeset a code{color:var(--md-typeset-a-color)}.lr-doc .md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.lr-doc .md-typeset code, .lr-doc .md-typeset kbd, .lr-doc .md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none;transition:background-color 125ms}@media print{.lr-doc .md-typeset code, .lr-doc .md-typeset kbd, .lr-doc .md-typeset pre{white-space:pre-wrap}}.lr-doc .md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;transition:color 125ms,background-color 125ms;word-break:break-word}.lr-doc .md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.lr-doc .md-typeset pre{display:flow-root;line-height:1.4;position:relative}.lr-doc .md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.lr-doc .md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.lr-doc .md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.lr-doc .md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.lr-doc .md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.lr-doc .md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.lr-doc .md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.lr-doc .md-typeset abbr{cursor:help;text-decoration:none}.lr-doc .md-typeset [data-preview], .lr-doc .md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light)}.lr-doc .md-typeset small{opacity:.75}.lr-doc [dir=ltr] .md-typeset sub, .lr-doc [dir=ltr] .md-typeset sup{margin-left:.078125em}.lr-doc [dir=rtl] .md-typeset sub, .lr-doc [dir=rtl] .md-typeset sup{margin-right:.078125em}.lr-doc [dir=ltr] .md-typeset blockquote{padding-left:.6rem}.lr-doc [dir=rtl] .md-typeset blockquote{padding-right:.6rem}.lr-doc [dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}.lr-doc [dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.lr-doc .md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.lr-doc .md-typeset ul{list-style-type:disc}.lr-doc .md-typeset ul[type]{list-style-type:revert-layer}.lr-doc [dir=ltr] .md-typeset ol, .lr-doc [dir=ltr] .md-typeset ul{margin-left:.625em}.lr-doc [dir=rtl] .md-typeset ol, .lr-doc [dir=rtl] .md-typeset ul{margin-right:.625em}.lr-doc .md-typeset ol, .lr-doc .md-typeset ul{padding:0}.lr-doc .md-typeset ol:not([hidden]), .lr-doc .md-typeset ul:not([hidden]){display:flow-root}.lr-doc .md-typeset ol ol, .lr-doc .md-typeset ul ol{list-style-type:lower-alpha}.lr-doc .md-typeset ol ol ol, .lr-doc .md-typeset ul ol ol{list-style-type:lower-roman}.lr-doc .md-typeset ol ol ol ol, .lr-doc .md-typeset ul ol ol ol{list-style-type:upper-alpha}.lr-doc .md-typeset ol ol ol ol ol, .lr-doc .md-typeset ul ol ol ol ol{list-style-type:upper-roman}.lr-doc .md-typeset ol[type], .lr-doc .md-typeset ul[type]{list-style-type:revert-layer}.lr-doc [dir=ltr] .md-typeset ol li, .lr-doc [dir=ltr] .md-typeset ul li{margin-left:1.25em}.lr-doc [dir=rtl] .md-typeset ol li, .lr-doc [dir=rtl] .md-typeset ul li{margin-right:1.25em}.lr-doc .md-typeset ol li, .lr-doc .md-typeset ul li{margin-bottom:.5em}.lr-doc .md-typeset ol li blockquote, .lr-doc .md-typeset ol li p, .lr-doc .md-typeset ul li blockquote, .lr-doc .md-typeset ul li p{margin:.5em 0}.lr-doc .md-typeset ol li:last-child, .lr-doc .md-typeset ul li:last-child{margin-bottom:0}.lr-doc [dir=ltr] .md-typeset ol li ol, .lr-doc [dir=ltr] .md-typeset ol li ul, .lr-doc [dir=ltr] .md-typeset ul li ol, .lr-doc [dir=ltr] .md-typeset ul li ul{margin-left:.625em}.lr-doc [dir=rtl] .md-typeset ol li ol, .lr-doc [dir=rtl] .md-typeset ol li ul, .lr-doc [dir=rtl] .md-typeset ul li ol, .lr-doc [dir=rtl] .md-typeset ul li ul{margin-right:.625em}.lr-doc .md-typeset ol li ol, .lr-doc .md-typeset ol li ul, .lr-doc .md-typeset ul li ol, .lr-doc .md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}.lr-doc [dir=ltr] .md-typeset dd{margin-left:1.875em}.lr-doc [dir=rtl] .md-typeset dd{margin-right:1.875em}.lr-doc .md-typeset dd{margin-bottom:1.5em;margin-top:1em}.lr-doc .md-typeset img, .lr-doc .md-typeset svg, .lr-doc .md-typeset video{height:auto;max-width:100%}.lr-doc .md-typeset img[align=left]{margin:1em 1em 1em 0}.lr-doc .md-typeset img[align=right]{margin:1em 0 1em 1em}.lr-doc .md-typeset img[align]:only-child{margin-top:0}.lr-doc .md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:fit-content}.lr-doc .md-typeset figure img{display:block;margin:0 auto}.lr-doc .md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.lr-doc .md-typeset iframe{max-width:100%}.lr-doc .md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.lr-doc .md-typeset table:not([class]){display:table}}.lr-doc .md-typeset table:not([class])+*{margin-top:1.5em}.lr-doc .md-typeset table:not([class]) td>:first-child, .lr-doc .md-typeset table:not([class]) th>:first-child{margin-top:0}.lr-doc .md-typeset table:not([class]) td>:last-child, .lr-doc .md-typeset table:not([class]) th>:last-child{margin-bottom:0}.lr-doc .md-typeset table:not([class]) td:not([align]), .lr-doc .md-typeset table:not([class]) th:not([align]){text-align:left}.lr-doc [dir=rtl] .md-typeset table:not([class]) td:not([align]), .lr-doc [dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.lr-doc .md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.lr-doc .md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.lr-doc .md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.lr-doc .md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.lr-doc .md-typeset table:not([class]) a{word-break:normal}.lr-doc .md-typeset table th[role=columnheader]{cursor:pointer}.lr-doc [dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}.lr-doc [dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.lr-doc .md-typeset table th[role=columnheader]:after{content:\"\";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.lr-doc .md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.lr-doc .md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.lr-doc .md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.lr-doc .md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.lr-doc .md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.lr-doc .md-typeset__table{display:block}}.lr-doc .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.984375em){.lr-doc .md-content__inner>pre{margin:1em -.8rem}.lr-doc .md-content__inner>pre code{border-radius:0}}.lr-doc .md-typeset .md-author{border-radius:100%;display:block;flex-shrink:0;height:1.6rem;overflow:hidden;position:relative;transition:color 125ms,transform 125ms;width:1.6rem}.lr-doc .md-typeset .md-author img{display:block}.lr-doc .md-typeset .md-author--more{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.lr-doc .md-typeset .md-author--long{height:2.4rem;width:2.4rem}.lr-doc .md-typeset a.md-author{transform:scale(1)}.lr-doc .md-typeset a.md-author img{border-radius:100%;filter:grayscale(100%) opacity(75%);transition:filter 125ms}.lr-doc .md-typeset a.md-author:focus, .lr-doc .md-typeset a.md-author:hover{transform:scale(1.1);z-index:1}.lr-doc .md-typeset a.md-author:focus img, .lr-doc .md-typeset a.md-author:hover img{filter:grayscale(0)}.lr-doc .md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.lr-doc .md-banner{display:none}}.lr-doc .md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.lr-doc .md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}.lr-doc [dir=ltr] .md-banner__button{float:right}.lr-doc [dir=rtl] .md-banner__button{float:left}.lr-doc .md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.lr-doc .no-js .md-banner__button{display:none}.lr-doc .md-banner__button:hover{opacity:.7}.lr-doc{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){.lr-doc{font-size:137.5%}}@media screen and (min-width:125em){.lr-doc{font-size:150%}}.lr-doc{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{.lr-doc{display:block}}@media screen and (max-width:59.984375em){.lr-doc[data-md-scrolllock]{position:fixed}}.lr-doc .md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.lr-doc .md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.lr-doc .md-container{display:block}}.lr-doc .md-main{flex-grow:1}.lr-doc .md-main__inner{display:flex;height:100%;margin-top:1.5rem}.lr-doc .md-ellipsis{overflow:hidden;text-overflow:ellipsis}.lr-doc .md-toggle{display:none}.lr-doc .md-option{height:0;opacity:0;position:absolute;width:0}.lr-doc .md-option:checked+label:not([hidden]){display:block}.lr-doc .md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.lr-doc .md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.lr-doc .md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}.lr-doc{--md-clipboard-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12z\"\/><\/svg>')}.lr-doc .md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em;z-index:1}@media print{.lr-doc .md-clipboard{display:none}}.lr-doc .md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.lr-doc :hover>.md-clipboard{color:var(--md-default-fg-color--light)}.lr-doc .md-clipboard:focus, .lr-doc .md-clipboard:hover{color:var(--md-accent-fg-color)}.lr-doc .md-clipboard:after{background-color:currentcolor;content:\"\";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.lr-doc .md-clipboard--inline{cursor:pointer}.lr-doc .md-clipboard--inline code{transition:color .25s,background-color .25s}.lr-doc .md-clipboard--inline:focus code, .lr-doc .md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.lr-doc{--md-code-select-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 19h-4v2h4c1.1 0 2-.9 2-2v-4h-2m0-12h-4v2h4v4h2V5c0-1.1-.9-2-2-2M5 5h4V3H5c-1.1 0-2 .9-2 2v4h2m0 6H3v4c0 1.1.9 2 2 2h4v-2H5zm2-4h2v2H7zm4 0h2v2h-2zm4 0h2v2h-2zM7 7h2v2H7zm4 0h2v2h-2zm4 0h2v2h-2zm-8 8h2v2H7zm4 0h2v2h-2zm4 0h2v2h-2z\"\/><\/svg>');--md-code-copy-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12z\"\/><\/svg>')}.lr-doc .md-typeset .md-code__content{display:grid}.lr-doc .md-code__nav{background-color:var(--md-code-bg-color--lighter);border-radius:.1rem;display:flex;gap:.2rem;padding:.2rem;position:absolute;right:.25em;top:.25em;transition:background-color .25s;z-index:1}.lr-doc :hover>.md-code__nav{background-color:var(--md-code-bg-color--light)}.lr-doc .md-code__button{color:var(--md-default-fg-color--lightest);cursor:pointer;display:block;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em}.lr-doc :hover>*>.md-code__button{color:var(--md-default-fg-color--light)}.lr-doc .md-code__button.focus-visible, .lr-doc .md-code__button:hover{color:var(--md-accent-fg-color)}.lr-doc .md-code__button--active{color:var(--md-default-fg-color)!important}.lr-doc .md-code__button:after{background-color:currentcolor;content:\"\";display:block;height:1.125em;margin:0 auto;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.lr-doc .md-code__button[data-md-type=select]:after{-webkit-mask-image:var(--md-code-select-icon);mask-image:var(--md-code-select-icon)}.lr-doc .md-code__button[data-md-type=copy]:after{-webkit-mask-image:var(--md-code-copy-icon);mask-image:var(--md-code-copy-icon)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.lr-doc .md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.lr-doc .md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.lr-doc .md-consent__form{padding:.8rem}.lr-doc .md-consent__settings{display:none;margin:1em 0}.lr-doc input:checked+.md-consent__settings{display:block}.lr-doc .md-consent__controls{margin-bottom:.8rem}.lr-doc .md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.984375em){.lr-doc .md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.lr-doc .md-consent label{cursor:pointer}.lr-doc .md-content{flex-grow:1;min-width:0}.lr-doc .md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){.lr-doc [dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}.lr-doc [dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner, .lr-doc [dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}.lr-doc [dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.lr-doc .md-content__inner:before{content:\"\";display:block;height:.4rem}.lr-doc .md-content__inner>:last-child{margin-bottom:0}.lr-doc [dir=ltr] .md-content__button{float:right}.lr-doc [dir=rtl] .md-content__button{float:left}.lr-doc [dir=ltr] .md-content__button{margin-left:.4rem}.lr-doc [dir=rtl] .md-content__button{margin-right:.4rem}.lr-doc .md-content__button{margin:.4rem 0;padding:0}@media print{.lr-doc .md-content__button{display:none}}.lr-doc .md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.lr-doc .md-content__button svg{display:inline;vertical-align:top}.lr-doc [dir=rtl] .md-content__button svg{transform:scaleX(-1)}.lr-doc [dir=ltr] .md-dialog{right:.8rem}.lr-doc [dir=rtl] .md-dialog{left:.8rem}.lr-doc .md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.lr-doc .md-dialog{display:none}}.lr-doc .md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.lr-doc .md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.lr-doc .md-feedback{margin:2em 0 1em;text-align:center}.lr-doc .md-feedback fieldset{border:none;margin:0;padding:0}.lr-doc .md-feedback__title{font-weight:700;margin:1em auto}.lr-doc .md-feedback__inner{position:relative}.lr-doc .md-feedback__list{display:flex;flex-wrap:wrap;place-content:baseline center;position:relative}.lr-doc .md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}.lr-doc :disabled .md-feedback__list{min-height:1.8rem}.lr-doc .md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.lr-doc .md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.lr-doc .md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.lr-doc .md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.lr-doc .md-feedback__note>*{margin:0 auto;max-width:16rem}.lr-doc :disabled .md-feedback__note{opacity:1;transform:translateY(0)}@media print{.lr-doc .md-feedback{display:none}}.lr-doc .md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.lr-doc .md-footer{display:none}}.lr-doc .md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.lr-doc .md-footer__inner:not([hidden]){display:flex}.lr-doc .md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.lr-doc .md-footer__link:focus, .lr-doc .md-footer__link:hover{opacity:.7}.lr-doc [dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.984375em){.lr-doc .md-footer__link--prev{flex-shrink:0}.lr-doc .md-footer__link--prev .md-footer__title{display:none}}.lr-doc [dir=ltr] .md-footer__link--next{margin-left:auto}.lr-doc [dir=rtl] .md-footer__link--next{margin-right:auto}.lr-doc .md-footer__link--next{text-align:right}.lr-doc [dir=rtl] .md-footer__link--next{text-align:left}.lr-doc .md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.lr-doc .md-footer__button{margin:.2rem;padding:.4rem}.lr-doc .md-footer__direction{font-size:.64rem;opacity:.7}.lr-doc .md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.lr-doc .md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}.lr-doc .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}.lr-doc .md-footer-meta.md-typeset a:focus, .lr-doc .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.lr-doc .md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.lr-doc .md-copyright{width:auto}}.lr-doc .md-copyright__highlight{color:var(--md-footer-fg-color--light)}.lr-doc .md-social{display:inline-flex;gap:.2rem;margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.lr-doc .md-social{padding:.6rem 0}}.lr-doc .md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.lr-doc .md-social__link:before{line-height:1.9}.lr-doc .md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.lr-doc .md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.lr-doc .md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.lr-doc .md-typeset .md-button:focus, .lr-doc .md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.lr-doc [dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}.lr-doc [dir=ltr] .md-typeset .md-input, .lr-doc [dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}.lr-doc [dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.lr-doc .md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.lr-doc .md-typeset .md-input:focus, .lr-doc .md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.lr-doc .md-typeset .md-input--stretch{width:100%}.lr-doc .md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.lr-doc .md-header{display:none}}.lr-doc .md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.lr-doc .md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.lr-doc .md-header__inner{align-items:center;display:flex;padding:0 .2rem}.lr-doc .md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.lr-doc .md-header__button:hover{opacity:.7}.lr-doc .md-header__button:not([hidden]){display:inline-block}.lr-doc .md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.lr-doc .md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.234375em){.lr-doc .md-header__button.md-logo{display:none}}.lr-doc .md-header__button.md-logo img, .lr-doc .md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.lr-doc .md-header__button[for=__search]{display:none}}.lr-doc .no-js .md-header__button[for=__search]{display:none}.lr-doc [dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.lr-doc .md-header__button[for=__drawer]{display:none}}.lr-doc .md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.lr-doc .md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}.lr-doc [dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.lr-doc .md-header__topic:first-child{font-weight:700}.lr-doc [dir=ltr] .md-header__title{margin-left:1rem;margin-right:.4rem}.lr-doc [dir=rtl] .md-header__title{margin-left:.4rem;margin-right:1rem}.lr-doc .md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.lr-doc .md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}.lr-doc [dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.lr-doc .md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.lr-doc .md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.lr-doc .md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}.lr-doc [data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.lr-doc .md-header__option>input{bottom:0}.lr-doc .md-header__source{display:none}@media screen and (min-width:60em){.lr-doc [dir=ltr] .md-header__source{margin-left:1rem}.lr-doc [dir=rtl] .md-header__source{margin-right:1rem}.lr-doc .md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){.lr-doc [dir=ltr] .md-header__source{margin-left:1.4rem}.lr-doc [dir=rtl] .md-header__source{margin-right:1.4rem}}.lr-doc .md-meta{color:var(--md-default-fg-color--light);font-size:.7rem;line-height:1.3}.lr-doc .md-meta__list{display:inline-flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.lr-doc .md-meta__item:not(:last-child):after{content:\"\u00b7\";margin-left:.2rem;margin-right:.2rem}.lr-doc .md-meta__link{color:var(--md-typeset-a-color)}.lr-doc .md-meta__link:focus, .lr-doc .md-meta__link:hover{color:var(--md-accent-fg-color)}.lr-doc .md-draft{background-color:#ff1744;border-radius:.125em;color:#fff;display:inline-block;font-weight:700;padding-left:.5714285714em;padding-right:.5714285714em}.lr-doc{--md-nav-icon--prev:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z\"\/><\/svg>');--md-nav-icon--next:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6z\"\/><\/svg>');--md-toc-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 9h14V7H3zm0 4h14v-2H3zm0 4h14v-2H3zm16 0h2v-2h-2zm0-10v2h2V7zm0 6h2v-2h-2z\"\/><\/svg>')}.lr-doc .md-nav{font-size:.7rem;line-height:1.3}.lr-doc .md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.lr-doc .md-nav__title .md-nav__button{display:none}.lr-doc .md-nav__title .md-nav__button img{height:100%;width:auto}.lr-doc .md-nav__title .md-nav__button.md-logo img, .lr-doc .md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.lr-doc .md-nav__list{list-style:none;margin:0;padding:0}.lr-doc .md-nav__link{align-items:flex-start;display:flex;gap:.4rem;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.lr-doc .md-nav__link--passed, .lr-doc .md-nav__link--passed code{color:var(--md-default-fg-color--light)}.lr-doc .md-nav__item .md-nav__link--active, .lr-doc .md-nav__item .md-nav__link--active code{color:var(--md-typeset-a-color)}.lr-doc .md-nav__link .md-ellipsis{position:relative}.lr-doc .md-nav__link .md-ellipsis code{word-break:normal}.lr-doc [dir=ltr] .md-nav__link .md-icon:last-child{margin-left:auto}.lr-doc [dir=rtl] .md-nav__link .md-icon:last-child{margin-right:auto}.lr-doc .md-nav__link .md-typeset{font-size:.7rem;line-height:1.3}.lr-doc .md-nav__link svg{fill:currentcolor;flex-shrink:0;height:1.3em;position:relative}.lr-doc .md-nav__link[for]:focus, .lr-doc .md-nav__link[for]:hover, .lr-doc .md-nav__link[href]:focus, .lr-doc .md-nav__link[href]:hover{color:var(--md-accent-fg-color);cursor:pointer}.lr-doc .md-nav__link[for]:focus code, .lr-doc .md-nav__link[for]:hover code, .lr-doc .md-nav__link[href]:focus code, .lr-doc .md-nav__link[href]:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.lr-doc .md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.lr-doc .md-nav--primary .md-nav__link[for=__toc]{display:none}.lr-doc .md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.lr-doc .md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.lr-doc .md-nav__container>.md-nav__link{margin-top:0}.lr-doc .md-nav__container>.md-nav__link:first-child{flex-grow:1;min-width:0}.lr-doc .md-nav__icon{flex-shrink:0}.lr-doc .md-nav__source{display:none}@media screen and (max-width:76.234375em){.lr-doc .md-nav--primary, .lr-doc .md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.lr-doc .md-nav--primary .md-nav__item, .lr-doc .md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.lr-doc .md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}.lr-doc [dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}.lr-doc [dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.lr-doc .md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.lr-doc .md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:\"\";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.lr-doc .md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.lr-doc .md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.lr-doc .md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.lr-doc .md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.lr-doc .md-nav--primary .md-nav__list{flex:1}.lr-doc .md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest)}.lr-doc .md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.lr-doc .md-nav--primary .md-nav__item--active>.md-nav__link:focus, .lr-doc .md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.lr-doc .md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}.lr-doc .md-nav--primary .md-nav__link svg{margin-top:.1em}.lr-doc .md-nav--primary .md-nav__link>.md-nav__link{padding:0}.lr-doc [dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}.lr-doc [dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.lr-doc .md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.lr-doc .md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:\"\";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.lr-doc [dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.lr-doc .md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}.lr-doc [dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}.lr-doc [dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}.lr-doc [dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}.lr-doc [dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}.lr-doc [dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}.lr-doc [dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}.lr-doc [dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}.lr-doc [dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.lr-doc .md-nav--secondary{background-color:initial}.lr-doc .md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}.lr-doc [dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.lr-doc .md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.lr-doc .md-nav__toggle:checked~.md-nav>.md-nav__list{backface-visibility:hidden}}@media screen and (max-width:59.984375em){.lr-doc .md-nav--primary .md-nav__link[for=__toc]{display:flex}.lr-doc .md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:\"\"}.lr-doc .md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.lr-doc .md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.lr-doc .md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.lr-doc .md-nav--integrated .md-nav__link[for=__toc]{display:flex}.lr-doc .md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:\"\"}.lr-doc .md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.lr-doc .md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.lr-doc .md-nav{margin-bottom:-.4rem}.lr-doc .md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.lr-doc .md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.lr-doc .md-nav--secondary .md-nav__title .md-nav__icon{display:none}.lr-doc [dir=ltr] .md-nav--secondary .md-nav__list{padding-left:.6rem}.lr-doc [dir=rtl] .md-nav--secondary .md-nav__list{padding-right:.6rem}.lr-doc .md-nav--secondary .md-nav__list{padding-bottom:.4rem}.lr-doc [dir=ltr] .md-nav--secondary .md-nav__item>.md-nav__link{margin-right:.4rem}.lr-doc [dir=rtl] .md-nav--secondary .md-nav__item>.md-nav__link{margin-left:.4rem}}@media screen and (min-width:76.25em){.lr-doc .md-nav{margin-bottom:-.4rem;transition:max-height .25s cubic-bezier(.86,0,.07,1)}.lr-doc .md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.lr-doc .md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.lr-doc .md-nav--primary .md-nav__title .md-nav__icon{display:none}.lr-doc [dir=ltr] .md-nav--primary .md-nav__list{padding-left:.6rem}.lr-doc [dir=rtl] .md-nav--primary .md-nav__list{padding-right:.6rem}.lr-doc .md-nav--primary .md-nav__list{padding-bottom:.4rem}.lr-doc [dir=ltr] .md-nav--primary .md-nav__item>.md-nav__link{margin-right:.4rem}.lr-doc [dir=rtl] .md-nav--primary .md-nav__item>.md-nav__link{margin-left:.4rem}.lr-doc .md-nav__toggle~.md-nav{display:grid;grid-template-rows:minmax(.4rem,0fr);opacity:0;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .25s,visibility 0ms .25s;visibility:collapse}.lr-doc .md-nav__toggle~.md-nav>.md-nav__list{overflow:hidden}.lr-doc .md-nav__toggle.md-toggle--indeterminate~.md-nav, .lr-doc .md-nav__toggle:checked~.md-nav{grid-template-rows:minmax(.4rem,1fr);opacity:1;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .15s .1s,visibility 0ms;visibility:visible}.lr-doc .md-nav__toggle.md-toggle--indeterminate~.md-nav{transition:none}.lr-doc .md-nav__item--nested>.md-nav>.md-nav__title{display:none}.lr-doc .md-nav__item--section{display:block;margin:1.25em 0}.lr-doc .md-nav__item--section:last-child{margin-bottom:0}.lr-doc .md-nav__item--section>.md-nav__link{font-weight:700}.lr-doc .md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.lr-doc .md-nav__item--section>.md-nav__link:not(.md-nav__container){pointer-events:none}.lr-doc .md-nav__item--section>.md-nav__link .md-icon, .lr-doc .md-nav__item--section>.md-nav__link>[for]{display:none}.lr-doc [dir=ltr] .md-nav__item--section>.md-nav{margin-left:-.6rem}.lr-doc [dir=rtl] .md-nav__item--section>.md-nav{margin-right:-.6rem}.lr-doc .md-nav__item--section>.md-nav{display:block;opacity:1;visibility:visible}.lr-doc .md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.lr-doc .md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.lr-doc .md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.lr-doc .md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:\"\";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}.lr-doc [dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.lr-doc .md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after, .lr-doc .md-nav__item--nested .md-toggle--indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.lr-doc .md-nav--lifted>.md-nav__list>.md-nav__item, .lr-doc .md-nav--lifted>.md-nav__title{display:none}.lr-doc .md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block}.lr-doc .md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);margin-top:0;position:sticky;top:0;z-index:1}.lr-doc .md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__container){pointer-events:none}.lr-doc .md-nav--lifted>.md-nav__list>.md-nav__item--active.md-nav__item--section{margin:0}.lr-doc [dir=ltr] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-left:-.6rem}.lr-doc [dir=rtl] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-right:-.6rem}.lr-doc .md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.lr-doc .md-nav--lifted .md-nav[data-md-level=\"1\"]{grid-template-rows:minmax(.4rem,1fr);opacity:1;visibility:visible}.lr-doc [dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}.lr-doc [dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.lr-doc .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em;opacity:1;visibility:visible}.lr-doc .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__list{overflow:visible;padding-bottom:0}.lr-doc .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}.lr-doc .md-pagination{font-size:.8rem;font-weight:700;gap:.4rem}.lr-doc .md-pagination, .lr-doc .md-pagination>*{align-items:center;display:flex;justify-content:center}.lr-doc .md-pagination>*{border-radius:.2rem;height:1.8rem;min-width:1.8rem;text-align:center}.lr-doc .md-pagination__current{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light)}.lr-doc .md-pagination__link{transition:color 125ms,background-color 125ms}.lr-doc .md-pagination__link:focus, .lr-doc .md-pagination__link:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.lr-doc .md-pagination__link:focus svg, .lr-doc .md-pagination__link:hover svg{color:var(--md-accent-fg-color)}.lr-doc .md-pagination__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.lr-doc .md-pagination__link svg{fill:currentcolor;color:var(--md-default-fg-color--lighter);display:block;max-height:100%;width:1.2rem}.lr-doc{--md-path-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6z\"\/><\/svg>')}.lr-doc .md-path{font-size:.7rem;margin:0 .8rem;overflow:auto;padding-top:1.2rem}.lr-doc .md-path:not([hidden]){display:block}@media screen and (min-width:76.25em){.lr-doc .md-path{margin:0 1.2rem}}.lr-doc .md-path__list{align-items:center;display:flex;gap:.2rem;list-style:none;margin:0;padding:0}.lr-doc .md-path__item:not(:first-child){display:inline-flex;gap:.2rem;white-space:nowrap}.lr-doc .md-path__item:not(:first-child):before{background-color:var(--md-default-fg-color--lighter);content:\"\";display:inline;height:.8rem;-webkit-mask-image:var(--md-path-icon);mask-image:var(--md-path-icon);width:.8rem}.lr-doc .md-path__link{align-items:center;color:var(--md-default-fg-color--light);display:flex}.lr-doc .md-path__link:focus, .lr-doc .md-path__link:hover{color:var(--md-accent-fg-color)}.lr-doc{--md-post-pin-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M16 12V4h1V2H7v2h1v8l-2 2v2h5.2v6h1.6v-6H18v-2z\"\/><\/svg>')}.lr-doc .md-post__back{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin-bottom:1.2rem;padding-bottom:1.2rem}@media screen and (max-width:76.234375em){.lr-doc .md-post__back{display:none}}.lr-doc [dir=rtl] .md-post__back svg{transform:scaleX(-1)}.lr-doc .md-post__authors{display:flex;flex-direction:column;gap:.6rem;margin:0 .6rem 1.2rem}.lr-doc .md-post .md-post__meta a{transition:color 125ms}.lr-doc .md-post .md-post__meta a:focus, .lr-doc .md-post .md-post__meta a:hover{color:var(--md-accent-fg-color)}.lr-doc .md-post__title{color:var(--md-default-fg-color--light);font-weight:700}.lr-doc .md-post--excerpt{margin-bottom:3.2rem}.lr-doc .md-post--excerpt .md-post__header{align-items:center;display:flex;gap:.6rem;min-height:1.6rem}.lr-doc .md-post--excerpt .md-post__authors{align-items:center;display:inline-flex;flex-direction:row;gap:.2rem;margin:0;min-height:2.4rem}.lr-doc [dir=ltr] .md-post--excerpt .md-post__meta .md-meta__list{margin-right:.4rem}.lr-doc [dir=rtl] .md-post--excerpt .md-post__meta .md-meta__list{margin-left:.4rem}.lr-doc .md-post--excerpt .md-post__content>:first-child{--md-scroll-margin:6rem;margin-top:0}.lr-doc .md-post>.md-nav--secondary{margin:1em 0}.lr-doc .md-pin{background:var(--md-default-fg-color--lightest);border-radius:1rem;margin-top:-.05rem;padding:.2rem}.lr-doc .md-pin:after{background-color:currentcolor;content:\"\";display:block;height:.6rem;margin:0 auto;-webkit-mask-image:var(--md-post-pin-icon);mask-image:var(--md-post-pin-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.6rem}.lr-doc .md-profile{align-items:center;display:flex;font-size:.7rem;gap:.6rem;line-height:1.4;width:100%}.lr-doc .md-profile__description{flex-grow:1}.lr-doc .md-content--post{display:flex}@media screen and (max-width:76.234375em){.lr-doc .md-content--post{flex-flow:column-reverse}}.lr-doc .md-content--post>.md-content__inner{flex-grow:1;min-width:0}@media screen and (min-width:76.25em){.lr-doc [dir=ltr] .md-content--post>.md-content__inner{margin-left:1.2rem}.lr-doc [dir=rtl] .md-content--post>.md-content__inner{margin-right:1.2rem}}@media screen and (max-width:76.234375em){.lr-doc .md-sidebar.md-sidebar--post{padding:0;position:static;width:100%}.lr-doc .md-sidebar.md-sidebar--post .md-sidebar__scrollwrap{overflow:visible}.lr-doc .md-sidebar.md-sidebar--post .md-sidebar__inner{padding:0}.lr-doc .md-sidebar.md-sidebar--post .md-post__meta{margin-left:.6rem;margin-right:.6rem}.lr-doc .md-sidebar.md-sidebar--post .md-nav__item{border:none;display:inline}.lr-doc .md-sidebar.md-sidebar--post .md-nav__list{display:inline-flex;flex-wrap:wrap;gap:.6rem;padding-bottom:.6rem;padding-top:.6rem}.lr-doc .md-sidebar.md-sidebar--post .md-nav__link{padding:0}.lr-doc .md-sidebar.md-sidebar--post .md-nav{height:auto;margin-bottom:0;position:static}}.lr-doc{--md-progress-value:0;--md-progress-delay:400ms}.lr-doc .md-progress{background:var(--md-primary-bg-color);height:.075rem;opacity:min(clamp(0,var(--md-progress-value),1),clamp(0,100 - var(--md-progress-value),1));position:fixed;top:0;transform:scaleX(calc(var(--md-progress-value)*1%));transform-origin:left;transition:transform .5s cubic-bezier(.19,1,.22,1),opacity .25s var(--md-progress-delay);width:100%;z-index:4}.lr-doc{--md-search-result-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h7c-.41-.25-.8-.56-1.14-.9-.33-.33-.61-.7-.86-1.1H6V4h7v5h5v1.18c.71.16 1.39.43 2 .82V8zm6.31 16.9c1.33-2.11.69-4.9-1.4-6.22-2.11-1.33-4.91-.68-6.22 1.4-1.34 2.11-.69 4.89 1.4 6.22 1.46.93 3.32.93 4.79.02L22 23.39 23.39 22zm-3.81.1a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5\"\/><\/svg>')}.lr-doc .md-search{position:relative}@media screen and (min-width:60em){.lr-doc .md-search{padding:.2rem 0}}.lr-doc .no-js .md-search{display:none}.lr-doc .md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.984375em){.lr-doc [dir=ltr] .md-search__overlay{left:-2.2rem}.lr-doc [dir=rtl] .md-search__overlay{right:-2.2rem}.lr-doc .md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){.lr-doc [dir=ltr] .md-search__overlay{left:0}.lr-doc [dir=rtl] .md-search__overlay{right:0}.lr-doc .md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.984375em){.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.984375em){.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.984375em){.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.lr-doc .md-search__inner{backface-visibility:hidden}@media screen and (max-width:59.984375em){.lr-doc [dir=ltr] .md-search__inner{left:0}.lr-doc [dir=rtl] .md-search__inner{right:0}.lr-doc .md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}.lr-doc [dir=rtl] .md-search__inner{transform:translateX(-5%)}.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){.lr-doc [dir=ltr] .md-search__inner{float:right}.lr-doc [dir=rtl] .md-search__inner{float:left}.lr-doc .md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.lr-doc .md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.lr-doc .md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.lr-doc .md-search__form:hover{background-color:#ffffff1f}}.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}.lr-doc [dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}.lr-doc [dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.lr-doc .md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.lr-doc .md-search__input::placeholder{transition:color .25s}.lr-doc .md-search__input::placeholder, .lr-doc .md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.lr-doc .md-search__input::-ms-clear{display:none}@media screen and (max-width:59.984375em){.lr-doc .md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){.lr-doc [dir=ltr] .md-search__input{padding-left:2.2rem}.lr-doc [dir=rtl] .md-search__input{padding-right:2.2rem}.lr-doc .md-search__input{color:inherit;font-size:.8rem}.lr-doc .md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.lr-doc .md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.lr-doc .md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.lr-doc .md-search__icon:hover{opacity:.7}.lr-doc [dir=ltr] .md-search__icon[for=__search]{left:.5rem}.lr-doc [dir=rtl] .md-search__icon[for=__search]{right:.5rem}.lr-doc .md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}.lr-doc [dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.984375em){.lr-doc [dir=ltr] .md-search__icon[for=__search]{left:.8rem}.lr-doc [dir=rtl] .md-search__icon[for=__search]{right:.8rem}.lr-doc .md-search__icon[for=__search]{top:.6rem}.lr-doc .md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.lr-doc .md-search__icon[for=__search]{pointer-events:none}.lr-doc .md-search__icon[for=__search] svg:last-child{display:none}}.lr-doc [dir=ltr] .md-search__options{right:.5rem}.lr-doc [dir=rtl] .md-search__options{left:.5rem}.lr-doc .md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.984375em){.lr-doc [dir=ltr] .md-search__options{right:.8rem}.lr-doc [dir=rtl] .md-search__options{left:.8rem}.lr-doc .md-search__options{top:.6rem}}.lr-doc [dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}.lr-doc [dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.lr-doc .md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.lr-doc .md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}.lr-doc [dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}.lr-doc [dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.lr-doc .md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){.lr-doc [dir=ltr] .md-search__suggest{padding-left:2.2rem}.lr-doc [dir=rtl] .md-search__suggest{padding-right:2.2rem}.lr-doc .md-search__suggest{font-size:.8rem}}.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}.lr-doc [dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}.lr-doc [dir=ltr] .md-search__output, .lr-doc [dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}.lr-doc [dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.lr-doc .md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.984375em){.lr-doc .md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.lr-doc .md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.lr-doc .md-search__scrollwrap{backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.lr-doc .md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.234375em){.lr-doc .md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.lr-doc .md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.lr-doc .md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}.lr-doc [data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.lr-doc .md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.lr-doc .md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.lr-doc .md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.lr-doc .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.lr-doc .md-search-result{color:var(--md-default-fg-color);word-break:break-word}.lr-doc .md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){.lr-doc [dir=ltr] .md-search-result__meta{padding-left:2.2rem}.lr-doc [dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.lr-doc .md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.lr-doc .md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.lr-doc .md-search-result__item:first-child{box-shadow:none}.lr-doc .md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.lr-doc .md-search-result__link:focus, .lr-doc .md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.lr-doc .md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.lr-doc .md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.lr-doc .md-search-result__more>summary::marker{display:none}.lr-doc .md-search-result__more>summary::-webkit-details-marker{display:none}.lr-doc .md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){.lr-doc [dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}.lr-doc [dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.lr-doc .md-search-result__more>summary:focus>div, .lr-doc .md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.lr-doc .md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.lr-doc .md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){.lr-doc [dir=ltr] .md-search-result__article{padding-left:2.2rem}.lr-doc [dir=rtl] .md-search-result__article{padding-right:2.2rem}}.lr-doc [dir=ltr] .md-search-result__icon{left:0}.lr-doc [dir=rtl] .md-search-result__icon{right:0}.lr-doc .md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.984375em){.lr-doc .md-search-result__icon{display:none}}.lr-doc .md-search-result__icon:after{background-color:currentcolor;content:\"\";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.lr-doc [dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.lr-doc .md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.lr-doc .md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.lr-doc .md-search-result .md-typeset h1 mark{text-decoration:none}.lr-doc .md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.lr-doc .md-search-result .md-typeset h2 mark{text-decoration:none}.lr-doc .md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.lr-doc .md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.lr-doc .md-select{position:relative;z-index:1}.lr-doc .md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.lr-doc .md-select:focus-within .md-select__inner, .lr-doc .md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.lr-doc .md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:\"\";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.lr-doc .md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.lr-doc .md-select__item{line-height:1.8rem}.lr-doc [dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}.lr-doc [dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.lr-doc .md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.lr-doc .md-select__link:focus, .lr-doc .md-select__link:hover{color:var(--md-accent-fg-color)}.lr-doc .md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.lr-doc .md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.lr-doc .md-sidebar{display:none}}@media screen and (max-width:76.234375em){.lr-doc [dir=ltr] .md-sidebar--primary{left:-12.1rem}.lr-doc [dir=rtl] .md-sidebar--primary{right:-12.1rem}.lr-doc .md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}.lr-doc [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}.lr-doc [dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.lr-doc .md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.lr-doc .md-sidebar{height:0}.lr-doc .no-js .md-sidebar{height:auto}.lr-doc .md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.lr-doc .md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.lr-doc .md-sidebar--secondary{height:0}.lr-doc .no-js .md-sidebar--secondary{height:auto}.lr-doc .md-sidebar--secondary:not([hidden]){display:block}.lr-doc .md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.lr-doc .md-sidebar__scrollwrap{backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000}@media screen and (min-width:60em){.lr-doc .md-sidebar__scrollwrap{scrollbar-gutter:stable;scrollbar-width:thin}}.lr-doc .md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.lr-doc .md-sidebar__scrollwrap:focus-within, .lr-doc .md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.lr-doc .md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb, .lr-doc .md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.lr-doc .md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover, .lr-doc .md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.lr-doc .md-sidebar__scrollwrap{scrollbar-gutter:auto}.lr-doc [dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}.lr-doc [dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.234375em){.lr-doc .md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}.lr-doc [data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}.lr-doc{--md-source-forks-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 16 16\"><path d=\"M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0M5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0m6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5m-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0\"\/><\/svg>');--md-source-repositories-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 16 16\"><path d=\"M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.5 2.5 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.5 2.5 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.25.25 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z\"\/><\/svg>');--md-source-stars-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 16 16\"><path d=\"M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25m0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41z\"\/><\/svg>');--md-source-version-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 16 16\"><path d=\"M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.75 1.75 0 0 1 1 7.775m1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2\"\/><\/svg>')}.lr-doc .md-source{backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.lr-doc .md-source:hover{opacity:.7}.lr-doc .md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}.lr-doc [dir=ltr] .md-source__icon svg{margin-left:.6rem}.lr-doc [dir=rtl] .md-source__icon svg{margin-right:.6rem}.lr-doc .md-source__icon svg{margin-top:.6rem}.lr-doc [dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}.lr-doc [dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}.lr-doc [dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}.lr-doc [dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}.lr-doc [dir=ltr] .md-source__repository{margin-left:.6rem}.lr-doc [dir=rtl] .md-source__repository{margin-right:.6rem}.lr-doc .md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.lr-doc .md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.lr-doc .md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.lr-doc .md-source__fact{overflow:hidden;text-overflow:ellipsis}.lr-doc .md-source__repository--active .md-source__fact{animation:fact .4s ease-out}.lr-doc [dir=ltr] .md-source__fact:before{margin-right:.1rem}.lr-doc [dir=rtl] .md-source__fact:before{margin-left:.1rem}.lr-doc .md-source__fact:before{background-color:currentcolor;content:\"\";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.lr-doc .md-source__fact:nth-child(1n+2){flex-shrink:0}.lr-doc .md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.lr-doc .md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.lr-doc .md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.lr-doc .md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.lr-doc .md-source-file{margin:1em 0}.lr-doc [dir=ltr] .md-source-file__fact{margin-right:.6rem}.lr-doc [dir=rtl] .md-source-file__fact{margin-left:.6rem}.lr-doc .md-source-file__fact{align-items:center;color:var(--md-default-fg-color--light);display:inline-flex;font-size:.68rem;gap:.3rem}.lr-doc .md-source-file__fact .md-icon{flex-shrink:0;margin-bottom:.05rem}.lr-doc [dir=ltr] .md-source-file__fact .md-author{float:left}.lr-doc [dir=rtl] .md-source-file__fact .md-author{float:right}.lr-doc .md-source-file__fact .md-author{margin-right:.2rem}.lr-doc .md-source-file__fact svg{width:.9rem}.lr-doc{--md-status:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M11 9h2V7h-2m1 13c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-18A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m-1 15h2v-6h-2z\"\/><\/svg>');--md-status--new:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"m23 12-2.44-2.78.34-3.68-3.61-.82-1.89-3.18L12 3 8.6 1.54 6.71 4.72l-3.61.81.34 3.68L1 12l2.44 2.78-.34 3.69 3.61.82 1.89 3.18L12 21l3.4 1.46 1.89-3.18 3.61-.82-.34-3.68zm-10 5h-2v-2h2zm0-4h-2V7h2z\"\/><\/svg>');--md-status--deprecated:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M9 3v1H4v2h1v13a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V6h1V4h-5V3zm0 5h2v9H9zm4 0h2v9h-2z\"\/><\/svg>');--md-status--encrypted:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 1 3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5zm0 6c1.4 0 2.8 1.1 2.8 2.5V11c.6 0 1.2.6 1.2 1.3v3.5c0 .6-.6 1.2-1.3 1.2H9.2c-.6 0-1.2-.6-1.2-1.3v-3.5c0-.6.6-1.2 1.2-1.2V9.5C9.2 8.1 10.6 7 12 7m0 1.2c-.8 0-1.5.5-1.5 1.3V11h3V9.5c0-.8-.7-1.3-1.5-1.3\"\/><\/svg>')}.lr-doc .md-status:after{background-color:var(--md-default-fg-color--light);content:\"\";display:inline-block;height:1.125em;-webkit-mask-image:var(--md-status);mask-image:var(--md-status);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-bottom;width:1.125em}.lr-doc .md-status:hover:after{background-color:currentcolor}.lr-doc .md-status--new:after{-webkit-mask-image:var(--md-status--new);mask-image:var(--md-status--new)}.lr-doc .md-status--deprecated:after{-webkit-mask-image:var(--md-status--deprecated);mask-image:var(--md-status--deprecated)}.lr-doc .md-status--encrypted:after{-webkit-mask-image:var(--md-status--encrypted);mask-image:var(--md-status--encrypted)}.lr-doc .md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.lr-doc .md-tabs{display:none}}@media screen and (max-width:76.234375em){.lr-doc .md-tabs{display:none}}.lr-doc .md-tabs[hidden]{pointer-events:none}.lr-doc [dir=ltr] .md-tabs__list{margin-left:.2rem}.lr-doc [dir=rtl] .md-tabs__list{margin-right:.2rem}.lr-doc .md-tabs__list{contain:content;display:flex;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.lr-doc .md-tabs__list::-webkit-scrollbar{display:none}.lr-doc .md-tabs__item{height:2.4rem;padding-left:.6rem;padding-right:.6rem}.lr-doc .md-tabs__item--active .md-tabs__link{color:inherit;opacity:1}.lr-doc .md-tabs__link{backface-visibility:hidden;display:flex;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.lr-doc .md-tabs__link:focus, .lr-doc .md-tabs__link:hover{color:inherit;opacity:1}.lr-doc [dir=ltr] .md-tabs__link svg{margin-right:.4rem}.lr-doc [dir=rtl] .md-tabs__link svg{margin-left:.4rem}.lr-doc .md-tabs__link svg{fill:currentcolor;height:1.3em}.lr-doc .md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.lr-doc .md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.lr-doc .md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.lr-doc .md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.lr-doc .md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.lr-doc .md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.lr-doc .md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.lr-doc .md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.lr-doc .md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.lr-doc .md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.lr-doc .md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.lr-doc .md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.lr-doc .md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.lr-doc .md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.lr-doc .md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.lr-doc .md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}.lr-doc{--md-tag-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"m5.41 21 .71-4h-4l.35-2h4l1.06-6h-4l.35-2h4l.71-4h2l-.71 4h6l.71-4h2l-.71 4h4l-.35 2h-4l-1.06 6h4l-.35 2h-4l-.71 4h-2l.71-4h-6l-.71 4zM9.53 9l-1.06 6h6l1.06-6z\"\/><\/svg>')}.lr-doc .md-typeset .md-tags:not([hidden]){display:inline-flex;flex-wrap:wrap;gap:.5em;margin-bottom:.75em;margin-top:-.125em}.lr-doc .md-typeset .md-tag{align-items:center;background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-flex;font-size:.64rem;font-size:min(.8em,.64rem);font-weight:700;gap:.5em;letter-spacing:normal;line-height:1.6;padding:.3125em .78125em}.lr-doc .md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.lr-doc .md-typeset .md-tag[href]:focus, .lr-doc .md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.lr-doc [id]>.md-typeset .md-tag{vertical-align:text-top}.lr-doc .md-typeset .md-tag-shadow{opacity:.5}.lr-doc .md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:\"\";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.lr-doc .md-typeset .md-tag-icon[href]:focus:before, .lr-doc .md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{transform:scale(.95)}75%{transform:scale(1)}to{transform:scale(.95)}}.lr-doc{--md-annotation-bg-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2\"\/><\/svg>');--md-annotation-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M17 13h-4v4h-2v-4H7v-2h4V7h2v4h4m-5-9A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2\"\/><\/svg>')}.lr-doc .md-tooltip{backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.lr-doc .md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.lr-doc .md-tooltip--inline{font-weight:700;-webkit-user-select:none;user-select:none;width:auto}.lr-doc .md-tooltip--inline:not(.md-tooltip--active){transform:translateY(.2rem) scale(.9)}.lr-doc .md-tooltip--inline .md-tooltip__inner{font-size:.5rem;padding:.2rem .4rem}.lr-doc [hidden]+.md-tooltip--inline{display:none}.lr-doc .focus-visible>.md-tooltip, .lr-doc .md-tooltip:target{outline:var(--md-accent-fg-color) auto}.lr-doc .md-tooltip__inner{font-size:.64rem;padding:.8rem}.lr-doc .md-tooltip__inner.md-typeset>:first-child{margin-top:0}.lr-doc .md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.lr-doc .md-annotation{font-style:normal;font-weight:400;outline:none;text-align:initial;vertical-align:text-bottom;white-space:normal}.lr-doc [dir=rtl] .md-annotation{direction:rtl}.lr-doc code .md-annotation{font-family:var(--md-code-font-family);font-size:inherit}.lr-doc .md-annotation:not([hidden]){display:inline-block;line-height:1.25}.lr-doc .md-annotation__index{border-radius:.01px;cursor:pointer;display:inline-block;margin-left:.4ch;margin-right:.4ch;outline:none;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none;vertical-align:text-top;z-index:0}.lr-doc .md-annotation .md-annotation__index{transition:z-index .25s}@media screen{.lr-doc .md-annotation__index{width:2.2ch}.lr-doc [data-md-visible]>.md-annotation__index{animation:pulse 2s infinite}.lr-doc .md-annotation__index:before{background:var(--md-default-bg-color);-webkit-mask-image:var(--md-annotation-bg-icon);mask-image:var(--md-annotation-bg-icon)}.lr-doc .md-annotation__index:after, .lr-doc .md-annotation__index:before{content:\"\";height:2.2ch;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:-.1ch;width:2.2ch;z-index:-1}.lr-doc .md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);-webkit-mask-image:var(--md-annotation-icon);mask-image:var(--md-annotation-icon);transform:scale(1.0001);transition:background-color .25s,transform .25s}.lr-doc .md-tooltip--active+.md-annotation__index:after{transform:rotate(45deg)}.lr-doc .md-tooltip--active+.md-annotation__index:after, .lr-doc :hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}}.lr-doc .md-tooltip--active+.md-annotation__index{animation-play-state:paused;transition-duration:0ms;z-index:2}.lr-doc .md-annotation__index [data-md-annotation-id]{display:inline-block}@media print{.lr-doc .md-annotation__index [data-md-annotation-id]{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);font-weight:700;padding:0 .6ch;white-space:nowrap}.lr-doc .md-annotation__index [data-md-annotation-id]:after{content:attr(data-md-annotation-id)}}.lr-doc .md-typeset .md-annotation-list{counter-reset:annotation;list-style:none!important}.lr-doc .md-typeset .md-annotation-list li{position:relative}.lr-doc [dir=ltr] .md-typeset .md-annotation-list li:before{left:-2.125em}.lr-doc [dir=rtl] .md-typeset .md-annotation-list li:before{right:-2.125em}.lr-doc .md-typeset .md-annotation-list li:before{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);content:counter(annotation);counter-increment:annotation;font-size:.8875em;font-weight:700;height:2ch;line-height:1.25;min-width:2ch;padding:0 .6ch;position:absolute;text-align:center;top:.25em}.lr-doc{--md-tooltip-width:20rem;--md-tooltip-tail:0.3rem}.lr-doc .md-tooltip2{backface-visibility:hidden;color:var(--md-default-fg-color);font-family:var(--md-text-font-family);opacity:0;pointer-events:none;position:absolute;top:calc(var(--md-tooltip-host-y) + var(--md-tooltip-y));transform:translateY(-.4rem);transform-origin:calc(var(--md-tooltip-host-x) + var(--md-tooltip-x)) 0;transition:transform 0ms .25s,opacity .25s,z-index .25s;width:100%;z-index:0}.lr-doc .md-tooltip2:before{border-left:var(--md-tooltip-tail) solid #0000;border-right:var(--md-tooltip-tail) solid #0000;content:\"\";display:block;left:clamp(1.5 * .8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-tail),100vw - 2 * var(--md-tooltip-tail) - 1.5 * .8rem);position:absolute;z-index:1}.lr-doc .md-tooltip2--top:before{border-top:var(--md-tooltip-tail) solid var(--md-default-bg-color);bottom:calc(var(--md-tooltip-tail)*-1 + .025rem);filter:drop-shadow(0 1px 0 hsla(0,0%,0%,.05))}.lr-doc .md-tooltip2--bottom:before{border-bottom:var(--md-tooltip-tail) solid var(--md-default-bg-color);filter:drop-shadow(0 -1px 0 hsla(0,0%,0%,.05));top:calc(var(--md-tooltip-tail)*-1 + .025rem)}.lr-doc .md-tooltip2--active{opacity:1;transform:translateY(0);transition:transform .4s cubic-bezier(0,1,.5,1),opacity .25s,z-index 0ms;z-index:2}.lr-doc .md-tooltip2__inner{scrollbar-gutter:stable;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);left:clamp(.8rem,var(--md-tooltip-host-x) - .8rem,100vw - var(--md-tooltip-width) - .8rem);max-height:40vh;max-width:calc(100vw - 1.6rem);position:relative;scrollbar-width:thin}.lr-doc .md-tooltip2__inner::-webkit-scrollbar{height:.2rem;width:.2rem}.lr-doc .md-tooltip2__inner::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.lr-doc .md-tooltip2__inner::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.lr-doc [role=dialog]>.md-tooltip2__inner{font-size:.64rem;overflow:auto;padding:0 .8rem;pointer-events:auto;width:var(--md-tooltip-width)}.lr-doc [role=dialog]>.md-tooltip2__inner:after, .lr-doc [role=dialog]>.md-tooltip2__inner:before{content:\"\";display:block;height:.8rem;position:sticky;width:100%;z-index:10}.lr-doc [role=dialog]>.md-tooltip2__inner:before{background:linear-gradient(var(--md-default-bg-color),#0000 75%);top:0}.lr-doc [role=dialog]>.md-tooltip2__inner:after{background:linear-gradient(#0000,var(--md-default-bg-color) 75%);bottom:0}.lr-doc [role=tooltip]>.md-tooltip2__inner{font-size:.5rem;font-weight:700;left:clamp(.8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-width)\/2,100vw - var(--md-tooltip-width) - .8rem);max-width:min(100vw - 2 * .8rem,400px);padding:.2rem .4rem;-webkit-user-select:none;user-select:none;width:fit-content}.lr-doc .md-tooltip2__inner.md-typeset>:first-child{margin-top:0}.lr-doc .md-tooltip2__inner.md-typeset>:last-child{margin-bottom:0}.lr-doc [dir=ltr] .md-top{margin-left:50%}.lr-doc [dir=rtl] .md-top{margin-right:50%}.lr-doc .md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.lr-doc .md-top{display:none}}.lr-doc [dir=rtl] .md-top{transform:translate(50%)}.lr-doc .md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}.lr-doc [dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.lr-doc .md-top:focus, .lr-doc .md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.lr-doc .md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}.lr-doc{--md-version-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 320 512\"><!--! Font Awesome Free 7.1.0 by @fontawesome - https:\/\/fontawesome.com License - https:\/\/fontawesome.com\/license\/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d=\"M140.3 376.8c12.6 10.2 31.1 9.5 42.8-2.2l128-128c9.2-9.2 11.9-22.9 6.9-34.9S301.4 192 288.5 192h-256c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 7 34.8l128 128z\"\/><\/svg>')}.lr-doc .md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}.lr-doc [dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}.lr-doc [dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.lr-doc .md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}.lr-doc [dir=ltr] .md-version__current:after{margin-left:.4rem}.lr-doc [dir=rtl] .md-version__current:after{margin-right:.4rem}.lr-doc .md-version__current:after{background-color:currentcolor;content:\"\";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.lr-doc .md-version__alias{margin-left:.3rem;opacity:.7}.lr-doc .md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.lr-doc .md-version:focus-within .md-version__list, .lr-doc .md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (hover:none),(pointer:coarse){.lr-doc .md-version:hover .md-version__list{animation:hoverfix .25s forwards}.lr-doc .md-version:focus-within .md-version__list{animation:none}}.lr-doc .md-version__item{line-height:1.8rem}.lr-doc [dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}.lr-doc [dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.lr-doc .md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.lr-doc .md-version__link:focus, .lr-doc .md-version__link:hover{color:var(--md-accent-fg-color)}.lr-doc .md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}.lr-doc{--md-admonition-icon--note:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2m3.1 5.07c.14 0 .28.05.4.16l1.27 1.27c.23.22.23.57 0 .78l-1 1-2.05-2.05 1-1c.1-.11.24-.16.38-.16m-1.97 1.74 2.06 2.06-6.06 6.06H7.07v-2.06z\"\/><\/svg>');--md-admonition-icon--abstract:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M17 9H7V7h10m0 6H7v-2h10m-3 6H7v-2h7M12 3a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1s-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2\"\/><\/svg>');--md-admonition-icon--info:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M13 9h-2V7h2m0 10h-2v-6h2m-1-9A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2\"\/><\/svg>');--md-admonition-icon--tip:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M17.66 11.2c-.23-.3-.51-.56-.77-.82-.67-.6-1.43-1.03-2.07-1.66C13.33 7.26 13 4.85 13.95 3c-.95.23-1.78.75-2.49 1.32-2.59 2.08-3.61 5.75-2.39 8.9.04.1.08.2.08.33 0 .22-.15.42-.35.5-.23.1-.47.04-.66-.12a.6.6 0 0 1-.14-.17c-1.13-1.43-1.31-3.48-.55-5.12C5.78 10 4.87 12.3 5 14.47c.06.5.12 1 .29 1.5.14.6.41 1.2.71 1.73 1.08 1.73 2.95 2.97 4.96 3.22 2.14.27 4.43-.12 6.07-1.6 1.83-1.66 2.47-4.32 1.53-6.6l-.13-.26c-.21-.46-.77-1.26-.77-1.26m-3.16 6.3c-.28.24-.74.5-1.1.6-1.12.4-2.24-.16-2.9-.82 1.19-.28 1.9-1.16 2.11-2.05.17-.8-.15-1.46-.28-2.23-.12-.74-.1-1.37.17-2.06.19.38.39.76.63 1.06.77 1 1.98 1.44 2.24 2.8.04.14.06.28.06.43.03.82-.33 1.72-.93 2.27\"\/><\/svg>');--md-admonition-icon--success:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M21 7 9 19l-5.5-5.5 1.41-1.41L9 16.17 19.59 5.59z\"\/><\/svg>');--md-admonition-icon--question:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"m15.07 11.25-.9.92C13.45 12.89 13 13.5 13 15h-2v-.5c0-1.11.45-2.11 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41a2 2 0 0 0-2-2 2 2 0 0 0-2 2H8a4 4 0 0 1 4-4 4 4 0 0 1 4 4 3.2 3.2 0 0 1-.93 2.25M13 19h-2v-2h2M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10c0-5.53-4.5-10-10-10\"\/><\/svg>');--md-admonition-icon--warning:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M13 14h-2V9h2m0 9h-2v-2h2M1 21h22L12 2z\"\/><\/svg>');--md-admonition-icon--failure:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\/><\/svg>');--md-admonition-icon--danger:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"m11.5 20 4.86-9.73H13V4l-5 9.73h3.5zM12 2c2.75 0 5.1 1 7.05 2.95S22 9.25 22 12s-1 5.1-2.95 7.05S14.75 22 12 22s-5.1-1-7.05-2.95S2 14.75 2 12s1-5.1 2.95-7.05S9.25 2 12 2\"\/><\/svg>');--md-admonition-icon--bug:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M11 13h2v1h-2zm10-8v6c0 5.5-3.8 10.7-9 12-5.2-1.3-9-6.5-9-12V5l9-4zm-4 5h-2.2c-.2-.6-.6-1.1-1.1-1.5l1.2-1.2-.7-.7L12.8 8H12c-.2 0-.5 0-.7.1L9.9 6.6l-.8.8 1.2 1.2c-.5.3-.9.8-1.1 1.4H7v1h2v1H7v1h2v1H7v1h2.2c.4 1.2 1.5 2 2.8 2s2.4-.8 2.8-2H17v-1h-2v-1h2v-1h-2v-1h2zm-6 2h2v-1h-2z\"\/><\/svg>');--md-admonition-icon--example:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M7 2v2h1v14a4 4 0 0 0 4 4 4 4 0 0 0 4-4V4h1V2zm4 14c-.6 0-1-.4-1-1s.4-1 1-1 1 .4 1 1-.4 1-1 1m2-4c-.6 0-1-.4-1-1s.4-1 1-1 1 .4 1 1-.4 1-1 1m1-5h-4V4h4z\"\/><\/svg>');--md-admonition-icon--quote:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M14 17h3l2-4V7h-6v6h3M6 17h3l2-4V7H5v6h3z\"\/><\/svg>')}.lr-doc .md-typeset .admonition, .lr-doc .md-typeset details{background-color:var(--md-admonition-bg-color);border:.075rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid;transition:box-shadow 125ms}@media print{.lr-doc .md-typeset .admonition, .lr-doc .md-typeset details{box-shadow:none}}.lr-doc .md-typeset .admonition:focus-within, .lr-doc .md-typeset details:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.lr-doc .md-typeset .admonition>*, .lr-doc .md-typeset details>*{box-sizing:border-box}.lr-doc .md-typeset .admonition .admonition, .lr-doc .md-typeset .admonition details, .lr-doc .md-typeset details .admonition, .lr-doc .md-typeset details details{margin-bottom:1em;margin-top:1em}.lr-doc .md-typeset .admonition .md-typeset__scrollwrap, .lr-doc .md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.lr-doc .md-typeset .admonition .md-typeset__table, .lr-doc .md-typeset details .md-typeset__table{padding:0 .6rem}.lr-doc .md-typeset .admonition>.tabbed-set:only-child, .lr-doc .md-typeset details>.tabbed-set:only-child{margin-top:0}.lr-doc .md-typeset .admonition>:last-child, .lr-doc .md-typeset details>:last-child{margin-bottom:.6rem}.lr-doc [dir=ltr] .md-typeset .admonition-title, .lr-doc [dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}.lr-doc [dir=rtl] .md-typeset .admonition-title, .lr-doc [dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}.lr-doc [dir=ltr] .md-typeset .admonition-title, .lr-doc [dir=ltr] .md-typeset summary{border-left-width:.2rem}.lr-doc [dir=rtl] .md-typeset .admonition-title, .lr-doc [dir=rtl] .md-typeset summary{border-right-width:.2rem}.lr-doc [dir=ltr] .md-typeset .admonition-title, .lr-doc [dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}.lr-doc [dir=ltr] .md-typeset .admonition-title, .lr-doc [dir=ltr] .md-typeset summary, .lr-doc [dir=rtl] .md-typeset .admonition-title, .lr-doc [dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}.lr-doc [dir=rtl] .md-typeset .admonition-title, .lr-doc [dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.lr-doc .md-typeset .admonition-title, .lr-doc .md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}.lr-doc .md-typeset .admonition-title:last-child, .lr-doc .md-typeset summary:last-child{margin-bottom:0}.lr-doc [dir=ltr] .md-typeset .admonition-title:before, .lr-doc [dir=ltr] .md-typeset summary:before{left:.6rem}.lr-doc [dir=rtl] .md-typeset .admonition-title:before, .lr-doc [dir=rtl] .md-typeset summary:before{right:.6rem}.lr-doc .md-typeset .admonition-title:before, .lr-doc .md-typeset summary:before{background-color:#448aff;content:\"\";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.lr-doc .md-typeset .admonition-title code, .lr-doc .md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.lr-doc .md-typeset .admonition.note, .lr-doc .md-typeset details.note{border-color:#448aff}.lr-doc .md-typeset .admonition.note:focus-within, .lr-doc .md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.lr-doc .md-typeset .note>.admonition-title, .lr-doc .md-typeset .note>summary{background-color:#448aff1a}.lr-doc .md-typeset .note>.admonition-title:before, .lr-doc .md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.lr-doc .md-typeset .note>.admonition-title:after, .lr-doc .md-typeset .note>summary:after{color:#448aff}.lr-doc .md-typeset .admonition.abstract, .lr-doc .md-typeset details.abstract{border-color:#00b0ff}.lr-doc .md-typeset .admonition.abstract:focus-within, .lr-doc .md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem #00b0ff1a}.lr-doc .md-typeset .abstract>.admonition-title, .lr-doc .md-typeset .abstract>summary{background-color:#00b0ff1a}.lr-doc .md-typeset .abstract>.admonition-title:before, .lr-doc .md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.lr-doc .md-typeset .abstract>.admonition-title:after, .lr-doc .md-typeset .abstract>summary:after{color:#00b0ff}.lr-doc .md-typeset .admonition.info, .lr-doc .md-typeset details.info{border-color:#00b8d4}.lr-doc .md-typeset .admonition.info:focus-within, .lr-doc .md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem #00b8d41a}.lr-doc .md-typeset .info>.admonition-title, .lr-doc .md-typeset .info>summary{background-color:#00b8d41a}.lr-doc .md-typeset .info>.admonition-title:before, .lr-doc .md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.lr-doc .md-typeset .info>.admonition-title:after, .lr-doc .md-typeset .info>summary:after{color:#00b8d4}.lr-doc .md-typeset .admonition.tip, .lr-doc .md-typeset details.tip{border-color:#00bfa5}.lr-doc .md-typeset .admonition.tip:focus-within, .lr-doc .md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem #00bfa51a}.lr-doc .md-typeset .tip>.admonition-title, .lr-doc .md-typeset .tip>summary{background-color:#00bfa51a}.lr-doc .md-typeset .tip>.admonition-title:before, .lr-doc .md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.lr-doc .md-typeset .tip>.admonition-title:after, .lr-doc .md-typeset .tip>summary:after{color:#00bfa5}.lr-doc .md-typeset .admonition.success, .lr-doc .md-typeset details.success{border-color:#00c853}.lr-doc .md-typeset .admonition.success:focus-within, .lr-doc .md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem #00c8531a}.lr-doc .md-typeset .success>.admonition-title, .lr-doc .md-typeset .success>summary{background-color:#00c8531a}.lr-doc .md-typeset .success>.admonition-title:before, .lr-doc .md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.lr-doc .md-typeset .success>.admonition-title:after, .lr-doc .md-typeset .success>summary:after{color:#00c853}.lr-doc .md-typeset .admonition.question, .lr-doc .md-typeset details.question{border-color:#64dd17}.lr-doc .md-typeset .admonition.question:focus-within, .lr-doc .md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem #64dd171a}.lr-doc .md-typeset .question>.admonition-title, .lr-doc .md-typeset .question>summary{background-color:#64dd171a}.lr-doc .md-typeset .question>.admonition-title:before, .lr-doc .md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.lr-doc .md-typeset .question>.admonition-title:after, .lr-doc .md-typeset .question>summary:after{color:#64dd17}.lr-doc .md-typeset .admonition.warning, .lr-doc .md-typeset details.warning{border-color:#ff9100}.lr-doc .md-typeset .admonition.warning:focus-within, .lr-doc .md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem #ff91001a}.lr-doc .md-typeset .warning>.admonition-title, .lr-doc .md-typeset .warning>summary{background-color:#ff91001a}.lr-doc .md-typeset .warning>.admonition-title:before, .lr-doc .md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.lr-doc .md-typeset .warning>.admonition-title:after, .lr-doc .md-typeset .warning>summary:after{color:#ff9100}.lr-doc .md-typeset .admonition.failure, .lr-doc .md-typeset details.failure{border-color:#ff5252}.lr-doc .md-typeset .admonition.failure:focus-within, .lr-doc .md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem #ff52521a}.lr-doc .md-typeset .failure>.admonition-title, .lr-doc .md-typeset .failure>summary{background-color:#ff52521a}.lr-doc .md-typeset .failure>.admonition-title:before, .lr-doc .md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.lr-doc .md-typeset .failure>.admonition-title:after, .lr-doc .md-typeset .failure>summary:after{color:#ff5252}.lr-doc .md-typeset .admonition.danger, .lr-doc .md-typeset details.danger{border-color:#ff1744}.lr-doc .md-typeset .admonition.danger:focus-within, .lr-doc .md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem #ff17441a}.lr-doc .md-typeset .danger>.admonition-title, .lr-doc .md-typeset .danger>summary{background-color:#ff17441a}.lr-doc .md-typeset .danger>.admonition-title:before, .lr-doc .md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.lr-doc .md-typeset .danger>.admonition-title:after, .lr-doc .md-typeset .danger>summary:after{color:#ff1744}.lr-doc .md-typeset .admonition.bug, .lr-doc .md-typeset details.bug{border-color:#f50057}.lr-doc .md-typeset .admonition.bug:focus-within, .lr-doc .md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem #f500571a}.lr-doc .md-typeset .bug>.admonition-title, .lr-doc .md-typeset .bug>summary{background-color:#f500571a}.lr-doc .md-typeset .bug>.admonition-title:before, .lr-doc .md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.lr-doc .md-typeset .bug>.admonition-title:after, .lr-doc .md-typeset .bug>summary:after{color:#f50057}.lr-doc .md-typeset .admonition.example, .lr-doc .md-typeset details.example{border-color:#7c4dff}.lr-doc .md-typeset .admonition.example:focus-within, .lr-doc .md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem #7c4dff1a}.lr-doc .md-typeset .example>.admonition-title, .lr-doc .md-typeset .example>summary{background-color:#7c4dff1a}.lr-doc .md-typeset .example>.admonition-title:before, .lr-doc .md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.lr-doc .md-typeset .example>.admonition-title:after, .lr-doc .md-typeset .example>summary:after{color:#7c4dff}.lr-doc .md-typeset .admonition.quote, .lr-doc .md-typeset details.quote{border-color:#9e9e9e}.lr-doc .md-typeset .admonition.quote:focus-within, .lr-doc .md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem #9e9e9e1a}.lr-doc .md-typeset .quote>.admonition-title, .lr-doc .md-typeset .quote>summary{background-color:#9e9e9e1a}.lr-doc .md-typeset .quote>.admonition-title:before, .lr-doc .md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.lr-doc .md-typeset .quote>.admonition-title:after, .lr-doc .md-typeset .quote>summary:after{color:#9e9e9e}.lr-doc{--md-footnotes-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.42L5.83 13H21V7z\"\/><\/svg>')}.lr-doc .md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}.lr-doc [dir=ltr] .md-typeset .footnote>ol{margin-left:0}.lr-doc [dir=rtl] .md-typeset .footnote>ol{margin-right:0}.lr-doc .md-typeset .footnote>ol>li{transition:color 125ms}.lr-doc .md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.lr-doc .md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.lr-doc .md-typeset .footnote>ol>li:hover .footnote-backref, .lr-doc .md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.lr-doc .md-typeset .footnote>ol>li>:first-child{margin-top:0}.lr-doc .md-typeset .footnote-ref{font-size:.75em;font-weight:700}.lr-doc .md-typeset .footnote-ref{outline-offset:.1rem}.lr-doc .md-typeset [id^=\"fnref:\"]:target>.footnote-ref{outline:auto}.lr-doc .md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.lr-doc .md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}.lr-doc [dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.lr-doc .md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.lr-doc .md-typeset .footnote-backref:before{background-color:currentcolor;content:\"\";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}.lr-doc [dir=rtl] .md-typeset .footnote-backref:before{transform:scaleX(-1)}.lr-doc [dir=ltr] .md-typeset .headerlink{margin-left:.5rem}.lr-doc [dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.lr-doc .md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.lr-doc .md-typeset .headerlink{display:none}}.lr-doc .md-typeset .headerlink:focus, .lr-doc .md-typeset :hover>.headerlink, .lr-doc .md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.lr-doc .md-typeset .headerlink:focus, .lr-doc .md-typeset .headerlink:hover, .lr-doc .md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.lr-doc .md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.lr-doc .md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.lr-doc .md-typeset h1:target, .lr-doc .md-typeset h2:target, .lr-doc .md-typeset h3:target{--md-scroll-offset:0.2rem}.lr-doc .md-typeset h4:target{--md-scroll-offset:0.15rem}.lr-doc .md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.984375em){.lr-doc .md-typeset div.arithmatex{margin:0 -.8rem}.lr-doc .md-typeset div.arithmatex>*{width:min-content}}.lr-doc .md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto}.lr-doc .md-typeset div.arithmatex>* mjx-container{margin:0!important}.lr-doc .md-typeset div.arithmatex mjx-assistive-mml{height:0}.lr-doc .md-typeset .katex-html svg{max-width:revert}.lr-doc .md-typeset del.critic{background-color:var(--md-typeset-del-color)}.lr-doc .md-typeset del.critic, .lr-doc .md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.lr-doc .md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.lr-doc .md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.lr-doc .md-typeset .critic.comment:before{content:\"\/* \"}.lr-doc .md-typeset .critic.comment:after{content:\" *\/\"}.lr-doc .md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.lr-doc .md-typeset .critic.block>:first-child{margin-top:.5em}.lr-doc .md-typeset .critic.block>:last-child{margin-bottom:.5em}.lr-doc{--md-details-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6z\"\/><\/svg>')}.lr-doc .md-typeset details{display:flow-root;overflow:visible;padding-top:0}.lr-doc .md-typeset details[open]>summary:after{transform:rotate(90deg)}.lr-doc .md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.lr-doc .md-typeset details:not([open])>summary{border-radius:.1rem}.lr-doc [dir=ltr] .md-typeset summary{padding-right:1.8rem}.lr-doc [dir=rtl] .md-typeset summary{padding-left:1.8rem}.lr-doc [dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}.lr-doc [dir=ltr] .md-typeset summary, .lr-doc [dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}.lr-doc [dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.lr-doc .md-typeset summary{cursor:pointer;display:block;min-height:1rem;overflow:hidden}.lr-doc .md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.lr-doc .md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.lr-doc [dir=ltr] .md-typeset summary:after{right:.4rem}.lr-doc [dir=rtl] .md-typeset summary:after{left:.4rem}.lr-doc .md-typeset summary:after{background-color:currentcolor;content:\"\";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}.lr-doc [dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.lr-doc .md-typeset summary::marker{display:none}.lr-doc .md-typeset summary::-webkit-details-marker{display:none}.lr-doc .md-typeset .emojione, .lr-doc .md-typeset .gemoji, .lr-doc .md-typeset .twemoji{--md-icon-size:1.125em;display:inline-flex;height:var(--md-icon-size);vertical-align:text-top}.lr-doc .md-typeset .emojione svg, .lr-doc .md-typeset .gemoji svg, .lr-doc .md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:var(--md-icon-size)}.lr-doc .md-typeset .lg, .lr-doc .md-typeset .xl, .lr-doc .md-typeset .xxl, .lr-doc .md-typeset .xxxl{vertical-align:text-bottom}.lr-doc .md-typeset .middle{vertical-align:middle}.lr-doc .md-typeset .lg{--md-icon-size:1.5em}.lr-doc .md-typeset .xl{--md-icon-size:2.25em}.lr-doc .md-typeset .xxl{--md-icon-size:3em}.lr-doc .md-typeset .xxxl{--md-icon-size:4em}.lr-doc .highlight .o, .lr-doc .highlight .ow{color:var(--md-code-hl-operator-color)}.lr-doc .highlight .p{color:var(--md-code-hl-punctuation-color)}.lr-doc .highlight .cpf, .lr-doc .highlight .l, .lr-doc .highlight .s, .lr-doc .highlight .s1, .lr-doc .highlight .s2, .lr-doc .highlight .sb, .lr-doc .highlight .sc, .lr-doc .highlight .si, .lr-doc .highlight .ss{color:var(--md-code-hl-string-color)}.lr-doc .highlight .cp, .lr-doc .highlight .se, .lr-doc .highlight .sh, .lr-doc .highlight .sr, .lr-doc .highlight .sx{color:var(--md-code-hl-special-color)}.lr-doc .highlight .il, .lr-doc .highlight .m, .lr-doc .highlight .mb, .lr-doc .highlight .mf, .lr-doc .highlight .mh, .lr-doc .highlight .mi, .lr-doc .highlight .mo{color:var(--md-code-hl-number-color)}.lr-doc .highlight .k, .lr-doc .highlight .kd, .lr-doc .highlight .kn, .lr-doc .highlight .kp, .lr-doc .highlight .kr, .lr-doc .highlight .kt{color:var(--md-code-hl-keyword-color)}.lr-doc .highlight .kc, .lr-doc .highlight .n{color:var(--md-code-hl-name-color)}.lr-doc .highlight .bp, .lr-doc .highlight .nb, .lr-doc .highlight .no{color:var(--md-code-hl-constant-color)}.lr-doc .highlight .nc, .lr-doc .highlight .ne, .lr-doc .highlight .nf, .lr-doc .highlight .nn{color:var(--md-code-hl-function-color)}.lr-doc .highlight .nd, .lr-doc .highlight .ni, .lr-doc .highlight .nl, .lr-doc .highlight .nt{color:var(--md-code-hl-keyword-color)}.lr-doc .highlight .c, .lr-doc .highlight .c1, .lr-doc .highlight .ch, .lr-doc .highlight .cm, .lr-doc .highlight .cs, .lr-doc .highlight .sd{color:var(--md-code-hl-comment-color)}.lr-doc .highlight .na, .lr-doc .highlight .nv, .lr-doc .highlight .vc, .lr-doc .highlight .vg, .lr-doc .highlight .vi{color:var(--md-code-hl-variable-color)}.lr-doc .highlight .ge, .lr-doc .highlight .gh, .lr-doc .highlight .go, .lr-doc .highlight .gp, .lr-doc .highlight .gr, .lr-doc .highlight .gs, .lr-doc .highlight .gt, .lr-doc .highlight .gu{color:var(--md-code-hl-generic-color)}.lr-doc .highlight .gd, .lr-doc .highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.lr-doc .highlight .gd{background-color:var(--md-typeset-del-color)}.lr-doc .highlight .gi{background-color:var(--md-typeset-ins-color)}.lr-doc .highlight .hll{background-color:var(--md-code-hl-color--light);box-shadow:2px 0 0 0 var(--md-code-hl-color) inset;display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.lr-doc .highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.lr-doc .highlight span.filename+pre{margin-top:0}.lr-doc .highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.lr-doc .highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.lr-doc .highlight code a[id]{position:absolute;visibility:hidden}.lr-doc .highlight code[data-md-copying]{display:initial}.lr-doc .highlight code[data-md-copying] .hll{display:contents}.lr-doc .highlight code[data-md-copying] .md-annotation{display:none}.lr-doc .highlighttable{display:flow-root}.lr-doc .highlighttable tbody, .lr-doc .highlighttable td{display:block;padding:0}.lr-doc .highlighttable tr{display:flex}.lr-doc .highlighttable pre{margin:0}.lr-doc .highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.lr-doc .highlighttable th.filename span.filename{margin-top:0}.lr-doc .highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.lr-doc .highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset}.lr-doc .highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.lr-doc .highlighttable .linenodiv span[class]{padding-right:.5882352941em}.lr-doc .highlighttable .code{flex:1;min-width:0}.lr-doc .linenodiv a{color:inherit}.lr-doc .md-typeset .highlighttable{direction:ltr;margin:1em 0}.lr-doc .md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.lr-doc .md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.lr-doc .md-typeset .highlight+.result:after{clear:both;content:\"\";display:block}@media screen and (max-width:44.984375em){.lr-doc .md-content__inner>.highlight{margin:1em -.8rem}.lr-doc .md-content__inner>.highlight>.filename, .lr-doc .md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code, .lr-doc .md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename, .lr-doc .md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos, .lr-doc .md-content__inner>.highlight>pre>code{border-radius:0}.lr-doc .md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.lr-doc .md-typeset .keys kbd:after, .lr-doc .md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.lr-doc .md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.lr-doc .md-typeset .keys .key-alt:before, .lr-doc .md-typeset .keys .key-left-alt:before, .lr-doc .md-typeset .keys .key-right-alt:before{content:\"\u2387\";padding-right:.4em}.lr-doc .md-typeset .keys .key-command:before, .lr-doc .md-typeset .keys .key-left-command:before, .lr-doc .md-typeset .keys .key-right-command:before{content:\"\u2318\";padding-right:.4em}.lr-doc .md-typeset .keys .key-control:before, .lr-doc .md-typeset .keys .key-left-control:before, .lr-doc .md-typeset .keys .key-right-control:before{content:\"\u2303\";padding-right:.4em}.lr-doc .md-typeset .keys .key-left-meta:before, .lr-doc .md-typeset .keys .key-meta:before, .lr-doc .md-typeset .keys .key-right-meta:before{content:\"\u25c6\";padding-right:.4em}.lr-doc .md-typeset .keys .key-left-option:before, .lr-doc .md-typeset .keys .key-option:before, .lr-doc .md-typeset .keys .key-right-option:before{content:\"\u2325\";padding-right:.4em}.lr-doc .md-typeset .keys .key-left-shift:before, .lr-doc .md-typeset .keys .key-right-shift:before, .lr-doc .md-typeset .keys .key-shift:before{content:\"\u21e7\";padding-right:.4em}.lr-doc .md-typeset .keys .key-left-super:before, .lr-doc .md-typeset .keys .key-right-super:before, .lr-doc .md-typeset .keys .key-super:before{content:\"\u2756\";padding-right:.4em}.lr-doc .md-typeset .keys .key-left-windows:before, .lr-doc .md-typeset .keys .key-right-windows:before, .lr-doc .md-typeset .keys .key-windows:before{content:\"\u229e\";padding-right:.4em}.lr-doc .md-typeset .keys .key-arrow-down:before{content:\"\u2193\";padding-right:.4em}.lr-doc .md-typeset .keys .key-arrow-left:before{content:\"\u2190\";padding-right:.4em}.lr-doc .md-typeset .keys .key-arrow-right:before{content:\"\u2192\";padding-right:.4em}.lr-doc .md-typeset .keys .key-arrow-up:before{content:\"\u2191\";padding-right:.4em}.lr-doc .md-typeset .keys .key-backspace:before{content:\"\u232b\";padding-right:.4em}.lr-doc .md-typeset .keys .key-backtab:before{content:\"\u21e4\";padding-right:.4em}.lr-doc .md-typeset .keys .key-caps-lock:before{content:\"\u21ea\";padding-right:.4em}.lr-doc .md-typeset .keys .key-clear:before{content:\"\u2327\";padding-right:.4em}.lr-doc .md-typeset .keys .key-context-menu:before{content:\"\u2630\";padding-right:.4em}.lr-doc .md-typeset .keys .key-delete:before{content:\"\u2326\";padding-right:.4em}.lr-doc .md-typeset .keys .key-eject:before{content:\"\u23cf\";padding-right:.4em}.lr-doc .md-typeset .keys .key-end:before{content:\"\u2913\";padding-right:.4em}.lr-doc .md-typeset .keys .key-escape:before{content:\"\u238b\";padding-right:.4em}.lr-doc .md-typeset .keys .key-home:before{content:\"\u2912\";padding-right:.4em}.lr-doc .md-typeset .keys .key-insert:before{content:\"\u2380\";padding-right:.4em}.lr-doc .md-typeset .keys .key-page-down:before{content:\"\u21df\";padding-right:.4em}.lr-doc .md-typeset .keys .key-page-up:before{content:\"\u21de\";padding-right:.4em}.lr-doc .md-typeset .keys .key-print-screen:before{content:\"\u2399\";padding-right:.4em}.lr-doc .md-typeset .keys .key-tab:after{content:\"\u21e5\";padding-left:.4em}.lr-doc .md-typeset .keys .key-num-enter:after{content:\"\u2324\";padding-left:.4em}.lr-doc .md-typeset .keys .key-enter:after{content:\"\u23ce\";padding-left:.4em}.lr-doc{--md-tabbed-icon--prev:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M15.41 16.58 10.83 12l4.58-4.59L14 6l-6 6 6 6z\"\/><\/svg>');--md-tabbed-icon--next:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6z\"\/><\/svg>')}.lr-doc .md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.lr-doc .md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.lr-doc .md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.lr-doc .md-typeset .tabbed-set>input.focus-visible~.tabbed-labels:before{background-color:var(--md-accent-fg-color)}.lr-doc .md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.lr-doc .md-typeset .tabbed-labels{display:contents}}@media screen{.lr-doc .js .md-typeset .tabbed-labels{position:relative}.lr-doc .js .md-typeset .tabbed-labels:before{background:var(--md-default-fg-color);bottom:0;content:\"\";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,background-color .25s,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.lr-doc .md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.lr-doc .md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.lr-doc .md-typeset .tabbed-labels>label:first-child{order:1}.lr-doc .md-typeset .tabbed-labels>label:nth-child(2){order:2}.lr-doc .md-typeset .tabbed-labels>label:nth-child(3){order:3}.lr-doc .md-typeset .tabbed-labels>label:nth-child(4){order:4}.lr-doc .md-typeset .tabbed-labels>label:nth-child(5){order:5}.lr-doc .md-typeset .tabbed-labels>label:nth-child(6){order:6}.lr-doc .md-typeset .tabbed-labels>label:nth-child(7){order:7}.lr-doc .md-typeset .tabbed-labels>label:nth-child(8){order:8}.lr-doc .md-typeset .tabbed-labels>label:nth-child(9){order:9}.lr-doc .md-typeset .tabbed-labels>label:nth-child(10){order:10}.lr-doc .md-typeset .tabbed-labels>label:nth-child(11){order:11}.lr-doc .md-typeset .tabbed-labels>label:nth-child(12){order:12}.lr-doc .md-typeset .tabbed-labels>label:nth-child(13){order:13}.lr-doc .md-typeset .tabbed-labels>label:nth-child(14){order:14}.lr-doc .md-typeset .tabbed-labels>label:nth-child(15){order:15}.lr-doc .md-typeset .tabbed-labels>label:nth-child(16){order:16}.lr-doc .md-typeset .tabbed-labels>label:nth-child(17){order:17}.lr-doc .md-typeset .tabbed-labels>label:nth-child(18){order:18}.lr-doc .md-typeset .tabbed-labels>label:nth-child(19){order:19}.lr-doc .md-typeset .tabbed-labels>label:nth-child(20){order:20}}.lr-doc .md-typeset .tabbed-labels>label:hover{color:var(--md-default-fg-color)}.lr-doc .md-typeset .tabbed-labels>label>[href]:first-child{color:inherit}.lr-doc .md-typeset .tabbed-labels--linked>label{padding:0}.lr-doc .md-typeset .tabbed-labels--linked>label>a{display:block;padding:.78125em 1.25em .625em}.lr-doc .md-typeset .tabbed-content{width:100%}@media print{.lr-doc .md-typeset .tabbed-content{display:contents}}.lr-doc .md-typeset .tabbed-block{display:none}@media print{.lr-doc .md-typeset .tabbed-block{display:block}.lr-doc .md-typeset .tabbed-block:first-child{order:1}.lr-doc .md-typeset .tabbed-block:nth-child(2){order:2}.lr-doc .md-typeset .tabbed-block:nth-child(3){order:3}.lr-doc .md-typeset .tabbed-block:nth-child(4){order:4}.lr-doc .md-typeset .tabbed-block:nth-child(5){order:5}.lr-doc .md-typeset .tabbed-block:nth-child(6){order:6}.lr-doc .md-typeset .tabbed-block:nth-child(7){order:7}.lr-doc .md-typeset .tabbed-block:nth-child(8){order:8}.lr-doc .md-typeset .tabbed-block:nth-child(9){order:9}.lr-doc .md-typeset .tabbed-block:nth-child(10){order:10}.lr-doc .md-typeset .tabbed-block:nth-child(11){order:11}.lr-doc .md-typeset .tabbed-block:nth-child(12){order:12}.lr-doc .md-typeset .tabbed-block:nth-child(13){order:13}.lr-doc .md-typeset .tabbed-block:nth-child(14){order:14}.lr-doc .md-typeset .tabbed-block:nth-child(15){order:15}.lr-doc .md-typeset .tabbed-block:nth-child(16){order:16}.lr-doc .md-typeset .tabbed-block:nth-child(17){order:17}.lr-doc .md-typeset .tabbed-block:nth-child(18){order:18}.lr-doc .md-typeset .tabbed-block:nth-child(19){order:19}.lr-doc .md-typeset .tabbed-block:nth-child(20){order:20}}.lr-doc .md-typeset .tabbed-block>.highlight:first-child>pre, .lr-doc .md-typeset .tabbed-block>pre:first-child{margin:0}.lr-doc .md-typeset .tabbed-block>.highlight:first-child>pre>code, .lr-doc .md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.lr-doc .md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.lr-doc .md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.lr-doc .md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename, .lr-doc .md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.lr-doc .md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.lr-doc .md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.lr-doc .md-typeset .tabbed-block>.tabbed-set{margin:0}.lr-doc .md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.lr-doc .md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.lr-doc .md-typeset .tabbed-button:after{background-color:currentcolor;content:\"\";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.lr-doc .md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}.lr-doc [dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.lr-doc .md-typeset .tabbed-control[hidden]{opacity:0}.lr-doc .md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.lr-doc .md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.984375em){.lr-doc [dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}.lr-doc [dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.lr-doc .md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}.lr-doc [dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}.lr-doc [dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.lr-doc .md-content__inner>.tabbed-set .tabbed-labels:after{content:\"\"}.lr-doc [dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}.lr-doc [dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}.lr-doc [dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}.lr-doc [dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.lr-doc .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}.lr-doc [dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}.lr-doc [dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}.lr-doc [dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}.lr-doc [dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.lr-doc .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.lr-doc .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child, .lr-doc .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10), .lr-doc .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11), .lr-doc .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12), .lr-doc .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13), .lr-doc .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14), .lr-doc .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15), .lr-doc .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16), .lr-doc .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17), .lr-doc .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18), .lr-doc .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19), .lr-doc .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2), .lr-doc .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20), .lr-doc .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3), .lr-doc .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4), .lr-doc .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5), .lr-doc .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6), .lr-doc .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7), .lr-doc .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8), .lr-doc .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-default-fg-color)}.lr-doc .md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child, .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8), .lr-doc .md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child, .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8), .lr-doc .md-typeset [role=dialog] .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9), .lr-doc .no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child, .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8), .lr-doc .no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child, .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8), .lr-doc [role=dialog] .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-default-fg-color)}}.lr-doc .md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child, .lr-doc .md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10), .lr-doc .md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11), .lr-doc .md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12), .lr-doc .md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13), .lr-doc .md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14), .lr-doc .md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15), .lr-doc .md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16), .lr-doc .md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17), .lr-doc .md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18), .lr-doc .md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19), .lr-doc .md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2), .lr-doc .md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20), .lr-doc .md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3), .lr-doc .md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4), .lr-doc .md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5), .lr-doc .md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6), .lr-doc .md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7), .lr-doc .md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8), .lr-doc .md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.lr-doc .md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child, .lr-doc .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10), .lr-doc .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11), .lr-doc .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12), .lr-doc .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13), .lr-doc .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14), .lr-doc .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15), .lr-doc .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16), .lr-doc .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17), .lr-doc .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18), .lr-doc .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19), .lr-doc .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2), .lr-doc .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20), .lr-doc .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3), .lr-doc .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4), .lr-doc .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5), .lr-doc .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6), .lr-doc .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7), .lr-doc .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8), .lr-doc .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}.lr-doc{--md-tasklist-icon:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12m16.28-2.72a.75.75 0 0 0-.018-1.042.75.75 0 0 0-1.042-.018l-5.97 5.97-2.47-2.47a.75.75 0 0 0-1.042.018.75.75 0 0 0-.018 1.042l3 3a.75.75 0 0 0 1.06 0Z\"\/><\/svg>');--md-tasklist-icon--checked:url('data:image\/svg+xml;charset=utf-8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12m16.28-2.72a.75.75 0 0 0-.018-1.042.75.75 0 0 0-1.042-.018l-5.97 5.97-2.47-2.47a.75.75 0 0 0-1.042.018.75.75 0 0 0-.018 1.042l3 3a.75.75 0 0 0 1.06 0Z\"\/><\/svg>')}.lr-doc .md-typeset .task-list-item{list-style-type:none;position:relative}.lr-doc [dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}.lr-doc [dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.lr-doc .md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.lr-doc .md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}.lr-doc [dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}.lr-doc [dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.lr-doc .md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:\"\";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.lr-doc .md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}@media print{.lr-doc .giscus, .lr-doc [id=__comments]{display:none}}.lr-doc>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color);--md-mermaid-sequence-actor-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actor-fg-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-actor-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-actor-line-color:var(--md-default-fg-color--lighter);--md-mermaid-sequence-actorman-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actorman-line-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-box-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-box-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-label-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-label-fg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-loop-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-loop-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-loop-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-message-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-message-line-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-note-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-border-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-number-bg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-number-fg-color:var(--md-accent-bg-color)}.lr-doc .mermaid{line-height:normal;margin:1em 0}.lr-doc .md-typeset .grid{grid-gap:.4rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));margin:1em 0}.lr-doc .md-typeset .grid.cards>ol, .lr-doc .md-typeset .grid.cards>ul{display:contents}.lr-doc .md-typeset .grid.cards>ol>li, .lr-doc .md-typeset .grid.cards>ul>li, .lr-doc .md-typeset .grid>.card{border:.05rem solid var(--md-default-fg-color--lightest);border-radius:.1rem;display:block;margin:0;padding:.8rem;transition:border .25s,box-shadow .25s}.lr-doc .md-typeset .grid.cards>ol>li:focus-within, .lr-doc .md-typeset .grid.cards>ol>li:hover, .lr-doc .md-typeset .grid.cards>ul>li:focus-within, .lr-doc .md-typeset .grid.cards>ul>li:hover, .lr-doc .md-typeset .grid>.card:focus-within, .lr-doc .md-typeset .grid>.card:hover{border-color:#0000;box-shadow:var(--md-shadow-z2)}.lr-doc .md-typeset .grid.cards>ol>li>hr, .lr-doc .md-typeset .grid.cards>ul>li>hr, .lr-doc .md-typeset .grid>.card>hr{margin-bottom:1em;margin-top:1em}.lr-doc .md-typeset .grid.cards>ol>li>:first-child, .lr-doc .md-typeset .grid.cards>ul>li>:first-child, .lr-doc .md-typeset .grid>.card>:first-child{margin-top:0}.lr-doc .md-typeset .grid.cards>ol>li>:last-child, .lr-doc .md-typeset .grid.cards>ul>li>:last-child, .lr-doc .md-typeset .grid>.card>:last-child{margin-bottom:0}.lr-doc .md-typeset .grid>*, .lr-doc .md-typeset .grid>.admonition, .lr-doc .md-typeset .grid>.highlight>*, .lr-doc .md-typeset .grid>.highlighttable, .lr-doc .md-typeset .grid>.md-typeset details, .lr-doc .md-typeset .grid>details, .lr-doc .md-typeset .grid>pre{margin-bottom:0;margin-top:0}.lr-doc .md-typeset .grid>.highlight>pre:only-child, .lr-doc .md-typeset .grid>.highlight>pre>code, .lr-doc .md-typeset .grid>.highlighttable, .lr-doc .md-typeset .grid>.highlighttable>tbody, .lr-doc .md-typeset .grid>.highlighttable>tbody>tr, .lr-doc .md-typeset .grid>.highlighttable>tbody>tr>.code, .lr-doc .md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight, .lr-doc .md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre, .lr-doc .md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre>code{height:100%}.lr-doc .md-typeset .grid>.tabbed-set{margin-bottom:0;margin-top:0}@media screen and (min-width:45em){.lr-doc [dir=ltr] .md-typeset .inline{float:left}.lr-doc [dir=rtl] .md-typeset .inline{float:right}.lr-doc [dir=ltr] .md-typeset .inline{margin-right:.8rem}.lr-doc [dir=rtl] .md-typeset .inline{margin-left:.8rem}.lr-doc .md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}.lr-doc [dir=ltr] .md-typeset .inline.end{float:right}.lr-doc [dir=rtl] .md-typeset .inline.end{float:left}.lr-doc [dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}.lr-doc [dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}}\n<\/style>\n\n<style>\n@font-face{\n  font-family: 'Roboto';\n  font-style: italic;\n  font-weight: 300;\n  font-stretch: normal;\n  font-display: fallback;\n  src: url(https:\/\/fonts.gstatic.com\/s\/roboto\/v51\/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLt_QuAj-lg.ttf) format('truetype');\n}\n@font-face{\n  font-family: 'Roboto';\n  font-style: italic;\n  font-weight: 400;\n  font-stretch: normal;\n  font-display: fallback;\n  src: url(https:\/\/fonts.gstatic.com\/s\/roboto\/v51\/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLoHQuAj-lg.ttf) format('truetype');\n}\n@font-face{\n  font-family: 'Roboto';\n  font-style: italic;\n  font-weight: 700;\n  font-stretch: normal;\n  font-display: fallback;\n  src: url(https:\/\/fonts.gstatic.com\/s\/roboto\/v51\/KFOKCnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmOClHrs6ljXfMMLmbXuAj-lg.ttf) format('truetype');\n}\n@font-face{\n  font-family: 'Roboto';\n  font-style: normal;\n  font-weight: 300;\n  font-stretch: normal;\n  font-display: fallback;\n  src: url(https:\/\/fonts.gstatic.com\/s\/roboto\/v51\/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabVmUiA8.ttf) format('truetype');\n}\n@font-face{\n  font-family: 'Roboto';\n  font-style: normal;\n  font-weight: 400;\n  font-stretch: normal;\n  font-display: fallback;\n  src: url(https:\/\/fonts.gstatic.com\/s\/roboto\/v51\/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmUiA8.ttf) format('truetype');\n}\n@font-face{\n  font-family: 'Roboto';\n  font-style: normal;\n  font-weight: 700;\n  font-stretch: normal;\n  font-display: fallback;\n  src: url(https:\/\/fonts.gstatic.com\/s\/roboto\/v51\/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuYjalmUiA8.ttf) format('truetype');\n}\n@font-face{\n  font-family: 'Roboto Mono';\n  font-style: italic;\n  font-weight: 400;\n  font-display: fallback;\n  src: url(https:\/\/fonts.gstatic.com\/s\/robotomono\/v31\/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnANW6Cpw.ttf) format('truetype');\n}\n@font-face{\n  font-family: 'Roboto Mono';\n  font-style: italic;\n  font-weight: 700;\n  font-display: fallback;\n  src: url(https:\/\/fonts.gstatic.com\/s\/robotomono\/v31\/L0xoDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrmAB9W6Cpw.ttf) format('truetype');\n}\n@font-face{\n  font-family: 'Roboto Mono';\n  font-style: normal;\n  font-weight: 400;\n  font-display: fallback;\n  src: url(https:\/\/fonts.gstatic.com\/s\/robotomono\/v31\/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_ROW9.ttf) format('truetype');\n}\n@font-face{\n  font-family: 'Roboto Mono';\n  font-style: normal;\n  font-weight: 700;\n  font-display: fallback;\n  src: url(https:\/\/fonts.gstatic.com\/s\/robotomono\/v31\/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_Of2_ROW9.ttf) format('truetype');\n}\n\n<\/style>\n\n<style>\n.lr-doc \/* =========================\n   LightREST - CSS (clean v3)\n   ========================= *\/\n\n\/* ===== Layout (largeur contenu) ===== *\/\n.md-grid{\n  max-width: min(90vw, 110rem);\n}.lr-doc \/* ===== Sidebar (lisibilit\u00e9 + indentation) ===== *\/\n.md-sidebar .md-nav__title{\n  font-weight: 700;\n  letter-spacing: .02em;\n  padding-left: 0 !important;\n}.lr-doc .md-sidebar .md-nav__item--section > .md-nav__link{\n  font-weight: 700;\n  text-transform: uppercase;\n  font-size: .78rem;\n  opacity: .85;\n  padding-left: 0 !important;\n}.lr-doc .md-sidebar .md-nav__link{\n  padding: .25rem 0 .25rem 1.25rem !important;\n  text-decoration: none;\n}.lr-doc .md-sidebar .md-nav__link--active{\n  font-weight: 700;\n  border-left: 3px solid #004080;\n}.lr-doc .md-sidebar .md-nav__link--active .md-ellipsis{\n  color: #004080;\n}.lr-doc \/* ===== Liens du contenu : noirs + soulignement pointill\u00e9 (hors menus) ===== *\/\n.md-content .md-typeset a, .lr-doc .md-content .md-typeset a:visited{\n  color: #111827 !important;\n  text-decoration-line: underline !important;\n  text-decoration-style: dotted !important;\n  text-decoration-thickness: 1px !important;\n  text-underline-offset: .18em !important;\n}.lr-doc .md-content .md-typeset a:hover{\n  color: #000000 !important;\n  background: rgba(0,0,0,.04);\n  border-radius: 3px;\n}.lr-doc .md-content .md-typeset a:focus-visible{\n  outline: 2px dotted #111827;\n  outline-offset: 2px;\n}.lr-doc \/* Exclusions menus *\/\n.md-nav a, .lr-doc .md-header a, .lr-doc .md-tabs a, .lr-doc .md-footer a{\n  color: inherit !important;\n  text-decoration: none !important;\n  background: transparent !important;\n  border-radius: 0 !important;\n}.lr-doc \/* ===== Polices code ===== *\/\n.md-typeset code, .lr-doc .md-typeset pre{\n  font-family: \"Lucida Console\", \"Consolas\", \"Courier New\", monospace;\n}.lr-doc \/* Code standard (gris clair) *\/\n.md-typeset pre{\n  background-color: #f3f4f6;\n  color: #1f2937;\n  border-radius: 2px;\n}.lr-doc \/* ===== Highlight dans les blocs code (exemples) ===== *\/\n.md-typeset pre > code .lr-hl{\n  color: #ffd54a;\n  font-weight: 700;\n  background: rgba(255, 213, 74, 0.12);\n  border-radius: 3px;\n  padding: 0 .15em;\n}.lr-doc \/* ===== Prototypage (HTML <pre>) ===== *\/\n.md-typeset pre.lr-proto{\n  background-color: #f3f4f6;\n  color: #1f2937;\n  border-radius: 8px;\n  padding: .6rem .8rem;\n  overflow-x: auto;\n  overflow-y: hidden;\n  white-space: pre;\n  max-width: 100%;\n  display: block;\n}.lr-doc \/* ===== Tables globales ===== *\/\n.md-typeset table{\n  border: 1px solid rgba(0,0,0,.12);\n  border-collapse: collapse;\n  width: 100%;\n  table-layout: fixed;\n  background: transparent !important; \/* pas de gris *\/\n}.lr-doc .md-typeset table th, .lr-doc .md-typeset table td{\n  border-bottom: 1px solid rgba(0,0,0,.12);\n  padding: .6rem .8rem;\n  vertical-align: top;\n}.lr-doc .md-typeset table thead th{\n  font-weight: 700;\n  background: transparent !important; \/* pas de gris *\/\n  border-bottom: 2px solid rgba(0,0,0,.12) !important;\n}.lr-doc \/* Wrappers Material autour des tables *\/\n.md-typeset .md-typeset__scrollwrap, .lr-doc .md-typeset .md-typeset__table{\n  width: 100% !important;\n  max-width: 100% !important;\n}.lr-doc \/* Tables membres\/constantes : NOM plus gros + code sans fond *\/\n.md-typeset table td:first-child code{\n  font-size: 0.70rem !important;\n  font-weight: 500 !important;\n  background: transparent !important;\n  padding: 0 !important;\n  border-radius: 0 !important;\n}.lr-doc \/* ===== Cartes de sections (lr-secwrap) ===== *\/\n.md-typeset .lr-secwrap{\n  margin: 1.1rem 0 !important;\n  border: 1px solid rgba(0,0,0,.12) !important;\n  border-radius: 12px !important;\n  overflow: hidden !important;\n  background: #fff !important;\n}.lr-doc .md-typeset .lr-secwrap .lr-sec{\n  margin: 0 !important;\n  padding: .60rem 1rem !important;\n  font-weight: 900 !important;\n  border-bottom: 1px solid rgba(0,0,0,.10) !important;\n  background: #f3f4f6 !important;\n}.lr-doc .md-typeset .lr-secwrap .lr-secbody{\n  padding: .65rem .9rem !important;\n}.lr-doc \/* \u00c9vite le double cadre : la carte porte la bordure, .lr-doc pas la table *\/\n.md-typeset .lr-secwrap .lr-secbody table{\n  margin: 0 !important;\n  border: 0 !important;\n  width: 100% !important;\n  background: transparent !important;\n}.lr-doc .md-typeset .lr-secwrap .lr-secbody .md-typeset__scrollwrap, .lr-doc .md-typeset .lr-secwrap .lr-secbody .md-typeset__table{\n  margin: 0 !important;\n}.lr-doc .md-typeset .lr-secwrap .lr-secbody .md-typeset__scrollwrap table, .lr-doc .md-typeset .lr-secwrap .lr-secbody .md-typeset__table table{\n  border: 0 !important;\n  margin: 0 !important;\n}.lr-doc \/* Couleurs par section *\/\n.md-typeset .lr-secwrap-proto{ border-left: 7px solid rgba(107,114,128,.85) !important; }.lr-doc .md-typeset .lr-secwrap-proto .lr-sec{ background: rgba(107,114,128,.10) !important; }.lr-doc .md-typeset .lr-secwrap-params{ border-left: 7px solid rgba(0,64,128,.90) !important; }.lr-doc .md-typeset .lr-secwrap-params .lr-sec{ background: rgba(0,64,128,.08) !important; }.lr-doc .md-typeset .lr-secwrap-returns{ border-left: 7px solid rgba(16,185,129,.90) !important; }.lr-doc .md-typeset .lr-secwrap-returns .lr-sec{ background: rgba(16,185,129,.10) !important; }.lr-doc .md-typeset .lr-empty{\n  color: rgba(0,0,0,.6);\n  font-style: italic;\n}.lr-doc \/* =========================================================\n   Blocs repliables (details.note) : header bleu + chevron \u00e0 gauche\n   ========================================================= *\/\n\n\/* Cache le marker natif *\/\n.md-content .md-typeset details.note > summary::-webkit-details-marker{ display:none !important; }.lr-doc .md-content .md-typeset details.note > summary::marker{ content:\"\" !important; }.lr-doc .md-typeset details.note > summary{\n  background-color: #004080;\n  color: #ffffff;\n  font-weight: 600;\n  border-radius: 0;\n\n  position: relative !important;\n  padding-left: 2.2rem !important; \/* place chevron *\/\n  display: flex !important;\n  align-items: center !important;\n}.lr-doc \/* Supprime l\u2019ic\u00f4ne \"note\" par d\u00e9faut *\/\n.md-typeset details.note > summary::before{\n  display: none !important;\n}.lr-doc \/* Chevron *\/\n.md-content .md-typeset details.note > summary::after{\n  content: \"\u25b8\" !important;\n  position: absolute !important;\n  left: .9rem !important;\n  top: 50% !important;\n\n  color: #4f8cff !important;\n  font-size: 1.2rem !important;\n  font-weight: 900 !important;\n  line-height: 1 !important;\n  opacity: 0.95 !important;\n\n  transform: translateY(-50%) rotate(0deg) !important;\n  transition: transform .15s ease !important;\n}.lr-doc .md-content .md-typeset details.note[open] > summary::after{\n  transform: translateY(-50%) rotate(90deg) !important;\n}.lr-doc \/* Ic\u00f4ne Material (si pr\u00e9sente) \u00e0 droite *\/\n.md-typeset details.note > summary .md-details__icon{\n  margin-left: auto;\n  display: inline-flex !important;\n  opacity: 1 !important;\n  color: #ffffff !important;\n  transition: transform .15s ease;\n}.lr-doc .md-typeset details.note > summary .md-details__icon svg{\n  fill: #ffffff !important;\n}.lr-doc .md-typeset details.note[open] > summary .md-details__icon{\n  transform: rotate(180deg);\n}.lr-doc \/* Ic\u00f4nes dans le titre (summary) : twemoji plus grand *\/\n.md-typeset details > summary .twemoji{ display:inline-flex !important; width:2.15em !important; height:2.15em !important; }.lr-doc .md-typeset details > summary .twemoji svg, .lr-doc .md-typeset details > summary .twemoji img{ width:100% !important; height:100% !important; }.lr-doc \/* =========================================================\n   Admonitions : harmonisation titres (toutes sections)\n   ========================================================= *\/\n\n\/* Gabarit unique pour TOUS les titres *\/\n.md-typeset .admonition > .admonition-title{\n  display: block !important;\n  position: relative !important;\n  margin: 0 !important;\n\n  min-height: 2.35rem !important;\n  padding: .60rem 1rem .60rem 2.8rem !important;\n\n  line-height: 1.25 !important;\n  font-weight: 900 !important;\n}.lr-doc \/* Ic\u00f4ne : position fixe *\/\n.md-typeset .admonition > .admonition-title::before{\n  position: absolute !important;\n  left: 1rem !important;\n  top: 50% !important;\n  transform: translateY(-50%) !important;\n\n  width: 1.20em !important;\n  height: 1.20em !important;\n  margin: 0 !important;\n  opacity: 1 !important;\n}.lr-doc \/* Contenu : padding homog\u00e8ne (\u00e9vite diff\u00e9rences \u201cPr\u00e9sentation\u201d) *\/\n.md-typeset .admonition > :not(.admonition-title){\n  padding: .65rem .9rem !important;\n}.lr-doc \/* ===== Pr\u00e9sentation (abstract) : style carte + accent orange (sans casser le gabarit) ===== *\/\n.md-typeset .admonition.abstract{\n  margin: 1.1rem 0 !important;\n  border: 1px solid rgba(0,0,0,.12) !important;\n  border-left: 7px solid #f59e0b !important;\n  border-radius: 12px !important;\n  overflow: hidden !important;\n  background: #fff !important;\n  padding: 0 !important;\n  box-shadow: none !important;\n}.lr-doc .md-typeset .admonition.abstract > .admonition-title{\n  background: rgba(245,158,11,.10) !important;\n  border-bottom: 1px solid rgba(0,0,0,.10) !important;\n}.lr-doc .md-typeset .admonition.abstract > .admonition-title::before{\n  color: #f59e0b !important;\n}.lr-doc \/* \u00c9vite les \u201cdouble paddings\u201d entre paragraphes *\/\n.md-typeset .admonition.abstract > :not(.admonition-title){\n  margin: 0 !important;\n}.lr-doc .md-typeset .admonition.abstract > :not(.admonition-title) + :not(.admonition-title){\n  padding-top: 0 !important;\n}.lr-doc \/* ===== Exemple (example) ===== *\/\n.md-typeset .admonition.example > .admonition-title{\n  background-color: #e5e7eb !important;\n  color: #111827 !important;\n  font-weight: 900 !important;\n}.lr-doc .md-typeset .admonition.example pre{\n  background-color: #1e1e1e;\n  color: #e8e8e8;\n}.lr-doc .md-typeset .admonition.example code{\n  background-color: transparent;\n  color: #e8e8e8;\n}.lr-doc .md-typeset .admonition.example > .admonition-content > p:first-child{\n  margin-top: 0;\n  margin-bottom: .6rem;\n  color: #111827;\n}.lr-doc \/* =========================================================\n   Mode inject\u00e9 \/ int\u00e9gration WordPress\n   ========================================================= *\/\n\n\/* Masque la TOC \u00e0 droite si besoin *\/\n.md-sidebar--secondary{ display:none !important; }.lr-doc \/* MkDocs inject\u00e9 : ne doit pas passer au-dessus du header WP *\/\n.md-header, .lr-doc .md-tabs{ z-index: 0 !important; }.lr-doc \/* Ajuste la taille globale en mode inject\u00e9 (si utilis\u00e9) *\/\n.lr-doc{ zoom: 1.25; }.lr-doc \/* ajuste 1.10 \u2192 1.30 *\/\n\n\n\/* =========================================================\n   EMBED (WordPress) : zoom (stable)\n   ========================================================= *\/\n.lr-doc{\n  zoom: 1.25;               \/* ajuste 1.10 \u2192 1.30 *\/\n}.lr-doc \/* =========================================================\n   Harmonisation des TITRES (S\u00dbR)\n   - Admonitions Material : title + ic\u00f4ne\n   - lr-secwrap : uniquement twemoji (pas de svg global)\n   ========================================================= *\/\n\n\/* 1) Admonitions : gabarit unique *\/\n.lr-doc .md-typeset .admonition > .admonition-title{\n  position: relative !important;\n  display: block !important;\n  margin: 0 !important;\n  min-height: 2.35rem !important;\n  padding: .60rem 1rem .60rem 2.8rem !important;\n  line-height: 1.25 !important;\n  font-weight: 900 !important;\n}.lr-doc \/* 2) Ic\u00f4ne des admonitions : placement fixe *\/\n.lr-doc .md-typeset .admonition > .admonition-title::before{\n  position: absolute !important;\n  left: 1rem !important;\n  top: 50% !important;\n  transform: translateY(-50%) !important;\n  width: 1.20em !important;\n  height: 1.20em !important;\n  margin: 0 !important;\n  opacity: 1 !important;\n}.lr-doc \/* 3) Pr\u00e9sentation (abstract) : conserve le style orange mais m\u00eame padding *\/\n.lr-doc .md-typeset .admonition.abstract > .admonition-title{\n  padding: .60rem 1rem .60rem 2.8rem !important;\n}.lr-doc \/* 4) Cartes lr-secwrap : m\u00eame padding titre *\/\n.lr-doc .md-typeset .lr-secwrap .lr-sec{\n  position: relative !important;\n  padding: .60rem 1rem .60rem 2.8rem !important;\n}.lr-doc \/* 5) Ic\u00f4ne des lr-secwrap : uniquement twemoji (s\u00e9curis\u00e9) *\/\n.lr-doc .md-typeset .lr-secwrap .lr-sec .twemoji{\n  position: absolute !important;\n  left: 1rem !important;\n  top: 50% !important;\n  transform: translateY(-50%) !important;\n  width: 1.20em !important;\n  height: 1.20em !important;\n  margin: 0 !important;\n}.lr-doc \/* Assure que le svg dans twemoji reste petit *\/\n.lr-doc .md-typeset .lr-secwrap .lr-sec .twemoji svg, .lr-doc .md-typeset .lr-secwrap .lr-sec .twemoji img{\n  width: 100% !important;\n  height: 100% !important;\n}.lr-doc .md-typeset .lr-secwrap-present{ border-left: 7px solid rgba(245,158,11,.90) !important; }.lr-doc .md-typeset .lr-secwrap-present .lr-sec{ background: rgba(245,158,11,.10) !important; }.lr-doc .md-typeset .lr-secwrap-example{ border-left: 7px solid rgba(124,58,237,.90) !important; }.lr-doc .md-typeset .lr-secwrap-example .lr-sec{ background: rgba(124,58,237,.10) !important; }.lr-doc \/* =========================================================\n   EXEMPLES : bloc code dark + marges compactes\n   ========================================================= *\/\n\n.md-typeset .lr-secwrap-example pre, .lr-doc .md-typeset .lr-secwrap-example .highlight pre{\n  background: #1e1e1e !important;\n  color: #e8e8e8 !important;\n  border-radius: 8px !important;\n  margin: .4rem 0 !important;      \/* r\u00e9duit la marge *\/\n  padding: .8rem 1rem !important;  \/* r\u00e9duit l\u2019espace *\/\n}.lr-doc \/* Le code ne doit pas remettre de fond clair *\/\n.md-typeset .lr-secwrap-example code{\n  background: transparent !important;\n  color: inherit !important;\n}.lr-doc \/* Certains th\u00e8mes entourent avec .highlight : on neutralise le fond du wrapper *\/\n.md-typeset .lr-secwrap-example .highlight{\n  background: transparent !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  border: 0 !important;\n}.lr-doc \/* Prototypage : compacter l'espace autour *\/\n.md-typeset .lr-secwrap-proto .lr-secbody{\n  padding: .45rem .65rem !important;   \/* au lieu de .65rem .9rem *\/\n}.lr-doc .md-typeset .lr-secwrap-proto pre.lr-proto{\n  margin: .35rem 0 !important;\n  padding: .6rem .8rem !important;\n  border-radius: 10px !important;\n}.lr-doc \/* === Code dark en lignes : base === *\/\n.md-typeset pre.lr-code-dark{\n  background: #1e1e1e !important;\n  color: #e8e8e8 !important;\n  border-radius: 10px !important;\n  padding: .8rem 1rem !important;\n  overflow-x: auto !important;\n}.lr-doc \/* Le code devient un conteneur de lignes *\/\n.md-typeset pre.lr-code-dark code.lr-code-lines{\n  display: block !important;\n  white-space: pre !important;\n}.lr-doc \/* Lignes normales *\/\n.md-typeset pre.lr-code-dark code.lr-code-lines .lr-line{\n  display: block !important;\n  line-height: 1.20 !important;\n}.lr-doc \/* \u2705 LIGNE VIDE : c\u2019est ici qu\u2019on r\u00e9duit le \u201cnoir\u201d *\/\n.md-typeset pre.lr-code-dark code.lr-code-lines .lr-emptyline{\n  height: .35em !important;     \/* <- ajuste (0.25 \u00e0 0.60) *\/\n  line-height: 0 !important;\n}.lr-doc \/* Ligne vide \u201cfine\u201d dans les blocs de code dark *\/\n.md-typeset pre.lr-code-dark .lr-blank{\n  display: block;\n  height: .35em;     \/* ajuste 0.25 \u00e0 0.60 *\/\n}.lr-doc \/* Prototypage : enlever le cadre bleu (focus\/outline) *\/\n.md-typeset .lr-secwrap-proto pre.lr-proto{\n  outline: none !important;\n  box-shadow: none !important;\n}.lr-doc \/* Pas de bouton Copier dans Prototypage *\/\n.md-typeset .lr-secwrap-proto .btn-clipboard{\n  display: none !important;\n}.lr-doc \/* Par d\u00e9faut : cache les boutons Copier dans la doc *\/\n.md-typeset .btn-clipboard{\n  display: none !important;\n}.lr-doc \/* \u2026mais on l\u2019autorise dans les EXEMPLES *\/\n.md-typeset .lr-secwrap-example .btn-clipboard{\n  display: block !important;\n}.lr-doc \/* Bo\u00eete code + bouton copier (exemples) *\/\n.md-typeset .lr-codebox{\n  position: relative;\n}.lr-doc .md-typeset .lr-codebox .lr-copy{\n  position: absolute;\n  top: .6rem;\n  right: .6rem;\n  z-index: 2;\n\n  font-size: .75rem;\n  padding: .25rem .5rem;\n  border-radius: 6px;\n  border: 0;\n  cursor: pointer;\n\n  color: #ffffff;\n  background: #004080;\n  opacity: .9;\n}.lr-doc .md-typeset .lr-codebox .lr-copy:hover{\n  opacity: 1;\n}.lr-doc .md-typeset .lr-secwrap-proto .btn-clipboard{ display:none !important; }.lr-doc \/* EXEMPLE : liste \u00e0 puces plus \u00e0 droite *\/\n.md-typeset .lr-secwrap-example .lr-secbody ul{\n  padding-left: 1.4rem !important;   \/* d\u00e9cale le contenu *\/\n  margin-left: 0 !important;\n}.lr-doc \/* Optionnel : d\u00e9cale aussi la puce elle-m\u00eame (selon rendu) *\/\n.md-typeset .lr-secwrap-example .lr-secbody ul{\n  list-style-position: outside;\n}.lr-doc \/* Supprimer le pied de page Material *\/\n.md-footer{\n  display: none !important;\n}.lr-doc .md-main__inner{\n  padding-bottom: 0 !important;\n}.lr-doc \/* =========================================\n   Cacher la barre de titre (haut de page)\n   + les onglets (si activ\u00e9s)\n   ========================================= *\/\n.md-header, .lr-doc .md-tabs{\n  display: none !important;\n}.lr-doc \/* Enl\u00e8ve l\u2019espace r\u00e9serv\u00e9 au header sticky (Material) *\/\n.lr-doc{\n  --md-header-height: 0px;\n}.lr-doc .md-main{\n  margin-top: 0 !important;\n}.lr-doc \/* =========================================\n   Cacher le menu MkDocs (sidebar gauche)\n   ========================================= *\/\n.md-sidebar--primary{\n  display: none !important;\n}.lr-doc \/* (Optionnel) Cacher la table des mati\u00e8res \u00e0 droite *\/\n.md-sidebar--secondary{\n  display: none !important;\n}.lr-doc \/* =========================================\n   \u00c9tendre le contenu\n   ========================================= *\/\n.md-main__inner{\n  margin: 0 !important;\n}.lr-doc .md-content{\n  max-width: min(95vw, 110rem);\n}.lr-doc \/* Supprime le symbole \u00b6 (permalink) \u00e0 c\u00f4t\u00e9 des titres *\/\n.md-typeset .headerlink{\n  display: none !important;\n}.lr-doc \/* Liens uniquement dans les blocs de code (fond noir) *\/\n.md-typeset pre code a, .lr-doc .md-typeset .highlight pre a, .lr-doc .md-typeset .highlight code a{\n  color: #fff !important;\n  text-decoration: underline;\n}.lr-doc \/* Optionnel : hover *\/\n.md-typeset pre code a:hover, .lr-doc .md-typeset .highlight pre a:hover, .lr-doc .md-typeset .highlight code a:hover{\n  opacity: 0.85;\n}.lr-doc \/* Liens dans les blocs custom LightREST *\/\npre.lr-code-dark a, .lr-doc .lr-code-dark a{\n  color: #fff !important;\n  text-decoration: underline;\n}.lr-doc \/* \u2705 Liens visibles UNIQUEMENT dans tes exemples \"code dark\" *\/\n.md-content .md-typeset pre.lr-code-dark a, .lr-doc .md-content .md-typeset pre.lr-code-dark a:visited{\n  color: #ffffff !important;\n  text-decoration: underline !important;\n  text-decoration-style: solid !important;\n}.lr-doc \/* Optionnel : hover\/focus dans code dark *\/\n.md-content .md-typeset pre.lr-code-dark a:hover{\n  color: #ffffff !important;\n  opacity: .85;\n  background: transparent !important;\n}.lr-doc .md-content .md-typeset pre.lr-code-dark a:focus-visible{\n  outline: 2px solid rgba(255,255,255,.65) !important;\n  outline-offset: 2px;\n}.lr-doc \/* \u2705 Liens visibles UNIQUEMENT dans tes exemples \"code dark\" *\/\n.md-content .md-typeset pre.lr-code-dark a, .lr-doc .md-content .md-typeset pre.lr-code-dark a:visited{\n  color: #ffffff !important;\n  text-decoration: underline !important;\n  text-decoration-style: solid !important;\n}.lr-doc \/* Optionnel : hover\/focus dans code dark *\/\n.md-content .md-typeset pre.lr-code-dark a:hover{\n  color: #ffffff !important;\n  opacity: .85;\n  background: transparent !important;\n}.lr-doc .md-content .md-typeset pre.lr-code-dark a:focus-visible{\n  outline: 2px solid rgba(255,255,255,.65) !important;\n  outline-offset: 2px;\n}.lr-doc \/* \u2705 Liens dans lr-code-dark : police monospace + underline pointill\u00e9 *\/\n.md-content .md-typeset pre.lr-code-dark code a, .lr-doc .md-content .md-typeset pre.lr-code-dark code a:visited{\n  font-family: var(--md-code-font-family, \"Lucida Console\",\"Consolas\",\"Courier New\",monospace) !important;\n  font-size: inherit !important;\n  color: inherit !important;\n\n  \/* underline pointill\u00e9 (on override le \"text-decoration: underline\" pr\u00e9c\u00e9dent) *\/\n  text-decoration-line: underline !important;\n  text-decoration-style: dotted !important;\n  text-decoration-thickness: 1px !important;\n  text-underline-offset: .18em !important;\n\n  background: transparent !important;\n}.lr-doc \/* Hover optionnel *\/\n.md-content .md-typeset pre.lr-code-dark code a:hover{\n  opacity: .85;\n  background: transparent !important;\n}.lr-doc \/* =========================================================\n   FAQ : cartes Question\/R\u00e9ponse sans sous-tiroirs\n   ========================================================= *\/\n.lr-doc .lr-faqitem{\n  margin: 1rem 0;\n  border: 1px solid rgba(0,0,0,.10);\n  border-radius: 14px;\n  background: #fff;\n  overflow: hidden;\n}.lr-doc \/* \u00c9vite un double espace entre les deux cartes *\/\n.lr-doc .lr-faqitem .lr-secwrap{\n  margin: 0 !important;\n  border: 0 !important;\n  border-radius: 0 !important;\n}.lr-doc \/* Un petit s\u00e9parateur entre Question et R\u00e9ponse *\/\n.lr-doc .lr-faqitem .lr-secwrap + .lr-secwrap{\n  border-top: 1px solid rgba(0,0,0,.08) !important;\n}.lr-doc \/* Option : resserrer un peu le padding pour lecture rapide *\/\n.lr-doc .lr-faqitem .lr-secbody{\n  padding: .55rem .85rem !important;\n}.lr-doc \/* =========================================================\n   FAQ : 1 carte = Question + R\u00e9ponse\n   ========================================================= *\/\n.lr-doc .lr-faqitem{\n  margin: 1rem 0;\n  border: 1px solid rgba(0,0,0,.12);\n  border-radius: 14px;\n  background: #fff;\n  overflow: hidden;\n}.lr-doc \/* Bandeau question *\/\n.lr-doc .lr-faqhead{\n  background: #004080;\n  color: #fff;\n  font-weight: 700;\n  padding: .65rem 1rem;\n  display: flex;\n  align-items: center;\n  gap: .6rem;\n}.lr-doc \/* R\u00e9ponse *\/\n.lr-doc .lr-faqbody{\n  padding: .75rem 1rem;\n}.lr-doc \/* Resserre les paragraphes (optionnel) *\/\n.lr-doc .lr-faqbody p{\n  margin: .5em 0;\n}.lr-doc .lr-faqbody p:first-child{ margin-top: 0; }.lr-doc .lr-faqbody p:last-child{ margin-bottom: 0; }.lr-doc \/* =========================================================\n   FAQ \u2013 rendu lisible m\u00eame si la r\u00e9ponse contient du texte \"brut\"\n   ========================================================= *\/\n\n\/* Cartes *\/\n.lr-doc .lr-faqitem{\n  margin: 1rem 0 !important;\n  border: 1px solid rgba(0,0,0,.12) !important;\n  border-radius: 14px !important;\n  background: #fff !important;\n  overflow: hidden !important;\n}.lr-doc \/* Bandeau question compact (ic\u00f4ne + texte sur la m\u00eame ligne) *\/\n.lr-doc .lr-faqhead{\n  background: #004080 !important;\n  color: #fff !important;\n  font-weight: 800 !important;\n  padding: .70rem 1rem !important;\n  display: flex !important;\n  align-items: center !important;\n  gap: .55rem !important;\n  line-height: 1.25 !important;\n}.lr-doc \/* Corps r\u00e9ponse : s\u00e9paration nette + lisibilit\u00e9 *\/\n.lr-doc .lr-faqbody{\n  border-top: 1px solid rgba(0,0,0,.08) !important;\n  padding: .80rem 1rem !important;\n  line-height: 1.55 !important;\n}.lr-doc \/* Si ta r\u00e9ponse contient des <p>, .lr-doc on \u00e9vite l'effet \"pav\u00e9\" *\/\n.lr-doc .lr-faqbody p{\n  margin: .55em 0 !important;\n}.lr-doc .lr-faqbody p:first-child{ margin-top: 0 !important; }.lr-doc .lr-faqbody p:last-child{ margin-bottom: 0 !important; }.lr-doc \/* Si ta r\u00e9ponse contient des listes (HTML) *\/\n.lr-doc .lr-faqbody ul, .lr-doc .lr-faqbody ol{\n  margin: .5em 0 .5em 1.25em !important;\n  padding-left: 1.1em !important;\n}.lr-doc .lr-faqbody li{\n  margin: .25em 0 !important;\n}.lr-doc \/* Fallback : si la r\u00e9ponse contient des lignes commen\u00e7ant par \"-\" rendues en texte, .lr-doc on met une petite indentation g\u00e9n\u00e9rale pour a\u00e9rer *\/\n.lr-doc .lr-faqbody{\n  white-space: normal !important;\n}.lr-doc .lr-faqitem{\n  box-shadow: 0 1px 0 rgba(0,0,0,.04) !important;\n}.lr-doc \/* =========================================================\n   FAQ : 1 carte Question + R\u00e9ponse (admonition custom \"faq\")\n   ========================================================= *\/\n\n\/* carte globale *\/\n.md-typeset .admonition.faq{\n  margin: 0.85rem 0 !important;\n  border: 1px solid rgba(0,0,0,.12) !important;\n  border-left: 7px solid #004080 !important;\n  border-radius: 14px !important;\n  overflow: hidden !important;\n  background: #fff !important;\n  box-shadow: 0 1px 0 rgba(0,0,0,.04) !important;\n  padding: 0 !important;\n}.lr-doc \/* bandeau question *\/\n.md-typeset .admonition.faq > .admonition-title{\n  background: rgba(0,64,128,.10) !important;\n  border-bottom: 1px solid rgba(0,0,0,.08) !important;\n  color: #0f172a !important;\n}.lr-doc \/* ic\u00f4ne \u00e0 gauche (question mark Material) *\/\n.md-typeset .admonition.faq > .admonition-title::before{\n  background-color: #004080 !important;\n  -webkit-mask-image: var(--md-admonition-icon--question) !important;\n  mask-image: var(--md-admonition-icon--question) !important;\n}.lr-doc \/* corps r\u00e9ponse *\/\n.md-typeset .admonition.faq > :not(.admonition-title){\n  padding: .75rem 1rem !important;\n}\n\n<\/style>\n\n\n  \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"><\/label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#classe-lrserver\" class=\"md-skip\">\n          Aller au contenu\n        <\/a>\n      \n    <\/div>\n    <div data-md-component=\"announce\">\n      \n    <\/div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"En-t\u00eate\">\n    <a href=\"https:\/\/lightrest.codeline.fr\/docs\" title=\"LightREST V3 documentation\" class=\"md-header__button md-logo\" aria-label=\"LightREST V3 documentation\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54\"\/><\/svg>\n\n    <\/a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      \n      <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z\"\/><\/svg>\n    <\/label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            LightREST V3 documentation\n          <\/span>\n        <\/div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              lrServer\n            \n          <\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n    \n    \n      \n    \n    \n    \n      \n      \n        <label class=\"md-header__button md-icon\" for=\"__search\">\n          \n          <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5\"\/><\/svg>\n        <\/label>\n        <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"><\/label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Rechercher\" placeholder=\"Rechercher\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        \n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5\"\/><\/svg>\n        \n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z\"\/><\/svg>\n      <\/label>\n      <nav class=\"md-search__options\" aria-label=\"Recherche\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Effacer\" aria-label=\"Effacer\" tabindex=\"-1\">\n          \n          <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\/><\/svg>\n        <\/button>\n      <\/nav>\n      \n    <\/form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" tabindex=\"0\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initialisation de la recherche\n          <\/div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"><\/ol>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n      \n    \n    \n  <\/nav>\n  \n<\/header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"https:\/\/lightrest.codeline.fr\/docs\" title=\"LightREST V3 documentation\" class=\"md-nav__button md-logo\" aria-label=\"LightREST V3 documentation\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54\"\/><\/svg>\n\n    <\/a>\n    LightREST V3 documentation\n  <\/label>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n  \n  \n    \n  \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          \n  \n  \n  <span class=\"md-ellipsis\">\n    \n  \n    lrServer\n  \n\n    \n  <\/span>\n  \n  \n\n          <span class=\"md-nav__icon md-icon\"><\/span>\n        <\/label>\n      \n      <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver\" class=\"md-nav__link md-nav__link--active\">\n        \n  \n  \n  <span class=\"md-ellipsis\">\n    \n  \n    lrServer\n  \n\n    \n  <\/span>\n  \n  \n\n      <\/a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table des mati\u00e8res\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"><\/span>\n      Table des mati\u00e8res\n    <\/label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#_1\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        &nbsp;\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#ciphering-regex\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Ciphering &amp; RegEx\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#timeouts-maxrequests\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Timeouts &amp; MaxRequests\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#monitoring-log\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Monitoring &amp; log\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#methodes-http\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        M\u00e9thodes HTTP\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#valeurs-par-defaut\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Valeurs par d\u00e9faut\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#methodes\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        M\u00e9thodes\n      \n    <\/span>\n  <\/a>\n  \n    <nav class=\"md-nav\" aria-label=\"M\u00e9thodes\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#routing-hooks\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Routing \/ Hooks\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#controle-du-serveur\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Contr\u00f4le du serveur\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#id-ciphering\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        ID Ciphering\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#http-headers\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        HTTP Headers\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#certificats\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Certificats\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n        \n      <\/ul>\n    <\/nav>\n  \n<\/li>\n      \n    <\/ul>\n  \n<\/nav>\n      \n    <\/li>\n  \n\n    \n      \n      \n  \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrrequest\" class=\"md-nav__link\">\n        \n  \n  \n  <span class=\"md-ellipsis\">\n    \n  \n    lrRequest\n  \n\n    \n  <\/span>\n  \n  \n\n      <\/a>\n    <\/li>\n  \n\n    \n      \n      \n  \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrresponse\" class=\"md-nav__link\">\n        \n  \n  \n  <span class=\"md-ellipsis\">\n    \n  \n    lrResponse\n  \n\n    \n  <\/span>\n  \n  \n\n      <\/a>\n    <\/li>\n  \n\n    \n      \n      \n  \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrroute\" class=\"md-nav__link\">\n        \n  \n  \n  <span class=\"md-ellipsis\">\n    \n  \n    lrRoute\n  \n\n    \n  <\/span>\n  \n  \n\n      <\/a>\n    <\/li>\n  \n\n    \n      \n      \n  \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrhook\" class=\"md-nav__link\">\n        \n  \n  \n  <span class=\"md-ellipsis\">\n    \n  \n    lrHook\n  \n\n    \n  <\/span>\n  \n  \n\n      <\/a>\n    <\/li>\n  \n\n    \n      \n      \n  \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrsession\" class=\"md-nav__link\">\n        \n  \n  \n  <span class=\"md-ellipsis\">\n    \n  \n    lrSession\n  \n\n    \n  <\/span>\n  \n  \n\n      <\/a>\n    <\/li>\n  \n\n    \n      \n      \n  \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"https:\/\/lightrest.codeline.fr\/docs\/faq\" class=\"md-nav__link\">\n        \n  \n  \n  <span class=\"md-ellipsis\">\n    \n  \n    FAQ\n  \n\n    \n  <\/span>\n  \n  \n\n      <\/a>\n    <\/li>\n  \n\n    \n      \n      \n  \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"https:\/\/lightrest.codeline.fr\/docs\/bp\/index.md\" class=\"md-nav__link\">\n        \n  \n  \n  <span class=\"md-ellipsis\">\n    \n  \n    BP\n  \n\n    \n  <\/span>\n  \n  \n\n      <\/a>\n    <\/li>\n  \n\n    \n  <\/ul>\n<\/nav>\n                  <\/div>\n                <\/div>\n              <\/div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table des mati\u00e8res\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"><\/span>\n      Table des mati\u00e8res\n    <\/label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#_1\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        &nbsp;\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#ciphering-regex\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Ciphering &amp; RegEx\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#timeouts-maxrequests\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Timeouts &amp; MaxRequests\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#monitoring-log\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Monitoring &amp; log\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#methodes-http\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        M\u00e9thodes HTTP\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#valeurs-par-defaut\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Valeurs par d\u00e9faut\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#methodes\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        M\u00e9thodes\n      \n    <\/span>\n  <\/a>\n  \n    <nav class=\"md-nav\" aria-label=\"M\u00e9thodes\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#routing-hooks\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Routing \/ Hooks\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#controle-du-serveur\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Contr\u00f4le du serveur\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#id-ciphering\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        ID Ciphering\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#http-headers\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        HTTP Headers\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#certificats\" class=\"md-nav__link\">\n    <span class=\"md-ellipsis\">\n      \n        Certificats\n      \n    <\/span>\n  <\/a>\n  \n<\/li>\n        \n      <\/ul>\n    <\/nav>\n  \n<\/li>\n      \n    <\/ul>\n  \n<\/nav>\n                  <\/div>\n                <\/div>\n              <\/div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              \n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n\n\n<h1 id=\"classe-lrserver\">Classe lrServer<a class=\"headerlink\" href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#classe-lrserver\" title=\"Permanent link\">&para;<\/a><\/h1>\n<!-- GENERATED_BY_CODE_LINE_RENDER_API_V3_2026-01-27 -->\n\n<div class=\"admonition abstract\">\n<p class=\"admonition-title\">Role<\/p>\n<p>Configuration et ex\u00e9cution d\u2019un serveur LightREST (HTTP\/HTTPS), routage, timeouts, headers globaux, hooks (niveau serveur et route), et chiffrement\/d\u00e9chiffrement d\u2019identifiants.<\/p>\n<\/div>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M10.25 2c.19 0 .36.11.44.26l2.22 3.96.09.28-.09.28-2.22 3.96c-.08.15-.25.26-.44.26h-4.5c-.19 0-.36-.11-.44-.26L3.09 6.78 3 6.5l.09-.28 2.22-3.96c.08-.15.25-.26.44-.26zm0 11c.19 0 .36.11.44.26l2.22 3.96.09.28-.09.28-2.22 3.96c-.08.15-.25.26-.44.26h-4.5c-.19 0-.36-.11-.44-.26l-2.22-3.96L3 17.5l.09-.28 2.22-3.96c.08-.15.25-.26.44-.26zm9.25-5.5c.19 0 .36.11.44.26l2.22 3.96.09.28-.09.28-2.22 3.96c-.08.15-.25.26-.44.26H15c-.19 0-.36-.11-.44-.26l-2.22-3.96-.09-.28.09-.28 2.22-3.96c.08-.15.25-.26.44-.26z\"\/><\/svg><\/span> Membres et propri\u00e9t\u00e9s<\/summary>\n<h3 id=\"_1\">&nbsp;<a class=\"headerlink\" href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#_1\" title=\"Permanent link\">&para;<\/a><\/h3>\n<p><table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"member-ipandport\"><td><code>IPAndPort<\/code><\/td><td>cha\u00eene<\/td><td>Interface r\u00e9seau et port d\u2019\u00e9coute.<br>\nSi on indique une IP = 0.0.0.0, le serveur LightREST \u00e9coutera toutes les interfaces (dont 127.0.0.1).<br>\n<br>\nExemple : <em>0.0.0.0:9000<\/em> ou 192.168.1.150:<em>8888<\/em><br>\n<\/td><\/tr>\n    <tr id=\"member-customdata\"><td><code>CustomData<\/code><\/td><td>Variant<\/td><td>Donn\u00e9es personnalis\u00e9es associ\u00e9es au serveur, qui seront transmises automatiquement \u00e0 chaque requ\u00eate dans le propri\u00e9t\u00e9 <em><a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrrequest?h=ServerCustomData\">lrRequest:ServerCustomData<\/a><\/em>.<br>\nUtile par exemple pour y stocker des param\u00e8tres globaux et \u00e9viter de les relire \u00e0 chaque ex\u00e9cution d'une requ\u00eate.<br>\n<\/td><\/tr>\n    <tr id=\"member-httpmode\"><td><code>HTTPMode<\/code><\/td><td>\u00c9num\u00e9ration enHTTPMode<\/td><td>Mode de chiffrement de la communication.<br>\n<br>\nSelon le mode HTTP choisi, il conviendra de d\u00e9terminer les param\u00e8tres de gestion du certificat SSL avec ces m\u00e9thodes:<br>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0- HTTP : Aucun chiffrement. Mode par d\u00e9faut (utile pour d\u00e9velopper en mode local, d\u00e9conseill\u00e9 en production)<br>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0- HTTPS_CERT : SSL avec certificat fourni avec la m\u00e9thode <em><a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver\/?h=sethttpscertificate\">SetHTTPSCertificate<\/a><\/em><br>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0- HTTPS_SELF : SSL avec certificat auto-g\u00e9n\u00e9r\u00e9, param\u00e8tres fournis avec la m\u00e9thode <em><a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver\/?h=setselfcertificateparameters\">SetSelfCertificateParameters<\/a><\/em><br>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0- HTTPS_LETS_ENCRYPT : SSL avec certificat Let's Encrypt auto-renouvel\u00e9, param\u00e8tres fournis avec la m\u00e9thode <em><a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver\/?h=setletsencryptparameters\">SetLetsEncryptParameters<\/a><\/em><br>\n<\/td><\/tr>\n    <tr id=\"member-state\"><td><code>State<\/code><\/td><td>Enum\u00e9ration enServerState<\/td><td>\u00c9tat courant du serveur (lecture seule).<br>\nValeurs possibles : <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=enServerState\">STARTING, STARTED, STOPPING, STOPPED<\/a>.<br>\n<\/td><\/tr>\n    <tr id=\"member-tempfolder\"><td><code>TempFolder<\/code><\/td><td>cha\u00eene<\/td><td>R\u00e9pertoire temporaire utilis\u00e9 par le serveur.<br>\nPar d\u00e9faut = le r\u00e9pertoire temporaire du user (retourn\u00e9 par la fonction WinDev <a href=\"https:\/\/doc.pcsoft.fr\/fr-FR\/?3036044&amp;name=fTempPath\"><em>fR\u00e9pertoireTemp()<\/em><\/a>).<br>\n<br>\nSert au stockage de fichiers temporaires par le composant.<br>\n<\/td><\/tr>\n  <\/tbody>\n<\/table><\/p>\n<h3 id=\"ciphering-regex\">Ciphering &amp; RegEx<a class=\"headerlink\" href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#ciphering-regex\" title=\"Permanent link\">&para;<\/a><\/h3>\n<p><table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"member-cipheringkey\"><td><code>CipheringKey<\/code><\/td><td>Buffer<\/td><td>Cl\u00e9 de chiffrement utilis\u00e9e par les m\u00e9thodes <em><a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver\/?h=cipherid\">CipherID<\/a><\/em> et <em><a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver\/?h=decipherid\">DecipherID<\/a><\/em>.<br>\n<br>\n<img decoding=\"async\" alt=\"\u26a0\" class=\"twemoji\" src=\"https:\/\/cdn.jsdelivr.net\/gh\/jdecked\/twemoji@16.0.1\/assets\/svg\/26a0.svg\" title=\":warning:\" \/> Une cl\u00e9 est d\u00e9finie par d\u00e9faut lors de l'instanciation de l'objet. En cas de red\u00e9marrage du serveur, une nouvelle cl\u00e9 sera affect\u00e9e. Donc si des clients envoient des requ\u00eates REST comprenant des IDs chiffr\u00e9s avec la cl\u00e9 initiale, ceux-ci seront inexploitables. Pour s'en pr\u00e9munir, il faut donc affecter une cl\u00e9 fixe, ou bien avec une rotation r\u00e9guli\u00e8re; ainsi les IDs chiffr\u00e9es resteront valides en cas de red\u00e9marrage.<br>\n<\/td><\/tr>\n    <tr id=\"member-noregex\"><td><code>NoRegex<\/code><\/td><td>Booleen<\/td><td>D\u00e9sactive la v\u00e9rification RegEx de la syntaxe des routes lors de leur ajout avec la m\u00e9thode <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=addroute\"><em>:AddRoute<\/em><\/a>.<br>\n<br>\nValeur par d\u00e9faut = Faux<br>\n<\/td><\/tr>\n  <\/tbody>\n<\/table><\/p>\n<h3 id=\"timeouts-maxrequests\">Timeouts &amp; MaxRequests<a class=\"headerlink\" href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#timeouts-maxrequests\" title=\"Permanent link\">&para;<\/a><\/h3>\n<p><table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"member-idletimeout\"><td><code>IdleTimeout<\/code><\/td><td>Dur\u00e9e<\/td><td>Timeout d\u2019inactivit\u00e9 entre deux requ\u00eates sur une m\u00eame connexion HTTP (keep-alive).<br>\nValeur par d\u00e9faut = 60s (constante :DEFAULT_IDLE_TIMEOUT)<br>\n<br>\nCe d\u00e9lai s\u2019applique uniquement lorsqu\u2019aucune requ\u00eate n\u2019est en cours et que le serveur attend une nouvelle requ\u00eate sur la m\u00eame connexion. Lorsque la r\u00eaqu\u00eate suivante arrive, elle est trait\u00e9e imm\u00e9diatement dans ren\u00e9gociation de la connexion, donc gain de performances.<br>\nEn cas de d\u00e9passement du d\u00e9lai, le serveur ferme proprement la connexion et lib\u00e8re les ressources associ\u00e9es.<br>\n<br>\n<img decoding=\"async\" alt=\"\u2139\" class=\"twemoji\" src=\"https:\/\/cdn.jsdelivr.net\/gh\/jdecked\/twemoji@16.0.1\/assets\/svg\/2139.svg\" title=\":information:\" \/> IdleTimeout ne limite pas la dur\u00e9e d\u2019ex\u00e9cution maximale d\u2019une route. Pour cela, utiliser <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=writetimeout\"><em>WriteTimeout<\/em><\/a> (et\/ou un timeout sp\u00e9cifique \u00e0 la route).<br>\n<\/td><\/tr>\n    <tr id=\"member-readtimeout\"><td><code>ReadTimeout<\/code><\/td><td>Dur\u00e9e<\/td><td>Timeout de lecture sur la connexion du client REST.<br>\nValeur par d\u00e9faut = 30s (constante :DEFAULT_READ_TIMEOUT)<br>\n<br>\nEn cas de d\u00e9passement, les ressources sont liblib\u00e9r\u00e9es c\u00f4t\u00e9 serveur. Aucune erreur n'est renvoy\u00e9e au client (car on consid\u00e8re que la connexion est tomb\u00e9e, donc communication impossible).<br>\n<\/td><\/tr>\n    <tr id=\"member-requesttimeout\"><td><code>RequestTimeout<\/code><\/td><td>Dur\u00e9e<\/td><td>Timeout par d\u00e9faut appliqu\u00e9 aux routes.<br>\nValeur par d\u00e9faut = 30s (constante :DEFAULT_REQUEST_TIMEOUT)<br>\n<br>\nEn cas de d\u00e9passement, l'ex\u00e9cution du Handler REST WinDev est annul\u00e9e et une erreur HTTP 408 (<a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrresponse?h=StatusRequestTimeout\"><em>StatusRequestTimeout<\/em><\/a>) est envoy\u00e9e au client.<br>\n<br>\n<img decoding=\"async\" alt=\"\u2139\" class=\"twemoji\" src=\"https:\/\/cdn.jsdelivr.net\/gh\/jdecked\/twemoji@16.0.1\/assets\/svg\/2139.svg\" title=\":information_source:\" \/> Peut \u00eatre surcharg\u00e9 sp\u00e9cifiquement sur une route avec la propri\u00e9t\u00e9 <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrroute?h=Timeout\"><em>lrRoute:Timeout<\/em><\/a><br>\n<\/td><\/tr>\n    <tr id=\"member-writetimeout\"><td><code>WriteTimeout<\/code><\/td><td>Dur\u00e9e<\/td><td>Timeout d'\u00e9criture sur la connexion du client REST.<br>\nValeur par d\u00e9faut = 30s (constante :DEFAULT_WRITE_TIMEOUT).<br>\n<br>\nEn cas de d\u00e9passement, les ressources sont lib\u00e9r\u00e9es c\u00f4t\u00e9 serveur. Aucune erreur n'est renvoy\u00e9e au client (car on consid\u00e8re que la connexion est tomb\u00e9e, donc communication impossible).<br>\n<br>\n<img decoding=\"async\" alt=\"\u26a0\" class=\"twemoji\" src=\"https:\/\/cdn.jsdelivr.net\/gh\/jdecked\/twemoji@16.0.1\/assets\/svg\/26a0.svg\" title=\":warning:\" \/> WriteTimeout doit \u00eatre sup\u00e9rieur au plus grand timeout des routes (ou du serveur) + une marge pour laisser le temps d'envoyer les ent\u00eates. Si WriteTimeout &lt; Timeout route, la connexion avec le client sera coup\u00e9e avant que le timeout soit arriv\u00e9 \u00e0 \u00e9ch\u00e9ance.<br>\n<\/td><\/tr>\n    <tr id=\"member-maxrequests\"><td><code>MaxRequests<\/code><\/td><td>entier<\/td><td>Nombre maximum de requ\u00eates trait\u00e9es simultan\u00e9ment par le serveur.<br>\nValeur par d\u00e9faut : 100 (constante :DEFAULT_MAX_REQUEST)<br>\nPermet d'\u00e9viter la surcharge du serveur. Lorsque le nombre de requ\u00eate maximal est atteint, une erreur HTTP 503 (<a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrresponse\/?h=StatusServiceUnavailable\"><em>StatusServiceUnavailable<\/em><\/a>) est envoy\u00e9e au client.<br>\n<\/td><\/tr>\n  <\/tbody>\n<\/table><\/p>\n<h3 id=\"monitoring-log\">Monitoring &amp; log<a class=\"headerlink\" href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#monitoring-log\" title=\"Permanent link\">&para;<\/a><\/h3>\n<p><table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"member-logger\"><td><code>Logger<\/code><\/td><td>bool\u00e9en<\/td><td>Active ou d\u00e9sactive le logger interne du moteur LightREST.<br>\nPar d\u00e9faut = Faux.<br>\nChronophage et verbeux, \u00e0 n'utiliser principalement qu'en phase de debug du composant.<br>\nEcrit par d\u00e9faut dans le fichier lr_log situ\u00e9 dans le r\u00e9pertoire de l'ex\u00e9cutable. Pour indiquer un autre nom, utiliser la propri\u00e9t\u00e9 <em>:LoggerFile<\/em>.<br>\n<\/td><\/tr>\n    <tr id=\"member-loggerfile\"><td><code>LoggerFile<\/code><\/td><td>cha\u00eene<\/td><td>Chemin du fichier de log lorsque le logger est activ\u00e9.<br>\n<\/td><\/tr>\n    <tr id=\"member-monitoring\"><td><code>Monitoring<\/code><\/td><td>bool\u00e9en<\/td><td>Active le monitoring des requ\u00eates.<br>\nValeur par d\u00e9faut = Faux<br>\nAjoute dans le HEADER de chaque r\u00e9ponse les temps :<br>\n\u00a0\u00a0\u00a0- global du traitement de la requ\u00eate dans <em>Chrono-Global-Millisec<\/em><br>\n\u00a0\u00a0\u00a0- d'ex\u00e9cution du Handler REST WinDev dans <em>Chrono-Methode-Millisec<\/em><br>\n<\/td><\/tr>\n    <tr id=\"member-windeverrordetails\"><td><code>WindevErrorDetails<\/code><\/td><td>entier<\/td><td>Niveau de d\u00e9tail pour des erreurs retourn\u00e9es au client.<br>\nD\u00e9faut = ErrComplet (constante :DEFAULT_WINDEV_ERROR_LEVEL)<br>\n<br>\nContr\u00f4le la verbosit\u00e9 des erreurs WinDev envoy\u00e9es au client REST.<br>\n<br>\nLightREST r\u00e9cup\u00e8re (dans la mesure du possible) les erreurs et exceptions survenues lors de l'ex\u00e9cution des m\u00e9thodes REST, et envoie automatiquement au client une erreur HTTP 500 (<a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrresponse?h=StatusInternalServerError\"><em>StatusInternalServerError<\/em><\/a>) accompagn\u00e9 du contenu de ErreurInfo() ou ExceptionInfo().<br>\n<br>\nLe membre :WindevErrorDetails permet de choisir le niveau de d\u00e9tail de l'erreur envoy\u00e9e, pour \u00e9viter par exemple d'exposer des informations techniques sensibles). Il doit correspondre \u00e0 une des <a href=\"https:\/\/doc.windev.com\/fr-FR\/?3034018&amp;name=Constantes_Erreur\"><em>constantes Err<\/em>*<\/a> support\u00e9es par WinDev^\u00ae^.<br>\n<\/td><\/tr>\n  <\/tbody>\n<\/table><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 5v2h17V5M4 11h17V9H4m0 10h17v-2H4m0-2h17v-2H4z\"\/><\/svg><\/span> Types<\/summary>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 4h4v4H3zm6 1v2h12V5zm-6 5h4v4H3zm6 1v2h12v-2zm-6 5h4v4H3zm6 1v2h12v-2z\"\/><\/svg><\/span> enServerState \u2014 \u00c9tat du serveur<\/summary>\n<p><div id=\"type-enserverstate\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"type-enserverstate-type\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83c\udff7\ufe0f Type<\/div>\n  <div class=\"lr-secbody\">\n<code>Enum\u00e9ration<\/code>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"type-enserverstate-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nIndique l'\u00e9tat actuel du serveur LightREST.\nType retourn\u00e9 par la propri\u00e9t\u00e9 propri\u00e9t\u00e9 <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=state\">:State<\/a>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"type-enserverstate-def\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\ud83d\udccb Valeurs<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:78%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Valeur<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"type-enserverstate-value-1\"><td><code>STARTING<\/code><\/td><td>En cours de d\u00e9marrage<\/td><\/tr>\n    <tr id=\"type-enserverstate-value-2\"><td><code>STARTED<\/code><\/td><td>D\u00e9marr\u00e9, pr\u00eat pour ex\u00e9cuter les requ\u00eates<\/td><\/tr>\n    <tr id=\"type-enserverstate-value-3\"><td><code>STOPPING<\/code><\/td><td>En cours d'arr\u00eat (g\u00e9n\u00e9ralement en attente de terminaison des requ\u00eates en cours)<\/td><\/tr>\n    <tr id=\"type-enserverstate-value-4\"><td><code>STOPPED<\/code><\/td><td>Arr\u00eat\u00e9<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M11 13.5v8H3v-8zM12 2l5.5 9h-11zm5.5 11c2.5 0 4.5 2 4.5 4.5S20 22 17.5 22 13 20 13 17.5s2-4.5 4.5-4.5\"\/><\/svg><\/span> lrSSLCertificate \u2014 D\u00e9finition du certificat SSL<\/summary>\n<p><div id=\"type-lrsslcertificate\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"type-lrsslcertificate-type\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83c\udff7\ufe0f Type<\/div>\n  <div class=\"lr-secbody\">\n<code>Structure<\/code>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"type-lrsslcertificate-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nD\u00e9termine le contenu du certificat SSL et de sa cl\u00e9 priv\u00e9e lorsque <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=HttpMode\"><em>:HttpMode<\/em><\/a> = <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=HTTPS_CERTIFICATE\"><em>HTTPS_CERTIFICATE<\/em><\/a>.\nStructure pass\u00e9e en param\u00e8tre \u00e0 la m\u00e9thode <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=SetHTTPSCertificate\"><em>:SetHTTPSCertificate()<\/em><\/a>.\n  <\/div>\n<\/div><\/p>\n<p><div id=\"type-lrsslcertificate-def\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Structure<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"type-lrsslcertificate-member-certificate\"><td><code>Certificate<\/code><\/td><td>cha\u00eene<\/td><td>Contenu du certificat SSL<\/td><\/tr>\n    <tr id=\"type-lrsslcertificate-member-privatekey\"><td><code>PrivateKey<\/code><\/td><td>cha\u00eene<\/td><td>Cl\u00e9 priv\u00e9e<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M11 13.5v8H3v-8zM12 2l5.5 9h-11zm5.5 11c2.5 0 4.5 2 4.5 4.5S20 22 17.5 22 13 20 13 17.5s2-4.5 4.5-4.5\"\/><\/svg><\/span> stLogger \u2014 Param\u00e8tres de journalisation<\/summary>\n<p><div id=\"type-stlogger\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"type-stlogger-type\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83c\udff7\ufe0f Type<\/div>\n  <div class=\"lr-secbody\">\n<code>Structure<\/code>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"type-stlogger-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nParam\u00e8tres de la journalisation bas niveau (moteur LightREST GO)\n  <\/div>\n<\/div><\/p>\n<p><div id=\"type-stlogger-def\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Structure<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"type-stlogger-member-blogger\"><td><code>bLogger<\/code><\/td><td>bool\u00e9en<\/td><td>Activation de la journalisation<br><img decoding=\"async\" alt=\"\u26a0\" class=\"twemoji\" src=\"https:\/\/cdn.jsdelivr.net\/gh\/jdecked\/twemoji@16.0.1\/assets\/svg\/26a0.svg\" title=\":warning:\" \/> Chronophage, \u00e0 r\u00e9server au debug du composant.<\/td><\/tr>\n    <tr id=\"type-stlogger-member-sloggerfile\"><td><code>sLoggerFile<\/code><\/td><td>cha\u00eene<\/td><td>Nom du fichier de log<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M11 13.5v8H3v-8zM12 2l5.5 9h-11zm5.5 11c2.5 0 4.5 2 4.5 4.5S20 22 17.5 22 13 20 13 17.5s2-4.5 4.5-4.5\"\/><\/svg><\/span> lrLetsEncrypt \u2014 Param\u00e8tres Let's Encrypt<\/summary>\n<p><div id=\"type-lrletsencrypt\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"type-lrletsencrypt-type\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83c\udff7\ufe0f Type<\/div>\n  <div class=\"lr-secbody\">\n<code>Structure<\/code>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"type-lrletsencrypt-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nStructure pass\u00e9e en param\u00e8tre \u00e0 la m\u00e9thode <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=SetLetsEncryptParameters\"><em>:SetLetsEncryptParameters()<\/em><\/a>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"type-lrletsencrypt-def\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Structure<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"type-lrletsencrypt-member-domains\"><td><code>Domains<\/code><\/td><td>tableau de cha\u00eenes<\/td><td>Domaines pour lesquels le certificat Let's Encrypt doit \u00eatre g\u00e9n\u00e9r\u00e9.<\/td><\/tr>\n    <tr id=\"type-lrletsencrypt-member-email\"><td><code>Email<\/code><\/td><td>cha\u00eene<\/td><td>Email de l'administrateur<\/td><\/tr>\n    <tr id=\"type-lrletsencrypt-member-certificatepath\"><td><code>CertificatePath<\/code><\/td><td>cha\u00eene<\/td><td>Chemin de stockage du certificat<\/td><\/tr>\n    <tr id=\"type-lrletsencrypt-member-renewdelay\"><td><code>RenewDelay<\/code><\/td><td>entier<\/td><td>D\u00e9lai de renouvellement (en nombre de jours avant l'expiration)<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M11 13.5v8H3v-8zM12 2l5.5 9h-11zm5.5 11c2.5 0 4.5 2 4.5 4.5S20 22 17.5 22 13 20 13 17.5s2-4.5 4.5-4.5\"\/><\/svg><\/span> lrSelfCertificate \u2014 Param\u00e8tres du certificat auto-sign\u00e9<\/summary>\n<p><div id=\"type-lrselfcertificate\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"type-lrselfcertificate-type\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83c\udff7\ufe0f Type<\/div>\n  <div class=\"lr-secbody\">\n<code>Structure<\/code>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"type-lrselfcertificate-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nStructure pass\u00e9e en param\u00e8tre \u00e0 la m\u00e9thode <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=SetSelfCertificateParameters\"><em>:SetSelfCertificateParameters()<\/em><\/a>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"type-lrselfcertificate-def\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Structure<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"type-lrselfcertificate-member-keysize\"><td><code>KeySize<\/code><\/td><td>entier<\/td><td>Taille de la cl\u00e9 (2048 par d\u00e9faut)<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 4h4v4H3zm6 1v2h12V5zm-6 5h4v4H3zm6 1v2h12v-2zm-6 5h4v4H3zm6 1v2h12v-2z\"\/><\/svg><\/span> enHTTPMode \u2014 Mode de fonctionnement HTTP\/HTTPS<\/summary>\n<p><div id=\"type-enhttpmode\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"type-enhttpmode-type\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83c\udff7\ufe0f Type<\/div>\n  <div class=\"lr-secbody\">\n<code>Enum\u00e9ration<\/code>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"type-enhttpmode-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nPermet de d\u00e9terminer le mode de fonctionnement HTTP\/HTTPS. Voir la propri\u00e9t\u00e9 <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=HTTPMode\"><em>:HTTPMode<\/em><\/a>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"type-enhttpmode-def\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\ud83d\udccb Valeurs<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:78%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Valeur<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"type-enhttpmode-value-1\"><td><code>HTTP<\/code><\/td><td>Pas de chiffrement de la communication, pas de certificat<\/td><\/tr>\n    <tr id=\"type-enhttpmode-value-2\"><td><code>HTTPS_CERT<\/code><\/td><td>Certificat SSL fourni (voir <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=SetHTTPSCertificate\"><em>:SetHTTPSCertificate()<\/em><\/a>)<\/td><\/tr>\n    <tr id=\"type-enhttpmode-value-3\"><td><code>HTTPS_SELF<\/code><\/td><td>Certificat SSL auto g\u00e9n\u00e9r\u00e9. (voir <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=SetSelfCertificateParameters\"><em>:SetSelfCertificateParameters()<\/em><\/a>)<\/td><\/tr>\n    <tr id=\"type-enhttpmode-value-4\"><td><code>HTTPS_LETS_ENCRYPT<\/code><\/td><td>Certificat Let's Encrypt (voir <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=SetLetsEncryptParameters\"><em>:SetLetsEncryptParameters()<\/em><\/a>)<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2a10 10 0 0 1 10 10 10 10 0 0 1-10 10A10 10 0 0 1 2 12 10 10 0 0 1 12 2m-1 5a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2v-1h-2v1h-2V9h2v1h2V9a2 2 0 0 0-2-2z\"\/><\/svg><\/span> Constantes<\/summary>\n<p><table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"const-route-regex\"><td><code>ROUTE_REGEX<\/code><\/td><td>cha\u00eene<\/td><td>Expression r\u00e9guli\u00e8re pour v\u00e9rification de la syntaxe des routes REST par la m\u00e9thode <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=AddRoute\"><em>:AddRoute()<\/em><\/a><br>\nValeur : \"^\/($|([A-Za-z0-9_-]+|{[A-Za-z0-9_]+})(\/([A-Za-z0-9_-]+|{[A-Za-z0-9_]+}))*$)\"<br>\n<\/td><\/tr>\n  <\/tbody>\n<\/table><\/p>\n<h3 id=\"methodes-http\">M\u00e9thodes HTTP<a class=\"headerlink\" href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#methodes-http\" title=\"Permanent link\">&para;<\/a><\/h3>\n<p><table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"const-methodget\"><td><code>MethodGET<\/code><\/td><td>cha\u00eene<\/td><td>M\u00e9thode REST <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9110.html#GET\">GET<\/a><\/td><\/tr>\n    <tr id=\"const-methodpost\"><td><code>MethodPOST<\/code><\/td><td>cha\u00eene<\/td><td>M\u00e9thode REST <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9110.html#POST\">POST<\/a><\/td><\/tr>\n    <tr id=\"const-methodput\"><td><code>MethodPUT<\/code><\/td><td>cha\u00eene<\/td><td>M\u00e9thode REST <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9110.html#PUT\">PUT<\/a><\/td><\/tr>\n    <tr id=\"const-methoddelete\"><td><code>MethodDELETE<\/code><\/td><td>cha\u00eene<\/td><td>M\u00e9thode REST <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9110.html#DELETE\">DELETE<\/a><\/td><\/tr>\n    <tr id=\"const-methodhead\"><td><code>MethodHEAD<\/code><\/td><td>cha\u00eene<\/td><td>M\u00e9thode REST <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9110.html#HEAD\">HEAD<\/a><\/td><\/tr>\n    <tr id=\"const-methodpatch\"><td><code>MethodPATCH<\/code><\/td><td>cha\u00eene<\/td><td>M\u00e9thode REST <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9110.html#PATCH\">PATCH<\/a><\/td><\/tr>\n    <tr id=\"const-methodoptions\"><td><code>MethodOPTIONS<\/code><\/td><td>cha\u00eene<\/td><td>M\u00e9thode REST  <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9110.html#OPTIONS\">OPTIONS<\/a><\/td><\/tr>\n    <tr id=\"const-methodtrace\"><td><code>MethodTRACE<\/code><\/td><td>cha\u00eene<\/td><td>M\u00e9thode REST  <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9110.html#TRACE\">TRACE<\/a><\/td><\/tr>\n  <\/tbody>\n<\/table><\/p>\n<h3 id=\"valeurs-par-defaut\">Valeurs par d\u00e9faut<a class=\"headerlink\" href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#valeurs-par-defaut\" title=\"Permanent link\">&para;<\/a><\/h3>\n<p><table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"const-default-max-request\"><td><code>DEFAULT_MAX_REQUEST<\/code><\/td><td>entier<\/td><td>Valeur par d\u00e9faut du membre <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=MaxRequests\"><em>:MaxRequests<\/em><\/a><\/td><\/tr>\n    <tr id=\"const-default-request-timeout\"><td><code>DEFAULT_REQUEST_TIMEOUT<\/code><\/td><td>Dur\u00e9e<\/td><td>Valeur par d\u00e9faut du membre <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=RequestTimeout\"><em>:RequestTimeout<\/em><\/a><\/td><\/tr>\n    <tr id=\"const-default-read-timeout\"><td><code>DEFAULT_READ_TIMEOUT<\/code><\/td><td>Dur\u00e9e<\/td><td>Valeur par d\u00e9faut du membre <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=ReadTimeout\"><em>:ReadTimeout<\/em><\/a><\/td><\/tr>\n    <tr id=\"const-default-write-timeout\"><td><code>DEFAULT_WRITE_TIMEOUT<\/code><\/td><td>Dur\u00e9e<\/td><td>Valeur par d\u00e9faut du membre <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=WriteTimeout\"><em>:WriteTimeout<\/em><\/a><\/td><\/tr>\n    <tr id=\"const-default-idle-timeout\"><td><code>DEFAULT_IDLE_TIMEOUT<\/code><\/td><td>Dur\u00e9e<\/td><td>Valeur par d\u00e9faut du membre <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=IdleTimeout\"><em>:IdleTimeout<\/em><\/a><\/td><\/tr>\n    <tr id=\"const-default-windev-error-level\"><td><code>DEFAULT_WINDEV_ERROR_LEVEL<\/code><\/td><td>Entier<\/td><td>Valeur par d\u00e9faut du membre <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=WindevErrorDetails\"><em>:WindevErrorDetails<\/em><\/a><\/td><\/tr>\n  <\/tbody>\n<\/table><\/p>\n<\/details>\n<h2 id=\"methodes\">M\u00e9thodes<a class=\"headerlink\" href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#methodes\" title=\"Permanent link\">&para;<\/a><\/h2>\n<h3 id=\"routing-hooks\">Routing \/ Hooks<a class=\"headerlink\" href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#routing-hooks\" title=\"Permanent link\">&para;<\/a><\/h3>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M11 10H5L3 8l2-2h6V3l1-1 1 1v1h6l2 2-2 2h-6v2h6l2 2-2 2h-6v6a2 2 0 0 1 2 2H9a2 2 0 0 1 2-2z\"\/><\/svg><\/span> AddRoute<\/summary>\n<p><div id=\"method-addroute\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-addroute-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nAjoute une route REST au serveur en lui associant une fonction Handler.<br>\n<img decoding=\"async\" alt=\"\u2139\" class=\"twemoji\" src=\"https:\/\/cdn.jsdelivr.net\/gh\/jdecked\/twemoji@16.0.1\/assets\/svg\/2139.svg\" title=\":information:\" \/> Avant ajout, la syntaxe de la route est v\u00e9rifi\u00e9e avec une expression r\u00e9guli\u00e8re (<a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=route_regex\"><em>:ROUTE_REGEX<\/em><\/a>). Pour d\u00e9sactiver cette v\u00e9rification, positionner la propri\u00e9t\u00e9 <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=noregex\"><em>:NoRegex<\/em><\/a>=vrai.\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-addroute-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">Syntaxe 1            : AddRoute(poRoute objet <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrroute\/\">lrRoute<\/a>) : (bool\u00e9en, cha\u00eene)\nSyntaxe 2 (d\u00e9pr\u00e9ci\u00e9e): AddRoute(pRoute chaine, pMethod chaine, pFunction procedure(<a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrrequest\/\">lrRequest<\/a>), pTimeout duree = :RequestTimeout) : (bool\u00e9en, cha\u00eene)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-addroute-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-poroute\"><td><code>poRoute<\/code><\/td><td>Objet <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrroute\/\">lrRoute<\/a><\/td><td>D\u00e9finition compl\u00e8te de la route (m\u00e9thode, route, handler, timeout, hooks, ...)<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-addroute-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:78%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"return-1\"><td>bool\u00e9en<\/td><td>Vrai si la route est ajout\u00e9e.<\/td><\/tr>\n    <tr id=\"return-2\"><td>cha\u00eene<\/td><td>Message d\u2019erreur (vide si succ\u00e8s).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-addroute-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>D\u00e9marrage d'un serveur LightREST sur le port 9876<\/li>\n<li>Cr\u00e9ation d'une route <em>\/ping<\/em> qui renvoie l'heure syst\u00e8me et l'h\u00f4te du client REST<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\noRoute  est objet lrRoute\nbOK     est bool\u00e9en\nsErr    est cha\u00eene\n<span class=\"lr-blank\"><\/span>\noServer:IPAndPort = \"127.0.0.1:9876\"\n<span class=\"lr-blank\"><\/span>\noRoute.Method  = lrRoute::MethodGET\noRoute.Route   = \"\/ping\"\noRoute.Handler = piPing\n<span class=\"lr-blank\"><\/span>\n(bOK, sErr) = <span class=\"lr-hl\">oServer:AddRoute(oRoute)<\/span>\nSI PAS bOK ALORS\n    Erreur(\"Erreur lors de la cr\u00e9ation de la route : \", sErr)\n    RETOUR\nFIN\n<span class=\"lr-blank\"><\/span>\n(bOK, sErr) = oServer:Start()\nSI PAS bOK ALORS\n    Erreur(\"Erreur lors du d\u00e9marrage : \", sErr)\n    RETOUR\nFIN\n<span class=\"lr-blank\"><\/span>\nInfo(\"Call http:\/\/[%oServer:IPAndPort%][%oRoute:Route%]\", CRLF+\"Click on OK to close LightREST server\")\n<span class=\"lr-blank\"><\/span>\noServer:Terminate()\n<span class=\"lr-blank\"><\/span>\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n<span class=\"lr-blank\"><\/span>\nPROCEDURE INTERNE piPing(pRequest objet lrRequest) : objet lrResponse\n    oResp est objet lrResponse\n<span class=\"lr-blank\"><\/span>\n    oResp.Body        = \"Sending pong to host \" + pRequest.Host + \" at \" + DateVersCha\u00eene(DateHeureSys())\n    oResp.ContentType = lrResponse::ContentTXT\n    oResp:Status      = lrResponse::StatusOK\n<span class=\"lr-blank\"><\/span>\n    RENVOYER oResp\nFIN<\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M18 6a3.99 3.99 0 0 1-3 3.86V17a5 5 0 0 1-5 5 5 5 0 0 1-5-5v-5l5 5H7a3 3 0 0 0 3 3 3 3 0 0 0 3-3V9.86c-1.77-.46-3-2.06-3-3.89C10 3.76 11.8 2 14 2c2.22 0 4 1.79 4 4m-4 2a2 2 0 0 0 2-2 2 2 0 0 0-2-2 2 2 0 0 0-2 2 2 2 0 0 0 2 2\"\/><\/svg><\/span> AddHook<\/summary>\n<p><div id=\"method-addhook\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-addhook-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nAjout de hook(s) serveur (interception d'\u00e9v\u00e9nements).\nD\u00e9clenchement automatique de(s) hook en fonction des \u00e9v\u00e8nements d\u00e9finis dans chaque objet <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrhook\">lrHook<\/a> (ouverture d'une connexion, r\u00e9ception requ\u00eate, avant\/apr\u00e8s m\u00e9thode, r\u00e9sultat, warning, error, panic, etc...).<\/p>\n<p><img decoding=\"async\" alt=\"\u2139\" class=\"twemoji\" src=\"https:\/\/cdn.jsdelivr.net\/gh\/jdecked\/twemoji@16.0.1\/assets\/svg\/2139.svg\" title=\":information_source:\" \/> Pour un hook sp\u00e9cifique \u00e0 une seule route (ou un ordre diff\u00e9rent), utiliser <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrroute?h=addhook\">lrRoute:AddHook()<\/a>.\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-addhook-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">AddHook(poHook objet <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrhook\/\">lrHook<\/a>, [poHook2 objet lrHook, poHook3, ....])<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-addhook-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-pohook\"><td><code>poHook<\/code><\/td><td>Objet <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrhook\/\">lrHook<\/a><\/td><td>Hook(s) \u00e0 ajouter (type d\u2019\u00e9v\u00e8nements, handler, options d\u2019action sur la requ\u00eate\/r\u00e9ponse).<br>\n<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-addhook-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<div class=\"lr-empty\">(aucune)<\/div>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-addhook-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>Ajout d\u2019un hook global<\/li>\n<li>Le handler de Hook, lanc\u00e9 automatiquement \u00e0 chaque r\u00e9ception d'une requ\u00eate REST, ajoute un header sur les r\u00e9ponses<\/li>\n<li>Retourne EVE_OK pour poursuivre l'ex\u00e9cution<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\noHook   est objet lrHook\n<span class=\"lr-blank\"><\/span>\noHook:Events  = <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrhook\/?h=eve_received\">lrHook::EVE_RECEIVED<\/a>\noHook:Handler = fnHook\n<span class=\"lr-blank\"><\/span>\n<span class=\"lr-hl\">oServer:AddHook(oHook)<\/span>\n<span class=\"lr-blank\"><\/span>\nPROCEDURE INTERNE fnHook(pEventInfo <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrhook\/?h=eventinfo\">lrHook:EventInfo<\/a>) : <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrhook\/?h=eventreturn\">lrHook:EventReturn<\/a>)\n<span class=\"lr-blank\"><\/span>\n  \/\/ pEventInfo d\u00e9pend de lrHook (\u00e9v\u00e8nement, request, response, message...)\n  SI pEventInfo.Response &lt;&gt; Null ALORS\n    pEventInfo.Response:SetHeaderValue(\"X-LightREST-Hook\", \"1\")\n  FIN\n<span class=\"lr-blank\"><\/span>\n  RENVOYER <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrhook\/?h=eve_ok\">lrHook::EVE_OK<\/a>\nFIN<\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 1 3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5zm0 4a3 3 0 0 1 3 3 3 3 0 0 1-3 3 3 3 0 0 1-3-3 3 3 0 0 1 3-3m5.13 12A9.7 9.7 0 0 1 12 20.92 9.7 9.7 0 0 1 6.87 17c-.34-.5-.63-1-.87-1.53 0-1.65 2.71-3 6-3s6 1.32 6 3c-.24.53-.53 1.03-.87 1.53\"\/><\/svg><\/span> SetAuthenticationCheckFunction<\/summary>\n<p><div id=\"method-setauthenticationcheckfunction\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-setauthenticationcheckfunction-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\n<em>(D\u00e9pr\u00e9ci\u00e9)<\/em> <br> D\u00e9finit une fonction appel\u00e9e pour valider l\u2019authentification avant l\u2019ex\u00e9cution de la route.<br> Si la fonction de contr\u00f4le retourne Faux, la requ\u00eate est rejet\u00e9e avec un statut <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrresponse?h=StatusUnauthorized\"><em>401 - StatusUnauthorized<\/em><\/a>. <br><br> <img decoding=\"async\" alt=\"\u26a0\" class=\"twemoji\" src=\"https:\/\/cdn.jsdelivr.net\/gh\/jdecked\/twemoji@16.0.1\/assets\/svg\/26a0.svg\" title=\":warning:\" \/> Pr\u00e9f\u00e9rer un <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/lightrest-composant-rest-windev\/lightrest-documentation\/les-hooks\/\"><em>hook<\/em><\/a> ajout\u00e9 via <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=AddHook\"><em>:AddHook()<\/em><\/a> ou <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrroute?h=AddHook\"><em>lrRoute:AddHook()<\/em><\/a> ce qui permet un filtrage fin et un ordre d\u2019ex\u00e9cution contr\u00f4l\u00e9.\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setauthenticationcheckfunction-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">SetAuthenticationCheckFunction(pFunction proc\u00e9dure)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setauthenticationcheckfunction-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-pfunction\"><td><code>pFunction<\/code><\/td><td>proc\u00e9dure<\/td><td>Proc\u00e9dure de contr\u00f4le qui re\u00e7oit un lrRequest et retourne un bool\u00e9en (Vrai\/Faux).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setauthenticationcheckfunction-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<div class=\"lr-empty\">(aucune)<\/div>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setauthenticationcheckfunction-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>Ajout d\u2019un contr\u00f4le d\u2019acc\u00e8s simple bas\u00e9 sur un header <em>X-API-KEY<\/em><\/li>\n<li>La fonction sera appel\u00e9e automatiquement avant chaque ex\u00e9cution de requ\u00eate REST<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\n<span class=\"lr-blank\"><\/span>\n<span class=\"lr-hl\">oServer:SetAuthenticationCheckFunction(fnAuth)<\/span>\n<span class=\"lr-blank\"><\/span>\nPROCEDURE INTERNE fnAuth(pRequest objet lrRequest) : bool\u00e9en\n    sKey est cha\u00eene = pRequest:GetHeaderValue(\"X-API-KEY\")\n    RENVOYER (sKey=\"MY_SECRET_KEY\")\nFIN<\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<h3 id=\"controle-du-serveur\">Contr\u00f4le du serveur<a class=\"headerlink\" href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#controle-du-serveur\" title=\"Permanent link\">&para;<\/a><\/h3>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M10 16.5v-9l6 4.5M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2\"\/><\/svg><\/span> Start<\/summary>\n<p><div id=\"method-start\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-start-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nD\u00e9marre le serveur LigthREST\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-start-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">Start() : (bool\u00e9en, cha\u00eene)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-start-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<div class=\"lr-empty\">(aucun)<\/div>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-start-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:78%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"return-1\"><td>bool\u00e9en<\/td><td>Vrai si d\u00e9marrage r\u00e9ussi.<\/td><\/tr>\n    <tr id=\"return-2\"><td>cha\u00eene<\/td><td>Message d\u2019erreur (vide si succ\u00e8s).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-start-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>D\u00e9marrage d'un serveur LightREST sur le port 9876<\/li>\n<li>Cr\u00e9ation d'une route \/ping qui renvoie l'heure syst\u00e8me et l'h\u00f4te du client REST<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\noRoute  est objet lrRoute\nbOK     est bool\u00e9en\nsErr    est cha\u00eene\n<span class=\"lr-blank\"><\/span>\noServer:IPAndPort = \"127.0.0.1:9876\"\n<span class=\"lr-blank\"><\/span>\noRoute.Method  = lrRoute::MethodGET\noRoute.Route   = \"\/ping\"\noRoute.Handler = piPing\n<span class=\"lr-blank\"><\/span>\n(bOK, sErr) = oServer:AddRoute(oRoute)\nSI PAS bOK ALORS\n    Erreur(\"Erreur lors de la cr\u00e9ation de la route : \", sErr)\n    RETOUR\nFIN\n<span class=\"lr-blank\"><\/span>\n(bOK, sErr) = <span class=\"lr-hl\">oServer:Start()<\/span>\nSI PAS bOK ALORS\n    Erreur(\"Erreur lors du d\u00e9marrage : \", sErr)\n    RETOUR\nFIN\n<span class=\"lr-blank\"><\/span>\nInfo(\"Call http:\/\/[%oServer:IPAndPort%][%oRoute:Route%]\", CRLF+\"Click on OK to close LightREST server\")\n<span class=\"lr-blank\"><\/span>\noServer:Terminate()\n<span class=\"lr-blank\"><\/span>\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n<span class=\"lr-blank\"><\/span>\nPROCEDURE INTERNE piPing(pRequest objet lrRequest) : objet lrResponse\n    oResp est objet lrResponse\n<span class=\"lr-blank\"><\/span>\n    oResp.Body        = \"Sending pong to host \" + pRequest.Host + \" at \" + DateVersCha\u00eene(DateHeureSys())\n    oResp.ContentType = lrResponse::ContentTXT\n    oResp:Status      = lrResponse::StatusOK\n<span class=\"lr-blank\"><\/span>\n    RENVOYER oResp\nFIN<\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M7 5h16v4h-1v1h-6a1 1 0 0 0-1 1v1a2 2 0 0 1-2 2H9.62c-.38 0-.73.22-.9.56l-2.45 4.89c-.17.34-.51.55-.89.55H2s-3 0 1-6c0 0 3-4-1-4V5h1l.5-1h3zm7 7v-1a1 1 0 0 0-1-1h-1s-1 1 0 2a2 2 0 0 1-2-2 1 1 0 0 0-1 1v1a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1\"\/><\/svg><\/span> Kill<\/summary>\n<p><div id=\"method-kill\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-kill-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nArr\u00eat forc\u00e9 du serveur.<br>\n<img decoding=\"async\" alt=\"\u2139\" class=\"twemoji\" src=\"https:\/\/cdn.jsdelivr.net\/gh\/jdecked\/twemoji@16.0.1\/assets\/svg\/2139.svg\" title=\":information:\" \/> Les routes REST en cours d'ex\u00e9cution sont interrompues abruptement. Pour un arr\u00eat \"propre\", pr\u00e9f\u00e9rer la m\u00e9thode <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=terminate\"><em>:Terminate()<\/em><\/a>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-kill-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">Kill() : (bool\u00e9en, cha\u00eene)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-kill-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<div class=\"lr-empty\">(aucun)<\/div>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-kill-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:78%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"return-1\"><td>bool\u00e9en<\/td><td>Vrai si arr\u00eat forc\u00e9 r\u00e9ussi.<\/td><\/tr>\n    <tr id=\"return-2\"><td>cha\u00eene<\/td><td>Message d\u2019erreur (vide si succ\u00e8s).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-kill-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>Arr\u00eat abrupt du serveur<\/li>\n<li>\u00c0 utiliser en dernier recours (debug \/ shutdown forc\u00e9)<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oSrv est objet lrServer\nbOK  est bool\u00e9en\nsErr est cha\u00eene\n<span class=\"lr-blank\"><\/span>\n(bOK, sErr) = <span class=\"lr-hl\">oSrv:Kill()<\/span>\nSI PAS bOK ALORS\n  ExceptionDeclenche(exceptionAvertissement, sErr)\nFIN<\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2M9 9h6v6H9\"\/><\/svg><\/span> Terminate<\/summary>\n<p><div id=\"method-terminate\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-terminate-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nArr\u00eat propre du serveur.\n<br>\n<img decoding=\"async\" alt=\"\u2139\" class=\"twemoji\" src=\"https:\/\/cdn.jsdelivr.net\/gh\/jdecked\/twemoji@16.0.1\/assets\/svg\/2139.svg\" title=\":information:\" \/> Les routes REST en cours d'ex\u00e9cution sont compl\u00e9t\u00e9es avant arr\u00eat (ou timeout). Pour un arr\u00eat im\u00e9mdiat, utiliser la m\u00e9thode <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=kill\"><em>:Kill()<\/em><\/a>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-terminate-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">Terminate(pTimeout Dur\u00e9e = <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=RequestTimeout\">:RequestTimeout<\/a>) : (bool\u00e9en, cha\u00eene)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-terminate-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-ptimeout\"><td><code>pTimeout<\/code><\/td><td>Dur\u00e9e<\/td><td>Dur\u00e9e maximale d\u2019attente.<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-terminate-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:78%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"return-1\"><td>bool\u00e9en<\/td><td>Vrai si arr\u00eat r\u00e9ussi.<\/td><\/tr>\n    <tr id=\"return-2\"><td>cha\u00eene<\/td><td>Message d\u2019erreur (vide si succ\u00e8s).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-terminate-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>Arr\u00eat propre du serveur (attente fin des requ\u00eates)<\/li>\n<li>Timeout = 10 secondes<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oSrv est objet lrServer\nbOK  est bool\u00e9en\nsErr est cha\u00eene\n<span class=\"lr-blank\"><\/span>\n(bOK, sErr) = <span class=\"lr-hl\">oSrv:Terminate(10s)<\/span>\n<span class=\"lr-blank\"><\/span>\nSI PAS bOK ALORS\n  ExceptionDeclenche(exceptionAvertissement, sErr)\nFIN<\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M6 2a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6zm0 2h7v5h5v11H6zm2 8v2h8v-2zm0 4v2h5v-2z\"\/><\/svg><\/span> SetLoggerOn<\/summary>\n<p><div id=\"method-setloggeron\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-setloggeron-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nActive le logger interne et d\u00e9finit le fichier de log.\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setloggeron-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">SetLoggerOn(pLoggerFile cha\u00eene) : (bool\u00e9en, cha\u00eene)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setloggeron-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-ploggerfile\"><td><code>pLoggerFile<\/code><\/td><td>cha\u00eene<\/td><td>Chemin du fichier de log (vide =&gt; fichier par d\u00e9faut).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setloggeron-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:78%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"return-1\"><td>bool\u00e9en<\/td><td>Vrai si activation OK.<\/td><\/tr>\n    <tr id=\"return-2\"><td>cha\u00eene<\/td><td>Message d\u2019erreur (vide si succ\u00e8s).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setloggeron-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>Activation du logger LightREST dans un fichier<\/li>\n<li>Utile pour diagnostiquer un probl\u00e8me en phase de debug<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\nbOK     est bool\u00e9en\nsErr    est cha\u00eene\n<span class=\"lr-blank\"><\/span>\n<span class=\"lr-hl\">(bOK, sErr) = oServer:SetLoggerOn(\"c:\\temp\\lr_log.txt\")<\/span>\nSI PAS bOK ALORS\n  Erreur(\"Logger not enabled: \", sErr)\nFIN<\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M13.81 22H6c-1.11 0-2-.89-2-2V4a2 2 0 0 1 2-2h8l6 6v5.09c-.33-.05-.66-.09-1-.09s-.67.04-1 .09V9h-5V4H6v16h7.09c.12.72.37 1.39.72 2m8.73-.88L20.41 19l2.13-2.12-1.42-1.41L19 17.59l-2.12-2.12-1.41 1.41L17.59 19l-2.12 2.12 1.41 1.42L19 20.41l2.12 2.13z\"\/><\/svg><\/span> SetLoggerOff<\/summary>\n<p><div id=\"method-setloggeroff\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-setloggeroff-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nD\u00e9sactive le logger interne.\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setloggeroff-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">SetLoggerOff() : (bool\u00e9en, cha\u00eene)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setloggeroff-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<div class=\"lr-empty\">(aucun)<\/div>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setloggeroff-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:78%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"return-1\"><td>bool\u00e9en<\/td><td>Vrai si d\u00e9sactivation OK.<\/td><\/tr>\n    <tr id=\"return-2\"><td>cha\u00eene<\/td><td>Message d\u2019erreur (vide si succ\u00e8s).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setloggeroff-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>D\u00e9sactivation du logger LightREST<\/li>\n<li>\u00c0 utiliser apr\u00e8s une phase de debug pour retrouver les performances nominales<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\nbOK     est bool\u00e9en\nsErr    est cha\u00eene\n<span class=\"lr-blank\"><\/span>\n<span class=\"lr-hl\">(bOK, sErr) = oServer:SetLoggerOff()<\/span>\nSI PAS bOK ALORS\n  Erreur(\"Logger not disabled: \", sErr)\nFIN<\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<h3 id=\"id-ciphering\">ID Ciphering<a class=\"headerlink\" href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#id-ciphering\" title=\"Permanent link\">&para;<\/a><\/h3>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M7.5 3c2 0 3.6 1.2 4.2 3H21v3h-3v3h-3V9h-3.3c-.6 1.8-2.3 3-4.2 3C5 12 3 10 3 7.5S5 3 7.5 3m0 3C6.7 6 6 6.7 6 7.5S6.7 9 7.5 9 9 8.3 9 7.5 8.3 6 7.5 6M8 17h3v-3h2v3h3v2h-3v3h-2v-3H8z\"\/><\/svg><\/span> CipherID<\/summary>\n<p><div id=\"method-cipherid\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-cipherid-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nChiffre un identifiant de la base de donn\u00e9es. \u00c9vite le pillage des donn\u00e9es en utilisant par exemple une route \/{id} en incr\u00e9mentant simplement une valeur.<\/p>\n<p>La m\u00e9thode CipherID transformera une simple valeur num\u00e9rique en un long identifiant chiffr\u00e9. Il devient alors compliqu\u00e9 voire impossible d'aspirer l'int\u00e9gralit\u00e9 de la base de donn\u00e9es sans conna\u00eetre la cl\u00e9 de chiffrement.<\/p>\n<pre><code> Exemple avec une m\u00eame cl\u00e9 de chiffrement :\n\n L'ID 1 devient 03980608-5abe9581-7fee65e9-194ae106\n L'ID 2 devient d3e8b3a7-94319945-f7484a0d-aecf776c\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"\u2139\" class=\"twemoji\" src=\"https:\/\/cdn.jsdelivr.net\/gh\/jdecked\/twemoji@16.0.1\/assets\/svg\/2139.svg\" title=\":information_source:\" \/> Pour chiffrer plusieurs identifiants il est beaucoup plus rapide d'appeler une fois <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver\/?h=cipherids\">CipherIDs<\/a> sur un tableau que de boucler unitairement sur <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver\/?h=cipherid\">CipherID<\/a>.<\/p>\n<div class=\"admonition info\">\n<p class=\"admonition-title\">Note<\/p>\n<p>La cl\u00e9 de chiffrement des IDs est stock\u00e9e dans le membre <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver\/?h=cipheringkey\"><em>:CipheringKey<\/em><\/a> et initialis\u00e9e al\u00e9atoirement \u00e0 l'instanciation de l'objet. Cela signifie qu'en cas de red\u00e9marrage du serveur, les identifiants chiffr\u00e9s d\u00e9j\u00e0 transmis aux clients seront inexploitables. Pour \u00e9viter ceci, il suffira de donner une cl\u00e9 de chiffrement fixe au membre <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver\/?h=cipheringkey\"><em>:CipheringKey<\/em><\/a> (dans ce cas on peut imaginer un changement r\u00e9gulier du contenu de la cl\u00e9, par exemple quotidiennement).<\/p>\n<\/div>\n<p><\/div>\n<\/div><\/p>\n<p><div id=\"method-cipherid-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">CipherID(pIDName cha\u00eene, pIDValue cha\u00eene) : cha\u00eene<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-cipherid-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-pidname\"><td><code>pIDName<\/code><\/td><td>cha\u00eene<\/td><td>Nom logique de l\u2019identifiant. Utile pour discriminer les IDs identiques sur des tables diff\u00e9rents. G\u00e9n\u00e9ralement \u00e9gal au nom de la table concern\u00e9e.<br><br>\nAinsi l'ID 123 des tables CLIENT et USER ne seront pas chiffr\u00e9s de fa\u00e7on identique.<br>\n<\/td><\/tr>\n    <tr id=\"param-pidvalue\"><td><code>pIDValue<\/code><\/td><td>cha\u00eene<\/td><td>Valeur \u00e0 chiffrer (identifiant unique ou autre valeur \u00e0 dissimuler)<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-cipherid-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:78%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"return-1\"><td>cha\u00eene<\/td><td>Valeur chiffr\u00e9e format xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-cipherid-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>R\u00e9cup\u00e9ration du nom d'un client pass\u00e9 dans l'URL (exemple <em>https:\/\/monapi.fr\/client?name=dupont<\/em>)<\/li>\n<li>Envoie une erreur StatusBadRequest si le param\u00e8tre n'a pas \u00e9t\u00e9 re\u00e7u<\/li>\n<li>Recherche de l'enregistrement correspondant (si KO, retour StatusNotFound au client)<\/li>\n<li>Conversion de l'enregistrement en Variant (m\u00e9thode lrResponse:RecordToVariant)<\/li>\n<li>Chiffrement de l'ID de la base de donn\u00e9es<\/li>\n<li>Envoi des donn\u00e9es au format JSON<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>FUNCTION ClientGETByName(pRequest objet lrRequest, poResponse objet lrResponse)\n<span class=\"lr-blank\"><\/span>\nvClient   est variant\nsName     est chaine = pRequest:GetURLValue(\"name\")\n<span class=\"lr-blank\"><\/span>\nSI sName=\"\" ALORS\n  poResponse:Body          = \"No value provided\"\n  poResponse:ContentType   = lrResponse::ContentTXT\n  poResponse:Status        = lrResponse::StatusBadRequest\nSINON\n  SI hLitRecherchePremier(\"CLIENT\", \"NAME\", sName) ALORS\n      vClient = lrResponse::RecordToVariant(\"CLIENT\", \"NAME,FIRSTNAME,ADRESS,ZIP,CITY\")\n<span class=\"lr-blank\"><\/span>\n      vClient.ID = <span class=\"lr-hl\">oServer:CipherID(\"CLIENT\", CLIENT.ID)<\/span>\n<span class=\"lr-blank\"><\/span>\n      poResponse:Body        = VariantVersJSON(vClient)\n      poResponse:ContentType = lrResponse::ContentJSON\n      poResponse:Status      = lrResponse::StatusOK\n  SINON\n      poResponse:Status = lrResponse::StatusNotFound\n  FIN\nFIN<\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M7.5 3c2 0 3.6 1.2 4.2 3H21v3h-3v3h-3V9h-3.3c-.6 1.8-2.3 3-4.2 3C5 12 3 10 3 7.5S5 3 7.5 3m0 3C6.7 6 6 6.7 6 7.5S6.7 9 7.5 9 9 8.3 9 7.5 8.3 6 7.5 6M8 17h3v-3h2v3h3v2h-3v3h-2v-3H8z\"\/><\/svg><\/span> CipherIDs<\/summary>\n<p><div id=\"method-cipherids\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-cipherids-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nChiffre un tableau d'identifiants de la base de donn\u00e9es.<br><br>\n<img decoding=\"async\" alt=\"\u2139\" class=\"twemoji\" src=\"https:\/\/cdn.jsdelivr.net\/gh\/jdecked\/twemoji@16.0.1\/assets\/svg\/2139.svg\" title=\":information_source:\" \/> Pour chiffrer plusieurs identifiants il est beaucoup plus rapide d'appeler une fois <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver\/?h=cipherids\">CipherIDs<\/a> sur un tableau que de boucler unitairement sur <a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver\/?h=cipherid\">CipherID<\/a>.\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-cipherids-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">Syntaxe 1 : CipherIDs(pIDName cha\u00eene, pIDValues tableau de chaines) : tableau de cha\u00eenes\nSyntaxe 2 : CipherIDs(pIDName cha\u00eene, pArray tableau, pClearCol cha\u00eene, pCipheredCol cha\u00eene=pClearCol)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-cipherids-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-pidname\"><td><code>pIDName<\/code><\/td><td>cha\u00eene<\/td><td>Nom logique de l\u2019identifiant.<\/td><\/tr>\n    <tr id=\"param-pidvalues\"><td><code>pIDValues<\/code><\/td><td>tableau de cha\u00eenes<\/td><td>IDs \u00e0 chiffrer (syntaxe 1).<\/td><\/tr>\n    <tr id=\"param-parray\"><td><code>pArray<\/code><\/td><td>tableau<\/td><td>Tableau d'\u00e9l\u00e9ments contenant l'ID (syntaxe 2).<\/td><\/tr>\n    <tr id=\"param-pclearcol\"><td><code>pClearCol<\/code><\/td><td>cha\u00eene<\/td><td>Nom du membre qui contient l'ID clair (syntaxe 2).<\/td><\/tr>\n    <tr id=\"param-pcipheredcol\"><td><code>pCipheredCol<\/code><\/td><td>cha\u00eene<\/td><td>Nom du membre qui contiendra l'ID chiffr\u00e9 (syntaxe 2).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-cipherids-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:78%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"return-1\"><td>tableau de cha\u00eenes (syntaxe 1)<\/td><td>IDs chiffr\u00e9s format xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx.<\/td><\/tr>\n    <tr id=\"return-2\"><td>Aucun (syntaxe 2)<\/td><td>Le tableau pArray est modifi\u00e9 sur place.<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-cipherids-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>Chiffrement d'une liste d'IDs (optimis\u00e9 par lot)<\/li>\n<li>Renvoi d'un tableau de cha\u00eenes chiffr\u00e9es.<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\ntIDs    est tableau de cha\u00eenes\ntEnc    est tableau de cha\u00eenes\n<span class=\"lr-blank\"><\/span>\ntIDs.Ajoute(\"1\")\ntIDs.Ajoute(\"2\")\ntIDs.Ajoute(\"3\")\n<span class=\"lr-blank\"><\/span>\ntEnc = <span class=\"lr-hl\">oServer:CipherIDs(\"CLIENT\", tIDs)<\/span><\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M7.5 3c2 0 3.6 1.2 4.2 3H21v3h-3v3h-3V9h-3.3c-.6 1.8-2.3 3-4.2 3C5 12 3 10 3 7.5S5 3 7.5 3m0 3C6.7 6 6 6.7 6 7.5S6.7 9 7.5 9 9 8.3 9 7.5 8.3 6 7.5 6m7.1 8 1.4 1.4-2.6 2.6 2.6 2.6-1.4 1.4-2.6-2.6L9.4 22 8 20.6l2.6-2.6L8 15.4 9.4 14l2.6 2.6z\"\/><\/svg><\/span> DecipherID<\/summary>\n<p><div id=\"method-decipherid\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-decipherid-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nD\u00e9chiffre un identifiant.\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-decipherid-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">DecipherID(pIDName cha\u00eene, pIDValue cha\u00eene) : cha\u00eene<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-decipherid-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-pidname\"><td><code>pIDName<\/code><\/td><td>cha\u00eene<\/td><td>Nom logique de l\u2019identifiant.<\/td><\/tr>\n    <tr id=\"param-pidvalue\"><td><code>pIDValue<\/code><\/td><td>cha\u00eene<\/td><td>Valeur chiffr\u00e9e format xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx.<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-decipherid-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:78%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"return-1\"><td>cha\u00eene<\/td><td>Valeur d\u00e9chiffr\u00e9e (cha\u00eene vide si \u00e9chec).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-decipherid-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>R\u00e9cup\u00e9ration d'un ID chiffr\u00e9 dans la route <em>\/client\/{id}<\/em><\/li>\n<li>D\u00e9chiffrement de l'ID<\/li>\n<li>Suppression de l'enregistrement<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>FONCTION ClientDELETE(pRequest objet lrRequest, poResponse objet lrResponse)\n<span class=\"lr-blank\"><\/span>\nsID       est chaine = pRequest:GetRouteValue(\"id\")\n<span class=\"lr-blank\"><\/span>\nSI sID=\"\" ALORS\n  poResponse:Body        = \"No ID provided\"\n  poResponse:ContentType = lrResponse::ContentTXT\n  poResponse:Status      = lrResponse::StatusBadRequest\nSINON\n  sID = <span class=\"lr-hl\">oServer:DecipherID(\"CLIENT\", sID)<\/span>\n  SI sID=\"\" ALORS\n      poResponse:Body        = \"illegal or expired ID provided\"\n      poResponse:ContentType = lrResponse::ContentTXT\n      poResponse:Status      = lrResponse::StatusBadRequest\n  SINON\n      SI hLitRecherchePremier(\"CLIENT\", \"ID\", sID) ALORS\n          hSupprime(\"CLIENT\")\n          poResponse:Status = lrResponse::StatusOK\n      SINON\n          poResponse:Status = lrResponse::StatusNotFound\n      FIN\n  FIN\nFIN<\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M7.5 3c2 0 3.6 1.2 4.2 3H21v3h-3v3h-3V9h-3.3c-.6 1.8-2.3 3-4.2 3C5 12 3 10 3 7.5S5 3 7.5 3m0 3C6.7 6 6 6.7 6 7.5S6.7 9 7.5 9 9 8.3 9 7.5 8.3 6 7.5 6m7.1 8 1.4 1.4-2.6 2.6 2.6 2.6-1.4 1.4-2.6-2.6L9.4 22 8 20.6l2.6-2.6L8 15.4 9.4 14l2.6 2.6z\"\/><\/svg><\/span> DecipherIDs<\/summary>\n<p><div id=\"method-decipherids\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-decipherids-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nD\u00e9chiffre plusieurs identifiants.\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-decipherids-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">Syntaxe 1 : DecipherIDs(pIDName cha\u00eene, pIDValues) : tableau de cha\u00eenes\nSyntaxe 2 : DecipherIDs(pArray, pIDName cha\u00eene, pCipheredCol cha\u00eene, pClearCol cha\u00eene=pCipheredCol)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-decipherids-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-pidname\"><td><code>pIDName<\/code><\/td><td>cha\u00eene<\/td><td>Nom logique de l\u2019identifiant.<\/td><\/tr>\n    <tr id=\"param-pidvalues\"><td><code>pIDValues<\/code><\/td><td>tableau<\/td><td>Valeurs chiffr\u00e9es (syntaxe 1).<\/td><\/tr>\n    <tr id=\"param-parray\"><td><code>pArray<\/code><\/td><td>tableau<\/td><td>Tableau d'\u00e9l\u00e9ments contenant les IDs chiffr\u00e9s (syntaxe 2).<\/td><\/tr>\n    <tr id=\"param-pcipheredcol\"><td><code>pCipheredCol<\/code><\/td><td>cha\u00eene<\/td><td>Nom du membre contenant l'ID chiffr\u00e9 (syntaxe 2).<\/td><\/tr>\n    <tr id=\"param-pclearcol\"><td><code>pClearCol<\/code><\/td><td>cha\u00eene<\/td><td>Nom du membre qui contiendra l'ID clair (syntaxe 2).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-decipherids-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:78%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"return-1\"><td>tableau de cha\u00eenes (syntaxe 1)<\/td><td>Valeurs d\u00e9chiffr\u00e9es format xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx.<\/td><\/tr>\n    <tr id=\"return-2\"><td>Aucun (syntaxe 2)<\/td><td>Le tableau pArray est modifi\u00e9 sur place.<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-decipherids-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>D\u00e9chiffrement par lot d'un tableau d'IDs<\/li>\n<li>Utile quand tu re\u00e7ois plusieurs IDs chiffr\u00e9s dans une m\u00eame requ\u00eate<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\ntEnc    est tableau de cha\u00eenes\ntPlain  est tableau de cha\u00eenes\n<span class=\"lr-blank\"><\/span>\ntEnc.Ajoute(\"03980608-5abe9581-7fee65e9-194ae106\")\ntEnc.Ajoute(\"d3e8b3a7-94319945-f7484a0d-aecf776c\")\n<span class=\"lr-blank\"><\/span>\ntPlain = <span class=\"lr-hl\">oServer:DecipherIDs(\"CLIENT\", tEnc)<\/span><\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<h3 id=\"http-headers\">HTTP Headers<a class=\"headerlink\" href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#http-headers\" title=\"Permanent link\">&para;<\/a><\/h3>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M9 5v4h12V5M9 19h12v-4H9m0-1h12v-4H9M4 9h4V5H4m0 14h4v-4H4m0-1h4v-4H4z\"\/><\/svg><\/span> SetGlobalHeader<\/summary>\n<p><div id=\"method-setglobalheader\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-setglobalheader-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nAjoute (ou remplace) un header HTTP global envoy\u00e9 dans toutes les r\u00e9ponses,\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobalheader-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">SetGlobalHeader(pHeader cha\u00eene, pValue cha\u00eene)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobalheader-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-pheader\"><td><code>pHeader<\/code><\/td><td>cha\u00eene<\/td><td>Nom du header (ex: X-App-Version).<\/td><\/tr>\n    <tr id=\"param-pvalue\"><td><code>pValue<\/code><\/td><td>cha\u00eene<\/td><td>Valeur.<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobalheader-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<div class=\"lr-empty\">(aucune)<\/div>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobalheader-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>Ajout d\u2019un header global <em>X-App-Version<\/em> sur toutes les routes<\/li>\n<li>Utile pour le debug client et la tra\u00e7abilit\u00e9<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\n<span class=\"lr-hl\">oServer:SetGlobalHeader(\"X-App-Version\", \"LightREST v3\")<\/span><\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M9 5v4h12V5M9 19h12v-4H9m0-1h12v-4H9M4 9h4V5H4m0 14h4v-4H4m0-1h4v-4H4z\"\/><\/svg><\/span> SetGlobalHeaders<\/summary>\n<p><div id=\"method-setglobalheaders\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-setglobalheaders-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nCopie un ensemble de headers HTTP globaux (tableau associatif) vers le serveur.\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobalheaders-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">SetGlobalHeaders(pGlobalHeaders tableau associatif de cha\u00eenes)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobalheaders-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-pglobalheaders\"><td><code>pGlobalHeaders<\/code><\/td><td>tableau associatif de cha\u00eenes<\/td><td>Tableau des headers globaux (Tag =&gt; Valeur).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobalheaders-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<div class=\"lr-empty\">(aucune)<\/div>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobalheaders-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>D\u00e9finition de plusieurs headers globaux en une seule op\u00e9ration<\/li>\n<li>Pratique pour centraliser version, cache, options d\u2019application<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\ntas     est tableau associatif de cha\u00eenes\n<span class=\"lr-blank\"><\/span>\ntas[\"X-App-Version\"] = \"LightREST v3\"\ntas[\"X-Server\"]      = \"CODE LINE\"\ntas[\"Cache-Control\"] = \"no-store\"\n<span class=\"lr-blank\"><\/span>\n<span class=\"lr-hl\">oServer:SetGlobalHeaders(tas)<\/span><\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M9 5v4h12V5M9 19h12v-4H9m0-1h12v-4H9M4 9h4V5H4m0 14h4v-4H4m0-1h4v-4H4z\"\/><\/svg><\/span> SetGlobalOptionsHeader<\/summary>\n<p><div id=\"method-setglobaloptionsheader\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-setglobaloptionsheader-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nAjoute (ou remplace) un header global pour les r\u00e9ponses OPTIONS (CORS).\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobaloptionsheader-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">SetGlobalOptionsHeader(pHeader cha\u00eene, pValue cha\u00eene)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobaloptionsheader-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-pheader\"><td><code>pHeader<\/code><\/td><td>cha\u00eene<\/td><td>Nom du header OPTIONS (ex: Access-Control-Allow-Origin).<\/td><\/tr>\n    <tr id=\"param-pvalue\"><td><code>pValue<\/code><\/td><td>cha\u00eene<\/td><td>Valeur.<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobaloptionsheader-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<div class=\"lr-empty\">(aucune)<\/div>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobaloptionsheader-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>Ajout d\u2019un header CORS global pour les r\u00e9ponses OPTIONS<\/li>\n<li>Permet aux clients navigateur d\u2019appeler l\u2019API cross-domain<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\n<span class=\"lr-hl\">oServer:SetGlobalOptionsHeader(\"Access-Control-Allow-Origin\", \"*\")<\/span><\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M9 5v4h12V5M9 19h12v-4H9m0-1h12v-4H9M4 9h4V5H4m0 14h4v-4H4m0-1h4v-4H4z\"\/><\/svg><\/span> SetGlobalOptionsHeaders<\/summary>\n<p><div id=\"method-setglobaloptionsheaders\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-setglobaloptionsheaders-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nCopie un ensemble de headers globaux pour OPTIONS (CORS).\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobaloptionsheaders-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">SetGlobalOptionsHeaders(pGlobalOptionsHeaders tableau associatif de cha\u00eenes)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobaloptionsheaders-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-pglobaloptionsheaders\"><td><code>pGlobalOptionsHeaders<\/code><\/td><td>tableau associatif de cha\u00eenes<\/td><td>Tableau des headers OPTIONS globaux (Tag =&gt; Valeur).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobaloptionsheaders-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<div class=\"lr-empty\">(aucune)<\/div>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setglobaloptionsheaders-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>D\u00e9finition d\u2019un jeu complet de headers CORS (OPTIONS)<\/li>\n<li>Autorise m\u00e9thodes et headers personnalis\u00e9s<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\ntasOpt  est tableau associatif de cha\u00eenes\n<span class=\"lr-blank\"><\/span>\ntasOpt[\"Access-Control-Allow-Origin\"]  = \"*\"\ntasOpt[\"Access-Control-Allow-Methods\"] = \"GET,POST,PUT,DELETE,OPTIONS\"\ntasOpt[\"Access-Control-Allow-Headers\"] = \"Content-Type, X-API-KEY, SESSION_ID\"\n<span class=\"lr-blank\"><\/span>\n<span class=\"lr-hl\">oServer:SetGlobalOptionsHeaders(tasOpt)<\/span><\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<h3 id=\"certificats\">Certificats<a class=\"headerlink\" href=\"https:\/\/lightrest.codeline.fr\/docs\/classes\/lrserver#certificats\" title=\"Permanent link\">&para;<\/a><\/h3>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 3c-1.11 0-2 .89-2 2v10a2 2 0 0 0 2 2h8v5l3-3 3 3v-5h2a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2H4m8 2 3 2 3-2v3.5l3 1.5-3 1.5V15l-3-2-3 2v-3.5L9 10l3-1.5zM4 5h5v2H4zm0 4h3v2H4zm0 4h5v2H4z\"\/><\/svg><\/span> SetHTTPSCertificate<\/summary>\n<p><div id=\"method-sethttpscertificate\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-sethttpscertificate-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nD\u00e9finit le certificat SSL et la cl\u00e9 priv\u00e9e (mode HTTPS_CERT).\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-sethttpscertificate-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">Syntaxe 1 : SetHTTPSCertificate(pCertificate cha\u00eene, pPrivateKey cha\u00eene)\nSyntaxe 2 : SetHTTPSCertificate(pCertificate lrSSLCertificate)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-sethttpscertificate-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-pcertificate\"><td><code>pCertificate<\/code><\/td><td>cha\u00eene \/ lrSSLCertificate<\/td><td>Certificat (chemin, contenu, ou structure lrSSLCertificate).<\/td><\/tr>\n    <tr id=\"param-pprivatekey\"><td><code>pPrivateKey<\/code><\/td><td>cha\u00eene<\/td><td>Cl\u00e9 priv\u00e9e (syntaxe 1).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-sethttpscertificate-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<div class=\"lr-empty\">(aucune)<\/div>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-sethttpscertificate-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>Passage du serveur en HTTPS avec certificat fourni (HTTPS_CERT)<\/li>\n<li>D\u00e9finition certificat + cl\u00e9 priv\u00e9e<\/li>\n<li>D\u00e9marrage du serveur<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\nbOK     est bool\u00e9en\nsErr    est cha\u00eene\n<span class=\"lr-blank\"><\/span>\noServer:IPAndPort = \"0.0.0.0:443\"\noServer:HTTPMode  = lrServer::HTTPS_CERT\n<span class=\"lr-blank\"><\/span>\n<span class=\"lr-hl\">oServer:SetHTTPSCertificate(fChargeTexte(\"c:\\ssl\\server.crt\"), fChargeTexte(\"c:\\ssl\\server.key\"))<\/span>\n<span class=\"lr-blank\"><\/span>\n(bOK, sErr) = oServer:Start()\nSI PAS bOK ALORS\n  Erreur(\"HTTPS start failed: \", sErr)\nFIN<\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 3c-1.11 0-2 .89-2 2v10a2 2 0 0 0 2 2h8v5l3-3 3 3v-5h2a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2H4m8 2 3 2 3-2v3.5l3 1.5-3 1.5V15l-3-2-3 2v-3.5L9 10l3-1.5zM4 5h5v2H4zm0 4h3v2H4zm0 4h5v2H4z\"\/><\/svg><\/span> SetLetsEncryptParameters<\/summary>\n<p><div id=\"method-setletsencryptparameters\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-setletsencryptparameters-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nConfigure les param\u00e8tres Let's Encrypt (mode HTTPS_LETS_ENCRYPT).\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setletsencryptparameters-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">Syntaxe 1 : SetLetsEncryptParameters(pDomain cha\u00eene, pEmail cha\u00eene, pCertificatePath cha\u00eene = \"\", pRenewDelay entier = 0)\nSyntaxe 2 : SetLetsEncryptParameters(pDomains tableau de cha\u00eenes, pEmail cha\u00eene, pCertificatePath cha\u00eene = \"\", pRenewDelay entier = 0)\nSyntaxe 3 : SetLetsEncryptParameters(pLetsEncrypt lrLetsEncrypt)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setletsencryptparameters-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-pdomain\"><td><code>pDomain<\/code><\/td><td>cha\u00eene<\/td><td>Domaine principal (syntaxe 1).<\/td><\/tr>\n    <tr id=\"param-pdomains\"><td><code>pDomains<\/code><\/td><td>tableau de cha\u00eenes<\/td><td>Liste de domaines (syntaxe 2).<\/td><\/tr>\n    <tr id=\"param-pemail\"><td><code>pEmail<\/code><\/td><td>cha\u00eene<\/td><td>Email Let's Encrypt (syntaxe 1 et 2).<\/td><\/tr>\n    <tr id=\"param-pcertificatepath\"><td><code>pCertificatePath<\/code><\/td><td>cha\u00eene<\/td><td>Chemin de stockage des certificats (syntaxe 1 et 2, optionnel).<\/td><\/tr>\n    <tr id=\"param-prenewdelay\"><td><code>pRenewDelay<\/code><\/td><td>entier<\/td><td>D\u00e9lai de renouvellement (syntaxe 1 et 2, optionnel).<\/td><\/tr>\n    <tr id=\"param-pletsencrypt\"><td><code>pLetsEncrypt<\/code><\/td><td><a href=\"https:\/\/lightrest.codeline.fr\/index.php\/la-classe-lrserver?h=lrLetsEncrypt\"><em>lrLetsEncrypt<\/em><\/a><\/td><td>Structure compl\u00e8te (syntaxe 3).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setletsencryptparameters-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<div class=\"lr-empty\">(aucune)<\/div>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setletsencryptparameters-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>Passage en HTTPS avec Let's Encrypt (certificats auto-renouvel\u00e9s)<\/li>\n<li>D\u00e9finition du domaine et de l'email<\/li>\n<li>D\u00e9marrage du serveur<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\nbOK     est bool\u00e9en\nsErr    est cha\u00eene\nstLets  est lrLetsEncrypt\n<span class=\"lr-blank\"><\/span>\noServer:IPAndPort = \"0.0.0.0:443\"\noServer:HTTPMode  = lrServer::HTTPS_LETS_ENCRYPT\n<span class=\"lr-blank\"><\/span>\nstLets.Domains.Ajoute(\"api.mondomaine.fr\")\nstLets.Domains.Ajoute(\"private.mondomaine.fr\")\nstLets.Email           = \"admin@mondomaine.fr\"\nstLets.CertificatePath = \".\/certificates\"\nstLets.RenewDelay      = 30\n<span class=\"lr-blank\"><\/span>\n<span class=\"lr-hl\">oServer:SetLetsEncryptParameters(stLets)<\/span>\n<span class=\"lr-blank\"><\/span>\n(bOK, sErr) = oServer:Start()\nSI PAS bOK ALORS\n  Erreur(\"LetsEncrypt start failed: \", sErr)\nFIN<\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n<details class=\"note\">\n<summary><span class=\"twemoji\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 3c-1.11 0-2 .89-2 2v10a2 2 0 0 0 2 2h8v5l3-3 3 3v-5h2a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2H4m8 2 3 2 3-2v3.5l3 1.5-3 1.5V15l-3-2-3 2v-3.5L9 10l3-1.5zM4 5h5v2H4zm0 4h3v2H4zm0 4h5v2H4z\"\/><\/svg><\/span> SetSelfCertificateParameters<\/summary>\n<p><div id=\"method-setselfcertificateparameters\" class=\"lr-anchor\"><\/div><\/p>\n<p><div id=\"method-setselfcertificateparameters-intro\" class=\"lr-secwrap lr-secwrap-present\">\n  <div class=\"lr-sec lr-sec-present\">\ud83d\udcd8 Pr\u00e9sentation<\/div>\n  <div class=\"lr-secbody\">\nConfigure les param\u00e8tres du certificat auto-g\u00e9n\u00e9r\u00e9 (mode HTTPS_SELF).\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setselfcertificateparameters-proto\" class=\"lr-secwrap lr-secwrap-proto\">\n  <div class=\"lr-sec lr-sec-proto\">\ud83e\udde9 Prototypage<\/div>\n  <div class=\"lr-secbody\">\n<pre class=\"lr-proto\">SetSelfCertificateParameters(plrSelfCertificate lrSelfCertificate)<\/pre>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setselfcertificateparameters-params\" class=\"lr-secwrap lr-secwrap-params\">\n  <div class=\"lr-sec lr-sec-params\">\ud83d\udd27 Param\u00e8tres<\/div>\n  <div class=\"lr-secbody\">\n<table>\n  <colgroup>\n    <col style=\"width:22%;\">\n    <col style=\"width:18%;\">\n    <col style=\"width:60%;\">\n  <\/colgroup>\n  <thead>\n    <tr><th>Nom<\/th><th>Type<\/th><th>Usage<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr id=\"param-plrselfcertificate\"><td><code>plrSelfCertificate<\/code><\/td><td>lrSelfCertificate<\/td><td>Structure contenant les param\u00e8tres du certificat auto-g\u00e9n\u00e9r\u00e9 (ex: KeySize).<\/td><\/tr>\n  <\/tbody>\n<\/table>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setselfcertificateparameters-returns\" class=\"lr-secwrap lr-secwrap-returns\">\n  <div class=\"lr-sec lr-sec-returns\">\u21a9\ufe0f Valeurs retourn\u00e9es<\/div>\n  <div class=\"lr-secbody\">\n<div class=\"lr-empty\">(aucune)<\/div>\n  <\/div>\n<\/div><\/p>\n<p><div id=\"method-setselfcertificateparameters-example\" class=\"lr-secwrap lr-secwrap-example\">\n  <div class=\"lr-sec lr-sec-example\">\ud83e\uddea Exemple<\/div>\n  <div class=\"lr-secbody\">\n<ul>\n<li>Passage en HTTPS avec certificat auto-g\u00e9n\u00e9r\u00e9 (HTTPS_SELF)<\/li>\n<li>D\u00e9finition de la taille de cl\u00e9<\/li>\n<li>D\u00e9marrage du serveur<\/li>\n<\/ul>\n<div class=\"lr-codebox\"><button class=\"lr-copy\" type=\"button\" data-lr-copy=\"1\">Copier<\/button><pre class=\"lr-code-dark\"><code>oServer est objet lrServer\nstSelf  est lrSelfCertificate\nbOK     est bool\u00e9en\nsErr    est cha\u00eene\n<span class=\"lr-blank\"><\/span>\noServer:IPAndPort = \"0.0.0.0:8443\"\noServer:HTTPMode  = lrServer::HTTPS_SELF\n<span class=\"lr-blank\"><\/span>\nstSelf.KeySize = 2048\n<span class=\"lr-blank\"><\/span>\n<span class=\"lr-hl\">oServer:SetSelfCertificateParameters(stSelf)<\/span>\n<span class=\"lr-blank\"><\/span>\n(bOK, sErr) = oServer:Start()\nSI PAS bOK ALORS\n  Erreur(\"HTTPS self start failed: \", sErr)\nFIN<\/code><\/pre><\/div>\n  <\/div>\n<\/div><\/p>\n<\/details>\n\n\n\n\n\n\n\n\n\n\n\n\n                \n              <\/article>\n            <\/div>\n          \n          \n\n        <\/div>\n        \n      <\/main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n       \n      \n    <\/div>\n  <\/div>\n<\/footer>\n      \n    <\/div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"><\/div>\n    <\/div>\n    \n    \n    \n      \n      \n      \n    \n    \n      \n      \n        \n      \n        \n      \n        \n      \n    \n  \n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2275","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/pages\/2275","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/comments?post=2275"}],"version-history":[{"count":3,"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/pages\/2275\/revisions"}],"predecessor-version":[{"id":2485,"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/pages\/2275\/revisions\/2485"}],"wp:attachment":[{"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/media?parent=2275"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}