static,internal: add toggle for internal directories on doc pages

Updates the directories section to display all internal directories
with toggle. Internal directories are hidden by default on pkg.go.dev
but displayed by default when pkgsite is used to display local
documentation.

For golang/go#58577.

Change-Id: Iaf9bff7829c9a5dd6f1d0d5e63975b9f066e3081
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/476616
Reviewed-by: Robert Findley <rfindley@google.com>
TryBot-Result: kokoro <noreply+kokoro@google.com>
Run-TryBot: Jamal Carvalho <jamal@golang.org>
diff --git a/internal/frontend/directory.go b/internal/frontend/directory.go
index 5a1a421..cae9c51 100644
--- a/internal/frontend/directory.go
+++ b/internal/frontend/directory.go
@@ -14,16 +14,6 @@
 	"golang.org/x/pkgsite/internal/version"
 )
 
-// Directories is the directory listing for all directories in the unit,
-// which is listed in the directories section of the main page.
-type Directories struct {
-	// External contains all of the non-internal directories for the unit.
-	External []*Directory
-
-	// Internal contains the top level internal directory for the unit, if any.
-	Internal *Directory
-}
-
 // Directory is either a nested module or subdirectory of a unit, organized in
 // a two level tree structure. This content is used in the
 // directories section of the unit page.
@@ -42,15 +32,16 @@
 // relative to the path of a given unit. This content is used in the
 // Directories section of the unit page.
 type DirectoryInfo struct {
-	Suffix   string
-	URL      string
-	Synopsis string
-	IsModule bool
+	Suffix     string
+	URL        string
+	Synopsis   string
+	IsModule   bool
+	IsInternal bool
 }
 
 // unitDirectories zips the subdirectories and nested modules together in a two
 // level tree hierarchy.
-func unitDirectories(directories []*DirectoryInfo) *Directories {
+func unitDirectories(directories []*DirectoryInfo) []*Directory {
 	if len(directories) == 0 {
 		return nil
 	}
@@ -64,9 +55,8 @@
 		// Skip internal directories that are not in the top level internal
 		// directory. For example, foo/internal and foo/internal/bar should
 		// be skipped, but internal/foo should be included.
-		if prefix != "internal" && (strings.HasSuffix(d.Suffix, "/internal") ||
-			strings.Contains(d.Suffix, "/internal/")) {
-			continue
+		if strings.HasSuffix(d.Suffix, "/internal") || strings.Contains(d.Suffix, "/internal/") {
+			d.IsInternal = true
 		}
 		if _, ok := mappedDirs[prefix]; !ok {
 			mappedDirs[prefix] = &Directory{Prefix: prefix}
@@ -79,18 +69,14 @@
 		}
 	}
 
-	section := &Directories{}
-	for prefix, dir := range mappedDirs {
-		if prefix == "internal" {
-			section.Internal = dir
-		} else {
-			section.External = append(section.External, dir)
-		}
+	var dirs []*Directory
+	for _, dir := range mappedDirs {
+		dirs = append(dirs, dir)
 	}
-	sort.Slice(section.External, func(i, j int) bool {
-		return section.External[i].Prefix < section.External[j].Prefix
+	sort.Slice(dirs, func(i, j int) bool {
+		return dirs[i].Prefix < dirs[j].Prefix
 	})
-	return section
+	return dirs
 }
 
 func getNestedModules(ctx context.Context, ds internal.DataSource, um *internal.UnitMeta, sds []*DirectoryInfo) ([]*DirectoryInfo, error) {
diff --git a/internal/frontend/directory_test.go b/internal/frontend/directory_test.go
index 632511a..f7c9d72 100644
--- a/internal/frontend/directory_test.go
+++ b/internal/frontend/directory_test.go
@@ -138,39 +138,40 @@
 		{Suffix: "pubsub/internal", IsModule: true},
 	}
 	got := unitDirectories(append(subdirectories, nestedModules...))
-	want := &Directories{
-		External: []*Directory{
-			{
-				Prefix: "accessapproval",
-				Root:   &DirectoryInfo{Suffix: "accessapproval"},
-				Subdirectories: []*DirectoryInfo{
-					{Suffix: "cgi"},
-					{Suffix: "cookiejar"},
-				},
-			},
-			{
-				Prefix: "fgci",
-				Root:   &DirectoryInfo{Suffix: "fgci"},
-			},
-			{
-				Prefix: "httptest",
-				Root:   &DirectoryInfo{Suffix: "httptest", IsModule: true},
-			},
-			{
-				Prefix: "httptrace",
-				Root:   &DirectoryInfo{Suffix: "httptrace"},
-			},
-			{
-				Prefix: "zoltan",
-				Root:   &DirectoryInfo{Suffix: "zoltan"},
+	want := []*Directory{
+		{
+			Prefix: "accessapproval",
+			Root:   &DirectoryInfo{Suffix: "accessapproval"},
+			Subdirectories: []*DirectoryInfo{
+				{Suffix: "internal", IsInternal: true},
+				{Suffix: "cgi"},
+				{Suffix: "cookiejar"},
+				{Suffix: "cookiejar/internal", IsInternal: true},
 			},
 		},
-		Internal: &Directory{
-			Prefix: "internal",
-			Subdirectories: []*DirectoryInfo{
-				{Suffix: "bytesconv"},
-				{Suffix: "json"},
-			},
+		{
+			Prefix: "fgci",
+			Root:   &DirectoryInfo{Suffix: "fgci"},
+		},
+		{
+			Prefix: "httptest",
+			Root:   &DirectoryInfo{Suffix: "httptest", IsModule: true},
+		},
+		{
+			Prefix: "httptrace",
+			Root:   &DirectoryInfo{Suffix: "httptrace"},
+		},
+		{
+			Prefix:         "internal",
+			Subdirectories: []*DirectoryInfo{{Suffix: "bytesconv"}, {Suffix: "json"}},
+		},
+		{
+			Prefix:         "pubsub",
+			Subdirectories: []*DirectoryInfo{{Suffix: "internal", IsModule: true, IsInternal: true}},
+		},
+		{
+			Prefix: "zoltan",
+			Root:   &DirectoryInfo{Suffix: "zoltan"},
 		},
 	}
 
diff --git a/internal/frontend/main.go b/internal/frontend/main.go
index ff4b703..fe3792c 100644
--- a/internal/frontend/main.go
+++ b/internal/frontend/main.go
@@ -25,7 +25,7 @@
 type MainDetails struct {
 	// Directories are packages and nested modules relative to the path for the
 	// unit.
-	Directories *Directories
+	Directories []*Directory
 
 	// Licenses contains license metadata used in the header.
 	Licenses []LicenseMetadata
diff --git a/static/frontend/unit/main/_directories.css b/static/frontend/unit/main/_directories.css
index 0f770ac..a36bbba 100644
--- a/static/frontend/unit/main/_directories.css
+++ b/static/frontend/unit/main/_directories.css
@@ -130,6 +130,14 @@
   padding: 0.5rem 1rem;
 }
 
+.UnitDirectories-internal {
+  display: none;
+}
+
+.UnitDirectories-showInternal .UnitDirectories-internal {
+  display: table-row;
+}
+
 .UnitDirectories-mobileSynopsis {
   display: none;
   line-height: 1.25rem;
@@ -147,20 +155,25 @@
   }
 }
 
-.UnitDirectories-expandButton {
+.UnitDirectories-toggles {
   position: relative;
 }
 
-.UnitDirectories-expandButton button {
+.UnitDirectories-toggleButtons {
+  bottom: 1rem;
+  display: flex;
+  gap: 1rem;
+  position: absolute;
+  right: 0;
+}
+
+.UnitDirectories-toggleButtons button {
   background-color: transparent;
   border: none;
-  bottom: 1rem;
   color: var(--color-brand-primary);
   cursor: pointer;
   display: none;
   font-size: 0.875rem;
-  position: absolute;
-  right: 0;
   text-decoration: none;
 }
 
diff --git a/static/frontend/unit/main/_directories.tmpl b/static/frontend/unit/main/_directories.tmpl
index 3fa26ea..08c09a4 100644
--- a/static/frontend/unit/main/_directories.tmpl
+++ b/static/frontend/unit/main/_directories.tmpl
@@ -11,11 +11,17 @@
       Directories
       <a class="UnitDirectories-idLink" href="#section-directories">¶</a>
     </h2>
-    <div class="UnitDirectories-expandButton">
-      <button class="js-expandAllDirectories" data-test-id="directories-toggle"
-          data-gtmc="directories button" aria-label="Expand All Directories">
-        Expand all
-      </button>
+    <div class="UnitDirectories-toggles">
+      <div class="UnitDirectories-toggleButtons">
+        <button class="js-showInternalDirectories" data-test-id="internal-directories-toggle"
+            data-gtmc="directories button" aria-label="Show Internal Directories">
+          Show internal
+        </button>
+        <button class="js-expandAllDirectories" data-test-id="directories-toggle"
+            data-gtmc="directories button" aria-label="Expand All Directories">
+          Expand all
+        </button>
+      </div>
     </div>
     <table class="UnitDirectories-table UnitDirectories-table--tree js-expandableTable"
           data-test-id="UnitDirectories-table">
@@ -23,19 +29,17 @@
         <th>Path</th>
         <th class="UnitDirectories-desktopSynopsis">Synopsis</th>
       </tr>
-      {{range $dir := .Directories.External}}
+      {{range $dir := .Directories}}
           {{template "directory" .}}
       {{end}}
-      {{if .Directories.Internal}}
-          {{template "directory" .Directories.Internal}}
-      {{end}}
     </table>
   </div>
 {{end}}
 
 {{define "directory"}}
   {{$prefix := .Prefix}}
-  <tr{{if .Subdirectories}} data-aria-controls="{{range .Subdirectories}}{{$prefix}}-{{.Suffix}} {{end}}"{{end}}>
+  <tr{{if .Subdirectories}} data-aria-controls="{{range .Subdirectories}}{{$prefix}}-{{.Suffix}} {{end}}"{{end}}
+      class="{{if eq $prefix "internal"}}UnitDirectories-internal{{end}}">
     <td data-id="{{$prefix}}" data-aria-owns="{{range .Subdirectories}}{{$prefix}}-{{.Suffix}} {{end}}">
       <div class="UnitDirectories-pathCell">
         <div>
@@ -65,7 +69,7 @@
     {{- end -}}
   </tr>
   {{- range .Subdirectories -}}
-    <tr data-id="{{$prefix}}-{{.Suffix}}">
+    <tr data-id="{{$prefix}}-{{.Suffix}}" class="{{if .IsInternal}}UnitDirectories-internal{{end}}">
       <td>
         <div class="UnitDirectories-subdirectory">
           <span>
diff --git a/static/frontend/unit/main/main.js b/static/frontend/unit/main/main.js
index 5225158..92a32d4 100644
--- a/static/frontend/unit/main/main.js
+++ b/static/frontend/unit/main/main.js
@@ -1,9 +1,9 @@
-var d={PLAY_HREF:".js-exampleHref",PLAY_CONTAINER:".js-exampleContainer",EXAMPLE_INPUT:".Documentation-exampleCode",EXAMPLE_OUTPUT:".Documentation-exampleOutput",EXAMPLE_ERROR:".Documentation-exampleError",PLAY_BUTTON:".Documentation-examplePlayButton",SHARE_BUTTON:".Documentation-exampleShareButton",FORMAT_BUTTON:".Documentation-exampleFormatButton",RUN_BUTTON:".Documentation-exampleRunButton"},E=class{constructor(e){this.exampleEl=e;var t,i,s,r;this.exampleEl=e,this.anchorEl=e.querySelector("a"),this.errorEl=e.querySelector(d.EXAMPLE_ERROR),this.playButtonEl=e.querySelector(d.PLAY_BUTTON),this.shareButtonEl=e.querySelector(d.SHARE_BUTTON),this.formatButtonEl=e.querySelector(d.FORMAT_BUTTON),this.runButtonEl=e.querySelector(d.RUN_BUTTON),this.inputEl=this.makeTextArea(e.querySelector(d.EXAMPLE_INPUT)),this.outputEl=e.querySelector(d.EXAMPLE_OUTPUT),(t=this.playButtonEl)==null||t.addEventListener("click",()=>this.handleShareButtonClick()),(i=this.shareButtonEl)==null||i.addEventListener("click",()=>this.handleShareButtonClick()),(s=this.formatButtonEl)==null||s.addEventListener("click",()=>this.handleFormatButtonClick()),(r=this.runButtonEl)==null||r.addEventListener("click",()=>this.handleRunButtonClick()),this.inputEl&&(this.resize(),this.inputEl.addEventListener("keyup",()=>this.resize()),this.inputEl.addEventListener("keydown",l=>this.onKeydown(l)))}makeTextArea(e){var i,s;let t=document.createElement("textarea");return t.classList.add("Documentation-exampleCode","code"),t.spellcheck=!1,t.value=(i=e==null?void 0:e.textContent)!=null?i:"",(s=e==null?void 0:e.parentElement)==null||s.replaceChild(t,e),t}getAnchorHash(){var e;return(e=this.anchorEl)==null?void 0:e.hash}expand(){this.exampleEl.open=!0}resize(){var e;if((e=this.inputEl)!=null&&e.value){let t=(this.inputEl.value.match(/\n/g)||[]).length;this.inputEl.style.height=`${(20+t*20+12+2)/16}rem`}}onKeydown(e){e.key==="Tab"&&(document.execCommand("insertText",!1,"	"),e.preventDefault())}setInputText(e){this.inputEl&&(this.inputEl.value=e)}setOutputText(e){this.outputEl&&(this.outputEl.textContent=e)}appendToOutputText(e){this.outputEl&&(this.outputEl.textContent+=e)}setOutputHTML(e){this.outputEl&&(this.outputEl.innerHTML=e)}setErrorText(e){this.errorEl&&(this.errorEl.textContent=e),this.setOutputText("An error has occurred\u2026")}getCodeWithModFile(){var i,s,r,l;let e=(s=(i=this.inputEl)==null?void 0:i.value)!=null?s:"",t=(l=(r=document.querySelector(".js-playgroundVars"))==null?void 0:r.dataset)!=null?l:{};return t.modulepath!=="std"&&(e=e.concat(`
+var d={PLAY_HREF:".js-exampleHref",PLAY_CONTAINER:".js-exampleContainer",EXAMPLE_INPUT:".Documentation-exampleCode",EXAMPLE_OUTPUT:".Documentation-exampleOutput",EXAMPLE_ERROR:".Documentation-exampleError",PLAY_BUTTON:".Documentation-examplePlayButton",SHARE_BUTTON:".Documentation-exampleShareButton",FORMAT_BUTTON:".Documentation-exampleFormatButton",RUN_BUTTON:".Documentation-exampleRunButton"},b=class{constructor(e){this.exampleEl=e;var t,i,s,r;this.exampleEl=e,this.anchorEl=e.querySelector("a"),this.errorEl=e.querySelector(d.EXAMPLE_ERROR),this.playButtonEl=e.querySelector(d.PLAY_BUTTON),this.shareButtonEl=e.querySelector(d.SHARE_BUTTON),this.formatButtonEl=e.querySelector(d.FORMAT_BUTTON),this.runButtonEl=e.querySelector(d.RUN_BUTTON),this.inputEl=this.makeTextArea(e.querySelector(d.EXAMPLE_INPUT)),this.outputEl=e.querySelector(d.EXAMPLE_OUTPUT),(t=this.playButtonEl)==null||t.addEventListener("click",()=>this.handleShareButtonClick()),(i=this.shareButtonEl)==null||i.addEventListener("click",()=>this.handleShareButtonClick()),(s=this.formatButtonEl)==null||s.addEventListener("click",()=>this.handleFormatButtonClick()),(r=this.runButtonEl)==null||r.addEventListener("click",()=>this.handleRunButtonClick()),this.inputEl&&(this.resize(),this.inputEl.addEventListener("keyup",()=>this.resize()),this.inputEl.addEventListener("keydown",l=>this.onKeydown(l)))}makeTextArea(e){var i,s;let t=document.createElement("textarea");return t.classList.add("Documentation-exampleCode","code"),t.spellcheck=!1,t.value=(i=e==null?void 0:e.textContent)!=null?i:"",(s=e==null?void 0:e.parentElement)==null||s.replaceChild(t,e),t}getAnchorHash(){var e;return(e=this.anchorEl)==null?void 0:e.hash}expand(){this.exampleEl.open=!0}resize(){var e;if((e=this.inputEl)!=null&&e.value){let t=(this.inputEl.value.match(/\n/g)||[]).length;this.inputEl.style.height=`${(20+t*20+12+2)/16}rem`}}onKeydown(e){e.key==="Tab"&&(document.execCommand("insertText",!1,"	"),e.preventDefault())}setInputText(e){this.inputEl&&(this.inputEl.value=e)}setOutputText(e){this.outputEl&&(this.outputEl.textContent=e)}appendToOutputText(e){this.outputEl&&(this.outputEl.textContent+=e)}setOutputHTML(e){this.outputEl&&(this.outputEl.innerHTML=e)}setErrorText(e){this.errorEl&&(this.errorEl.textContent=e),this.setOutputText("An error has occurred\u2026")}getCodeWithModFile(){var i,s,r,l;let e=(s=(i=this.inputEl)==null?void 0:i.value)!=null?s:"",t=(l=(r=document.querySelector(".js-playgroundVars"))==null?void 0:r.dataset)!=null?l:{};return t.modulepath!=="std"&&(e=e.concat(`
 -- go.mod --
 module play.ground
 
 require ${t.modulepath} ${t.version}
-`)),e}handleShareButtonClick(){let e="https://play.golang.org/p/";this.setOutputText("Waiting for remote server\u2026"),fetch("/play/share",{method:"POST",body:this.getCodeWithModFile()}).then(t=>t.text()).then(t=>{let i=e+t;this.setOutputHTML(`<a href="${i}">${i}</a>`),window.open(i)}).catch(t=>{this.setErrorText(t)})}handleFormatButtonClick(){var t,i;this.setOutputText("Waiting for remote server\u2026");let e=new FormData;e.append("body",(i=(t=this.inputEl)==null?void 0:t.value)!=null?i:""),fetch("/play/fmt",{method:"POST",body:e}).then(s=>s.json()).then(({Body:s,Error:r})=>{this.setOutputText(r||"Done."),s&&(this.setInputText(s),this.resize())}).catch(s=>{this.setErrorText(s)})}handleRunButtonClick(){this.setOutputText("Waiting for remote server\u2026"),fetch("/play/compile",{method:"POST",body:JSON.stringify({body:this.getCodeWithModFile(),version:2})}).then(e=>e.json()).then(async({Events:e,Errors:t})=>{this.setOutputText(t||"");for(let i of e||[])this.appendToOutputText(i.Message),await new Promise(s=>setTimeout(s,i.Delay/1e6))}).catch(e=>{this.setErrorText(e)})}};function L(){let n=location.hash.match(/^#(example-.*)$/);if(n){let i=document.getElementById(n[1]);i&&(i.open=!0)}let e=[...document.querySelectorAll(d.PLAY_HREF)],t=i=>e.find(s=>s.hash===i.getAnchorHash());for(let i of document.querySelectorAll(d.PLAY_CONTAINER)){let s=new E(i),r=t(s);r?r.addEventListener("click",()=>{s.expand()}):console.warn("example href not found")}}var m=class{constructor(e){this.el=e;this.el.addEventListener("change",t=>{let i=t.target,s=i.value;i.value.startsWith("/")||(s="/"+s),window.location.href=s})}};function A(n){let e=document.createElement("label");e.classList.add("go-Label"),e.setAttribute("aria-label","Menu");let t=document.createElement("select");t.classList.add("go-Select","js-selectNav"),e.appendChild(t);let i=document.createElement("optgroup");i.label="Outline",t.appendChild(i);let s={},r;for(let l of n.treeitems){if(Number(l.depth)>4)continue;l.groupTreeitem?(r=s[l.groupTreeitem.label],r||(r=s[l.groupTreeitem.label]=document.createElement("optgroup"),r.label=l.groupTreeitem.label,t.appendChild(r))):r=i;let a=document.createElement("option");a.label=l.label,a.textContent=l.label,a.value=l.el.href.replace(window.location.origin,"").replace("/",""),r.appendChild(a)}return n.addObserver(l=>{var c;let a=l.el.hash,h=(c=t.querySelector(`[value$="${a}"]`))==null?void 0:c.value;h&&(t.value=h)},50),e}var p=class{constructor(e){this.el=e;this.handleResize=()=>{this.el.style.setProperty("--js-tree-height","100vh"),this.el.style.setProperty("--js-tree-height",this.el.clientHeight+"px")};this.treeitems=[],this.firstChars=[],this.firstTreeitem=null,this.lastTreeitem=null,this.observerCallbacks=[],this.init()}init(){this.handleResize(),window.addEventListener("resize",this.handleResize),this.findTreeItems(),this.updateVisibleTreeitems(),this.observeTargets(),this.firstTreeitem&&(this.firstTreeitem.el.tabIndex=0)}observeTargets(){this.addObserver(i=>{this.expandTreeitem(i),this.setSelected(i)});let e=new Map,t=new IntersectionObserver(i=>{for(let s of i)e.set(s.target.id,s.isIntersecting||s.intersectionRatio===1);for(let[s,r]of e)if(r){let l=this.treeitems.find(a=>{var h;return(h=a.el)==null?void 0:h.href.endsWith(`#${s}`)});if(l)for(let a of this.observerCallbacks)a(l);break}},{threshold:1,rootMargin:"-60px 0px 0px 0px"});for(let i of this.treeitems.map(s=>s.el.getAttribute("href")))if(i){let s=i.replace(window.location.origin,"").replace("/","").replace("#",""),r=document.getElementById(s);r&&t.observe(r)}}addObserver(e,t=200){this.observerCallbacks.push(w(e,t))}setFocusToNextItem(e){let t=null;for(let i=e.index+1;i<this.treeitems.length;i++){let s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToPreviousItem(e){let t=null;for(let i=e.index-1;i>-1;i--){let s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToParentItem(e){e.groupTreeitem&&this.setFocusToItem(e.groupTreeitem)}setFocusToFirstItem(){this.firstTreeitem&&this.setFocusToItem(this.firstTreeitem)}setFocusToLastItem(){this.lastTreeitem&&this.setFocusToItem(this.lastTreeitem)}setSelected(e){var t;for(let i of this.el.querySelectorAll('[aria-expanded="true"]'))i!==e.el&&((t=i.nextElementSibling)!=null&&t.contains(e.el)||i.setAttribute("aria-expanded","false"));for(let i of this.el.querySelectorAll("[aria-selected]"))i!==e.el&&i.setAttribute("aria-selected","false");e.el.setAttribute("aria-selected","true"),this.updateVisibleTreeitems(),this.setFocusToItem(e,!1)}expandTreeitem(e){let t=e;for(;t;)t.isExpandable&&t.el.setAttribute("aria-expanded","true"),t=t.groupTreeitem;this.updateVisibleTreeitems()}expandAllSiblingItems(e){for(let t of this.treeitems)t.groupTreeitem===e.groupTreeitem&&t.isExpandable&&this.expandTreeitem(t)}collapseTreeitem(e){let t=null;e.isExpanded()?t=e:t=e.groupTreeitem,t&&(t.el.setAttribute("aria-expanded","false"),this.updateVisibleTreeitems(),this.setFocusToItem(t))}setFocusByFirstCharacter(e,t){let i,s;t=t.toLowerCase(),i=e.index+1,i===this.treeitems.length&&(i=0),s=this.getIndexFirstChars(i,t),s===-1&&(s=this.getIndexFirstChars(0,t)),s>-1&&this.setFocusToItem(this.treeitems[s])}findTreeItems(){let e=(t,i)=>{let s=i,r=t.firstElementChild;for(;r;)(r.tagName==="A"||r.tagName==="SPAN")&&(s=new b(r,this,i),this.treeitems.push(s),this.firstChars.push(s.label.substring(0,1).toLowerCase())),r.firstElementChild&&e(r,s),r=r.nextElementSibling};e(this.el,null),this.treeitems.map((t,i)=>t.index=i)}updateVisibleTreeitems(){this.firstTreeitem=this.treeitems[0];for(let e of this.treeitems){let t=e.groupTreeitem;for(e.isVisible=!0;t&&t.el!==this.el;)t.isExpanded()||(e.isVisible=!1),t=t.groupTreeitem;e.isVisible&&(this.lastTreeitem=e)}}setFocusToItem(e,t=!0){e.el.tabIndex=0,t&&e.el.focus();for(let i of this.treeitems)i!==e&&(i.el.tabIndex=-1)}getIndexFirstChars(e,t){for(let i=e;i<this.firstChars.length;i++)if(this.treeitems[i].isVisible&&t===this.firstChars[i])return i;return-1}},b=class{constructor(e,t,i){var l,a,h,c,g;e.tabIndex=-1,this.el=e,this.groupTreeitem=i,this.label=(a=(l=e.textContent)==null?void 0:l.trim())!=null?a:"",this.tree=t,this.depth=((i==null?void 0:i.depth)||0)+1,this.index=0;let s=e.parentElement;(s==null?void 0:s.tagName.toLowerCase())==="li"&&(s==null||s.setAttribute("role","none")),e.setAttribute("aria-level",this.depth+""),e.getAttribute("aria-label")&&(this.label=(c=(h=e==null?void 0:e.getAttribute("aria-label"))==null?void 0:h.trim())!=null?c:""),this.isExpandable=!1,this.isVisible=!1,this.isInGroup=!!i;let r=e.nextElementSibling;for(;r;){if(r.tagName.toLowerCase()=="ul"){let y=`${(g=i==null?void 0:i.label)!=null?g:""} nav group ${this.label}`.replace(/[\W_]+/g,"_");e.setAttribute("aria-owns",y),e.setAttribute("aria-expanded","false"),r.setAttribute("role","group"),r.setAttribute("id",y),this.isExpandable=!0;break}r=r.nextElementSibling}this.init()}init(){this.el.tabIndex=-1,this.el.getAttribute("role")||this.el.setAttribute("role","treeitem"),this.el.addEventListener("keydown",this.handleKeydown.bind(this)),this.el.addEventListener("click",this.handleClick.bind(this)),this.el.addEventListener("focus",this.handleFocus.bind(this)),this.el.addEventListener("blur",this.handleBlur.bind(this))}isExpanded(){return this.isExpandable?this.el.getAttribute("aria-expanded")==="true":!1}isSelected(){return this.el.getAttribute("aria-selected")==="true"}handleClick(e){e.target!==this.el&&e.target!==this.el.firstElementChild||(this.isExpandable&&(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),e.stopPropagation()),this.tree.setSelected(this))}handleFocus(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.add("focus")}handleBlur(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.remove("focus")}handleKeydown(e){if(e.altKey||e.ctrlKey||e.metaKey)return;let t=!1;switch(e.key){case" ":case"Enter":this.isExpandable?(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),t=!0):e.stopPropagation(),this.tree.setSelected(this);break;case"ArrowUp":this.tree.setFocusToPreviousItem(this),t=!0;break;case"ArrowDown":this.tree.setFocusToNextItem(this),t=!0;break;case"ArrowRight":this.isExpandable&&(this.isExpanded()?this.tree.setFocusToNextItem(this):this.tree.expandTreeitem(this)),t=!0;break;case"ArrowLeft":this.isExpandable&&this.isExpanded()?(this.tree.collapseTreeitem(this),t=!0):this.isInGroup&&(this.tree.setFocusToParentItem(this),t=!0);break;case"Home":this.tree.setFocusToFirstItem(),t=!0;break;case"End":this.tree.setFocusToLastItem(),t=!0;break;default:e.key.length===1&&e.key.match(/\S/)&&(e.key=="*"?this.tree.expandAllSiblingItems(this):this.tree.setFocusByFirstCharacter(this,e.key),t=!0);break}t&&(e.stopPropagation(),e.preventDefault())}};function w(n,e){let t;return(...i)=>{let s=()=>{t=null,n(...i)};t&&clearTimeout(t),t=setTimeout(s,e)}}var f=class{constructor(e,t){this.table=e;this.toggleAll=t;this.expandAllItems=()=>{this.toggles.map(e=>e.setAttribute("aria-expanded","true")),this.update()};this.collapseAllItems=()=>{this.toggles.map(e=>e.setAttribute("aria-expanded","false")),this.update()};this.update=()=>{this.updateVisibleItems(),setTimeout(()=>this.updateGlobalToggle())};this.rows=Array.from(e.querySelectorAll("[data-aria-controls]")),this.toggles=Array.from(this.table.querySelectorAll("[aria-expanded]")),this.setAttributes(),this.attachEventListeners(),this.update()}setAttributes(){for(let e of["data-aria-controls","data-aria-labelledby","data-id"])this.table.querySelectorAll(`[${e}]`).forEach(t=>{var i;t.setAttribute(e.replace("data-",""),(i=t.getAttribute(e))!=null?i:""),t.removeAttribute(e)})}attachEventListeners(){var e;this.rows.forEach(t=>{t.addEventListener("click",i=>{this.handleToggleClick(i)})}),(e=this.toggleAll)==null||e.addEventListener("click",()=>{this.expandAllItems()}),document.addEventListener("keydown",t=>{(t.ctrlKey||t.metaKey)&&t.key==="f"&&this.expandAllItems()})}handleToggleClick(e){let t=e.currentTarget;t!=null&&t.hasAttribute("aria-expanded")||(t=this.table.querySelector(`button[aria-controls="${t==null?void 0:t.getAttribute("aria-controls")}"]`));let i=(t==null?void 0:t.getAttribute("aria-expanded"))==="true";t==null||t.setAttribute("aria-expanded",i?"false":"true"),e.stopPropagation(),this.update()}updateVisibleItems(){this.rows.map(e=>{var s;let t=(e==null?void 0:e.getAttribute("aria-expanded"))==="true",i=(s=e==null?void 0:e.getAttribute("aria-controls"))==null?void 0:s.trimEnd().split(" ");i==null||i.map(r=>{let l=document.getElementById(`${r}`);t?(l==null||l.classList.add("visible"),l==null||l.classList.remove("hidden")):(l==null||l.classList.add("hidden"),l==null||l.classList.remove("visible"))})})}updateGlobalToggle(){if(!this.toggleAll)return;this.rows.some(t=>t.hasAttribute("aria-expanded"))&&(this.toggleAll.style.display="block"),this.toggles.some(t=>t.getAttribute("aria-expanded")==="false")?(this.toggleAll.innerText="Expand all",this.toggleAll.onclick=this.expandAllItems):(this.toggleAll.innerText="Collapse all",this.toggleAll.onclick=this.collapseAllItems)}};L();var C=document.querySelector(".js-expandableTable");if(C){let n=new f(C,document.querySelector(".js-expandAllDirectories"));window.location.search.includes("expand-directories")&&n.expandAllItems()}var I=document.querySelector(".js-tree");if(I){let n=new p(I),e=A(n),t=document.querySelector(".js-mainNavMobile");t&&t.firstElementChild&&(t==null||t.replaceChild(e,t.firstElementChild)),e.firstElementChild&&new m(e.firstElementChild)}var o=document.querySelector(".js-readme"),v=document.querySelector(".js-readmeContent"),S=document.querySelector(".js-readmeOutline"),T=document.querySelectorAll(".js-readmeExpand"),k=document.querySelector(".js-readmeCollapse"),x=document.querySelector(".DocNavMobile-select");o&&v&&S&&T.length&&k&&(o.clientHeight>320&&(o==null||o.classList.remove("UnitReadme--expanded"),o==null||o.classList.add("UnitReadme--toggle")),window.location.hash.includes("readme")&&u(),x==null||x.addEventListener("change",n=>{n.target.value.startsWith("readme-")&&u()}),T.forEach(n=>n.addEventListener("click",e=>{e.preventDefault(),u(),o.scrollIntoView()})),k.addEventListener("click",n=>{n.preventDefault(),o.classList.remove("UnitReadme--expanded"),T[1]&&T[1].scrollIntoView({block:"center"})}),v.addEventListener("keyup",()=>{u()}),v.addEventListener("click",()=>{u()}),S.addEventListener("click",()=>{u()}),document.addEventListener("keydown",n=>{(n.ctrlKey||n.metaKey)&&n.key==="f"&&u()}));function u(){history.replaceState(null,"",`${location.pathname}#section-readme`),o==null||o.classList.add("UnitReadme--expanded")}function M(){var t;if(!location.hash)return;let n=document.getElementById(location.hash.slice(1)),e=(t=n==null?void 0:n.parentElement)==null?void 0:t.parentElement;(e==null?void 0:e.nodeName)==="DETAILS"&&(e.open=!0)}M();window.addEventListener("hashchange",()=>M());document.querySelectorAll(".js-buildContextSelect").forEach(n=>{n.addEventListener("change",e=>{window.location.search=`?GOOS=${e.target.value}`})});
+`)),e}handleShareButtonClick(){let e="https://play.golang.org/p/";this.setOutputText("Waiting for remote server\u2026"),fetch("/play/share",{method:"POST",body:this.getCodeWithModFile()}).then(t=>t.text()).then(t=>{let i=e+t;this.setOutputHTML(`<a href="${i}">${i}</a>`),window.open(i)}).catch(t=>{this.setErrorText(t)})}handleFormatButtonClick(){var t,i;this.setOutputText("Waiting for remote server\u2026");let e=new FormData;e.append("body",(i=(t=this.inputEl)==null?void 0:t.value)!=null?i:""),fetch("/play/fmt",{method:"POST",body:e}).then(s=>s.json()).then(({Body:s,Error:r})=>{this.setOutputText(r||"Done."),s&&(this.setInputText(s),this.resize())}).catch(s=>{this.setErrorText(s)})}handleRunButtonClick(){this.setOutputText("Waiting for remote server\u2026"),fetch("/play/compile",{method:"POST",body:JSON.stringify({body:this.getCodeWithModFile(),version:2})}).then(e=>e.json()).then(async({Events:e,Errors:t})=>{this.setOutputText(t||"");for(let i of e||[])this.appendToOutputText(i.Message),await new Promise(s=>setTimeout(s,i.Delay/1e6))}).catch(e=>{this.setErrorText(e)})}};function A(){let n=location.hash.match(/^#(example-.*)$/);if(n){let i=document.getElementById(n[1]);i&&(i.open=!0)}let e=[...document.querySelectorAll(d.PLAY_HREF)],t=i=>e.find(s=>s.hash===i.getAnchorHash());for(let i of document.querySelectorAll(d.PLAY_CONTAINER)){let s=new b(i),r=t(s);r?r.addEventListener("click",()=>{s.expand()}):console.warn("example href not found")}}var p=class{constructor(e){this.el=e;this.el.addEventListener("change",t=>{let i=t.target,s=i.value;i.value.startsWith("/")||(s="/"+s),window.location.href=s})}};function I(n){let e=document.createElement("label");e.classList.add("go-Label"),e.setAttribute("aria-label","Menu");let t=document.createElement("select");t.classList.add("go-Select","js-selectNav"),e.appendChild(t);let i=document.createElement("optgroup");i.label="Outline",t.appendChild(i);let s={},r;for(let l of n.treeitems){if(Number(l.depth)>4)continue;l.groupTreeitem?(r=s[l.groupTreeitem.label],r||(r=s[l.groupTreeitem.label]=document.createElement("optgroup"),r.label=l.groupTreeitem.label,t.appendChild(r))):r=i;let a=document.createElement("option");a.label=l.label,a.textContent=l.label,a.value=l.el.href.replace(window.location.origin,"").replace("/",""),r.appendChild(a)}return n.addObserver(l=>{var c;let a=l.el.hash,h=(c=t.querySelector(`[value$="${a}"]`))==null?void 0:c.value;h&&(t.value=h)},50),e}var f=class{constructor(e){this.el=e;this.handleResize=()=>{this.el.style.setProperty("--js-tree-height","100vh"),this.el.style.setProperty("--js-tree-height",this.el.clientHeight+"px")};this.treeitems=[],this.firstChars=[],this.firstTreeitem=null,this.lastTreeitem=null,this.observerCallbacks=[],this.init()}init(){this.handleResize(),window.addEventListener("resize",this.handleResize),this.findTreeItems(),this.updateVisibleTreeitems(),this.observeTargets(),this.firstTreeitem&&(this.firstTreeitem.el.tabIndex=0)}observeTargets(){this.addObserver(i=>{this.expandTreeitem(i),this.setSelected(i)});let e=new Map,t=new IntersectionObserver(i=>{for(let s of i)e.set(s.target.id,s.isIntersecting||s.intersectionRatio===1);for(let[s,r]of e)if(r){let l=this.treeitems.find(a=>{var h;return(h=a.el)==null?void 0:h.href.endsWith(`#${s}`)});if(l)for(let a of this.observerCallbacks)a(l);break}},{threshold:1,rootMargin:"-60px 0px 0px 0px"});for(let i of this.treeitems.map(s=>s.el.getAttribute("href")))if(i){let s=i.replace(window.location.origin,"").replace("/","").replace("#",""),r=document.getElementById(s);r&&t.observe(r)}}addObserver(e,t=200){this.observerCallbacks.push(M(e,t))}setFocusToNextItem(e){let t=null;for(let i=e.index+1;i<this.treeitems.length;i++){let s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToPreviousItem(e){let t=null;for(let i=e.index-1;i>-1;i--){let s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToParentItem(e){e.groupTreeitem&&this.setFocusToItem(e.groupTreeitem)}setFocusToFirstItem(){this.firstTreeitem&&this.setFocusToItem(this.firstTreeitem)}setFocusToLastItem(){this.lastTreeitem&&this.setFocusToItem(this.lastTreeitem)}setSelected(e){var t;for(let i of this.el.querySelectorAll('[aria-expanded="true"]'))i!==e.el&&((t=i.nextElementSibling)!=null&&t.contains(e.el)||i.setAttribute("aria-expanded","false"));for(let i of this.el.querySelectorAll("[aria-selected]"))i!==e.el&&i.setAttribute("aria-selected","false");e.el.setAttribute("aria-selected","true"),this.updateVisibleTreeitems(),this.setFocusToItem(e,!1)}expandTreeitem(e){let t=e;for(;t;)t.isExpandable&&t.el.setAttribute("aria-expanded","true"),t=t.groupTreeitem;this.updateVisibleTreeitems()}expandAllSiblingItems(e){for(let t of this.treeitems)t.groupTreeitem===e.groupTreeitem&&t.isExpandable&&this.expandTreeitem(t)}collapseTreeitem(e){let t=null;e.isExpanded()?t=e:t=e.groupTreeitem,t&&(t.el.setAttribute("aria-expanded","false"),this.updateVisibleTreeitems(),this.setFocusToItem(t))}setFocusByFirstCharacter(e,t){let i,s;t=t.toLowerCase(),i=e.index+1,i===this.treeitems.length&&(i=0),s=this.getIndexFirstChars(i,t),s===-1&&(s=this.getIndexFirstChars(0,t)),s>-1&&this.setFocusToItem(this.treeitems[s])}findTreeItems(){let e=(t,i)=>{let s=i,r=t.firstElementChild;for(;r;)(r.tagName==="A"||r.tagName==="SPAN")&&(s=new v(r,this,i),this.treeitems.push(s),this.firstChars.push(s.label.substring(0,1).toLowerCase())),r.firstElementChild&&e(r,s),r=r.nextElementSibling};e(this.el,null),this.treeitems.map((t,i)=>t.index=i)}updateVisibleTreeitems(){this.firstTreeitem=this.treeitems[0];for(let e of this.treeitems){let t=e.groupTreeitem;for(e.isVisible=!0;t&&t.el!==this.el;)t.isExpanded()||(e.isVisible=!1),t=t.groupTreeitem;e.isVisible&&(this.lastTreeitem=e)}}setFocusToItem(e,t=!0){e.el.tabIndex=0,t&&e.el.focus();for(let i of this.treeitems)i!==e&&(i.el.tabIndex=-1)}getIndexFirstChars(e,t){for(let i=e;i<this.firstChars.length;i++)if(this.treeitems[i].isVisible&&t===this.firstChars[i])return i;return-1}},v=class{constructor(e,t,i){var l,a,h,c,y;e.tabIndex=-1,this.el=e,this.groupTreeitem=i,this.label=(a=(l=e.textContent)==null?void 0:l.trim())!=null?a:"",this.tree=t,this.depth=((i==null?void 0:i.depth)||0)+1,this.index=0;let s=e.parentElement;(s==null?void 0:s.tagName.toLowerCase())==="li"&&(s==null||s.setAttribute("role","none")),e.setAttribute("aria-level",this.depth+""),e.getAttribute("aria-label")&&(this.label=(c=(h=e==null?void 0:e.getAttribute("aria-label"))==null?void 0:h.trim())!=null?c:""),this.isExpandable=!1,this.isVisible=!1,this.isInGroup=!!i;let r=e.nextElementSibling;for(;r;){if(r.tagName.toLowerCase()=="ul"){let L=`${(y=i==null?void 0:i.label)!=null?y:""} nav group ${this.label}`.replace(/[\W_]+/g,"_");e.setAttribute("aria-owns",L),e.setAttribute("aria-expanded","false"),r.setAttribute("role","group"),r.setAttribute("id",L),this.isExpandable=!0;break}r=r.nextElementSibling}this.init()}init(){this.el.tabIndex=-1,this.el.getAttribute("role")||this.el.setAttribute("role","treeitem"),this.el.addEventListener("keydown",this.handleKeydown.bind(this)),this.el.addEventListener("click",this.handleClick.bind(this)),this.el.addEventListener("focus",this.handleFocus.bind(this)),this.el.addEventListener("blur",this.handleBlur.bind(this))}isExpanded(){return this.isExpandable?this.el.getAttribute("aria-expanded")==="true":!1}isSelected(){return this.el.getAttribute("aria-selected")==="true"}handleClick(e){e.target!==this.el&&e.target!==this.el.firstElementChild||(this.isExpandable&&(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),e.stopPropagation()),this.tree.setSelected(this))}handleFocus(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.add("focus")}handleBlur(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.remove("focus")}handleKeydown(e){if(e.altKey||e.ctrlKey||e.metaKey)return;let t=!1;switch(e.key){case" ":case"Enter":this.isExpandable?(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),t=!0):e.stopPropagation(),this.tree.setSelected(this);break;case"ArrowUp":this.tree.setFocusToPreviousItem(this),t=!0;break;case"ArrowDown":this.tree.setFocusToNextItem(this),t=!0;break;case"ArrowRight":this.isExpandable&&(this.isExpanded()?this.tree.setFocusToNextItem(this):this.tree.expandTreeitem(this)),t=!0;break;case"ArrowLeft":this.isExpandable&&this.isExpanded()?(this.tree.collapseTreeitem(this),t=!0):this.isInGroup&&(this.tree.setFocusToParentItem(this),t=!0);break;case"Home":this.tree.setFocusToFirstItem(),t=!0;break;case"End":this.tree.setFocusToLastItem(),t=!0;break;default:e.key.length===1&&e.key.match(/\S/)&&(e.key=="*"?this.tree.expandAllSiblingItems(this):this.tree.setFocusByFirstCharacter(this,e.key),t=!0);break}t&&(e.stopPropagation(),e.preventDefault())}};function M(n,e){let t;return(...i)=>{let s=()=>{t=null,n(...i)};t&&clearTimeout(t),t=setTimeout(s,e)}}var T=class{constructor(e,t){this.table=e;this.toggleAll=t;this.expandAllItems=()=>{this.toggles.map(e=>e.setAttribute("aria-expanded","true")),this.update()};this.collapseAllItems=()=>{this.toggles.map(e=>e.setAttribute("aria-expanded","false")),this.update()};this.update=()=>{this.updateVisibleItems(),setTimeout(()=>this.updateGlobalToggle())};this.rows=Array.from(e.querySelectorAll("[data-aria-controls]")),this.toggles=Array.from(this.table.querySelectorAll("[aria-expanded]")),this.setAttributes(),this.attachEventListeners(),this.update()}setAttributes(){for(let e of["data-aria-controls","data-aria-labelledby","data-id"])this.table.querySelectorAll(`[${e}]`).forEach(t=>{var i;t.setAttribute(e.replace("data-",""),(i=t.getAttribute(e))!=null?i:""),t.removeAttribute(e)})}attachEventListeners(){var e;this.rows.forEach(t=>{t.addEventListener("click",i=>{this.handleToggleClick(i)})}),(e=this.toggleAll)==null||e.addEventListener("click",()=>{this.expandAllItems()}),document.addEventListener("keydown",t=>{(t.ctrlKey||t.metaKey)&&t.key==="f"&&this.expandAllItems()})}handleToggleClick(e){let t=e.currentTarget;t!=null&&t.hasAttribute("aria-expanded")||(t=this.table.querySelector(`button[aria-controls="${t==null?void 0:t.getAttribute("aria-controls")}"]`));let i=(t==null?void 0:t.getAttribute("aria-expanded"))==="true";t==null||t.setAttribute("aria-expanded",i?"false":"true"),e.stopPropagation(),this.update()}updateVisibleItems(){this.rows.map(e=>{var s;let t=(e==null?void 0:e.getAttribute("aria-expanded"))==="true",i=(s=e==null?void 0:e.getAttribute("aria-controls"))==null?void 0:s.trimEnd().split(" ");i==null||i.map(r=>{let l=document.getElementById(`${r}`);t?(l==null||l.classList.add("visible"),l==null||l.classList.remove("hidden")):(l==null||l.classList.add("hidden"),l==null||l.classList.remove("visible"))})})}updateGlobalToggle(){if(!this.toggleAll)return;this.rows.some(t=>t.hasAttribute("aria-expanded"))&&(this.toggleAll.style.display="block"),this.toggles.some(t=>t.getAttribute("aria-expanded")==="false")?(this.toggleAll.innerText="Expand all",this.toggleAll.onclick=this.expandAllItems):(this.toggleAll.innerText="Collapse all",this.toggleAll.onclick=this.collapseAllItems)}};A();var m=document.querySelector(".js-expandableTable");if(m){let n=new T(m,document.querySelector(".js-expandAllDirectories"));window.location.search.includes("expand-directories")&&n.expandAllItems();let e=document.querySelector(".js-showInternalDirectories");e&&(document.querySelector(".UnitDirectories-internal")&&(e.style.display="block"),e.addEventListener("click",()=>{m.classList.contains("UnitDirectories-showInternal")?(m.classList.remove("UnitDirectories-showInternal"),e.innerText="Show internal"):(m.classList.add("UnitDirectories-showInternal"),e.innerText="Hide internal")})),document.querySelector('html[data-local="true"]')&&(e==null||e.click())}var C=document.querySelector(".js-tree");if(C){let n=new f(C),e=I(n),t=document.querySelector(".js-mainNavMobile");t&&t.firstElementChild&&(t==null||t.replaceChild(e,t.firstElementChild)),e.firstElementChild&&new p(e.firstElementChild)}var o=document.querySelector(".js-readme"),x=document.querySelector(".js-readmeContent"),S=document.querySelector(".js-readmeOutline"),E=document.querySelectorAll(".js-readmeExpand"),k=document.querySelector(".js-readmeCollapse"),g=document.querySelector(".DocNavMobile-select");o&&x&&S&&E.length&&k&&(o.clientHeight>320&&(o==null||o.classList.remove("UnitReadme--expanded"),o==null||o.classList.add("UnitReadme--toggle")),window.location.hash.includes("readme")&&u(),g==null||g.addEventListener("change",n=>{n.target.value.startsWith("readme-")&&u()}),E.forEach(n=>n.addEventListener("click",e=>{e.preventDefault(),u(),o.scrollIntoView()})),k.addEventListener("click",n=>{n.preventDefault(),o.classList.remove("UnitReadme--expanded"),E[1]&&E[1].scrollIntoView({block:"center"})}),x.addEventListener("keyup",()=>{u()}),x.addEventListener("click",()=>{u()}),S.addEventListener("click",()=>{u()}),document.addEventListener("keydown",n=>{(n.ctrlKey||n.metaKey)&&n.key==="f"&&u()}));function u(){history.replaceState(null,"",`${location.pathname}#section-readme`),o==null||o.classList.add("UnitReadme--expanded")}function w(){var t;if(!location.hash)return;let n=document.getElementById(location.hash.slice(1)),e=(t=n==null?void 0:n.parentElement)==null?void 0:t.parentElement;(e==null?void 0:e.nodeName)==="DETAILS"&&(e.open=!0)}w();window.addEventListener("hashchange",()=>w());document.querySelectorAll(".js-buildContextSelect").forEach(n=>{n.addEventListener("change",e=>{window.location.search=`?GOOS=${e.target.value}`})});
 /*!
  * @license
  * Copyright 2021 The Go Authors. All rights reserved.
diff --git a/static/frontend/unit/main/main.js.map b/static/frontend/unit/main/main.js.map
index f6cd0f8..f287142 100644
--- a/static/frontend/unit/main/main.js.map
+++ b/static/frontend/unit/main/main.js.map
@@ -1,7 +1,7 @@
 {
   "version": 3,
   "sources": ["../../../shared/playground/playground.ts", "../../../shared/outline/select.ts", "../../../shared/outline/tree.ts", "../../../shared/table/table.ts", "main.ts"],
-  "sourcesContent": ["/*!\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// This file implements the playground implementation of the documentation\n// page. The playground involves a \"play\" button that allows you to open up\n// a new link to play.golang.org using the example code.\n\n// The CSS is in static/frontend/unit/main/_doc.css\n\n/**\n * CSS classes used by PlaygroundExampleController\n */\nconst PlayExampleClassName = {\n  PLAY_HREF: '.js-exampleHref',\n  PLAY_CONTAINER: '.js-exampleContainer',\n  EXAMPLE_INPUT: '.Documentation-exampleCode',\n  EXAMPLE_OUTPUT: '.Documentation-exampleOutput',\n  EXAMPLE_ERROR: '.Documentation-exampleError',\n  PLAY_BUTTON: '.Documentation-examplePlayButton',\n  SHARE_BUTTON: '.Documentation-exampleShareButton',\n  FORMAT_BUTTON: '.Documentation-exampleFormatButton',\n  RUN_BUTTON: '.Documentation-exampleRunButton',\n};\n\n/**\n * This controller enables playground examples to expand their dropdown or\n * generate shareable Go Playground URLs.\n */\nexport class PlaygroundExampleController {\n  /**\n   * The anchor tag used to identify the container with an example href.\n   * There is only one in an example container div.\n   */\n  private readonly anchorEl: HTMLAnchorElement | null;\n\n  /**\n   * The error element\n   */\n  private readonly errorEl: Element | null;\n\n  /**\n   * Buttons that redirect to an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly playButtonEl: Element | null;\n  private readonly shareButtonEl: Element | null;\n\n  /**\n   * Button that formats the code in an example's playground.\n   */\n  private readonly formatButtonEl: Element | null;\n\n  /**\n   * Button that runs the code in an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly runButtonEl: Element | null;\n\n  /**\n   * The executable code of an example.\n   */\n  private readonly inputEl: HTMLTextAreaElement | null;\n\n  /**\n   * The output of the given example code. This only exists if the\n   * author of the package provides an output for this example.\n   */\n  private readonly outputEl: Element | null;\n\n  /**\n   * @param exampleEl The div that contains playground content for the given example.\n   */\n  constructor(private readonly exampleEl: HTMLDetailsElement) {\n    this.exampleEl = exampleEl;\n    this.anchorEl = exampleEl.querySelector('a');\n    this.errorEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_ERROR);\n    this.playButtonEl = exampleEl.querySelector(PlayExampleClassName.PLAY_BUTTON);\n    this.shareButtonEl = exampleEl.querySelector(PlayExampleClassName.SHARE_BUTTON);\n    this.formatButtonEl = exampleEl.querySelector(PlayExampleClassName.FORMAT_BUTTON);\n    this.runButtonEl = exampleEl.querySelector(PlayExampleClassName.RUN_BUTTON);\n    this.inputEl = this.makeTextArea(exampleEl.querySelector(PlayExampleClassName.EXAMPLE_INPUT));\n    this.outputEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_OUTPUT);\n\n    // This is legacy listener to be replaced the listener for shareButtonEl.\n    this.playButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.shareButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.formatButtonEl?.addEventListener('click', () => this.handleFormatButtonClick());\n    this.runButtonEl?.addEventListener('click', () => this.handleRunButtonClick());\n\n    if (!this.inputEl) return;\n\n    this.resize();\n    this.inputEl.addEventListener('keyup', () => this.resize());\n    this.inputEl.addEventListener('keydown', e => this.onKeydown(e));\n  }\n\n  /**\n   * Replace the pre element with a textarea. The examples are initially rendered\n   * as pre elements so they're fully visible when JS is disabled.\n   */\n  makeTextArea(el: Element | null): HTMLTextAreaElement {\n    const t = document.createElement('textarea');\n    t.classList.add('Documentation-exampleCode', 'code');\n    t.spellcheck = false;\n    t.value = el?.textContent ?? '';\n    el?.parentElement?.replaceChild(t, el);\n    return t;\n  }\n\n  /**\n   * Retrieve the hash value of the anchor element.\n   */\n  getAnchorHash(): string | undefined {\n    return this.anchorEl?.hash;\n  }\n\n  /**\n   * Expands the current playground example.\n   */\n  expand(): void {\n    this.exampleEl.open = true;\n  }\n\n  /**\n   * Resizes the input element to accommodate the amount of text present.\n   */\n  private resize(): void {\n    if (this.inputEl?.value) {\n      const numLineBreaks = (this.inputEl.value.match(/\\n/g) || []).length;\n      // min-height + lines x line-height + padding + border\n      this.inputEl.style.height = `${(20 + numLineBreaks * 20 + 12 + 2) / 16}rem`;\n    }\n  }\n\n  /**\n   * Handler to override keyboard behavior in the playground's\n   * textarea element.\n   *\n   * Tab key inserts tabs into the example playground instead of\n   * switching to the next interactive element.\n   * @param e input element keyboard event.\n   */\n  private onKeydown(e: KeyboardEvent) {\n    if (e.key === 'Tab') {\n      document.execCommand('insertText', false, '\\t');\n      e.preventDefault();\n    }\n  }\n\n  /**\n   * Changes the text of the example's input box.\n   */\n  private setInputText(output: string) {\n    if (this.inputEl) {\n      this.inputEl.value = output;\n    }\n  }\n\n  /**\n   * Changes the text of the example's output box.\n   */\n  private setOutputText(output: string) {\n    if (this.outputEl) {\n      this.outputEl.textContent = output;\n    }\n  }\n\n  /**\n   * Appends to the text of the example's output box.\n   */\n  private appendToOutputText(output: string) {\n    if (this.outputEl) {\n      this.outputEl.textContent += output;\n    }\n  }\n\n  private setOutputHTML(output: string) {\n    if (this.outputEl) {\n      this.outputEl.innerHTML = output;\n    }\n  }\n\n  /**\n   * Sets the error message text and overwrites\n   * output box to indicate a failed response.\n   */\n  private setErrorText(err: string) {\n    if (this.errorEl) {\n      this.errorEl.textContent = err;\n    }\n    this.setOutputText('An error has occurred\u2026');\n  }\n\n  private getCodeWithModFile(): string {\n    let codeWithModFile = this.inputEl?.value ?? '';\n    const moduleVars = document.querySelector<HTMLDivElement>('.js-playgroundVars')?.dataset ?? {};\n    if (moduleVars.modulepath !== 'std') {\n      codeWithModFile = codeWithModFile.concat(`\n-- go.mod --\nmodule play.ground\n\nrequire ${moduleVars.modulepath} ${moduleVars.version}\n`);\n    }\n\n    return codeWithModFile;\n  }\n\n  /**\n   * Opens a new window to play.golang.org using the\n   * example snippet's code in the playground.\n   */\n  private handleShareButtonClick() {\n    const PLAYGROUND_BASE_URL = 'https://play.golang.org/p/';\n\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/share', {\n      method: 'POST',\n      body: this.getCodeWithModFile(),\n    })\n      .then(res => res.text())\n      .then(shareId => {\n        const href = PLAYGROUND_BASE_URL + shareId;\n        this.setOutputHTML(`<a href=\"${href}\">${href}</a>`);\n        window.open(href);\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs gofmt on the example snippet in the playground.\n   */\n  private handleFormatButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n    const body = new FormData();\n    body.append('body', this.inputEl?.value ?? '');\n\n    fetch('/play/fmt', {\n      method: 'POST',\n      body: body,\n    })\n      .then(res => res.json())\n      .then(({ Body, Error }) => {\n        this.setOutputText(Error || 'Done.');\n        if (Body) {\n          this.setInputText(Body);\n          this.resize();\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs the code snippet in the example playground.\n   */\n  private handleRunButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/compile', {\n      method: 'POST',\n      body: JSON.stringify({ body: this.getCodeWithModFile(), version: 2 }),\n    })\n      .then(res => res.json())\n      .then(async ({ Events, Errors }) => {\n        this.setOutputText(Errors || '');\n        for (const e of Events || []) {\n          this.appendToOutputText(e.Message);\n          await new Promise(resolve => setTimeout(resolve, e.Delay / 1000000));\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n}\n\nexport function initPlaygrounds(): void {\n  const exampleHashRegex = location.hash.match(/^#(example-.*)$/);\n  if (exampleHashRegex) {\n    const exampleHashEl = document.getElementById(exampleHashRegex[1]) as HTMLDetailsElement;\n    if (exampleHashEl) {\n      exampleHashEl.open = true;\n    }\n  }\n\n  // We use a spread operator to convert a nodelist into an array of elements.\n  const exampleHrefs = [\n    ...document.querySelectorAll<HTMLAnchorElement>(PlayExampleClassName.PLAY_HREF),\n  ];\n\n  /**\n   * Sometimes exampleHrefs and playContainers are in different order, so we\n   * find an exampleHref from a common hash.\n   * @param playContainer - playground container\n   */\n  const findExampleHash = (playContainer: PlaygroundExampleController) =>\n    exampleHrefs.find(ex => {\n      return ex.hash === playContainer.getAnchorHash();\n    });\n\n  for (const el of document.querySelectorAll(PlayExampleClassName.PLAY_CONTAINER)) {\n    // There should be the same amount of hrefs referencing examples as example containers.\n    const playContainer = new PlaygroundExampleController(el as HTMLDetailsElement);\n    const exampleHref = findExampleHash(playContainer);\n    if (exampleHref) {\n      exampleHref.addEventListener('click', () => {\n        playContainer.expand();\n      });\n    } else {\n      console.warn('example href not found');\n    }\n  }\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport { TreeNavController } from './tree.js';\n\nexport class SelectNavController {\n  constructor(private el: Element) {\n    this.el.addEventListener('change', e => {\n      const target = e.target as HTMLSelectElement;\n      let href = target.value;\n      if (!target.value.startsWith('/')) {\n        href = '/' + href;\n      }\n      window.location.href = href;\n    });\n  }\n}\n\nexport function makeSelectNav(tree: TreeNavController): HTMLLabelElement {\n  const label = document.createElement('label');\n  label.classList.add('go-Label');\n  label.setAttribute('aria-label', 'Menu');\n  const select = document.createElement('select');\n  select.classList.add('go-Select', 'js-selectNav');\n  label.appendChild(select);\n  const outline = document.createElement('optgroup');\n  outline.label = 'Outline';\n  select.appendChild(outline);\n  const groupMap: Record<string, HTMLOptGroupElement> = {};\n  let group: HTMLOptGroupElement;\n  for (const t of tree.treeitems) {\n    if (Number(t.depth) > 4) continue;\n    if (t.groupTreeitem) {\n      group = groupMap[t.groupTreeitem.label];\n      if (!group) {\n        group = groupMap[t.groupTreeitem.label] = document.createElement('optgroup');\n        group.label = t.groupTreeitem.label;\n        select.appendChild(group);\n      }\n    } else {\n      group = outline;\n    }\n    const o = document.createElement('option');\n    o.label = t.label;\n    o.textContent = t.label;\n    o.value = (t.el as HTMLAnchorElement).href.replace(window.location.origin, '').replace('/', '');\n    group.appendChild(o);\n  }\n  tree.addObserver(t => {\n    const hash = (t.el as HTMLAnchorElement).hash;\n    const value = select.querySelector<HTMLOptionElement>(`[value$=\"${hash}\"]`)?.value;\n    if (value) {\n      select.value = value;\n    }\n  }, 50);\n  return label;\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * TreeNavController is the navigation tree component of the documentation page.\n * It adds accessiblity attributes to a tree, observes the heading elements\n * focus the topmost link for headings visible on the page, and implements the\n * WAI-ARIA Treeview Design Pattern with full\n * [keyboard support](https://www.w3.org/TR/wai-aria-practices/examples/treeview/treeview-2/treeview-2a.html#kbd_label).\n */\nexport class TreeNavController {\n  treeitems: TreeItem[];\n\n  /**\n   * firstChars is the first character of each treeitem in the same order\n   * as this.treeitems. We use this array to set focus by character when\n   * navigating the tree with a keyboard.\n   */\n  private firstChars: string[];\n  private firstTreeitem: TreeItem | null;\n  private lastTreeitem: TreeItem | null;\n  private observerCallbacks: ((t: TreeItem) => void)[];\n\n  constructor(private el: HTMLElement) {\n    this.treeitems = [];\n    this.firstChars = [];\n    this.firstTreeitem = null;\n    this.lastTreeitem = null;\n    this.observerCallbacks = [];\n    this.init();\n  }\n\n  private init(): void {\n    this.handleResize();\n    window.addEventListener('resize', this.handleResize);\n    this.findTreeItems();\n    this.updateVisibleTreeitems();\n    this.observeTargets();\n    if (this.firstTreeitem) {\n      this.firstTreeitem.el.tabIndex = 0;\n    }\n  }\n\n  private handleResize = (): void => {\n    this.el.style.setProperty('--js-tree-height', '100vh');\n    this.el.style.setProperty('--js-tree-height', this.el.clientHeight + 'px');\n  };\n\n  private observeTargets() {\n    this.addObserver(treeitem => {\n      this.expandTreeitem(treeitem);\n      this.setSelected(treeitem);\n      // TODO: Fix scroll issue in https://golang.org/issue/47450.\n      // treeitem.el.scrollIntoView({ block: 'nearest' });\n    });\n\n    const targets = new Map<string, boolean>();\n    const observer = new IntersectionObserver(\n      entries => {\n        for (const entry of entries) {\n          targets.set(entry.target.id, entry.isIntersecting || entry.intersectionRatio === 1);\n        }\n        for (const [id, isIntersecting] of targets) {\n          if (isIntersecting) {\n            const active = this.treeitems.find(t =>\n              (t.el as HTMLAnchorElement)?.href.endsWith(`#${id}`)\n            );\n            if (active) {\n              for (const fn of this.observerCallbacks) {\n                fn(active);\n              }\n            }\n            break;\n          }\n        }\n      },\n      {\n        threshold: 1.0,\n        rootMargin: '-60px 0px 0px 0px',\n      }\n    );\n\n    for (const href of this.treeitems.map(t => t.el.getAttribute('href'))) {\n      if (href) {\n        const id = href.replace(window.location.origin, '').replace('/', '').replace('#', '');\n        const target = document.getElementById(id);\n        if (target) {\n          observer.observe(target);\n        }\n      }\n    }\n  }\n\n  addObserver(fn: (t: TreeItem) => void, delay = 200): void {\n    this.observerCallbacks.push(debounce(fn, delay));\n  }\n\n  setFocusToNextItem(currentItem: TreeItem): void {\n    let nextItem = null;\n    for (let i = currentItem.index + 1; i < this.treeitems.length; i++) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        nextItem = ti;\n        break;\n      }\n    }\n    if (nextItem) {\n      this.setFocusToItem(nextItem);\n    }\n  }\n\n  setFocusToPreviousItem(currentItem: TreeItem): void {\n    let prevItem = null;\n    for (let i = currentItem.index - 1; i > -1; i--) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        prevItem = ti;\n        break;\n      }\n    }\n    if (prevItem) {\n      this.setFocusToItem(prevItem);\n    }\n  }\n\n  setFocusToParentItem(currentItem: TreeItem): void {\n    if (currentItem.groupTreeitem) {\n      this.setFocusToItem(currentItem.groupTreeitem);\n    }\n  }\n\n  setFocusToFirstItem(): void {\n    this.firstTreeitem && this.setFocusToItem(this.firstTreeitem);\n  }\n\n  setFocusToLastItem(): void {\n    this.lastTreeitem && this.setFocusToItem(this.lastTreeitem);\n  }\n\n  setSelected(currentItem: TreeItem): void {\n    for (const l1 of this.el.querySelectorAll('[aria-expanded=\"true\"]')) {\n      if (l1 === currentItem.el) continue;\n      if (!l1.nextElementSibling?.contains(currentItem.el)) {\n        l1.setAttribute('aria-expanded', 'false');\n      }\n    }\n    for (const l1 of this.el.querySelectorAll('[aria-selected]')) {\n      if (l1 !== currentItem.el) {\n        l1.setAttribute('aria-selected', 'false');\n      }\n    }\n    currentItem.el.setAttribute('aria-selected', 'true');\n    this.updateVisibleTreeitems();\n    this.setFocusToItem(currentItem, false);\n  }\n\n  expandTreeitem(treeitem: TreeItem): void {\n    let currentItem: TreeItem | null = treeitem;\n    while (currentItem) {\n      if (currentItem.isExpandable) {\n        currentItem.el.setAttribute('aria-expanded', 'true');\n      }\n      currentItem = currentItem.groupTreeitem;\n    }\n    this.updateVisibleTreeitems();\n  }\n\n  expandAllSiblingItems(currentItem: TreeItem): void {\n    for (const ti of this.treeitems) {\n      if (ti.groupTreeitem === currentItem.groupTreeitem && ti.isExpandable) {\n        this.expandTreeitem(ti);\n      }\n    }\n  }\n\n  collapseTreeitem(currentItem: TreeItem): void {\n    let groupTreeitem = null;\n\n    if (currentItem.isExpanded()) {\n      groupTreeitem = currentItem;\n    } else {\n      groupTreeitem = currentItem.groupTreeitem;\n    }\n\n    if (groupTreeitem) {\n      groupTreeitem.el.setAttribute('aria-expanded', 'false');\n      this.updateVisibleTreeitems();\n      this.setFocusToItem(groupTreeitem);\n    }\n  }\n\n  setFocusByFirstCharacter(currentItem: TreeItem, char: string): void {\n    let start: number, index: number;\n    char = char.toLowerCase();\n\n    // Get start index for search based on position of currentItem\n    start = currentItem.index + 1;\n    if (start === this.treeitems.length) {\n      start = 0;\n    }\n\n    // Check remaining slots in the menu\n    index = this.getIndexFirstChars(start, char);\n\n    // If not found in remaining slots, check from beginning\n    if (index === -1) {\n      index = this.getIndexFirstChars(0, char);\n    }\n\n    // If match was found...\n    if (index > -1) {\n      this.setFocusToItem(this.treeitems[index]);\n    }\n  }\n\n  private findTreeItems() {\n    const findItems = (el: HTMLElement, group: TreeItem | null) => {\n      let ti = group;\n      let curr = el.firstElementChild as HTMLElement;\n      while (curr) {\n        if (curr.tagName === 'A' || curr.tagName === 'SPAN') {\n          ti = new TreeItem(curr, this, group);\n          this.treeitems.push(ti);\n          this.firstChars.push(ti.label.substring(0, 1).toLowerCase());\n        }\n        if (curr.firstElementChild) {\n          findItems(curr, ti);\n        }\n        curr = curr.nextElementSibling as HTMLElement;\n      }\n    };\n    findItems(this.el as HTMLElement, null);\n    this.treeitems.map((ti, idx) => (ti.index = idx));\n  }\n\n  private updateVisibleTreeitems(): void {\n    this.firstTreeitem = this.treeitems[0];\n\n    for (const ti of this.treeitems) {\n      let parent = ti.groupTreeitem;\n      ti.isVisible = true;\n      while (parent && parent.el !== this.el) {\n        if (!parent.isExpanded()) {\n          ti.isVisible = false;\n        }\n        parent = parent.groupTreeitem;\n      }\n      if (ti.isVisible) {\n        this.lastTreeitem = ti;\n      }\n    }\n  }\n\n  private setFocusToItem(treeitem: TreeItem, focusEl = true) {\n    treeitem.el.tabIndex = 0;\n    if (focusEl) {\n      treeitem.el.focus();\n    }\n    for (const ti of this.treeitems) {\n      if (ti !== treeitem) {\n        ti.el.tabIndex = -1;\n      }\n    }\n  }\n\n  private getIndexFirstChars(startIndex: number, char: string): number {\n    for (let i = startIndex; i < this.firstChars.length; i++) {\n      if (this.treeitems[i].isVisible && char === this.firstChars[i]) {\n        return i;\n      }\n    }\n    return -1;\n  }\n}\n\nclass TreeItem {\n  el: HTMLElement;\n  groupTreeitem: TreeItem | null;\n  label: string;\n  isExpandable: boolean;\n  isVisible: boolean;\n  depth: number;\n  index: number;\n\n  private tree: TreeNavController;\n  private isInGroup: boolean;\n\n  constructor(el: HTMLElement, treeObj: TreeNavController, group: TreeItem | null) {\n    el.tabIndex = -1;\n    this.el = el;\n    this.groupTreeitem = group;\n    this.label = el.textContent?.trim() ?? '';\n    this.tree = treeObj;\n    this.depth = (group?.depth || 0) + 1;\n    this.index = 0;\n\n    const parent = el.parentElement;\n    if (parent?.tagName.toLowerCase() === 'li') {\n      parent?.setAttribute('role', 'none');\n    }\n    el.setAttribute('aria-level', this.depth + '');\n    if (el.getAttribute('aria-label')) {\n      this.label = el?.getAttribute('aria-label')?.trim() ?? '';\n    }\n\n    this.isExpandable = false;\n    this.isVisible = false;\n    this.isInGroup = !!group;\n\n    let curr = el.nextElementSibling;\n    while (curr) {\n      if (curr.tagName.toLowerCase() == 'ul') {\n        const groupId = `${group?.label ?? ''} nav group ${this.label}`.replace(/[\\W_]+/g, '_');\n        el.setAttribute('aria-owns', groupId);\n        el.setAttribute('aria-expanded', 'false');\n        curr.setAttribute('role', 'group');\n        curr.setAttribute('id', groupId);\n        this.isExpandable = true;\n        break;\n      }\n\n      curr = curr.nextElementSibling;\n    }\n    this.init();\n  }\n\n  private init() {\n    this.el.tabIndex = -1;\n    if (!this.el.getAttribute('role')) {\n      this.el.setAttribute('role', 'treeitem');\n    }\n    this.el.addEventListener('keydown', this.handleKeydown.bind(this));\n    this.el.addEventListener('click', this.handleClick.bind(this));\n    this.el.addEventListener('focus', this.handleFocus.bind(this));\n    this.el.addEventListener('blur', this.handleBlur.bind(this));\n  }\n\n  isExpanded() {\n    if (this.isExpandable) {\n      return this.el.getAttribute('aria-expanded') === 'true';\n    }\n\n    return false;\n  }\n\n  isSelected() {\n    return this.el.getAttribute('aria-selected') === 'true';\n  }\n\n  private handleClick(event: MouseEvent) {\n    // only process click events that directly happened on this treeitem\n    if (event.target !== this.el && event.target !== this.el.firstElementChild) {\n      return;\n    }\n    if (this.isExpandable) {\n      if (this.isExpanded() && this.isSelected()) {\n        this.tree.collapseTreeitem(this);\n      } else {\n        this.tree.expandTreeitem(this);\n      }\n      event.stopPropagation();\n    }\n    this.tree.setSelected(this);\n  }\n\n  private handleFocus() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.add('focus');\n  }\n\n  private handleBlur() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.remove('focus');\n  }\n\n  private handleKeydown(event: KeyboardEvent) {\n    if (event.altKey || event.ctrlKey || event.metaKey) {\n      return;\n    }\n\n    let captured = false;\n    switch (event.key) {\n      case ' ':\n      case 'Enter':\n        if (this.isExpandable) {\n          if (this.isExpanded() && this.isSelected()) {\n            this.tree.collapseTreeitem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n          captured = true;\n        } else {\n          event.stopPropagation();\n        }\n        this.tree.setSelected(this);\n        break;\n\n      case 'ArrowUp':\n        this.tree.setFocusToPreviousItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowDown':\n        this.tree.setFocusToNextItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowRight':\n        if (this.isExpandable) {\n          if (this.isExpanded()) {\n            this.tree.setFocusToNextItem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n        }\n        captured = true;\n        break;\n\n      case 'ArrowLeft':\n        if (this.isExpandable && this.isExpanded()) {\n          this.tree.collapseTreeitem(this);\n          captured = true;\n        } else {\n          if (this.isInGroup) {\n            this.tree.setFocusToParentItem(this);\n            captured = true;\n          }\n        }\n        break;\n\n      case 'Home':\n        this.tree.setFocusToFirstItem();\n        captured = true;\n        break;\n\n      case 'End':\n        this.tree.setFocusToLastItem();\n        captured = true;\n        break;\n\n      default:\n        if (event.key.length === 1 && event.key.match(/\\S/)) {\n          if (event.key == '*') {\n            this.tree.expandAllSiblingItems(this);\n          } else {\n            this.tree.setFocusByFirstCharacter(this, event.key);\n          }\n          captured = true;\n        }\n        break;\n    }\n\n    if (captured) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction debounce<T extends (...args: any[]) => any>(func: T, wait: number) {\n  let timeout: ReturnType<typeof setTimeout> | null;\n  return (...args: Parameters<T>) => {\n    const later = () => {\n      timeout = null;\n      func(...args);\n    };\n    if (timeout) {\n      clearTimeout(timeout);\n    }\n    timeout = setTimeout(later, wait);\n  };\n}\n", "/*!\n * @license\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Controller for a table element with expandable rows. Adds event listeners to\n * a toggle within a table row that controls visiblity of additional related\n * rows in the table.\n *\n * @example\n * ```typescript\n * import {ExpandableRowsTableController} from '/static/js/table';\n *\n * const el = document .querySelector<HTMLTableElement>('.js-myTableElement')\n * new ExpandableRowsTableController(el));\n * ```\n */\nexport class ExpandableRowsTableController {\n  private rows: HTMLTableRowElement[];\n  private toggles: HTMLButtonElement[];\n\n  /**\n   * Create a table controller.\n   * @param table - The table element to which the controller binds.\n   */\n  constructor(private table: HTMLTableElement, private toggleAll?: HTMLButtonElement | null) {\n    this.rows = Array.from(table.querySelectorAll<HTMLTableRowElement>('[data-aria-controls]'));\n    this.toggles = Array.from(this.table.querySelectorAll('[aria-expanded]'));\n    this.setAttributes();\n    this.attachEventListeners();\n    this.update();\n  }\n\n  /**\n   * setAttributes sets data-aria-* and data-id attributes to regular\n   * html attributes as a workaround for limitations from safehtml.\n   */\n  private setAttributes() {\n    for (const a of ['data-aria-controls', 'data-aria-labelledby', 'data-id']) {\n      this.table.querySelectorAll(`[${a}]`).forEach(t => {\n        t.setAttribute(a.replace('data-', ''), t.getAttribute(a) ?? '');\n        t.removeAttribute(a);\n      });\n    }\n  }\n\n  private attachEventListeners() {\n    this.rows.forEach(t => {\n      t.addEventListener('click', e => {\n        this.handleToggleClick(e);\n      });\n    });\n    this.toggleAll?.addEventListener('click', () => {\n      this.expandAllItems();\n    });\n\n    document.addEventListener('keydown', e => {\n      if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n        this.expandAllItems();\n      }\n    });\n  }\n\n  private handleToggleClick(e: MouseEvent) {\n    let target = e.currentTarget as HTMLTableRowElement | null;\n    if (!target?.hasAttribute('aria-expanded')) {\n      target = this.table.querySelector(\n        `button[aria-controls=\"${target?.getAttribute('aria-controls')}\"]`\n      );\n    }\n    const isExpanded = target?.getAttribute('aria-expanded') === 'true';\n    target?.setAttribute('aria-expanded', isExpanded ? 'false' : 'true');\n    e.stopPropagation();\n    this.update();\n  }\n\n  expandAllItems = (): void => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'true'));\n    this.update();\n  };\n\n  private collapseAllItems = () => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'false'));\n    this.update();\n  };\n\n  private update = () => {\n    this.updateVisibleItems();\n    setTimeout(() => this.updateGlobalToggle());\n  };\n\n  private updateVisibleItems() {\n    this.rows.map(t => {\n      const isExpanded = t?.getAttribute('aria-expanded') === 'true';\n      const rowIds = t?.getAttribute('aria-controls')?.trimEnd().split(' ');\n      rowIds?.map(id => {\n        const target = document.getElementById(`${id}`);\n        if (isExpanded) {\n          target?.classList.add('visible');\n          target?.classList.remove('hidden');\n        } else {\n          target?.classList.add('hidden');\n          target?.classList.remove('visible');\n        }\n      });\n    });\n  }\n\n  private updateGlobalToggle() {\n    if (!this.toggleAll) return;\n    if (this.rows.some(t => t.hasAttribute('aria-expanded'))) {\n      this.toggleAll.style.display = 'block';\n    }\n    const someCollapsed = this.toggles.some(el => el.getAttribute('aria-expanded') === 'false');\n    if (someCollapsed) {\n      this.toggleAll.innerText = 'Expand all';\n      this.toggleAll.onclick = this.expandAllItems;\n    } else {\n      this.toggleAll.innerText = 'Collapse all';\n      this.toggleAll.onclick = this.collapseAllItems;\n    }\n  }\n}\n", "import { initPlaygrounds } from 'static/shared/playground/playground';\nimport { SelectNavController, makeSelectNav } from 'static/shared/outline/select';\nimport { TreeNavController } from 'static/shared/outline/tree';\nimport { ExpandableRowsTableController } from 'static/shared/table/table';\n\ninitPlaygrounds();\n\nconst directories = document.querySelector<HTMLTableElement>('.js-expandableTable');\nif (directories) {\n  const table = new ExpandableRowsTableController(\n    directories,\n    document.querySelector<HTMLButtonElement>('.js-expandAllDirectories')\n  );\n  // Expand directories on page load with expand-directories query param.\n  if (window.location.search.includes('expand-directories')) {\n    table.expandAllItems();\n  }\n}\n\nconst treeEl = document.querySelector<HTMLElement>('.js-tree');\nif (treeEl) {\n  const treeCtrl = new TreeNavController(treeEl);\n  const select = makeSelectNav(treeCtrl);\n  const mobileNav = document.querySelector('.js-mainNavMobile');\n  if (mobileNav && mobileNav.firstElementChild) {\n    mobileNav?.replaceChild(select, mobileNav.firstElementChild);\n  }\n  if (select.firstElementChild) {\n    new SelectNavController(select.firstElementChild);\n  }\n}\n\n/**\n * Event handlers for expanding and collapsing the readme section.\n */\nconst readme = document.querySelector('.js-readme');\nconst readmeContent = document.querySelector('.js-readmeContent');\nconst readmeOutline = document.querySelector('.js-readmeOutline');\nconst readmeExpand = document.querySelectorAll('.js-readmeExpand');\nconst readmeCollapse = document.querySelector('.js-readmeCollapse');\nconst mobileNavSelect = document.querySelector<HTMLSelectElement>('.DocNavMobile-select');\nif (readme && readmeContent && readmeOutline && readmeExpand.length && readmeCollapse) {\n  if (readme.clientHeight > 320) {\n    readme?.classList.remove('UnitReadme--expanded');\n    readme?.classList.add('UnitReadme--toggle');\n  }\n  if (window.location.hash.includes('readme')) {\n    expandReadme();\n  }\n  mobileNavSelect?.addEventListener('change', e => {\n    if ((e.target as HTMLSelectElement).value.startsWith('readme-')) {\n      expandReadme();\n    }\n  });\n  readmeExpand.forEach(el =>\n    el.addEventListener('click', e => {\n      e.preventDefault();\n      expandReadme();\n      readme.scrollIntoView();\n    })\n  );\n  readmeCollapse.addEventListener('click', e => {\n    e.preventDefault();\n    readme.classList.remove('UnitReadme--expanded');\n    if (readmeExpand[1]) {\n      readmeExpand[1].scrollIntoView({ block: 'center' });\n    }\n  });\n  readmeContent.addEventListener('keyup', () => {\n    expandReadme();\n  });\n  readmeContent.addEventListener('click', () => {\n    expandReadme();\n  });\n  readmeOutline.addEventListener('click', () => {\n    expandReadme();\n  });\n  document.addEventListener('keydown', e => {\n    if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n      expandReadme();\n    }\n  });\n}\n\n/**\n * expandReadme expands the readme and adds the section-readme hash to the\n * URL so it stays expanded when navigating back from an external link.\n */\nfunction expandReadme() {\n  history.replaceState(null, '', `${location.pathname}#section-readme`);\n  readme?.classList.add('UnitReadme--expanded');\n}\n\n/**\n * Expand details items that are focused. This will expand\n * deprecated symbols when they are navigated to from the index\n * or a direct link.\n */\nfunction openDeprecatedSymbol() {\n  if (!location.hash) return;\n  const heading = document.getElementById(location.hash.slice(1));\n  const grandParent = heading?.parentElement?.parentElement as HTMLDetailsElement | null;\n  if (grandParent?.nodeName === 'DETAILS') {\n    grandParent.open = true;\n  }\n}\nopenDeprecatedSymbol();\nwindow.addEventListener('hashchange', () => openDeprecatedSymbol());\n\n/**\n * Listen for changes in the build context dropdown.\n */\ndocument.querySelectorAll('.js-buildContextSelect').forEach(el => {\n  el.addEventListener('change', e => {\n    window.location.search = `?GOOS=${(e.target as HTMLSelectElement).value}`;\n  });\n});\n"],
-  "mappings": "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",
-  "names": ["PlayExampleClassName", "PlaygroundExampleController", "exampleEl", "_a", "_b", "_c", "_d", "e", "el", "numLineBreaks", "output", "err", "codeWithModFile", "moduleVars", "PLAYGROUND_BASE_URL", "res", "shareId", "href", "body", "Body", "Error", "Events", "Errors", "resolve", "initPlaygrounds", "exampleHashRegex", "exampleHashEl", "exampleHrefs", "findExampleHash", "playContainer", "ex", "exampleHref", "SelectNavController", "el", "e", "target", "href", "makeSelectNav", "tree", "label", "select", "outline", "groupMap", "group", "t", "o", "_a", "hash", "value", "TreeNavController", "el", "treeitem", "targets", "observer", "entries", "entry", "id", "isIntersecting", "active", "t", "_a", "fn", "href", "target", "delay", "debounce", "currentItem", "nextItem", "ti", "prevItem", "l1", "groupTreeitem", "char", "start", "index", "findItems", "group", "curr", "TreeItem", "idx", "parent", "focusEl", "startIndex", "treeObj", "_b", "_c", "_d", "_e", "groupId", "event", "captured", "func", "wait", "timeout", "args", "later", "ExpandableRowsTableController", "table", "toggleAll", "t", "a", "_a", "e", "target", "isExpanded", "rowIds", "id", "el", "initPlaygrounds", "directories", "table", "ExpandableRowsTableController", "treeEl", "treeCtrl", "TreeNavController", "select", "makeSelectNav", "mobileNav", "SelectNavController", "readme", "readmeContent", "readmeOutline", "readmeExpand", "readmeCollapse", "mobileNavSelect", "expandReadme", "e", "el", "openDeprecatedSymbol", "_a", "heading", "grandParent"]
+  "sourcesContent": ["/*!\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// This file implements the playground implementation of the documentation\n// page. The playground involves a \"play\" button that allows you to open up\n// a new link to play.golang.org using the example code.\n\n// The CSS is in static/frontend/unit/main/_doc.css\n\n/**\n * CSS classes used by PlaygroundExampleController\n */\nconst PlayExampleClassName = {\n  PLAY_HREF: '.js-exampleHref',\n  PLAY_CONTAINER: '.js-exampleContainer',\n  EXAMPLE_INPUT: '.Documentation-exampleCode',\n  EXAMPLE_OUTPUT: '.Documentation-exampleOutput',\n  EXAMPLE_ERROR: '.Documentation-exampleError',\n  PLAY_BUTTON: '.Documentation-examplePlayButton',\n  SHARE_BUTTON: '.Documentation-exampleShareButton',\n  FORMAT_BUTTON: '.Documentation-exampleFormatButton',\n  RUN_BUTTON: '.Documentation-exampleRunButton',\n};\n\n/**\n * This controller enables playground examples to expand their dropdown or\n * generate shareable Go Playground URLs.\n */\nexport class PlaygroundExampleController {\n  /**\n   * The anchor tag used to identify the container with an example href.\n   * There is only one in an example container div.\n   */\n  private readonly anchorEl: HTMLAnchorElement | null;\n\n  /**\n   * The error element\n   */\n  private readonly errorEl: Element | null;\n\n  /**\n   * Buttons that redirect to an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly playButtonEl: Element | null;\n  private readonly shareButtonEl: Element | null;\n\n  /**\n   * Button that formats the code in an example's playground.\n   */\n  private readonly formatButtonEl: Element | null;\n\n  /**\n   * Button that runs the code in an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly runButtonEl: Element | null;\n\n  /**\n   * The executable code of an example.\n   */\n  private readonly inputEl: HTMLTextAreaElement | null;\n\n  /**\n   * The output of the given example code. This only exists if the\n   * author of the package provides an output for this example.\n   */\n  private readonly outputEl: Element | null;\n\n  /**\n   * @param exampleEl The div that contains playground content for the given example.\n   */\n  constructor(private readonly exampleEl: HTMLDetailsElement) {\n    this.exampleEl = exampleEl;\n    this.anchorEl = exampleEl.querySelector('a');\n    this.errorEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_ERROR);\n    this.playButtonEl = exampleEl.querySelector(PlayExampleClassName.PLAY_BUTTON);\n    this.shareButtonEl = exampleEl.querySelector(PlayExampleClassName.SHARE_BUTTON);\n    this.formatButtonEl = exampleEl.querySelector(PlayExampleClassName.FORMAT_BUTTON);\n    this.runButtonEl = exampleEl.querySelector(PlayExampleClassName.RUN_BUTTON);\n    this.inputEl = this.makeTextArea(exampleEl.querySelector(PlayExampleClassName.EXAMPLE_INPUT));\n    this.outputEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_OUTPUT);\n\n    // This is legacy listener to be replaced the listener for shareButtonEl.\n    this.playButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.shareButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.formatButtonEl?.addEventListener('click', () => this.handleFormatButtonClick());\n    this.runButtonEl?.addEventListener('click', () => this.handleRunButtonClick());\n\n    if (!this.inputEl) return;\n\n    this.resize();\n    this.inputEl.addEventListener('keyup', () => this.resize());\n    this.inputEl.addEventListener('keydown', e => this.onKeydown(e));\n  }\n\n  /**\n   * Replace the pre element with a textarea. The examples are initially rendered\n   * as pre elements so they're fully visible when JS is disabled.\n   */\n  makeTextArea(el: Element | null): HTMLTextAreaElement {\n    const t = document.createElement('textarea');\n    t.classList.add('Documentation-exampleCode', 'code');\n    t.spellcheck = false;\n    t.value = el?.textContent ?? '';\n    el?.parentElement?.replaceChild(t, el);\n    return t;\n  }\n\n  /**\n   * Retrieve the hash value of the anchor element.\n   */\n  getAnchorHash(): string | undefined {\n    return this.anchorEl?.hash;\n  }\n\n  /**\n   * Expands the current playground example.\n   */\n  expand(): void {\n    this.exampleEl.open = true;\n  }\n\n  /**\n   * Resizes the input element to accommodate the amount of text present.\n   */\n  private resize(): void {\n    if (this.inputEl?.value) {\n      const numLineBreaks = (this.inputEl.value.match(/\\n/g) || []).length;\n      // min-height + lines x line-height + padding + border\n      this.inputEl.style.height = `${(20 + numLineBreaks * 20 + 12 + 2) / 16}rem`;\n    }\n  }\n\n  /**\n   * Handler to override keyboard behavior in the playground's\n   * textarea element.\n   *\n   * Tab key inserts tabs into the example playground instead of\n   * switching to the next interactive element.\n   * @param e input element keyboard event.\n   */\n  private onKeydown(e: KeyboardEvent) {\n    if (e.key === 'Tab') {\n      document.execCommand('insertText', false, '\\t');\n      e.preventDefault();\n    }\n  }\n\n  /**\n   * Changes the text of the example's input box.\n   */\n  private setInputText(output: string) {\n    if (this.inputEl) {\n      this.inputEl.value = output;\n    }\n  }\n\n  /**\n   * Changes the text of the example's output box.\n   */\n  private setOutputText(output: string) {\n    if (this.outputEl) {\n      this.outputEl.textContent = output;\n    }\n  }\n\n  /**\n   * Appends to the text of the example's output box.\n   */\n  private appendToOutputText(output: string) {\n    if (this.outputEl) {\n      this.outputEl.textContent += output;\n    }\n  }\n\n  private setOutputHTML(output: string) {\n    if (this.outputEl) {\n      this.outputEl.innerHTML = output;\n    }\n  }\n\n  /**\n   * Sets the error message text and overwrites\n   * output box to indicate a failed response.\n   */\n  private setErrorText(err: string) {\n    if (this.errorEl) {\n      this.errorEl.textContent = err;\n    }\n    this.setOutputText('An error has occurred\u2026');\n  }\n\n  private getCodeWithModFile(): string {\n    let codeWithModFile = this.inputEl?.value ?? '';\n    const moduleVars = document.querySelector<HTMLDivElement>('.js-playgroundVars')?.dataset ?? {};\n    if (moduleVars.modulepath !== 'std') {\n      codeWithModFile = codeWithModFile.concat(`\n-- go.mod --\nmodule play.ground\n\nrequire ${moduleVars.modulepath} ${moduleVars.version}\n`);\n    }\n\n    return codeWithModFile;\n  }\n\n  /**\n   * Opens a new window to play.golang.org using the\n   * example snippet's code in the playground.\n   */\n  private handleShareButtonClick() {\n    const PLAYGROUND_BASE_URL = 'https://play.golang.org/p/';\n\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/share', {\n      method: 'POST',\n      body: this.getCodeWithModFile(),\n    })\n      .then(res => res.text())\n      .then(shareId => {\n        const href = PLAYGROUND_BASE_URL + shareId;\n        this.setOutputHTML(`<a href=\"${href}\">${href}</a>`);\n        window.open(href);\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs gofmt on the example snippet in the playground.\n   */\n  private handleFormatButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n    const body = new FormData();\n    body.append('body', this.inputEl?.value ?? '');\n\n    fetch('/play/fmt', {\n      method: 'POST',\n      body: body,\n    })\n      .then(res => res.json())\n      .then(({ Body, Error }) => {\n        this.setOutputText(Error || 'Done.');\n        if (Body) {\n          this.setInputText(Body);\n          this.resize();\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs the code snippet in the example playground.\n   */\n  private handleRunButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/compile', {\n      method: 'POST',\n      body: JSON.stringify({ body: this.getCodeWithModFile(), version: 2 }),\n    })\n      .then(res => res.json())\n      .then(async ({ Events, Errors }) => {\n        this.setOutputText(Errors || '');\n        for (const e of Events || []) {\n          this.appendToOutputText(e.Message);\n          await new Promise(resolve => setTimeout(resolve, e.Delay / 1000000));\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n}\n\nexport function initPlaygrounds(): void {\n  const exampleHashRegex = location.hash.match(/^#(example-.*)$/);\n  if (exampleHashRegex) {\n    const exampleHashEl = document.getElementById(exampleHashRegex[1]) as HTMLDetailsElement;\n    if (exampleHashEl) {\n      exampleHashEl.open = true;\n    }\n  }\n\n  // We use a spread operator to convert a nodelist into an array of elements.\n  const exampleHrefs = [\n    ...document.querySelectorAll<HTMLAnchorElement>(PlayExampleClassName.PLAY_HREF),\n  ];\n\n  /**\n   * Sometimes exampleHrefs and playContainers are in different order, so we\n   * find an exampleHref from a common hash.\n   * @param playContainer - playground container\n   */\n  const findExampleHash = (playContainer: PlaygroundExampleController) =>\n    exampleHrefs.find(ex => {\n      return ex.hash === playContainer.getAnchorHash();\n    });\n\n  for (const el of document.querySelectorAll(PlayExampleClassName.PLAY_CONTAINER)) {\n    // There should be the same amount of hrefs referencing examples as example containers.\n    const playContainer = new PlaygroundExampleController(el as HTMLDetailsElement);\n    const exampleHref = findExampleHash(playContainer);\n    if (exampleHref) {\n      exampleHref.addEventListener('click', () => {\n        playContainer.expand();\n      });\n    } else {\n      console.warn('example href not found');\n    }\n  }\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport { TreeNavController } from './tree.js';\n\nexport class SelectNavController {\n  constructor(private el: Element) {\n    this.el.addEventListener('change', e => {\n      const target = e.target as HTMLSelectElement;\n      let href = target.value;\n      if (!target.value.startsWith('/')) {\n        href = '/' + href;\n      }\n      window.location.href = href;\n    });\n  }\n}\n\nexport function makeSelectNav(tree: TreeNavController): HTMLLabelElement {\n  const label = document.createElement('label');\n  label.classList.add('go-Label');\n  label.setAttribute('aria-label', 'Menu');\n  const select = document.createElement('select');\n  select.classList.add('go-Select', 'js-selectNav');\n  label.appendChild(select);\n  const outline = document.createElement('optgroup');\n  outline.label = 'Outline';\n  select.appendChild(outline);\n  const groupMap: Record<string, HTMLOptGroupElement> = {};\n  let group: HTMLOptGroupElement;\n  for (const t of tree.treeitems) {\n    if (Number(t.depth) > 4) continue;\n    if (t.groupTreeitem) {\n      group = groupMap[t.groupTreeitem.label];\n      if (!group) {\n        group = groupMap[t.groupTreeitem.label] = document.createElement('optgroup');\n        group.label = t.groupTreeitem.label;\n        select.appendChild(group);\n      }\n    } else {\n      group = outline;\n    }\n    const o = document.createElement('option');\n    o.label = t.label;\n    o.textContent = t.label;\n    o.value = (t.el as HTMLAnchorElement).href.replace(window.location.origin, '').replace('/', '');\n    group.appendChild(o);\n  }\n  tree.addObserver(t => {\n    const hash = (t.el as HTMLAnchorElement).hash;\n    const value = select.querySelector<HTMLOptionElement>(`[value$=\"${hash}\"]`)?.value;\n    if (value) {\n      select.value = value;\n    }\n  }, 50);\n  return label;\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * TreeNavController is the navigation tree component of the documentation page.\n * It adds accessiblity attributes to a tree, observes the heading elements\n * focus the topmost link for headings visible on the page, and implements the\n * WAI-ARIA Treeview Design Pattern with full\n * [keyboard support](https://www.w3.org/TR/wai-aria-practices/examples/treeview/treeview-2/treeview-2a.html#kbd_label).\n */\nexport class TreeNavController {\n  treeitems: TreeItem[];\n\n  /**\n   * firstChars is the first character of each treeitem in the same order\n   * as this.treeitems. We use this array to set focus by character when\n   * navigating the tree with a keyboard.\n   */\n  private firstChars: string[];\n  private firstTreeitem: TreeItem | null;\n  private lastTreeitem: TreeItem | null;\n  private observerCallbacks: ((t: TreeItem) => void)[];\n\n  constructor(private el: HTMLElement) {\n    this.treeitems = [];\n    this.firstChars = [];\n    this.firstTreeitem = null;\n    this.lastTreeitem = null;\n    this.observerCallbacks = [];\n    this.init();\n  }\n\n  private init(): void {\n    this.handleResize();\n    window.addEventListener('resize', this.handleResize);\n    this.findTreeItems();\n    this.updateVisibleTreeitems();\n    this.observeTargets();\n    if (this.firstTreeitem) {\n      this.firstTreeitem.el.tabIndex = 0;\n    }\n  }\n\n  private handleResize = (): void => {\n    this.el.style.setProperty('--js-tree-height', '100vh');\n    this.el.style.setProperty('--js-tree-height', this.el.clientHeight + 'px');\n  };\n\n  private observeTargets() {\n    this.addObserver(treeitem => {\n      this.expandTreeitem(treeitem);\n      this.setSelected(treeitem);\n      // TODO: Fix scroll issue in https://golang.org/issue/47450.\n      // treeitem.el.scrollIntoView({ block: 'nearest' });\n    });\n\n    const targets = new Map<string, boolean>();\n    const observer = new IntersectionObserver(\n      entries => {\n        for (const entry of entries) {\n          targets.set(entry.target.id, entry.isIntersecting || entry.intersectionRatio === 1);\n        }\n        for (const [id, isIntersecting] of targets) {\n          if (isIntersecting) {\n            const active = this.treeitems.find(t =>\n              (t.el as HTMLAnchorElement)?.href.endsWith(`#${id}`)\n            );\n            if (active) {\n              for (const fn of this.observerCallbacks) {\n                fn(active);\n              }\n            }\n            break;\n          }\n        }\n      },\n      {\n        threshold: 1.0,\n        rootMargin: '-60px 0px 0px 0px',\n      }\n    );\n\n    for (const href of this.treeitems.map(t => t.el.getAttribute('href'))) {\n      if (href) {\n        const id = href.replace(window.location.origin, '').replace('/', '').replace('#', '');\n        const target = document.getElementById(id);\n        if (target) {\n          observer.observe(target);\n        }\n      }\n    }\n  }\n\n  addObserver(fn: (t: TreeItem) => void, delay = 200): void {\n    this.observerCallbacks.push(debounce(fn, delay));\n  }\n\n  setFocusToNextItem(currentItem: TreeItem): void {\n    let nextItem = null;\n    for (let i = currentItem.index + 1; i < this.treeitems.length; i++) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        nextItem = ti;\n        break;\n      }\n    }\n    if (nextItem) {\n      this.setFocusToItem(nextItem);\n    }\n  }\n\n  setFocusToPreviousItem(currentItem: TreeItem): void {\n    let prevItem = null;\n    for (let i = currentItem.index - 1; i > -1; i--) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        prevItem = ti;\n        break;\n      }\n    }\n    if (prevItem) {\n      this.setFocusToItem(prevItem);\n    }\n  }\n\n  setFocusToParentItem(currentItem: TreeItem): void {\n    if (currentItem.groupTreeitem) {\n      this.setFocusToItem(currentItem.groupTreeitem);\n    }\n  }\n\n  setFocusToFirstItem(): void {\n    this.firstTreeitem && this.setFocusToItem(this.firstTreeitem);\n  }\n\n  setFocusToLastItem(): void {\n    this.lastTreeitem && this.setFocusToItem(this.lastTreeitem);\n  }\n\n  setSelected(currentItem: TreeItem): void {\n    for (const l1 of this.el.querySelectorAll('[aria-expanded=\"true\"]')) {\n      if (l1 === currentItem.el) continue;\n      if (!l1.nextElementSibling?.contains(currentItem.el)) {\n        l1.setAttribute('aria-expanded', 'false');\n      }\n    }\n    for (const l1 of this.el.querySelectorAll('[aria-selected]')) {\n      if (l1 !== currentItem.el) {\n        l1.setAttribute('aria-selected', 'false');\n      }\n    }\n    currentItem.el.setAttribute('aria-selected', 'true');\n    this.updateVisibleTreeitems();\n    this.setFocusToItem(currentItem, false);\n  }\n\n  expandTreeitem(treeitem: TreeItem): void {\n    let currentItem: TreeItem | null = treeitem;\n    while (currentItem) {\n      if (currentItem.isExpandable) {\n        currentItem.el.setAttribute('aria-expanded', 'true');\n      }\n      currentItem = currentItem.groupTreeitem;\n    }\n    this.updateVisibleTreeitems();\n  }\n\n  expandAllSiblingItems(currentItem: TreeItem): void {\n    for (const ti of this.treeitems) {\n      if (ti.groupTreeitem === currentItem.groupTreeitem && ti.isExpandable) {\n        this.expandTreeitem(ti);\n      }\n    }\n  }\n\n  collapseTreeitem(currentItem: TreeItem): void {\n    let groupTreeitem = null;\n\n    if (currentItem.isExpanded()) {\n      groupTreeitem = currentItem;\n    } else {\n      groupTreeitem = currentItem.groupTreeitem;\n    }\n\n    if (groupTreeitem) {\n      groupTreeitem.el.setAttribute('aria-expanded', 'false');\n      this.updateVisibleTreeitems();\n      this.setFocusToItem(groupTreeitem);\n    }\n  }\n\n  setFocusByFirstCharacter(currentItem: TreeItem, char: string): void {\n    let start: number, index: number;\n    char = char.toLowerCase();\n\n    // Get start index for search based on position of currentItem\n    start = currentItem.index + 1;\n    if (start === this.treeitems.length) {\n      start = 0;\n    }\n\n    // Check remaining slots in the menu\n    index = this.getIndexFirstChars(start, char);\n\n    // If not found in remaining slots, check from beginning\n    if (index === -1) {\n      index = this.getIndexFirstChars(0, char);\n    }\n\n    // If match was found...\n    if (index > -1) {\n      this.setFocusToItem(this.treeitems[index]);\n    }\n  }\n\n  private findTreeItems() {\n    const findItems = (el: HTMLElement, group: TreeItem | null) => {\n      let ti = group;\n      let curr = el.firstElementChild as HTMLElement;\n      while (curr) {\n        if (curr.tagName === 'A' || curr.tagName === 'SPAN') {\n          ti = new TreeItem(curr, this, group);\n          this.treeitems.push(ti);\n          this.firstChars.push(ti.label.substring(0, 1).toLowerCase());\n        }\n        if (curr.firstElementChild) {\n          findItems(curr, ti);\n        }\n        curr = curr.nextElementSibling as HTMLElement;\n      }\n    };\n    findItems(this.el as HTMLElement, null);\n    this.treeitems.map((ti, idx) => (ti.index = idx));\n  }\n\n  private updateVisibleTreeitems(): void {\n    this.firstTreeitem = this.treeitems[0];\n\n    for (const ti of this.treeitems) {\n      let parent = ti.groupTreeitem;\n      ti.isVisible = true;\n      while (parent && parent.el !== this.el) {\n        if (!parent.isExpanded()) {\n          ti.isVisible = false;\n        }\n        parent = parent.groupTreeitem;\n      }\n      if (ti.isVisible) {\n        this.lastTreeitem = ti;\n      }\n    }\n  }\n\n  private setFocusToItem(treeitem: TreeItem, focusEl = true) {\n    treeitem.el.tabIndex = 0;\n    if (focusEl) {\n      treeitem.el.focus();\n    }\n    for (const ti of this.treeitems) {\n      if (ti !== treeitem) {\n        ti.el.tabIndex = -1;\n      }\n    }\n  }\n\n  private getIndexFirstChars(startIndex: number, char: string): number {\n    for (let i = startIndex; i < this.firstChars.length; i++) {\n      if (this.treeitems[i].isVisible && char === this.firstChars[i]) {\n        return i;\n      }\n    }\n    return -1;\n  }\n}\n\nclass TreeItem {\n  el: HTMLElement;\n  groupTreeitem: TreeItem | null;\n  label: string;\n  isExpandable: boolean;\n  isVisible: boolean;\n  depth: number;\n  index: number;\n\n  private tree: TreeNavController;\n  private isInGroup: boolean;\n\n  constructor(el: HTMLElement, treeObj: TreeNavController, group: TreeItem | null) {\n    el.tabIndex = -1;\n    this.el = el;\n    this.groupTreeitem = group;\n    this.label = el.textContent?.trim() ?? '';\n    this.tree = treeObj;\n    this.depth = (group?.depth || 0) + 1;\n    this.index = 0;\n\n    const parent = el.parentElement;\n    if (parent?.tagName.toLowerCase() === 'li') {\n      parent?.setAttribute('role', 'none');\n    }\n    el.setAttribute('aria-level', this.depth + '');\n    if (el.getAttribute('aria-label')) {\n      this.label = el?.getAttribute('aria-label')?.trim() ?? '';\n    }\n\n    this.isExpandable = false;\n    this.isVisible = false;\n    this.isInGroup = !!group;\n\n    let curr = el.nextElementSibling;\n    while (curr) {\n      if (curr.tagName.toLowerCase() == 'ul') {\n        const groupId = `${group?.label ?? ''} nav group ${this.label}`.replace(/[\\W_]+/g, '_');\n        el.setAttribute('aria-owns', groupId);\n        el.setAttribute('aria-expanded', 'false');\n        curr.setAttribute('role', 'group');\n        curr.setAttribute('id', groupId);\n        this.isExpandable = true;\n        break;\n      }\n\n      curr = curr.nextElementSibling;\n    }\n    this.init();\n  }\n\n  private init() {\n    this.el.tabIndex = -1;\n    if (!this.el.getAttribute('role')) {\n      this.el.setAttribute('role', 'treeitem');\n    }\n    this.el.addEventListener('keydown', this.handleKeydown.bind(this));\n    this.el.addEventListener('click', this.handleClick.bind(this));\n    this.el.addEventListener('focus', this.handleFocus.bind(this));\n    this.el.addEventListener('blur', this.handleBlur.bind(this));\n  }\n\n  isExpanded() {\n    if (this.isExpandable) {\n      return this.el.getAttribute('aria-expanded') === 'true';\n    }\n\n    return false;\n  }\n\n  isSelected() {\n    return this.el.getAttribute('aria-selected') === 'true';\n  }\n\n  private handleClick(event: MouseEvent) {\n    // only process click events that directly happened on this treeitem\n    if (event.target !== this.el && event.target !== this.el.firstElementChild) {\n      return;\n    }\n    if (this.isExpandable) {\n      if (this.isExpanded() && this.isSelected()) {\n        this.tree.collapseTreeitem(this);\n      } else {\n        this.tree.expandTreeitem(this);\n      }\n      event.stopPropagation();\n    }\n    this.tree.setSelected(this);\n  }\n\n  private handleFocus() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.add('focus');\n  }\n\n  private handleBlur() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.remove('focus');\n  }\n\n  private handleKeydown(event: KeyboardEvent) {\n    if (event.altKey || event.ctrlKey || event.metaKey) {\n      return;\n    }\n\n    let captured = false;\n    switch (event.key) {\n      case ' ':\n      case 'Enter':\n        if (this.isExpandable) {\n          if (this.isExpanded() && this.isSelected()) {\n            this.tree.collapseTreeitem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n          captured = true;\n        } else {\n          event.stopPropagation();\n        }\n        this.tree.setSelected(this);\n        break;\n\n      case 'ArrowUp':\n        this.tree.setFocusToPreviousItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowDown':\n        this.tree.setFocusToNextItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowRight':\n        if (this.isExpandable) {\n          if (this.isExpanded()) {\n            this.tree.setFocusToNextItem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n        }\n        captured = true;\n        break;\n\n      case 'ArrowLeft':\n        if (this.isExpandable && this.isExpanded()) {\n          this.tree.collapseTreeitem(this);\n          captured = true;\n        } else {\n          if (this.isInGroup) {\n            this.tree.setFocusToParentItem(this);\n            captured = true;\n          }\n        }\n        break;\n\n      case 'Home':\n        this.tree.setFocusToFirstItem();\n        captured = true;\n        break;\n\n      case 'End':\n        this.tree.setFocusToLastItem();\n        captured = true;\n        break;\n\n      default:\n        if (event.key.length === 1 && event.key.match(/\\S/)) {\n          if (event.key == '*') {\n            this.tree.expandAllSiblingItems(this);\n          } else {\n            this.tree.setFocusByFirstCharacter(this, event.key);\n          }\n          captured = true;\n        }\n        break;\n    }\n\n    if (captured) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction debounce<T extends (...args: any[]) => any>(func: T, wait: number) {\n  let timeout: ReturnType<typeof setTimeout> | null;\n  return (...args: Parameters<T>) => {\n    const later = () => {\n      timeout = null;\n      func(...args);\n    };\n    if (timeout) {\n      clearTimeout(timeout);\n    }\n    timeout = setTimeout(later, wait);\n  };\n}\n", "/*!\n * @license\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Controller for a table element with expandable rows. Adds event listeners to\n * a toggle within a table row that controls visiblity of additional related\n * rows in the table.\n *\n * @example\n * ```typescript\n * import {ExpandableRowsTableController} from '/static/js/table';\n *\n * const el = document .querySelector<HTMLTableElement>('.js-myTableElement')\n * new ExpandableRowsTableController(el));\n * ```\n */\nexport class ExpandableRowsTableController {\n  private rows: HTMLTableRowElement[];\n  private toggles: HTMLButtonElement[];\n\n  /**\n   * Create a table controller.\n   * @param table - The table element to which the controller binds.\n   */\n  constructor(private table: HTMLTableElement, private toggleAll?: HTMLButtonElement | null) {\n    this.rows = Array.from(table.querySelectorAll<HTMLTableRowElement>('[data-aria-controls]'));\n    this.toggles = Array.from(this.table.querySelectorAll('[aria-expanded]'));\n    this.setAttributes();\n    this.attachEventListeners();\n    this.update();\n  }\n\n  /**\n   * setAttributes sets data-aria-* and data-id attributes to regular\n   * html attributes as a workaround for limitations from safehtml.\n   */\n  private setAttributes() {\n    for (const a of ['data-aria-controls', 'data-aria-labelledby', 'data-id']) {\n      this.table.querySelectorAll(`[${a}]`).forEach(t => {\n        t.setAttribute(a.replace('data-', ''), t.getAttribute(a) ?? '');\n        t.removeAttribute(a);\n      });\n    }\n  }\n\n  private attachEventListeners() {\n    this.rows.forEach(t => {\n      t.addEventListener('click', e => {\n        this.handleToggleClick(e);\n      });\n    });\n    this.toggleAll?.addEventListener('click', () => {\n      this.expandAllItems();\n    });\n\n    document.addEventListener('keydown', e => {\n      if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n        this.expandAllItems();\n      }\n    });\n  }\n\n  private handleToggleClick(e: MouseEvent) {\n    let target = e.currentTarget as HTMLTableRowElement | null;\n    if (!target?.hasAttribute('aria-expanded')) {\n      target = this.table.querySelector(\n        `button[aria-controls=\"${target?.getAttribute('aria-controls')}\"]`\n      );\n    }\n    const isExpanded = target?.getAttribute('aria-expanded') === 'true';\n    target?.setAttribute('aria-expanded', isExpanded ? 'false' : 'true');\n    e.stopPropagation();\n    this.update();\n  }\n\n  expandAllItems = (): void => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'true'));\n    this.update();\n  };\n\n  private collapseAllItems = () => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'false'));\n    this.update();\n  };\n\n  private update = () => {\n    this.updateVisibleItems();\n    setTimeout(() => this.updateGlobalToggle());\n  };\n\n  private updateVisibleItems() {\n    this.rows.map(t => {\n      const isExpanded = t?.getAttribute('aria-expanded') === 'true';\n      const rowIds = t?.getAttribute('aria-controls')?.trimEnd().split(' ');\n      rowIds?.map(id => {\n        const target = document.getElementById(`${id}`);\n        if (isExpanded) {\n          target?.classList.add('visible');\n          target?.classList.remove('hidden');\n        } else {\n          target?.classList.add('hidden');\n          target?.classList.remove('visible');\n        }\n      });\n    });\n  }\n\n  private updateGlobalToggle() {\n    if (!this.toggleAll) return;\n    if (this.rows.some(t => t.hasAttribute('aria-expanded'))) {\n      this.toggleAll.style.display = 'block';\n    }\n    const someCollapsed = this.toggles.some(el => el.getAttribute('aria-expanded') === 'false');\n    if (someCollapsed) {\n      this.toggleAll.innerText = 'Expand all';\n      this.toggleAll.onclick = this.expandAllItems;\n    } else {\n      this.toggleAll.innerText = 'Collapse all';\n      this.toggleAll.onclick = this.collapseAllItems;\n    }\n  }\n}\n", "import { initPlaygrounds } from 'static/shared/playground/playground';\nimport { SelectNavController, makeSelectNav } from 'static/shared/outline/select';\nimport { TreeNavController } from 'static/shared/outline/tree';\nimport { ExpandableRowsTableController } from 'static/shared/table/table';\n\ninitPlaygrounds();\n\nconst directories = document.querySelector<HTMLTableElement>('.js-expandableTable');\nif (directories) {\n  const table = new ExpandableRowsTableController(\n    directories,\n    document.querySelector<HTMLButtonElement>('.js-expandAllDirectories')\n  );\n  // Expand directories on page load with expand-directories query param.\n  if (window.location.search.includes('expand-directories')) {\n    table.expandAllItems();\n  }\n\n  const internalToggle = document.querySelector<HTMLButtonElement>('.js-showInternalDirectories');\n  if (internalToggle) {\n    if (document.querySelector('.UnitDirectories-internal')) {\n      internalToggle.style.display = 'block';\n    }\n    internalToggle.addEventListener('click', () => {\n      if (directories.classList.contains('UnitDirectories-showInternal')) {\n        directories.classList.remove('UnitDirectories-showInternal');\n        internalToggle.innerText = 'Show internal';\n      } else {\n        directories.classList.add('UnitDirectories-showInternal');\n        internalToggle.innerText = 'Hide internal';\n      }\n    });\n  }\n  if (document.querySelector('html[data-local=\"true\"]')) {\n    internalToggle?.click();\n  }\n}\n\nconst treeEl = document.querySelector<HTMLElement>('.js-tree');\nif (treeEl) {\n  const treeCtrl = new TreeNavController(treeEl);\n  const select = makeSelectNav(treeCtrl);\n  const mobileNav = document.querySelector('.js-mainNavMobile');\n  if (mobileNav && mobileNav.firstElementChild) {\n    mobileNav?.replaceChild(select, mobileNav.firstElementChild);\n  }\n  if (select.firstElementChild) {\n    new SelectNavController(select.firstElementChild);\n  }\n}\n\n/**\n * Event handlers for expanding and collapsing the readme section.\n */\nconst readme = document.querySelector('.js-readme');\nconst readmeContent = document.querySelector('.js-readmeContent');\nconst readmeOutline = document.querySelector('.js-readmeOutline');\nconst readmeExpand = document.querySelectorAll('.js-readmeExpand');\nconst readmeCollapse = document.querySelector('.js-readmeCollapse');\nconst mobileNavSelect = document.querySelector<HTMLSelectElement>('.DocNavMobile-select');\nif (readme && readmeContent && readmeOutline && readmeExpand.length && readmeCollapse) {\n  if (readme.clientHeight > 320) {\n    readme?.classList.remove('UnitReadme--expanded');\n    readme?.classList.add('UnitReadme--toggle');\n  }\n  if (window.location.hash.includes('readme')) {\n    expandReadme();\n  }\n  mobileNavSelect?.addEventListener('change', e => {\n    if ((e.target as HTMLSelectElement).value.startsWith('readme-')) {\n      expandReadme();\n    }\n  });\n  readmeExpand.forEach(el =>\n    el.addEventListener('click', e => {\n      e.preventDefault();\n      expandReadme();\n      readme.scrollIntoView();\n    })\n  );\n  readmeCollapse.addEventListener('click', e => {\n    e.preventDefault();\n    readme.classList.remove('UnitReadme--expanded');\n    if (readmeExpand[1]) {\n      readmeExpand[1].scrollIntoView({ block: 'center' });\n    }\n  });\n  readmeContent.addEventListener('keyup', () => {\n    expandReadme();\n  });\n  readmeContent.addEventListener('click', () => {\n    expandReadme();\n  });\n  readmeOutline.addEventListener('click', () => {\n    expandReadme();\n  });\n  document.addEventListener('keydown', e => {\n    if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n      expandReadme();\n    }\n  });\n}\n\n/**\n * expandReadme expands the readme and adds the section-readme hash to the\n * URL so it stays expanded when navigating back from an external link.\n */\nfunction expandReadme() {\n  history.replaceState(null, '', `${location.pathname}#section-readme`);\n  readme?.classList.add('UnitReadme--expanded');\n}\n\n/**\n * Expand details items that are focused. This will expand\n * deprecated symbols when they are navigated to from the index\n * or a direct link.\n */\nfunction openDeprecatedSymbol() {\n  if (!location.hash) return;\n  const heading = document.getElementById(location.hash.slice(1));\n  const grandParent = heading?.parentElement?.parentElement as HTMLDetailsElement | null;\n  if (grandParent?.nodeName === 'DETAILS') {\n    grandParent.open = true;\n  }\n}\nopenDeprecatedSymbol();\nwindow.addEventListener('hashchange', () => openDeprecatedSymbol());\n\n/**\n * Listen for changes in the build context dropdown.\n */\ndocument.querySelectorAll('.js-buildContextSelect').forEach(el => {\n  el.addEventListener('change', e => {\n    window.location.search = `?GOOS=${(e.target as HTMLSelectElement).value}`;\n  });\n});\n"],
+  "mappings": "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",
+  "names": ["PlayExampleClassName", "PlaygroundExampleController", "exampleEl", "_a", "_b", "_c", "_d", "e", "el", "numLineBreaks", "output", "err", "codeWithModFile", "moduleVars", "PLAYGROUND_BASE_URL", "res", "shareId", "href", "body", "Body", "Error", "Events", "Errors", "resolve", "initPlaygrounds", "exampleHashRegex", "exampleHashEl", "exampleHrefs", "findExampleHash", "playContainer", "ex", "exampleHref", "SelectNavController", "el", "e", "target", "href", "makeSelectNav", "tree", "label", "select", "outline", "groupMap", "group", "t", "o", "_a", "hash", "value", "TreeNavController", "el", "treeitem", "targets", "observer", "entries", "entry", "id", "isIntersecting", "active", "t", "_a", "fn", "href", "target", "delay", "debounce", "currentItem", "nextItem", "ti", "prevItem", "l1", "groupTreeitem", "char", "start", "index", "findItems", "group", "curr", "TreeItem", "idx", "parent", "focusEl", "startIndex", "treeObj", "_b", "_c", "_d", "_e", "groupId", "event", "captured", "func", "wait", "timeout", "args", "later", "ExpandableRowsTableController", "table", "toggleAll", "t", "a", "_a", "e", "target", "isExpanded", "rowIds", "id", "el", "initPlaygrounds", "directories", "table", "ExpandableRowsTableController", "internalToggle", "treeEl", "treeCtrl", "TreeNavController", "select", "makeSelectNav", "mobileNav", "SelectNavController", "readme", "readmeContent", "readmeOutline", "readmeExpand", "readmeCollapse", "mobileNavSelect", "expandReadme", "e", "el", "openDeprecatedSymbol", "_a", "heading", "grandParent"]
 }
diff --git a/static/frontend/unit/main/main.min.css b/static/frontend/unit/main/main.min.css
index dbd994a..66e4139 100644
--- a/static/frontend/unit/main/main.min.css
+++ b/static/frontend/unit/main/main.min.css
@@ -3,7 +3,7 @@
  * Use of this source code is governed by a BSD-style
  * license that can be found in the LICENSE file.
  */
-.UnitBuildContext-titleContext label,.UnitBuildContext-singleContext{color:var(--color-text-subtle);font-size:.875rem}.UnitBuildContext-singleContext{padding:.35rem 0}.UnitBuildContext-titleContext select{border-color:var(--color-border);color:var(--color-text-subtle);margin-left:.25rem;min-width:6rem}.UnitBuildContext-titleContext option{color:var(--color-text-subtle)}.UnitBuildContext-link{display:none}@media only screen and (min-width: 30rem){.UnitBuildContext-link{display:initial}}.UnitDoc .UnitBuildContext-titleContext{position:relative}.UnitDoc .UnitBuildContext-titleContext label,.UnitDoc .UnitBuildContext-singleContext{bottom:.875rem;position:absolute;right:0}.UnitDirectories{margin-bottom:2rem}.UnitDirectories h2 a.UnitDirectories-idLink,.UnitDirectories summary a{opacity:0}.UnitDirectories h2:hover a,.UnitDirectories summary:focus a{opacity:1}.UnitDirectories-title{border-bottom:var(--border);font-size:1.375rem;margin:.5rem 0 0;padding-bottom:1rem}.UnitDirectories-title img{margin:auto 1rem auto 0}.UnitDirectories-table{border-collapse:collapse;height:0;table-layout:auto;width:100%}.UnitDirectories-table--tree{margin-top:-2rem}.UnitDirectories-tableHeader{background-color:var(--color-background-accented)}.UnitDirectories-tableHeader--tree{visibility:hidden}.UnitDirectories td{border-bottom:var(--border);max-width:32rem;min-width:12rem;padding:.25rem 1rem;vertical-align:middle;word-break:break-word}.UnitDirectories th{padding:.5rem 1rem;text-align:left}.UnitDirectories tr.hidden{display:none}.UnitDirectories tr[aria-controls]{cursor:pointer}.UnitDirectories tr[aria-controls]:hover{background-color:var(--color-background-accented)}.UnitDirectories th.UnitDirectories-toggleHead{font-size:0;max-width:.625rem;padding:0;width:.625rem}.UnitDirectories td.UnitDirectories-toggleCell,th.UnitDirectories-toggleCell{background-color:var(--background);border:var(--white);max-width:.625rem;padding:0;width:.625rem}.UnitDirectories-toggleButton{font-size:1.25rem;left:-.75rem;margin:0 0 -1rem -.875rem;padding:0;position:absolute;vertical-align:top}.UnitDirectories-subSpacer{border-right:var(--border);display:inline;margin-right:.875rem;width:.0625rem}.UnitDirectories-toggleButton[aria-expanded=true] img{transform:rotate(90deg)}.UnitDirectories-pathCell{align-items:flex-start;display:flex;flex-direction:column;line-height:1.75rem;word-break:break-all}.UnitDirectories-pathCell>div{position:relative}.UnitDirectories-subdirectory{border-left:var(--border);display:flex;flex-direction:column;margin-left:.375rem;padding:.5rem 1rem}.UnitDirectories-mobileSynopsis{display:none;line-height:1.25rem;margin-top:.25rem;word-break:keep-all}@media only screen and (max-width: 52rem){.UnitDirectories-mobileSynopsis{display:initial}.UnitDirectories-table th.UnitDirectories-desktopSynopsis,.UnitDirectories-table td.UnitDirectories-desktopSynopsis{display:none}}.UnitDirectories-expandButton{position:relative}.UnitDirectories-expandButton button{background-color:transparent;border:none;bottom:1rem;color:var(--color-brand-primary);cursor:pointer;display:none;font-size:.875rem;position:absolute;right:0;text-decoration:none}.UnitDirectories-badge{border:.0625rem solid var(--color-text-subtle);border-radius:.125rem;font-size:.6875rem;font-weight:500;line-height:1rem;margin-left:.5rem;margin-top:.125rem;padding:0 .35rem;text-align:center}.UnitDoc{margin-bottom:2rem;word-break:break-word}.UnitDoc h2 a.UnitDoc-idLink,.UnitDoc summary a{opacity:0}.UnitDoc h2:hover a,.UnitDoc summary:focus a{opacity:1}.UnitDoc-title{border-bottom:var(--border);padding-bottom:1rem}.UnitDoc-title img{margin:auto 1rem auto 0}.UnitDoc-emptySection{background-color:var(--color-background-accented);color:var(--color-text-subtle);height:12.25rem;margin-top:1.5rem;text-align:center}.UnitDoc-emptySection img{height:7.8125rem;width:auto}.Documentation .UnitDoc-emptySection p{margin:1rem auto}.UnitDoc .Documentation h4{margin-top:1.5rem}.Documentation{display:block}.Documentation p{margin:1rem 0}.Documentation h2,.Documentation h3{margin-top:1.5rem}.Documentation a{text-decoration:none}.Documentation a:hover{text-decoration:underline}.Documentation h2 a,.Documentation h3 a,.Documentation h4 a.Documentation-idLink,.Documentation summary a{opacity:0}.Documentation a:focus{opacity:1}.Documentation h3 a.Documentation-source{opacity:1}.Documentation h2:hover a,.Documentation h3:hover a,.Documentation h4:hover a,.Documentation summary:hover a,.Documentation summary:focus a{opacity:1}.Documentation ul{line-height:1.5rem;list-style:none;padding-left:0}.Documentation ul ul{padding-left:2em}.Documentation .Documentation-bulletList{list-style:disc;margin-bottom:1rem;padding-left:2rem}.Documentation .Documentation-numberList{list-style:decimal;margin-bottom:1rem;padding-left:2rem}.Documentation pre+pre{margin-top:.625rem}.Documentation .Documentation-declarationLink+pre{border-radius:0 0 .3em .3em;border-top:var(--border);margin-top:0}.Documentation pre .comment{color:var(--color-code-comment)}.Documentation-toc,.Documentation-overview,.Documentation-index,.Documentation-examples{padding-bottom:0}.Documentation-empty{color:var(--color-text-subtle);margin-top:-.5rem}@media only screen and (min-width: 64rem){.Documentation-toc{margin-left:2rem;white-space:nowrap}.Documentation-toc-columns{columns:2}}.Documentation-toc:empty{display:none}.Documentation-tocItem{overflow:hidden;text-overflow:ellipsis}.Documentation-tocItem--constants,.Documentation-tocItem--funcsAndTypes,.Documentation-tocItem--functions,.Documentation-tocItem--types,.Documentation-tocItem--variables,.Documentation-tocItem--notes{display:none}.Documentation-overviewHeader,.Documentation-indexHeader,.Documentation-constantsHeader,.Documentation-variablesHeader,.Documentation-examplesHeader,.Documentation-filesHeader,.Documentation-functionHeader,.Documentation-typeHeader,.Documentation-typeMethodHeader,.Documentation-typeFuncHeader{margin-bottom:.5rem}.Documentation-function h4,.Documentation-type h4,.Documentation-typeFunc h4,.Documentation-typeMethod h4{align-items:baseline;display:flex;justify-content:space-between}.Documentation-sinceVersion{color:var(--color-text-subtle);font-size:.9375rem;font-weight:400}.Documentation-constants br:last-of-type,.Documentation-variables br:last-of-type{display:none}.Documentation-build{color:var(--color-text-subtle);padding-top:1.5rem;text-align:right}.Documentation-declaration pre{scroll-padding-top:calc(var(--js-sticky-header-height, 3.5rem) + 3.75rem)}@media only screen and (min-width: 64rem){.Documentation-declaration pre{scroll-padding-top:calc(var(--js-sticky-header-height, 3.5rem) + .75rem)}}.Documentation-declaration+.Documentation-declaration{margin-top:.625rem}.Documentation-declarationLink{background-color:var(--color-background-accented);border:var(--border);border-bottom:none;border-radius:.3em .3em 0 0;display:block;font-size:.75rem;line-height:.5rem;padding:.375rem;text-align:right}.Documentation-exampleButtonsContainer{align-items:center;display:flex;justify-content:flex-end;margin-top:.5rem}.Documentation-examplePlayButton{background-color:var(--white);border:.15rem solid var(--turq-med);color:var(--turq-med);cursor:pointer;flex-shrink:0;height:2.5rem;width:4.125rem}.Documentation-exampleRunButton,.Documentation-exampleShareButton,.Documentation-exampleFormatButton{border:.0625rem solid var(--turq-dark);border-radius:.25rem;cursor:pointer;height:2rem;margin-left:.5rem;padding:0 1rem}.Documentation-exampleRunButton{background-color:var(--turq-dark);color:var(--white)}.Documentation-exampleShareButton,.Documentation-exampleFormatButton{background-color:var(--white);color:var(--turq-dark)}.Documentation-exampleDetails{margin-top:1rem}.Documentation-exampleDetailsBody pre{border-radius:0 0 .3rem .3rem;margin-bottom:1rem;margin-top:-.25rem}.Documentation-exampleDetailsBody textarea{height:100%;outline:none;overflow-x:auto;resize:none;white-space:pre;width:100%}.Documentation-exampleDetailsBody .Documentation-exampleCode{border-bottom-left-radius:0;border-bottom-right-radius:0;margin:0}.Documentation-exampleDetailsBody .Documentation-exampleOutput{border-top-left-radius:0;border-top-right-radius:0;margin:0 0 .5rem}.Documentation-exampleDetailsHeader{color:var(--color-brand-primary);cursor:pointer;margin-bottom:2rem;outline:none;text-decoration:none}.Documentation-exampleOutputLabel{color:var(--color-text-subtle)}.Documentation-exampleError{color:var(--pink);margin-right:.4rem;padding-right:.5rem}.Documentation-function pre,.Documentation-typeFunc pre,.Documentation-typeMethod pre{white-space:pre-wrap;word-break:break-all;word-wrap:break-word}.Documentation-indexDeprecated{margin-left:.5rem}.Documentation-deprecatedBody{color:var(--color-text-subtle);font-size:.87rem;font-weight:400;margin-left:.25rem;margin-right:.5rem}.Documentation-deprecatedTag{background-color:var(--color-border);border-radius:.125rem;color:var(--color-text-inverted);font-size:.75rem;font-weight:400;line-height:1.375;padding:.125rem .25rem;text-transform:uppercase;vertical-align:middle}.Documentation-deprecatedTitle{align-items:center;display:flex;gap:.5rem}.Documentation-deprecatedDetails,.Documentation-deprecatedDetails a{color:var(--color-text-subtle)}.Documentation-deprecatedDetails[open]{color:var(--color-text)}.Documentation-deprecatedDetails[open] a{color:var(--color-brand-primary)}.Documentation-deprecatedDetails .Documentation-deprecatedBody:after{color:var(--color-brand-primary);content:"Show"}.Documentation-deprecatedDetails[open] .Documentation-deprecatedBody:after{color:var(--color-brand-primary);content:"Hide"}.Documentation-deprecatedDetails>summary{list-style:none;opacity:1}.Documentation-deprecatedDetails .Documentation-source{opacity:1}.Documentation-deprecatedItemBody{padding:1rem 1rem .5rem}.Documentation-deprecatedMessage{align-items:center;display:flex;gap:.5rem;margin-bottom:1rem}.UnitFiles{margin-bottom:2rem}.UnitFiles-titleLink{position:relative}.UnitFiles-titleLink a{bottom:1rem;font-size:.875rem;position:absolute;right:0}.UnitFiles-titleLink a:after{background-image:url(/static/shared/icon/launch_gm_grey_24dp.svg);background-repeat:no-repeat;background-size:.875rem 1.25rem;content:"";display:inline-block;height:1rem;left:.3125rem;position:relative;top:.125rem;width:1rem}.UnitFiles h2 a.UnitFiles-idLink,.UnitFiles summary a{opacity:0}.UnitFiles h2:hover a,.UnitFiles summary:focus a{opacity:1}.UnitFiles-title{border-bottom:var(--border);font-size:1.375rem;margin:.5rem 0 0;padding-bottom:1rem}.UnitFiles-title img{margin:auto 1rem auto 0}.UnitFiles-fileList{columns:12.5rem 5;line-height:1.5rem;list-style:none;margin-top:1rem;padding-left:0;word-break:break-all}.UnitMeta{display:grid;gap:1rem 2rem;grid-template-columns:max-content auto;white-space:nowrap}.UnitMeta-details,.UnitMeta-links{display:flex;flex-flow:wrap;flex-direction:row;gap:1rem 2rem}.UnitMeta-repo{align-items:center;display:flex;overflow:hidden}.UnitMeta-repo a{overflow:hidden;text-overflow:ellipsis}@media (min-width: 50rem){.UnitMeta{grid-template-columns:max-content auto}.UnitMeta-details,.UnitMeta-links{flex-direction:row}}@media (min-width: 112rem){:root[data-layout=responsive] .UnitMeta{grid-template-columns:100%}:root[data-layout=responsive] .UnitMeta-details,:root[data-layout=responsive] .UnitMeta-links{flex-direction:column;white-space:nowrap}}.UnitMeta-detailsLearn{width:100%}@media (min-width: 50rem){.UnitMeta-detailsLearn{width:initial}}.UnitOutline-jumpTo{display:flex;margin-bottom:1rem}.UnitOutline-jumpTo button{align-items:center;background-color:var(--color-background);border:var(--border);border-radius:.25rem;color:var(--color-text-subtle);cursor:pointer;height:2rem;padding-left:1rem;text-align:left;width:100%}.UnitOutline-jumpTo button:hover:not([disabled]){border-color:var(--color-border)}.UnitOutline-jumpToInput:disabled{background-color:var(--gray-9)}.Overview-readmeContent details{display:block}.Overview-readmeContent summary{display:list-item}.Overview-readmeContent a{background-color:initial}.Overview-readmeContent a:active,.Overview-readmeContent a:hover{outline-width:0}.Overview-readmeContent strong{font-weight:inherit;font-weight:bolder}.Overview-readmeContent h3{font-size:2em;margin:.67em 0}.Overview-readmeContent img{border-style:none}.Overview-readmeContent code,.Overview-readmeContent kbd,.Overview-readmeContent pre{font-family:monospace,monospace;font-size:1em}.Overview-readmeContent hr{box-sizing:initial;height:0;overflow:visible}.Overview-readmeContent input{font:inherit;margin:0}.Overview-readmeContent input{overflow:visible}.Overview-readmeContent [type=checkbox]{box-sizing:border-box;padding:0}.Overview-readmeContent *{box-sizing:border-box}.Overview-readmeContent input{font-family:inherit;font-size:inherit;line-height:inherit}.Overview-readmeContent a{color:var(--color-brand-primary);text-decoration:none}.Overview-readmeContent a:hover{text-decoration:underline}.Overview-readmeContent strong{font-weight:600}.Overview-readmeContent hr{height:0;margin:.9375rem 0;overflow:hidden;background:transparent;border:0;border-bottom:var(--border)}.Overview-readmeContent hr:after,.Overview-readmeContent hr:before{display:table;content:""}.Overview-readmeContent hr:after{clear:both}.Overview-readmeContent table{border-spacing:0;border-collapse:collapse}.Overview-readmeContent td,.Overview-readmeContent th{padding:0}.Overview-readmeContent details summary{cursor:pointer}.Overview-readmeContent kbd{display:inline-block;padding:.1875rem .3125rem;font:.6875rem SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;line-height:.625rem;color:#444d56;vertical-align:middle;background-color:var(--color-background-accented);border:var(--border);border-radius:.1875rem;box-shadow:inset 0 -.0625rem 0 var(--border)}.Overview-readmeContent h3,.Overview-readmeContent h4,.Overview-readmeContent h5,.Overview-readmeContent h6,.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{margin-top:0;margin-bottom:0}.Overview-readmeContent h3{font-size:2rem}.Overview-readmeContent h3,.Overview-readmeContent h4{font-weight:600}.Overview-readmeContent h4{font-size:1.5rem}.Overview-readmeContent h5{font-size:1.25rem}.Overview-readmeContent h5,.Overview-readmeContent h6{font-weight:600}.Overview-readmeContent h6{font-size:1rem}.Overview-readmeContent div[aria-level="7"]{font-size:.875rem}.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{font-weight:600}.Overview-readmeContent div[aria-level="8"]{font-size:.75rem}.Overview-readmeContent p{margin-top:0;margin-bottom:.625rem}.Overview-readmeContent blockquote{margin:0}.Overview-readmeContent ol,.Overview-readmeContent ul{padding-left:0;margin-top:0;margin-bottom:0}.Overview-readmeContent ol ol,.Overview-readmeContent ul ol{list-style-type:lower-roman}.Overview-readmeContent ol ol ol,.Overview-readmeContent ol ul ol,.Overview-readmeContent ul ol ol,.Overview-readmeContent ul ul ol{list-style-type:lower-alpha}.Overview-readmeContent dd{margin-left:0}.Overview-readmeContent code,.Overview-readmeContent pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.75rem}.Overview-readmeContent pre{margin-top:0;margin-bottom:0}.Overview-readmeContent input::-webkit-inner-spin-button,.Overview-readmeContent input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}.Overview-readmeContent :checked+.radio-label{position:relative;z-index:1;border-color:var(--color-brand-primary)}.Overview-readmeContent hr{border-bottom-color:var(--color-border)}.Overview-readmeContent kbd{display:inline-block;padding:.1875rem .3125rem;font:.6875rem SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;line-height:.625rem;color:#444d56;vertical-align:middle;background-color:var(--color-background-accented);border:var(--border);border-radius:.1875rem;box-shadow:inset 0 -.0625rem 0 var(--color-border)}.Overview-readmeContent a:not([href]){color:inherit;text-decoration:none}.Overview-readmeContent blockquote,.Overview-readmeContent details,.Overview-readmeContent dl,.Overview-readmeContent ol,.Overview-readmeContent p,.Overview-readmeContent pre,.Overview-readmeContent table,.Overview-readmeContent ul{margin-top:0;margin-bottom:1rem}.Overview-readmeContent hr{height:.25em;padding:0;margin:1.5rem 0;background-color:var(--color-border);border:0}.Overview-readmeContent blockquote{padding:0 1em;color:var(--color-text-subtle);border-left:.25em solid var(--color-border)}.Overview-readmeContent blockquote>:first-child{margin-top:0}.Overview-readmeContent blockquote>:last-child{margin-bottom:0}.Overview-readmeContent h3,.Overview-readmeContent h4,.Overview-readmeContent h5,.Overview-readmeContent h6,.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{margin-top:1.5rem;margin-bottom:1rem;font-weight:600;line-height:1.25}.Overview-readmeContent h3{font-size:2em}.Overview-readmeContent h3,.Overview-readmeContent h4{padding-bottom:.3em;border-bottom:var(--border)}.Overview-readmeContent h4{font-size:1.5em}.Overview-readmeContent h5{font-size:1.25em}.Overview-readmeContent h6{font-size:1em}.Overview-readmeContent div[aria-level="7"]{font-size:.875em}.Overview-readmeContent div[aria-level="8"]{font-size:.85em;color:var(--color-text-subtle)}.Overview-readmeContent ol,.Overview-readmeContent ul{padding-left:2em}.Overview-readmeContent ol ol,.Overview-readmeContent ol ul,.Overview-readmeContent ul ol,.Overview-readmeContent ul ul{margin-top:0;margin-bottom:0}.Overview-readmeContent li{word-wrap:break-all}.Overview-readmeContent li>p{margin-top:1rem}.Overview-readmeContent li+li{margin-top:.25em}.Overview-readmeContent dl{padding:0}.Overview-readmeContent dl dt{padding:0;margin-top:1rem;font-size:1em;font-style:italic;font-weight:600}.Overview-readmeContent dl dd{padding:0 1rem;margin-bottom:1rem}.Overview-readmeContent table{display:block;width:100%;overflow:auto}.Overview-readmeContent table th{font-weight:600}.Overview-readmeContent table td,.Overview-readmeContent table th{padding:.375rem .8125rem;border:var(--border)}.Overview-readmeContent table tr{background-color:var(--color-background);border-top:var(--border)}.Overview-readmeContent table tr:nth-child(2n){background-color:var(--color-background-accented)}.Overview-readmeContent img{max-width:100%;box-sizing:initial;background-color:var(--color-background)}.Overview-readmeContent img[align=right]{padding-left:1.25rem}.Overview-readmeContent img[align=left]{padding-right:1.25rem}.Overview-readmeContent code{padding:.2em .4em;margin:0;font-size:85%;background-color:var(--color-background-accented);border-radius:.1875rem}.Overview-readmeContent pre{word-wrap:normal}.Overview-readmeContent pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.Overview-readmeContent pre{padding:1rem;overflow:auto;font-size:85%;line-height:1.45;background-color:var(--color-background-accented);border-radius:.1875rem}.Overview-readmeContent pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:initial;border:0}.UnitReadme{margin-bottom:2rem}.UnitReadme ul,.UnitReadme ol{list-style:circle}.UnitReadme h2 a.UnitReadme-idLink,.UnitReadme summary a{opacity:0}.UnitReadme h2:hover a,.UnitReadme summary:focus a{opacity:1}.UnitReadme-title{border-bottom:var(--border);font-size:1.375rem;padding-bottom:1rem}.UnitReadme-title img{margin:auto 1rem auto 0}.UnitReadme-content{-webkit-mask-image:linear-gradient(to bottom,black 75%,transparent 100%);mask-image:linear-gradient(to bottom,black 75%,transparent 100%);max-height:20rem;overflow:hidden;position:relative}.UnitReadme-content ul{line-height:1.5rem}.UnitReadme-expandLink{background:none;border:none;color:var(--color-brand-primary);cursor:pointer;padding:0}.UnitReadme-collapseLink{background:none;border:none;color:var(--color-brand-primary);cursor:pointer;display:none;padding:0}.UnitReadme--expanded .UnitReadme-content{-webkit-mask-image:none;mask-image:none;max-height:initial;overflow:initial}.UnitReadme--toggle .UnitReadme-expandLink{display:block}.UnitReadme--expanded .UnitReadme-expandLink{display:none}.UnitReadme--expanded.UnitReadme--toggle .UnitReadme-collapseLink{display:block}.Overview-readmeContent{overflow-wrap:break-word}.UnitDetails{column-gap:2rem;display:grid;grid-template-columns:minmax(0,auto);margin:auto;min-height:32rem}@media only screen and (min-width: 64rem){.UnitDetails{grid-template-columns:15.5rem minmax(30.5rem,43.125rem) minmax(10rem,15.5rem)}}@media only screen and (min-width: 80rem){.UnitDetails{grid-template-columns:15.5rem minmax(43.125rem,60rem) 15.5rem;justify-content:center}}.UnitDetails :target{scroll-margin-top:calc(var(--js-sticky-header-height, 3.5rem) * 2.15)}@media only screen and (min-width: 64rem){.UnitDetails :target{scroll-margin-top:calc(var(--js-sticky-header-height, 3.5rem) * 1.25)}}.UnitDetails :target:not(details,h2){background-color:var(--color-background-highlighted);padding:.25rem}.UnitDetails-meta{order:-1}@media only screen and (min-width: 64rem){.UnitDetails-meta{display:block;margin-top:2rem;order:initial}}.UnitDetails-contentEmpty{align-items:center;background-color:var(--color-background-accented);color:var(--color-text-subtle);display:flex;flex-direction:column;height:15rem;padding-top:1rem;text-align:center}.UnitDetails-contentEmpty img{height:7.8125rem;width:auto}
+.UnitBuildContext-titleContext label,.UnitBuildContext-singleContext{color:var(--color-text-subtle);font-size:.875rem}.UnitBuildContext-singleContext{padding:.35rem 0}.UnitBuildContext-titleContext select{border-color:var(--color-border);color:var(--color-text-subtle);margin-left:.25rem;min-width:6rem}.UnitBuildContext-titleContext option{color:var(--color-text-subtle)}.UnitBuildContext-link{display:none}@media only screen and (min-width: 30rem){.UnitBuildContext-link{display:initial}}.UnitDoc .UnitBuildContext-titleContext{position:relative}.UnitDoc .UnitBuildContext-titleContext label,.UnitDoc .UnitBuildContext-singleContext{bottom:.875rem;position:absolute;right:0}.UnitDirectories{margin-bottom:2rem}.UnitDirectories h2 a.UnitDirectories-idLink,.UnitDirectories summary a{opacity:0}.UnitDirectories h2:hover a,.UnitDirectories summary:focus a{opacity:1}.UnitDirectories-title{border-bottom:var(--border);font-size:1.375rem;margin:.5rem 0 0;padding-bottom:1rem}.UnitDirectories-title img{margin:auto 1rem auto 0}.UnitDirectories-table{border-collapse:collapse;height:0;table-layout:auto;width:100%}.UnitDirectories-table--tree{margin-top:-2rem}.UnitDirectories-tableHeader{background-color:var(--color-background-accented)}.UnitDirectories-tableHeader--tree{visibility:hidden}.UnitDirectories td{border-bottom:var(--border);max-width:32rem;min-width:12rem;padding:.25rem 1rem;vertical-align:middle;word-break:break-word}.UnitDirectories th{padding:.5rem 1rem;text-align:left}.UnitDirectories tr.hidden{display:none}.UnitDirectories tr[aria-controls]{cursor:pointer}.UnitDirectories tr[aria-controls]:hover{background-color:var(--color-background-accented)}.UnitDirectories th.UnitDirectories-toggleHead{font-size:0;max-width:.625rem;padding:0;width:.625rem}.UnitDirectories td.UnitDirectories-toggleCell,th.UnitDirectories-toggleCell{background-color:var(--background);border:var(--white);max-width:.625rem;padding:0;width:.625rem}.UnitDirectories-toggleButton{font-size:1.25rem;left:-.75rem;margin:0 0 -1rem -.875rem;padding:0;position:absolute;vertical-align:top}.UnitDirectories-subSpacer{border-right:var(--border);display:inline;margin-right:.875rem;width:.0625rem}.UnitDirectories-toggleButton[aria-expanded=true] img{transform:rotate(90deg)}.UnitDirectories-pathCell{align-items:flex-start;display:flex;flex-direction:column;line-height:1.75rem;word-break:break-all}.UnitDirectories-pathCell>div{position:relative}.UnitDirectories-subdirectory{border-left:var(--border);display:flex;flex-direction:column;margin-left:.375rem;padding:.5rem 1rem}.UnitDirectories-internal{display:none}.UnitDirectories-showInternal .UnitDirectories-internal{display:table-row}.UnitDirectories-mobileSynopsis{display:none;line-height:1.25rem;margin-top:.25rem;word-break:keep-all}@media only screen and (max-width: 52rem){.UnitDirectories-mobileSynopsis{display:initial}.UnitDirectories-table th.UnitDirectories-desktopSynopsis,.UnitDirectories-table td.UnitDirectories-desktopSynopsis{display:none}}.UnitDirectories-toggles{position:relative}.UnitDirectories-toggleButtons{bottom:1rem;display:flex;gap:1rem;position:absolute;right:0}.UnitDirectories-toggleButtons button{background-color:transparent;border:none;color:var(--color-brand-primary);cursor:pointer;display:none;font-size:.875rem;text-decoration:none}.UnitDirectories-badge{border:.0625rem solid var(--color-text-subtle);border-radius:.125rem;font-size:.6875rem;font-weight:500;line-height:1rem;margin-left:.5rem;margin-top:.125rem;padding:0 .35rem;text-align:center}.UnitDoc{margin-bottom:2rem;word-break:break-word}.UnitDoc h2 a.UnitDoc-idLink,.UnitDoc summary a{opacity:0}.UnitDoc h2:hover a,.UnitDoc summary:focus a{opacity:1}.UnitDoc-title{border-bottom:var(--border);padding-bottom:1rem}.UnitDoc-title img{margin:auto 1rem auto 0}.UnitDoc-emptySection{background-color:var(--color-background-accented);color:var(--color-text-subtle);height:12.25rem;margin-top:1.5rem;text-align:center}.UnitDoc-emptySection img{height:7.8125rem;width:auto}.Documentation .UnitDoc-emptySection p{margin:1rem auto}.UnitDoc .Documentation h4{margin-top:1.5rem}.Documentation{display:block}.Documentation p{margin:1rem 0}.Documentation h2,.Documentation h3{margin-top:1.5rem}.Documentation a{text-decoration:none}.Documentation a:hover{text-decoration:underline}.Documentation h2 a,.Documentation h3 a,.Documentation h4 a.Documentation-idLink,.Documentation summary a{opacity:0}.Documentation a:focus{opacity:1}.Documentation h3 a.Documentation-source{opacity:1}.Documentation h2:hover a,.Documentation h3:hover a,.Documentation h4:hover a,.Documentation summary:hover a,.Documentation summary:focus a{opacity:1}.Documentation ul{line-height:1.5rem;list-style:none;padding-left:0}.Documentation ul ul{padding-left:2em}.Documentation .Documentation-bulletList{list-style:disc;margin-bottom:1rem;padding-left:2rem}.Documentation .Documentation-numberList{list-style:decimal;margin-bottom:1rem;padding-left:2rem}.Documentation pre+pre{margin-top:.625rem}.Documentation .Documentation-declarationLink+pre{border-radius:0 0 .3em .3em;border-top:var(--border);margin-top:0}.Documentation pre .comment{color:var(--color-code-comment)}.Documentation-toc,.Documentation-overview,.Documentation-index,.Documentation-examples{padding-bottom:0}.Documentation-empty{color:var(--color-text-subtle);margin-top:-.5rem}@media only screen and (min-width: 64rem){.Documentation-toc{margin-left:2rem;white-space:nowrap}.Documentation-toc-columns{columns:2}}.Documentation-toc:empty{display:none}.Documentation-tocItem{overflow:hidden;text-overflow:ellipsis}.Documentation-tocItem--constants,.Documentation-tocItem--funcsAndTypes,.Documentation-tocItem--functions,.Documentation-tocItem--types,.Documentation-tocItem--variables,.Documentation-tocItem--notes{display:none}.Documentation-overviewHeader,.Documentation-indexHeader,.Documentation-constantsHeader,.Documentation-variablesHeader,.Documentation-examplesHeader,.Documentation-filesHeader,.Documentation-functionHeader,.Documentation-typeHeader,.Documentation-typeMethodHeader,.Documentation-typeFuncHeader{margin-bottom:.5rem}.Documentation-function h4,.Documentation-type h4,.Documentation-typeFunc h4,.Documentation-typeMethod h4{align-items:baseline;display:flex;justify-content:space-between}.Documentation-sinceVersion{color:var(--color-text-subtle);font-size:.9375rem;font-weight:400}.Documentation-constants br:last-of-type,.Documentation-variables br:last-of-type{display:none}.Documentation-build{color:var(--color-text-subtle);padding-top:1.5rem;text-align:right}.Documentation-declaration pre{scroll-padding-top:calc(var(--js-sticky-header-height, 3.5rem) + 3.75rem)}@media only screen and (min-width: 64rem){.Documentation-declaration pre{scroll-padding-top:calc(var(--js-sticky-header-height, 3.5rem) + .75rem)}}.Documentation-declaration+.Documentation-declaration{margin-top:.625rem}.Documentation-declarationLink{background-color:var(--color-background-accented);border:var(--border);border-bottom:none;border-radius:.3em .3em 0 0;display:block;font-size:.75rem;line-height:.5rem;padding:.375rem;text-align:right}.Documentation-exampleButtonsContainer{align-items:center;display:flex;justify-content:flex-end;margin-top:.5rem}.Documentation-examplePlayButton{background-color:var(--white);border:.15rem solid var(--turq-med);color:var(--turq-med);cursor:pointer;flex-shrink:0;height:2.5rem;width:4.125rem}.Documentation-exampleRunButton,.Documentation-exampleShareButton,.Documentation-exampleFormatButton{border:.0625rem solid var(--turq-dark);border-radius:.25rem;cursor:pointer;height:2rem;margin-left:.5rem;padding:0 1rem}.Documentation-exampleRunButton{background-color:var(--turq-dark);color:var(--white)}.Documentation-exampleShareButton,.Documentation-exampleFormatButton{background-color:var(--white);color:var(--turq-dark)}.Documentation-exampleDetails{margin-top:1rem}.Documentation-exampleDetailsBody pre{border-radius:0 0 .3rem .3rem;margin-bottom:1rem;margin-top:-.25rem}.Documentation-exampleDetailsBody textarea{height:100%;outline:none;overflow-x:auto;resize:none;white-space:pre;width:100%}.Documentation-exampleDetailsBody .Documentation-exampleCode{border-bottom-left-radius:0;border-bottom-right-radius:0;margin:0}.Documentation-exampleDetailsBody .Documentation-exampleOutput{border-top-left-radius:0;border-top-right-radius:0;margin:0 0 .5rem}.Documentation-exampleDetailsHeader{color:var(--color-brand-primary);cursor:pointer;margin-bottom:2rem;outline:none;text-decoration:none}.Documentation-exampleOutputLabel{color:var(--color-text-subtle)}.Documentation-exampleError{color:var(--pink);margin-right:.4rem;padding-right:.5rem}.Documentation-function pre,.Documentation-typeFunc pre,.Documentation-typeMethod pre{white-space:pre-wrap;word-break:break-all;word-wrap:break-word}.Documentation-indexDeprecated{margin-left:.5rem}.Documentation-deprecatedBody{color:var(--color-text-subtle);font-size:.87rem;font-weight:400;margin-left:.25rem;margin-right:.5rem}.Documentation-deprecatedTag{background-color:var(--color-border);border-radius:.125rem;color:var(--color-text-inverted);font-size:.75rem;font-weight:400;line-height:1.375;padding:.125rem .25rem;text-transform:uppercase;vertical-align:middle}.Documentation-deprecatedTitle{align-items:center;display:flex;gap:.5rem}.Documentation-deprecatedDetails,.Documentation-deprecatedDetails a{color:var(--color-text-subtle)}.Documentation-deprecatedDetails[open]{color:var(--color-text)}.Documentation-deprecatedDetails[open] a{color:var(--color-brand-primary)}.Documentation-deprecatedDetails .Documentation-deprecatedBody:after{color:var(--color-brand-primary);content:"Show"}.Documentation-deprecatedDetails[open] .Documentation-deprecatedBody:after{color:var(--color-brand-primary);content:"Hide"}.Documentation-deprecatedDetails>summary{list-style:none;opacity:1}.Documentation-deprecatedDetails .Documentation-source{opacity:1}.Documentation-deprecatedItemBody{padding:1rem 1rem .5rem}.Documentation-deprecatedMessage{align-items:center;display:flex;gap:.5rem;margin-bottom:1rem}.UnitFiles{margin-bottom:2rem}.UnitFiles-titleLink{position:relative}.UnitFiles-titleLink a{bottom:1rem;font-size:.875rem;position:absolute;right:0}.UnitFiles-titleLink a:after{background-image:url(/static/shared/icon/launch_gm_grey_24dp.svg);background-repeat:no-repeat;background-size:.875rem 1.25rem;content:"";display:inline-block;height:1rem;left:.3125rem;position:relative;top:.125rem;width:1rem}.UnitFiles h2 a.UnitFiles-idLink,.UnitFiles summary a{opacity:0}.UnitFiles h2:hover a,.UnitFiles summary:focus a{opacity:1}.UnitFiles-title{border-bottom:var(--border);font-size:1.375rem;margin:.5rem 0 0;padding-bottom:1rem}.UnitFiles-title img{margin:auto 1rem auto 0}.UnitFiles-fileList{columns:12.5rem 5;line-height:1.5rem;list-style:none;margin-top:1rem;padding-left:0;word-break:break-all}.UnitMeta{display:grid;gap:1rem 2rem;grid-template-columns:max-content auto;white-space:nowrap}.UnitMeta-details,.UnitMeta-links{display:flex;flex-flow:wrap;flex-direction:row;gap:1rem 2rem}.UnitMeta-repo{align-items:center;display:flex;overflow:hidden}.UnitMeta-repo a{overflow:hidden;text-overflow:ellipsis}@media (min-width: 50rem){.UnitMeta{grid-template-columns:max-content auto}.UnitMeta-details,.UnitMeta-links{flex-direction:row}}@media (min-width: 112rem){:root[data-layout=responsive] .UnitMeta{grid-template-columns:100%}:root[data-layout=responsive] .UnitMeta-details,:root[data-layout=responsive] .UnitMeta-links{flex-direction:column;white-space:nowrap}}.UnitMeta-detailsLearn{width:100%}@media (min-width: 50rem){.UnitMeta-detailsLearn{width:initial}}.UnitOutline-jumpTo{display:flex;margin-bottom:1rem}.UnitOutline-jumpTo button{align-items:center;background-color:var(--color-background);border:var(--border);border-radius:.25rem;color:var(--color-text-subtle);cursor:pointer;height:2rem;padding-left:1rem;text-align:left;width:100%}.UnitOutline-jumpTo button:hover:not([disabled]){border-color:var(--color-border)}.UnitOutline-jumpToInput:disabled{background-color:var(--gray-9)}.Overview-readmeContent details{display:block}.Overview-readmeContent summary{display:list-item}.Overview-readmeContent a{background-color:initial}.Overview-readmeContent a:active,.Overview-readmeContent a:hover{outline-width:0}.Overview-readmeContent strong{font-weight:inherit;font-weight:bolder}.Overview-readmeContent h3{font-size:2em;margin:.67em 0}.Overview-readmeContent img{border-style:none}.Overview-readmeContent code,.Overview-readmeContent kbd,.Overview-readmeContent pre{font-family:monospace,monospace;font-size:1em}.Overview-readmeContent hr{box-sizing:initial;height:0;overflow:visible}.Overview-readmeContent input{font:inherit;margin:0}.Overview-readmeContent input{overflow:visible}.Overview-readmeContent [type=checkbox]{box-sizing:border-box;padding:0}.Overview-readmeContent *{box-sizing:border-box}.Overview-readmeContent input{font-family:inherit;font-size:inherit;line-height:inherit}.Overview-readmeContent a{color:var(--color-brand-primary);text-decoration:none}.Overview-readmeContent a:hover{text-decoration:underline}.Overview-readmeContent strong{font-weight:600}.Overview-readmeContent hr{height:0;margin:.9375rem 0;overflow:hidden;background:transparent;border:0;border-bottom:var(--border)}.Overview-readmeContent hr:after,.Overview-readmeContent hr:before{display:table;content:""}.Overview-readmeContent hr:after{clear:both}.Overview-readmeContent table{border-spacing:0;border-collapse:collapse}.Overview-readmeContent td,.Overview-readmeContent th{padding:0}.Overview-readmeContent details summary{cursor:pointer}.Overview-readmeContent kbd{display:inline-block;padding:.1875rem .3125rem;font:.6875rem SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;line-height:.625rem;color:#444d56;vertical-align:middle;background-color:var(--color-background-accented);border:var(--border);border-radius:.1875rem;box-shadow:inset 0 -.0625rem 0 var(--border)}.Overview-readmeContent h3,.Overview-readmeContent h4,.Overview-readmeContent h5,.Overview-readmeContent h6,.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{margin-top:0;margin-bottom:0}.Overview-readmeContent h3{font-size:2rem}.Overview-readmeContent h3,.Overview-readmeContent h4{font-weight:600}.Overview-readmeContent h4{font-size:1.5rem}.Overview-readmeContent h5{font-size:1.25rem}.Overview-readmeContent h5,.Overview-readmeContent h6{font-weight:600}.Overview-readmeContent h6{font-size:1rem}.Overview-readmeContent div[aria-level="7"]{font-size:.875rem}.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{font-weight:600}.Overview-readmeContent div[aria-level="8"]{font-size:.75rem}.Overview-readmeContent p{margin-top:0;margin-bottom:.625rem}.Overview-readmeContent blockquote{margin:0}.Overview-readmeContent ol,.Overview-readmeContent ul{padding-left:0;margin-top:0;margin-bottom:0}.Overview-readmeContent ol ol,.Overview-readmeContent ul ol{list-style-type:lower-roman}.Overview-readmeContent ol ol ol,.Overview-readmeContent ol ul ol,.Overview-readmeContent ul ol ol,.Overview-readmeContent ul ul ol{list-style-type:lower-alpha}.Overview-readmeContent dd{margin-left:0}.Overview-readmeContent code,.Overview-readmeContent pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.75rem}.Overview-readmeContent pre{margin-top:0;margin-bottom:0}.Overview-readmeContent input::-webkit-inner-spin-button,.Overview-readmeContent input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}.Overview-readmeContent :checked+.radio-label{position:relative;z-index:1;border-color:var(--color-brand-primary)}.Overview-readmeContent hr{border-bottom-color:var(--color-border)}.Overview-readmeContent kbd{display:inline-block;padding:.1875rem .3125rem;font:.6875rem SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;line-height:.625rem;color:#444d56;vertical-align:middle;background-color:var(--color-background-accented);border:var(--border);border-radius:.1875rem;box-shadow:inset 0 -.0625rem 0 var(--color-border)}.Overview-readmeContent a:not([href]){color:inherit;text-decoration:none}.Overview-readmeContent blockquote,.Overview-readmeContent details,.Overview-readmeContent dl,.Overview-readmeContent ol,.Overview-readmeContent p,.Overview-readmeContent pre,.Overview-readmeContent table,.Overview-readmeContent ul{margin-top:0;margin-bottom:1rem}.Overview-readmeContent hr{height:.25em;padding:0;margin:1.5rem 0;background-color:var(--color-border);border:0}.Overview-readmeContent blockquote{padding:0 1em;color:var(--color-text-subtle);border-left:.25em solid var(--color-border)}.Overview-readmeContent blockquote>:first-child{margin-top:0}.Overview-readmeContent blockquote>:last-child{margin-bottom:0}.Overview-readmeContent h3,.Overview-readmeContent h4,.Overview-readmeContent h5,.Overview-readmeContent h6,.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{margin-top:1.5rem;margin-bottom:1rem;font-weight:600;line-height:1.25}.Overview-readmeContent h3{font-size:2em}.Overview-readmeContent h3,.Overview-readmeContent h4{padding-bottom:.3em;border-bottom:var(--border)}.Overview-readmeContent h4{font-size:1.5em}.Overview-readmeContent h5{font-size:1.25em}.Overview-readmeContent h6{font-size:1em}.Overview-readmeContent div[aria-level="7"]{font-size:.875em}.Overview-readmeContent div[aria-level="8"]{font-size:.85em;color:var(--color-text-subtle)}.Overview-readmeContent ol,.Overview-readmeContent ul{padding-left:2em}.Overview-readmeContent ol ol,.Overview-readmeContent ol ul,.Overview-readmeContent ul ol,.Overview-readmeContent ul ul{margin-top:0;margin-bottom:0}.Overview-readmeContent li{word-wrap:break-all}.Overview-readmeContent li>p{margin-top:1rem}.Overview-readmeContent li+li{margin-top:.25em}.Overview-readmeContent dl{padding:0}.Overview-readmeContent dl dt{padding:0;margin-top:1rem;font-size:1em;font-style:italic;font-weight:600}.Overview-readmeContent dl dd{padding:0 1rem;margin-bottom:1rem}.Overview-readmeContent table{display:block;width:100%;overflow:auto}.Overview-readmeContent table th{font-weight:600}.Overview-readmeContent table td,.Overview-readmeContent table th{padding:.375rem .8125rem;border:var(--border)}.Overview-readmeContent table tr{background-color:var(--color-background);border-top:var(--border)}.Overview-readmeContent table tr:nth-child(2n){background-color:var(--color-background-accented)}.Overview-readmeContent img{max-width:100%;box-sizing:initial;background-color:var(--color-background)}.Overview-readmeContent img[align=right]{padding-left:1.25rem}.Overview-readmeContent img[align=left]{padding-right:1.25rem}.Overview-readmeContent code{padding:.2em .4em;margin:0;font-size:85%;background-color:var(--color-background-accented);border-radius:.1875rem}.Overview-readmeContent pre{word-wrap:normal}.Overview-readmeContent pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.Overview-readmeContent pre{padding:1rem;overflow:auto;font-size:85%;line-height:1.45;background-color:var(--color-background-accented);border-radius:.1875rem}.Overview-readmeContent pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:initial;border:0}.UnitReadme{margin-bottom:2rem}.UnitReadme ul,.UnitReadme ol{list-style:circle}.UnitReadme h2 a.UnitReadme-idLink,.UnitReadme summary a{opacity:0}.UnitReadme h2:hover a,.UnitReadme summary:focus a{opacity:1}.UnitReadme-title{border-bottom:var(--border);font-size:1.375rem;padding-bottom:1rem}.UnitReadme-title img{margin:auto 1rem auto 0}.UnitReadme-content{-webkit-mask-image:linear-gradient(to bottom,black 75%,transparent 100%);mask-image:linear-gradient(to bottom,black 75%,transparent 100%);max-height:20rem;overflow:hidden;position:relative}.UnitReadme-content ul{line-height:1.5rem}.UnitReadme-expandLink{background:none;border:none;color:var(--color-brand-primary);cursor:pointer;padding:0}.UnitReadme-collapseLink{background:none;border:none;color:var(--color-brand-primary);cursor:pointer;display:none;padding:0}.UnitReadme--expanded .UnitReadme-content{-webkit-mask-image:none;mask-image:none;max-height:initial;overflow:initial}.UnitReadme--toggle .UnitReadme-expandLink{display:block}.UnitReadme--expanded .UnitReadme-expandLink{display:none}.UnitReadme--expanded.UnitReadme--toggle .UnitReadme-collapseLink{display:block}.Overview-readmeContent{overflow-wrap:break-word}.UnitDetails{column-gap:2rem;display:grid;grid-template-columns:minmax(0,auto);margin:auto;min-height:32rem}@media only screen and (min-width: 64rem){.UnitDetails{grid-template-columns:15.5rem minmax(30.5rem,43.125rem) minmax(10rem,15.5rem)}}@media only screen and (min-width: 80rem){.UnitDetails{grid-template-columns:15.5rem minmax(43.125rem,60rem) 15.5rem;justify-content:center}}.UnitDetails :target{scroll-margin-top:calc(var(--js-sticky-header-height, 3.5rem) * 2.15)}@media only screen and (min-width: 64rem){.UnitDetails :target{scroll-margin-top:calc(var(--js-sticky-header-height, 3.5rem) * 1.25)}}.UnitDetails :target:not(details,h2){background-color:var(--color-background-highlighted);padding:.25rem}.UnitDetails-meta{order:-1}@media only screen and (min-width: 64rem){.UnitDetails-meta{display:block;margin-top:2rem;order:initial}}.UnitDetails-contentEmpty{align-items:center;background-color:var(--color-background-accented);color:var(--color-text-subtle);display:flex;flex-direction:column;height:15rem;padding-top:1rem;text-align:center}.UnitDetails-contentEmpty img{height:7.8125rem;width:auto}
 /*!
 * Copyright 2019-2020 The Go Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style
diff --git a/static/frontend/unit/main/main.min.css.map b/static/frontend/unit/main/main.min.css.map
index 9137adb..9c31b25 100644
--- a/static/frontend/unit/main/main.min.css.map
+++ b/static/frontend/unit/main/main.min.css.map
@@ -1,7 +1,7 @@
 {
   "version": 3,
   "sources": ["_build-context.css", "_directories.css", "_doc.css", "_files.css", "_meta.css", "_outline.css", "_readme_gen.css", "_readme.css", "main.css"],
-  "sourcesContent": ["/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitBuildContext-titleContext label,\n.UnitBuildContext-singleContext {\n  color: var(--color-text-subtle);\n  font-size: 0.875rem;\n}\n\n.UnitBuildContext-singleContext {\n  padding: 0.35rem 0;\n}\n\n.UnitBuildContext-titleContext select {\n  border-color: var(--color-border);\n  color: var(--color-text-subtle);\n  margin-left: 0.25rem;\n  min-width: 6rem;\n}\n\n.UnitBuildContext-titleContext option {\n  color: var(--color-text-subtle);\n}\n\n.UnitBuildContext-link {\n  display: none;\n}\n@media only screen and (min-width: 30rem) {\n  .UnitBuildContext-link {\n    display: initial;\n  }\n}\n\n.UnitDoc .UnitBuildContext-titleContext {\n  position: relative;\n}\n\n.UnitDoc .UnitBuildContext-titleContext label,\n.UnitDoc .UnitBuildContext-singleContext {\n  bottom: 0.875rem;\n  position: absolute;\n  right: 0;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitDirectories {\n  margin-bottom: 2rem;\n}\n\n.UnitDirectories h2 a.UnitDirectories-idLink,\n.UnitDirectories summary a {\n  opacity: 0;\n}\n\n.UnitDirectories h2:hover a,\n.UnitDirectories summary:focus a {\n  opacity: 1;\n}\n\n.UnitDirectories-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  margin: 0.5rem 0 0;\n  padding-bottom: 1rem;\n}\n\n.UnitDirectories-title img {\n  margin: auto 1rem auto 0;\n}\n\n.UnitDirectories-table {\n  border-collapse: collapse;\n  height: 0;\n  table-layout: auto;\n  width: 100%;\n}\n\n.UnitDirectories-table--tree {\n  margin-top: -2rem;\n}\n\n.UnitDirectories-tableHeader {\n  background-color: var(--color-background-accented);\n}\n\n.UnitDirectories-tableHeader--tree {\n  visibility: hidden;\n}\n\n.UnitDirectories td {\n  border-bottom: var(--border);\n  max-width: 32rem;\n  min-width: 12rem;\n  padding: 0.25rem 1rem;\n  vertical-align: middle;\n  word-break: break-word;\n}\n\n.UnitDirectories th {\n  padding: 0.5rem 1rem;\n  text-align: left;\n}\n\n.UnitDirectories tr.hidden {\n  display: none;\n}\n\n.UnitDirectories tr[aria-controls] {\n  cursor: pointer;\n}\n\n.UnitDirectories tr[aria-controls]:hover {\n  background-color: var(--color-background-accented);\n}\n\n.UnitDirectories th.UnitDirectories-toggleHead {\n  font-size: 0;\n  max-width: 0.625rem;\n  padding: 0;\n  width: 0.625rem;\n}\n\n.UnitDirectories td.UnitDirectories-toggleCell,\nth.UnitDirectories-toggleCell {\n  background-color: var(--background);\n  border: var(--white);\n  max-width: 0.625rem;\n  padding: 0;\n  width: 0.625rem;\n}\n\n.UnitDirectories-toggleButton {\n  font-size: 1.25rem;\n  left: -0.75rem;\n  margin: 0 0 -1rem -0.875rem;\n  padding: 0;\n  position: absolute;\n  vertical-align: top;\n}\n\n.UnitDirectories-subSpacer {\n  border-right: var(--border);\n  display: inline;\n  margin-right: 0.875rem;\n  width: 0.0625rem;\n}\n\n.UnitDirectories-toggleButton[aria-expanded='true'] img {\n  transform: rotate(90deg);\n}\n\n.UnitDirectories-pathCell {\n  align-items: flex-start;\n  display: flex;\n  flex-direction: column;\n  line-height: 1.75rem;\n  word-break: break-all;\n}\n\n.UnitDirectories-pathCell > div {\n  position: relative;\n}\n\n.UnitDirectories-subdirectory {\n  border-left: var(--border);\n  display: flex;\n  flex-direction: column;\n  margin-left: 0.375rem;\n  padding: 0.5rem 1rem;\n}\n\n.UnitDirectories-mobileSynopsis {\n  display: none;\n  line-height: 1.25rem;\n  margin-top: 0.25rem;\n  word-break: keep-all;\n}\n@media only screen and (max-width: 52rem) {\n  .UnitDirectories-mobileSynopsis {\n    display: initial;\n  }\n\n  .UnitDirectories-table th.UnitDirectories-desktopSynopsis,\n  .UnitDirectories-table td.UnitDirectories-desktopSynopsis {\n    display: none;\n  }\n}\n\n.UnitDirectories-expandButton {\n  position: relative;\n}\n\n.UnitDirectories-expandButton button {\n  background-color: transparent;\n  border: none;\n  bottom: 1rem;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  display: none;\n  font-size: 0.875rem;\n  position: absolute;\n  right: 0;\n  text-decoration: none;\n}\n\n.UnitDirectories-badge {\n  border: 0.0625rem solid var(--color-text-subtle);\n  border-radius: 0.125rem;\n  font-size: 0.6875rem;\n  font-weight: 500;\n  line-height: 1rem;\n  margin-left: 0.5rem;\n  margin-top: 0.125rem;\n  padding: 0 0.35rem;\n  text-align: center;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/* stylelint-disable no-descending-specificity */\n.UnitDoc {\n  margin-bottom: 2rem;\n  word-break: break-word;\n}\n\n.UnitDoc h2 a.UnitDoc-idLink,\n.UnitDoc summary a {\n  opacity: 0;\n}\n\n.UnitDoc h2:hover a,\n.UnitDoc summary:focus a {\n  opacity: 1;\n}\n\n.UnitDoc-title {\n  border-bottom: var(--border);\n  padding-bottom: 1rem;\n}\n\n.UnitDoc-title img {\n  margin: auto 1rem auto 0;\n}\n\n.UnitDoc-emptySection {\n  background-color: var(--color-background-accented);\n  color: var(--color-text-subtle);\n  height: 12.25rem;\n  margin-top: 1.5rem;\n  text-align: center;\n}\n\n.UnitDoc-emptySection img {\n  height: 7.8125rem;\n  width: auto;\n}\n\n.Documentation .UnitDoc-emptySection p {\n  margin: 1rem auto;\n}\n\n.UnitDoc .Documentation h4 {\n  margin-top: 1.5rem;\n}\n\n.Documentation {\n  display: block;\n}\n\n.Documentation p {\n  margin: 1rem 0;\n}\n\n.Documentation h2,\n.Documentation h3 {\n  margin-top: 1.5rem;\n}\n\n.Documentation a {\n  text-decoration: none;\n}\n\n.Documentation a:hover {\n  text-decoration: underline;\n}\n\n.Documentation h2 a,\n.Documentation h3 a,\n.Documentation h4 a.Documentation-idLink,\n.Documentation summary a {\n  opacity: 0;\n}\n\n.Documentation a:focus {\n  opacity: 1;\n}\n\n.Documentation h3 a.Documentation-source {\n  opacity: 1;\n}\n\n.Documentation h2:hover a,\n.Documentation h3:hover a,\n.Documentation h4:hover a,\n.Documentation summary:hover a,\n.Documentation summary:focus a {\n  opacity: 1;\n}\n\n.Documentation ul {\n  line-height: 1.5rem;\n  list-style: none;\n  padding-left: 0;\n}\n\n.Documentation ul ul {\n  padding-left: 2em;\n}\n\n.Documentation .Documentation-bulletList {\n  list-style: disc;\n  margin-bottom: 1rem;\n  padding-left: 2rem;\n}\n\n.Documentation .Documentation-numberList {\n  list-style: decimal;\n  margin-bottom: 1rem;\n  padding-left: 2rem;\n}\n\n.Documentation pre + pre {\n  margin-top: 0.625rem;\n}\n\n.Documentation .Documentation-declarationLink + pre {\n  border-radius: 0 0 0.3em 0.3em;\n  border-top: var(--border);\n  margin-top: 0;\n}\n\n.Documentation pre .comment {\n  color: var(--color-code-comment);\n}\n\n.Documentation-toc,\n.Documentation-overview,\n.Documentation-index,\n.Documentation-examples {\n  padding-bottom: 0;\n}\n\n.Documentation-empty {\n  color: var(--color-text-subtle);\n  margin-top: -0.5rem;\n}\n@media only screen and (min-width: 64rem) {\n  .Documentation-toc {\n    margin-left: 2rem;\n    white-space: nowrap;\n  }\n\n  .Documentation-toc-columns {\n    columns: 2;\n  }\n}\n\n.Documentation-toc:empty {\n  display: none;\n}\n\n.Documentation-tocItem {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.Documentation-tocItem--constants,\n.Documentation-tocItem--funcsAndTypes,\n.Documentation-tocItem--functions,\n.Documentation-tocItem--types,\n.Documentation-tocItem--variables,\n.Documentation-tocItem--notes {\n  display: none;\n}\n\n.Documentation-overviewHeader,\n.Documentation-indexHeader,\n.Documentation-constantsHeader,\n.Documentation-variablesHeader,\n.Documentation-examplesHeader,\n.Documentation-filesHeader,\n.Documentation-functionHeader,\n.Documentation-typeHeader,\n.Documentation-typeMethodHeader,\n.Documentation-typeFuncHeader {\n  margin-bottom: 0.5rem;\n}\n\n.Documentation-function h4,\n.Documentation-type h4,\n.Documentation-typeFunc h4,\n.Documentation-typeMethod h4 {\n  align-items: baseline;\n  display: flex;\n  justify-content: space-between;\n}\n\n.Documentation-sinceVersion {\n  color: var(--color-text-subtle);\n  font-size: 0.9375rem;\n  font-weight: 400;\n}\n\n.Documentation-constants br:last-of-type,\n.Documentation-variables br:last-of-type {\n  display: none;\n}\n\n.Documentation-build {\n  color: var(--color-text-subtle);\n  padding-top: 1.5rem;\n  text-align: right;\n}\n\n.Documentation-declaration pre {\n  scroll-padding-top: calc(var(--js-sticky-header-height, 3.5rem) + 3.75rem);\n}\n@media only screen and (min-width: 64rem) {\n  .Documentation-declaration pre {\n    scroll-padding-top: calc(var(--js-sticky-header-height, 3.5rem) + 0.75rem);\n  }\n}\n\n.Documentation-declaration + .Documentation-declaration {\n  margin-top: 0.625rem;\n}\n\n.Documentation-declarationLink {\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-bottom: none;\n  border-radius: 0.3em 0.3em 0 0;\n  display: block;\n  font-size: 0.75rem;\n  line-height: 0.5rem;\n  padding: 0.375rem;\n  text-align: right;\n}\n\n.Documentation-exampleButtonsContainer {\n  align-items: center;\n  display: flex;\n  justify-content: flex-end;\n  margin-top: 0.5rem;\n}\n\n.Documentation-examplePlayButton {\n  background-color: var(--white);\n  border: 0.15rem solid var(--turq-med);\n  color: var(--turq-med);\n  cursor: pointer;\n  flex-shrink: 0;\n  height: 2.5rem;\n  width: 4.125rem;\n}\n\n.Documentation-exampleRunButton,\n.Documentation-exampleShareButton,\n.Documentation-exampleFormatButton {\n  border: 0.0625rem solid var(--turq-dark);\n  border-radius: 0.25rem;\n  cursor: pointer;\n  height: 2rem;\n  margin-left: 0.5rem;\n  padding: 0 1rem;\n}\n\n.Documentation-exampleRunButton {\n  background-color: var(--turq-dark);\n  color: var(--white);\n}\n\n.Documentation-exampleShareButton,\n.Documentation-exampleFormatButton {\n  background-color: var(--white);\n  color: var(--turq-dark);\n}\n\n.Documentation-exampleDetails {\n  margin-top: 1rem;\n}\n\n.Documentation-exampleDetailsBody pre {\n  border-radius: 0 0 0.3rem 0.3rem;\n  margin-bottom: 1rem;\n  margin-top: -0.25rem;\n}\n\n.Documentation-exampleDetailsBody textarea {\n  height: 100%;\n  outline: none;\n  overflow-x: auto;\n  resize: none;\n  white-space: pre;\n  width: 100%;\n}\n\n/**\n * We add another selector here to these two classes to increase CSS specificity,\n * the selector .Documentation pre + pre overrides .Documentation-exampleCode\n * and .Documentation-exampleOutput by itself and would replace the styles.\n */\n.Documentation-exampleDetailsBody .Documentation-exampleCode {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n  margin: 0;\n}\n\n.Documentation-exampleDetailsBody .Documentation-exampleOutput {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  margin: 0 0 0.5rem;\n}\n\n.Documentation-exampleDetailsHeader {\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  margin-bottom: 2rem;\n  outline: none;\n  text-decoration: none;\n}\n\n.Documentation-exampleOutputLabel {\n  color: var(--color-text-subtle);\n}\n\n.Documentation-exampleError {\n  color: var(--pink);\n  margin-right: 0.4rem;\n  padding-right: 0.5rem;\n}\n\n/* See https://golang.org/issue/43368 for context. */\n.Documentation-function pre,\n.Documentation-typeFunc pre,\n.Documentation-typeMethod pre {\n  white-space: pre-wrap;\n  word-break: break-all;\n  word-wrap: break-word;\n}\n\n.Documentation-indexDeprecated {\n  margin-left: 0.5rem;\n}\n\n.Documentation-deprecatedBody {\n  color: var(--color-text-subtle);\n  font-size: 0.87rem;\n  font-weight: 400;\n  margin-left: 0.25rem;\n  margin-right: 0.5rem;\n}\n\n.Documentation-deprecatedTag {\n  background-color: var(--color-border);\n  border-radius: 0.125rem;\n  color: var(--color-text-inverted);\n  font-size: 0.75rem;\n  font-weight: normal;\n  line-height: 1.375;\n  padding: 0.125rem 0.25rem;\n  text-transform: uppercase;\n  vertical-align: middle;\n}\n\n.Documentation-deprecatedTitle {\n  align-items: center;\n  display: flex;\n  gap: 0.5rem;\n}\n\n.Documentation-deprecatedDetails {\n  color: var(--color-text-subtle);\n}\n\n.Documentation-deprecatedDetails a {\n  color: var(--color-text-subtle);\n}\n\n.Documentation-deprecatedDetails[open] {\n  color: var(--color-text);\n}\n\n.Documentation-deprecatedDetails[open] a {\n  color: var(--color-brand-primary);\n}\n\n.Documentation-deprecatedDetails .Documentation-deprecatedBody::after {\n  color: var(--color-brand-primary);\n  content: 'Show';\n}\n\n.Documentation-deprecatedDetails[open] .Documentation-deprecatedBody::after {\n  color: var(--color-brand-primary);\n  content: 'Hide';\n}\n\n.Documentation-deprecatedDetails > summary {\n  list-style: none;\n  opacity: 1;\n}\n\n.Documentation-deprecatedDetails .Documentation-source {\n  opacity: 1;\n}\n\n.Documentation-deprecatedItemBody {\n  padding: 1rem 1rem 0.5rem;\n}\n\n.Documentation-deprecatedMessage {\n  align-items: center;\n  display: flex;\n  gap: 0.5rem;\n  margin-bottom: 1rem;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitFiles {\n  margin-bottom: 2rem;\n}\n\n.UnitFiles-titleLink {\n  position: relative;\n}\n\n.UnitFiles-titleLink a {\n  bottom: 1rem;\n  font-size: 0.875rem;\n  position: absolute;\n  right: 0;\n}\n\n.UnitFiles-titleLink a::after {\n  background-image: url('/static/shared/icon/launch_gm_grey_24dp.svg');\n  background-repeat: no-repeat;\n  background-size: 0.875rem 1.25rem;\n  content: '';\n  display: inline-block;\n  height: 1rem;\n  left: 0.3125rem;\n  position: relative;\n  top: 0.125rem;\n  width: 1rem;\n}\n\n.UnitFiles h2 a.UnitFiles-idLink,\n.UnitFiles summary a {\n  opacity: 0;\n}\n\n.UnitFiles h2:hover a,\n.UnitFiles summary:focus a {\n  opacity: 1;\n}\n\n.UnitFiles-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  margin: 0.5rem 0 0;\n  padding-bottom: 1rem;\n}\n\n.UnitFiles-title img {\n  margin: auto 1rem auto 0;\n}\n\n.UnitFiles-fileList {\n  columns: 12.5rem 5;\n  line-height: 1.5rem;\n  list-style: none;\n  margin-top: 1rem;\n  padding-left: 0;\n  word-break: break-all;\n}\n", "/*!\n* Copyright 2019-2020 The Go Authors. All rights reserved.\n* Use of this source code is governed by a BSD-style\n* license that can be found in the LICENSE file.\n*/\n\n.UnitMeta {\n  display: grid;\n  gap: 1rem 2rem;\n  grid-template-columns: max-content auto;\n  white-space: nowrap;\n}\n\n.UnitMeta-details,\n.UnitMeta-links {\n  display: flex;\n  flex-flow: wrap;\n  flex-direction: row;\n  gap: 1rem 2rem;\n}\n\n.UnitMeta-repo {\n  align-items: center;\n  display: flex;\n  overflow: hidden;\n}\n\n.UnitMeta-repo a {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n@media (min-width: 50rem) {\n  .UnitMeta {\n    grid-template-columns: max-content auto;\n  }\n\n  .UnitMeta-details,\n  .UnitMeta-links {\n    flex-direction: row;\n  }\n}\n@media (min-width: 112rem) {\n  :root[data-layout='responsive'] .UnitMeta {\n    grid-template-columns: 100%;\n  }\n\n  :root[data-layout='responsive'] .UnitMeta-details,\n  :root[data-layout='responsive'] .UnitMeta-links {\n    flex-direction: column;\n    white-space: nowrap;\n  }\n}\n\n.UnitMeta-detailsLearn {\n  width: 100%;\n}\n@media (min-width: 50rem) {\n  .UnitMeta-detailsLearn {\n    width: initial;\n  }\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitOutline-jumpTo {\n  display: flex;\n  margin-bottom: 1rem;\n}\n\n.UnitOutline-jumpTo button {\n  align-items: center;\n  background-color: var(--color-background);\n  border: var(--border);\n  border-radius: 0.25rem;\n  color: var(--color-text-subtle);\n  cursor: pointer;\n  height: 2rem;\n  padding-left: 1rem;\n  text-align: left;\n  width: 100%;\n}\n\n.UnitOutline-jumpTo button:hover:not([disabled]) {\n  border-color: var(--color-border);\n}\n\n.UnitOutline-jumpToInput:disabled {\n  background-color: var(--gray-9);\n}\n", "/*!\n* Copyright 2019-2020 The Go Authors. All rights reserved.\n* Use of this source code is governed by a BSD-style\n* license that can be found in the LICENSE file.\n*/\n\n/* ---------- */\n/*\n/* The CSS classes below are generated using devtools/cmd/css/main.go\n/* If the generated CSS already exists, the file is overwritten\n/*\n/* ---------- */\n\n.Overview-readmeContent details {\n  display: block;\n}\n.Overview-readmeContent summary {\n  display: list-item;\n}\n.Overview-readmeContent a {\n  background-color: initial;\n}\n.Overview-readmeContent a:active,\n.Overview-readmeContent a:hover {\n  outline-width: 0;\n}\n.Overview-readmeContent strong {\n  font-weight: inherit;\n  font-weight: bolder;\n}\n.Overview-readmeContent h3 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n.Overview-readmeContent img {\n  border-style: none;\n}\n.Overview-readmeContent code,\n.Overview-readmeContent kbd,\n.Overview-readmeContent pre {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n.Overview-readmeContent hr {\n  box-sizing: initial;\n  height: 0;\n  overflow: visible;\n}\n.Overview-readmeContent input {\n  font: inherit;\n  margin: 0;\n}\n.Overview-readmeContent input {\n  overflow: visible;\n}\n.Overview-readmeContent [type='checkbox'] {\n  box-sizing: border-box;\n  padding: 0;\n}\n.Overview-readmeContent * {\n  box-sizing: border-box;\n}\n.Overview-readmeContent input {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n.Overview-readmeContent a {\n  color: var(--color-brand-primary);\n  text-decoration: none;\n}\n.Overview-readmeContent a:hover {\n  text-decoration: underline;\n}\n.Overview-readmeContent strong {\n  font-weight: 600;\n}\n.Overview-readmeContent hr {\n  height: 0;\n  margin: 0.9375rem 0;\n  overflow: hidden;\n  background: transparent;\n  border: 0;\n  border-bottom: var(--border);\n}\n.Overview-readmeContent hr:after,\n.Overview-readmeContent hr:before {\n  display: table;\n  content: '';\n}\n.Overview-readmeContent hr:after {\n  clear: both;\n}\n.Overview-readmeContent table {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\n.Overview-readmeContent td,\n.Overview-readmeContent th {\n  padding: 0;\n}\n.Overview-readmeContent details summary {\n  cursor: pointer;\n}\n.Overview-readmeContent kbd {\n  display: inline-block;\n  padding: 0.1875rem 0.3125rem;\n  font: 0.6875rem SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  line-height: 0.625rem;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-radius: 0.1875rem;\n  box-shadow: inset 0 -0.0625rem 0 var(--border);\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4,\n.Overview-readmeContent h5,\n.Overview-readmeContent h6,\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent h3 {\n  font-size: 2rem;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4 {\n  font-weight: 600;\n}\n.Overview-readmeContent h4 {\n  font-size: 1.5rem;\n}\n.Overview-readmeContent h5 {\n  font-size: 1.25rem;\n}\n.Overview-readmeContent h5,\n.Overview-readmeContent h6 {\n  font-weight: 600;\n}\n.Overview-readmeContent h6 {\n  font-size: 1rem;\n}\n.Overview-readmeContent div[aria-level='7'] {\n  font-size: 0.875rem;\n}\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  font-weight: 600;\n}\n.Overview-readmeContent div[aria-level='8'] {\n  font-size: 0.75rem;\n}\n.Overview-readmeContent p {\n  margin-top: 0;\n  margin-bottom: 0.625rem;\n}\n.Overview-readmeContent blockquote {\n  margin: 0;\n}\n.Overview-readmeContent ol,\n.Overview-readmeContent ul {\n  padding-left: 0;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent ol ol,\n.Overview-readmeContent ul ol {\n  list-style-type: lower-roman;\n}\n.Overview-readmeContent ol ol ol,\n.Overview-readmeContent ol ul ol,\n.Overview-readmeContent ul ol ol,\n.Overview-readmeContent ul ul ol {\n  list-style-type: lower-alpha;\n}\n.Overview-readmeContent dd {\n  margin-left: 0;\n}\n.Overview-readmeContent code,\n.Overview-readmeContent pre {\n  font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  font-size: 0.75rem;\n}\n.Overview-readmeContent pre {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent input::-webkit-inner-spin-button,\n.Overview-readmeContent input::-webkit-outer-spin-button {\n  margin: 0;\n  -webkit-appearance: none;\n  appearance: none;\n}\n.Overview-readmeContent :checked + .radio-label {\n  position: relative;\n  z-index: 1;\n  border-color: var(--color-brand-primary);\n}\n.Overview-readmeContent hr {\n  border-bottom-color: var(--color-border);\n}\n.Overview-readmeContent kbd {\n  display: inline-block;\n  padding: 0.1875rem 0.3125rem;\n  font: 0.6875rem SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  line-height: 0.625rem;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-radius: 0.1875rem;\n  box-shadow: inset 0 -0.0625rem 0 var(--color-border);\n}\n.Overview-readmeContent a:not([href]) {\n  color: inherit;\n  text-decoration: none;\n}\n.Overview-readmeContent blockquote,\n.Overview-readmeContent details,\n.Overview-readmeContent dl,\n.Overview-readmeContent ol,\n.Overview-readmeContent p,\n.Overview-readmeContent pre,\n.Overview-readmeContent table,\n.Overview-readmeContent ul {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n.Overview-readmeContent hr {\n  height: 0.25em;\n  padding: 0;\n  margin: 1.5rem 0;\n  background-color: var(--color-border);\n  border: 0;\n}\n.Overview-readmeContent blockquote {\n  padding: 0 1em;\n  color: var(--color-text-subtle);\n  border-left: 0.25em solid var(--color-border);\n}\n.Overview-readmeContent blockquote > :first-child {\n  margin-top: 0;\n}\n.Overview-readmeContent blockquote > :last-child {\n  margin-bottom: 0;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4,\n.Overview-readmeContent h5,\n.Overview-readmeContent h6,\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  margin-top: 1.5rem;\n  margin-bottom: 1rem;\n  font-weight: 600;\n  line-height: 1.25;\n}\n.Overview-readmeContent h3 {\n  font-size: 2em;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4 {\n  padding-bottom: 0.3em;\n  border-bottom: var(--border);\n}\n.Overview-readmeContent h4 {\n  font-size: 1.5em;\n}\n.Overview-readmeContent h5 {\n  font-size: 1.25em;\n}\n.Overview-readmeContent h6 {\n  font-size: 1em;\n}\n.Overview-readmeContent div[aria-level='7'] {\n  font-size: 0.875em;\n}\n.Overview-readmeContent div[aria-level='8'] {\n  font-size: 0.85em;\n  color: var(--color-text-subtle);\n}\n.Overview-readmeContent ol,\n.Overview-readmeContent ul {\n  padding-left: 2em;\n}\n.Overview-readmeContent ol ol,\n.Overview-readmeContent ol ul,\n.Overview-readmeContent ul ol,\n.Overview-readmeContent ul ul {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent li {\n  word-wrap: break-all;\n}\n.Overview-readmeContent li > p {\n  margin-top: 1rem;\n}\n.Overview-readmeContent li + li {\n  margin-top: 0.25em;\n}\n.Overview-readmeContent dl {\n  padding: 0;\n}\n.Overview-readmeContent dl dt {\n  padding: 0;\n  margin-top: 1rem;\n  font-size: 1em;\n  font-style: italic;\n  font-weight: 600;\n}\n.Overview-readmeContent dl dd {\n  padding: 0 1rem;\n  margin-bottom: 1rem;\n}\n.Overview-readmeContent table {\n  display: block;\n  width: 100%;\n  overflow: auto;\n}\n.Overview-readmeContent table th {\n  font-weight: 600;\n}\n.Overview-readmeContent table td,\n.Overview-readmeContent table th {\n  padding: 0.375rem 0.8125rem;\n  border: var(--border);\n}\n.Overview-readmeContent table tr {\n  background-color: var(--color-background);\n  border-top: var(--border);\n}\n.Overview-readmeContent table tr:nth-child(2n) {\n  background-color: var(--color-background-accented);\n}\n.Overview-readmeContent img {\n  max-width: 100%;\n  box-sizing: initial;\n  background-color: var(--color-background);\n}\n.Overview-readmeContent img[align='right'] {\n  padding-left: 1.25rem;\n}\n.Overview-readmeContent img[align='left'] {\n  padding-right: 1.25rem;\n}\n.Overview-readmeContent code {\n  padding: 0.2em 0.4em;\n  margin: 0;\n  font-size: 85%;\n  background-color: var(--color-background-accented);\n  border-radius: 0.1875rem;\n}\n.Overview-readmeContent pre {\n  word-wrap: normal;\n}\n.Overview-readmeContent pre > code {\n  padding: 0;\n  margin: 0;\n  font-size: 100%;\n  word-break: normal;\n  white-space: pre;\n  background: transparent;\n  border: 0;\n}\n.Overview-readmeContent pre {\n  padding: 1rem;\n  overflow: auto;\n  font-size: 85%;\n  line-height: 1.45;\n  background-color: var(--color-background-accented);\n  border-radius: 0.1875rem;\n}\n.Overview-readmeContent pre code {\n  display: inline;\n  max-width: auto;\n  padding: 0;\n  margin: 0;\n  overflow: visible;\n  line-height: inherit;\n  word-wrap: normal;\n  background-color: initial;\n  border: 0;\n}\n\n/* ---------- */\n/*\n/* End output from devtools/cmd/css/main.go\n/*\n/* ---------- */\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitReadme {\n  margin-bottom: 2rem;\n}\n\n.UnitReadme ul,\n.UnitReadme ol {\n  list-style: circle;\n}\n\n.UnitReadme h2 a.UnitReadme-idLink,\n.UnitReadme summary a {\n  opacity: 0;\n}\n\n.UnitReadme h2:hover a,\n.UnitReadme summary:focus a {\n  opacity: 1;\n}\n\n.UnitReadme-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  padding-bottom: 1rem;\n}\n\n.UnitReadme-title img {\n  margin: auto 1rem auto 0;\n}\n\n.UnitReadme-content {\n  /* stylelint-disable-next-line property-no-vendor-prefix */\n  -webkit-mask-image: linear-gradient(to bottom, black 75%, transparent 100%);\n  mask-image: linear-gradient(to bottom, black 75%, transparent 100%);\n  max-height: 20rem;\n  overflow: hidden;\n  position: relative;\n}\n\n.UnitReadme-content ul {\n  line-height: 1.5rem;\n}\n\n.UnitReadme-expandLink {\n  background: none;\n  border: none;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  padding: 0;\n}\n\n.UnitReadme-collapseLink {\n  background: none;\n  border: none;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  display: none;\n  padding: 0;\n}\n\n.UnitReadme--expanded .UnitReadme-content {\n  /* stylelint-disable-next-line property-no-vendor-prefix */\n  -webkit-mask-image: none;\n  mask-image: none;\n  max-height: initial;\n  overflow: initial;\n}\n\n.UnitReadme--toggle .UnitReadme-expandLink {\n  display: block;\n}\n\n.UnitReadme--expanded .UnitReadme-expandLink {\n  display: none;\n}\n\n.UnitReadme--expanded.UnitReadme--toggle .UnitReadme-collapseLink {\n  display: block;\n}\n\n.Overview-readmeContent {\n  overflow-wrap: break-word;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n@import url('./_build-context.css');\n@import url('./_directories.css');\n@import url('./_doc.css');\n@import url('./_files.css');\n@import url('./_meta.css');\n@import url('./_outline.css');\n@import url('./_readme_gen.css');\n@import url('./_readme.css');\n\n.UnitDetails {\n  column-gap: 2rem;\n  display: grid;\n  grid-template-columns: minmax(0, auto);\n  margin: auto;\n  min-height: 32rem;\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails {\n    grid-template-columns: 15.5rem minmax(30.5rem, 43.125rem) minmax(10rem, 15.5rem);\n  }\n}\n@media only screen and (min-width: 80rem) {\n  .UnitDetails {\n    grid-template-columns: 15.5rem minmax(43.125rem, 60rem) 15.5rem;\n    justify-content: center;\n  }\n}\n\n.UnitDetails :target {\n  scroll-margin-top: calc(var(--js-sticky-header-height, 3.5rem) * 2.15);\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails :target {\n    scroll-margin-top: calc(var(--js-sticky-header-height, 3.5rem) * 1.25);\n  }\n}\n\n.UnitDetails :target:not(details, h2) {\n  background-color: var(--color-background-highlighted);\n  padding: 0.25rem;\n}\n\n.UnitDetails-meta {\n  order: -1;\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails-meta {\n    display: block;\n    margin-top: 2rem;\n    order: initial;\n  }\n}\n\n.UnitDetails-contentEmpty {\n  align-items: center;\n  background-color: var(--color-background-accented);\n  color: var(--color-text-subtle);\n  display: flex;\n  flex-direction: column;\n  height: 15rem;\n  padding-top: 1rem;\n  text-align: center;\n}\n\n.UnitDetails-contentEmpty img {\n  height: 7.8125rem;\n  width: auto;\n}\n"],
-  "mappings": ";;;;;AAMA,qEAEE,+BACA,kBAGF,gCAZA,iBAgBA,sCACE,iCACA,+BACA,mBACA,eAGF,sCACE,+BAGF,uBACE,aAEF,0CACE,uBACE,iBAIJ,wCACE,kBAGF,uFAEE,eACA,kBACA,QCtCF,iBACE,mBAGF,wEAEE,UAGF,6DAEE,UAGF,uBACE,4BACA,mBAtBF,iBAwBE,oBAGF,2BA3BA,wBA+BA,uBACE,yBACA,SACA,kBACA,WAGF,6BACE,iBAGF,6BACE,kDAGF,mCACE,kBAGF,oBACE,4BACA,gBACA,gBArDF,oBAuDE,sBACA,sBAGF,oBA3DA,mBA6DE,gBAGF,2BACE,aAGF,mCACE,eAGF,yCACE,kDAGF,+CACE,YACA,kBA9EF,UAgFE,cAGF,6EAEE,mCACA,oBACA,kBAvFF,UAyFE,cAGF,8BACE,kBACA,aA9FF,oCAiGE,kBACA,mBAGF,2BACE,2BACA,eACA,qBACA,eAGF,sDACE,wBAGF,0BACE,uBACA,aACA,sBACA,oBACA,qBAGF,8BACE,kBAGF,8BACE,0BACA,aACA,sBACA,oBAhIF,mBAoIA,gCACE,aACA,oBACA,kBACA,oBAEF,0CACE,gCACE,gBAGF,oHAEE,cAIJ,8BACE,kBAGF,qCACE,6BACA,YACA,YACA,iCACA,eACA,aACA,kBACA,kBACA,QACA,qBAGF,uBACE,+CAvKF,sBAyKE,mBACA,gBACA,iBACA,kBACA,mBA7KF,iBA+KE,kBCxKF,SACE,mBACA,sBAGF,gDAEE,UAGF,6CAEE,UAGF,eACE,4BACA,oBAGF,mBA3BA,wBA+BA,sBACE,kDACA,+BACA,gBACA,kBACA,kBAGF,0BACE,iBACA,WAGF,uCA5CA,iBAgDA,2BACE,kBAGF,eACE,cAGF,iBAxDA,cA4DA,oCAEE,kBAGF,iBACE,qBAGF,uBACE,0BAGF,0GAIE,UAGF,uBACE,UAGF,yCACE,UAGF,4IAKE,UAGF,kBACE,mBACA,gBACA,eAGF,qBACE,iBAGF,yCACE,gBACA,mBACA,kBAGF,yCACE,mBACA,mBACA,kBAGF,uBACE,mBAGF,kDA1HA,4BA4HE,yBACA,aAGF,4BACE,gCAGF,wFAIE,iBAGF,qBACE,+BACA,kBAEF,0CACE,mBACE,iBACA,mBAGF,2BACE,WAIJ,yBACE,aAGF,uBACE,gBACA,uBAGF,wMAME,aAGF,sSAUE,oBAGF,0GAIE,qBACA,aACA,8BAGF,4BACE,+BACA,mBACA,gBAGF,kFAEE,aAGF,qBACE,+BACA,mBACA,iBAGF,+BACE,0EAEF,0CACE,+BACE,0EAIJ,sDACE,mBAGF,+BACE,kDACA,qBACA,mBAnOF,4BAqOE,cACA,iBACA,kBAvOF,gBAyOE,iBAGF,uCACE,mBACA,aACA,yBACA,iBAGF,iCACE,8BACA,oCACA,sBACA,eACA,cACA,cACA,eAGF,qGAGE,uCAhQF,qBAkQE,eACA,YACA,kBApQF,eAwQA,gCACE,kCACA,mBAGF,qEAEE,8BACA,uBAGF,8BACE,gBAGF,sCAvRA,8BAyRE,mBACA,mBAGF,2CACE,YACA,aACA,gBACA,YACA,gBACA,WAQF,6DACE,4BACA,6BA7SF,SAiTA,+DACE,yBACA,0BAnTF,iBAuTA,oCACE,iCACA,eACA,mBACA,aACA,qBAGF,kCACE,+BAGF,4BACE,kBACA,mBACA,oBAIF,sFAGE,qBACA,qBACA,qBAGF,+BACE,kBAGF,8BACE,+BACA,iBACA,gBACA,mBACA,mBAGF,6BACE,qCA/VF,sBAiWE,iCACA,iBACA,gBACA,kBApWF,uBAsWE,yBACA,sBAGF,+BACE,mBACA,aACA,UAGF,oEACE,+BAOF,uCACE,wBAGF,yCACE,iCAGF,qEACE,iCACA,eAGF,2EACE,iCACA,eAGF,yCACE,gBACA,UAGF,uDACE,UAGF,kCAnZA,wBAuZA,iCACE,mBACA,aACA,UACA,mBCrZF,WACE,mBAGF,qBACE,kBAGF,uBACE,YACA,kBACA,kBACA,QAGF,6BACE,kEACA,4BACA,gCACA,WACA,qBACA,YACA,cACA,kBACA,YACA,WAGF,sDAEE,UAGF,iDAEE,UAGF,iBACE,4BACA,mBA9CF,iBAgDE,oBAGF,qBAnDA,wBAuDA,oBACE,kBACA,mBACA,gBACA,gBACA,eACA,qBCvDF,UACE,aACA,cACA,uCACA,mBAGF,kCAEE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",
+  "sourcesContent": ["/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitBuildContext-titleContext label,\n.UnitBuildContext-singleContext {\n  color: var(--color-text-subtle);\n  font-size: 0.875rem;\n}\n\n.UnitBuildContext-singleContext {\n  padding: 0.35rem 0;\n}\n\n.UnitBuildContext-titleContext select {\n  border-color: var(--color-border);\n  color: var(--color-text-subtle);\n  margin-left: 0.25rem;\n  min-width: 6rem;\n}\n\n.UnitBuildContext-titleContext option {\n  color: var(--color-text-subtle);\n}\n\n.UnitBuildContext-link {\n  display: none;\n}\n@media only screen and (min-width: 30rem) {\n  .UnitBuildContext-link {\n    display: initial;\n  }\n}\n\n.UnitDoc .UnitBuildContext-titleContext {\n  position: relative;\n}\n\n.UnitDoc .UnitBuildContext-titleContext label,\n.UnitDoc .UnitBuildContext-singleContext {\n  bottom: 0.875rem;\n  position: absolute;\n  right: 0;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitDirectories {\n  margin-bottom: 2rem;\n}\n\n.UnitDirectories h2 a.UnitDirectories-idLink,\n.UnitDirectories summary a {\n  opacity: 0;\n}\n\n.UnitDirectories h2:hover a,\n.UnitDirectories summary:focus a {\n  opacity: 1;\n}\n\n.UnitDirectories-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  margin: 0.5rem 0 0;\n  padding-bottom: 1rem;\n}\n\n.UnitDirectories-title img {\n  margin: auto 1rem auto 0;\n}\n\n.UnitDirectories-table {\n  border-collapse: collapse;\n  height: 0;\n  table-layout: auto;\n  width: 100%;\n}\n\n.UnitDirectories-table--tree {\n  margin-top: -2rem;\n}\n\n.UnitDirectories-tableHeader {\n  background-color: var(--color-background-accented);\n}\n\n.UnitDirectories-tableHeader--tree {\n  visibility: hidden;\n}\n\n.UnitDirectories td {\n  border-bottom: var(--border);\n  max-width: 32rem;\n  min-width: 12rem;\n  padding: 0.25rem 1rem;\n  vertical-align: middle;\n  word-break: break-word;\n}\n\n.UnitDirectories th {\n  padding: 0.5rem 1rem;\n  text-align: left;\n}\n\n.UnitDirectories tr.hidden {\n  display: none;\n}\n\n.UnitDirectories tr[aria-controls] {\n  cursor: pointer;\n}\n\n.UnitDirectories tr[aria-controls]:hover {\n  background-color: var(--color-background-accented);\n}\n\n.UnitDirectories th.UnitDirectories-toggleHead {\n  font-size: 0;\n  max-width: 0.625rem;\n  padding: 0;\n  width: 0.625rem;\n}\n\n.UnitDirectories td.UnitDirectories-toggleCell,\nth.UnitDirectories-toggleCell {\n  background-color: var(--background);\n  border: var(--white);\n  max-width: 0.625rem;\n  padding: 0;\n  width: 0.625rem;\n}\n\n.UnitDirectories-toggleButton {\n  font-size: 1.25rem;\n  left: -0.75rem;\n  margin: 0 0 -1rem -0.875rem;\n  padding: 0;\n  position: absolute;\n  vertical-align: top;\n}\n\n.UnitDirectories-subSpacer {\n  border-right: var(--border);\n  display: inline;\n  margin-right: 0.875rem;\n  width: 0.0625rem;\n}\n\n.UnitDirectories-toggleButton[aria-expanded='true'] img {\n  transform: rotate(90deg);\n}\n\n.UnitDirectories-pathCell {\n  align-items: flex-start;\n  display: flex;\n  flex-direction: column;\n  line-height: 1.75rem;\n  word-break: break-all;\n}\n\n.UnitDirectories-pathCell > div {\n  position: relative;\n}\n\n.UnitDirectories-subdirectory {\n  border-left: var(--border);\n  display: flex;\n  flex-direction: column;\n  margin-left: 0.375rem;\n  padding: 0.5rem 1rem;\n}\n\n.UnitDirectories-internal {\n  display: none;\n}\n\n.UnitDirectories-showInternal .UnitDirectories-internal {\n  display: table-row;\n}\n\n.UnitDirectories-mobileSynopsis {\n  display: none;\n  line-height: 1.25rem;\n  margin-top: 0.25rem;\n  word-break: keep-all;\n}\n@media only screen and (max-width: 52rem) {\n  .UnitDirectories-mobileSynopsis {\n    display: initial;\n  }\n\n  .UnitDirectories-table th.UnitDirectories-desktopSynopsis,\n  .UnitDirectories-table td.UnitDirectories-desktopSynopsis {\n    display: none;\n  }\n}\n\n.UnitDirectories-toggles {\n  position: relative;\n}\n\n.UnitDirectories-toggleButtons {\n  bottom: 1rem;\n  display: flex;\n  gap: 1rem;\n  position: absolute;\n  right: 0;\n}\n\n.UnitDirectories-toggleButtons button {\n  background-color: transparent;\n  border: none;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  display: none;\n  font-size: 0.875rem;\n  text-decoration: none;\n}\n\n.UnitDirectories-badge {\n  border: 0.0625rem solid var(--color-text-subtle);\n  border-radius: 0.125rem;\n  font-size: 0.6875rem;\n  font-weight: 500;\n  line-height: 1rem;\n  margin-left: 0.5rem;\n  margin-top: 0.125rem;\n  padding: 0 0.35rem;\n  text-align: center;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/* stylelint-disable no-descending-specificity */\n.UnitDoc {\n  margin-bottom: 2rem;\n  word-break: break-word;\n}\n\n.UnitDoc h2 a.UnitDoc-idLink,\n.UnitDoc summary a {\n  opacity: 0;\n}\n\n.UnitDoc h2:hover a,\n.UnitDoc summary:focus a {\n  opacity: 1;\n}\n\n.UnitDoc-title {\n  border-bottom: var(--border);\n  padding-bottom: 1rem;\n}\n\n.UnitDoc-title img {\n  margin: auto 1rem auto 0;\n}\n\n.UnitDoc-emptySection {\n  background-color: var(--color-background-accented);\n  color: var(--color-text-subtle);\n  height: 12.25rem;\n  margin-top: 1.5rem;\n  text-align: center;\n}\n\n.UnitDoc-emptySection img {\n  height: 7.8125rem;\n  width: auto;\n}\n\n.Documentation .UnitDoc-emptySection p {\n  margin: 1rem auto;\n}\n\n.UnitDoc .Documentation h4 {\n  margin-top: 1.5rem;\n}\n\n.Documentation {\n  display: block;\n}\n\n.Documentation p {\n  margin: 1rem 0;\n}\n\n.Documentation h2,\n.Documentation h3 {\n  margin-top: 1.5rem;\n}\n\n.Documentation a {\n  text-decoration: none;\n}\n\n.Documentation a:hover {\n  text-decoration: underline;\n}\n\n.Documentation h2 a,\n.Documentation h3 a,\n.Documentation h4 a.Documentation-idLink,\n.Documentation summary a {\n  opacity: 0;\n}\n\n.Documentation a:focus {\n  opacity: 1;\n}\n\n.Documentation h3 a.Documentation-source {\n  opacity: 1;\n}\n\n.Documentation h2:hover a,\n.Documentation h3:hover a,\n.Documentation h4:hover a,\n.Documentation summary:hover a,\n.Documentation summary:focus a {\n  opacity: 1;\n}\n\n.Documentation ul {\n  line-height: 1.5rem;\n  list-style: none;\n  padding-left: 0;\n}\n\n.Documentation ul ul {\n  padding-left: 2em;\n}\n\n.Documentation .Documentation-bulletList {\n  list-style: disc;\n  margin-bottom: 1rem;\n  padding-left: 2rem;\n}\n\n.Documentation .Documentation-numberList {\n  list-style: decimal;\n  margin-bottom: 1rem;\n  padding-left: 2rem;\n}\n\n.Documentation pre + pre {\n  margin-top: 0.625rem;\n}\n\n.Documentation .Documentation-declarationLink + pre {\n  border-radius: 0 0 0.3em 0.3em;\n  border-top: var(--border);\n  margin-top: 0;\n}\n\n.Documentation pre .comment {\n  color: var(--color-code-comment);\n}\n\n.Documentation-toc,\n.Documentation-overview,\n.Documentation-index,\n.Documentation-examples {\n  padding-bottom: 0;\n}\n\n.Documentation-empty {\n  color: var(--color-text-subtle);\n  margin-top: -0.5rem;\n}\n@media only screen and (min-width: 64rem) {\n  .Documentation-toc {\n    margin-left: 2rem;\n    white-space: nowrap;\n  }\n\n  .Documentation-toc-columns {\n    columns: 2;\n  }\n}\n\n.Documentation-toc:empty {\n  display: none;\n}\n\n.Documentation-tocItem {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.Documentation-tocItem--constants,\n.Documentation-tocItem--funcsAndTypes,\n.Documentation-tocItem--functions,\n.Documentation-tocItem--types,\n.Documentation-tocItem--variables,\n.Documentation-tocItem--notes {\n  display: none;\n}\n\n.Documentation-overviewHeader,\n.Documentation-indexHeader,\n.Documentation-constantsHeader,\n.Documentation-variablesHeader,\n.Documentation-examplesHeader,\n.Documentation-filesHeader,\n.Documentation-functionHeader,\n.Documentation-typeHeader,\n.Documentation-typeMethodHeader,\n.Documentation-typeFuncHeader {\n  margin-bottom: 0.5rem;\n}\n\n.Documentation-function h4,\n.Documentation-type h4,\n.Documentation-typeFunc h4,\n.Documentation-typeMethod h4 {\n  align-items: baseline;\n  display: flex;\n  justify-content: space-between;\n}\n\n.Documentation-sinceVersion {\n  color: var(--color-text-subtle);\n  font-size: 0.9375rem;\n  font-weight: 400;\n}\n\n.Documentation-constants br:last-of-type,\n.Documentation-variables br:last-of-type {\n  display: none;\n}\n\n.Documentation-build {\n  color: var(--color-text-subtle);\n  padding-top: 1.5rem;\n  text-align: right;\n}\n\n.Documentation-declaration pre {\n  scroll-padding-top: calc(var(--js-sticky-header-height, 3.5rem) + 3.75rem);\n}\n@media only screen and (min-width: 64rem) {\n  .Documentation-declaration pre {\n    scroll-padding-top: calc(var(--js-sticky-header-height, 3.5rem) + 0.75rem);\n  }\n}\n\n.Documentation-declaration + .Documentation-declaration {\n  margin-top: 0.625rem;\n}\n\n.Documentation-declarationLink {\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-bottom: none;\n  border-radius: 0.3em 0.3em 0 0;\n  display: block;\n  font-size: 0.75rem;\n  line-height: 0.5rem;\n  padding: 0.375rem;\n  text-align: right;\n}\n\n.Documentation-exampleButtonsContainer {\n  align-items: center;\n  display: flex;\n  justify-content: flex-end;\n  margin-top: 0.5rem;\n}\n\n.Documentation-examplePlayButton {\n  background-color: var(--white);\n  border: 0.15rem solid var(--turq-med);\n  color: var(--turq-med);\n  cursor: pointer;\n  flex-shrink: 0;\n  height: 2.5rem;\n  width: 4.125rem;\n}\n\n.Documentation-exampleRunButton,\n.Documentation-exampleShareButton,\n.Documentation-exampleFormatButton {\n  border: 0.0625rem solid var(--turq-dark);\n  border-radius: 0.25rem;\n  cursor: pointer;\n  height: 2rem;\n  margin-left: 0.5rem;\n  padding: 0 1rem;\n}\n\n.Documentation-exampleRunButton {\n  background-color: var(--turq-dark);\n  color: var(--white);\n}\n\n.Documentation-exampleShareButton,\n.Documentation-exampleFormatButton {\n  background-color: var(--white);\n  color: var(--turq-dark);\n}\n\n.Documentation-exampleDetails {\n  margin-top: 1rem;\n}\n\n.Documentation-exampleDetailsBody pre {\n  border-radius: 0 0 0.3rem 0.3rem;\n  margin-bottom: 1rem;\n  margin-top: -0.25rem;\n}\n\n.Documentation-exampleDetailsBody textarea {\n  height: 100%;\n  outline: none;\n  overflow-x: auto;\n  resize: none;\n  white-space: pre;\n  width: 100%;\n}\n\n/**\n * We add another selector here to these two classes to increase CSS specificity,\n * the selector .Documentation pre + pre overrides .Documentation-exampleCode\n * and .Documentation-exampleOutput by itself and would replace the styles.\n */\n.Documentation-exampleDetailsBody .Documentation-exampleCode {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n  margin: 0;\n}\n\n.Documentation-exampleDetailsBody .Documentation-exampleOutput {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  margin: 0 0 0.5rem;\n}\n\n.Documentation-exampleDetailsHeader {\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  margin-bottom: 2rem;\n  outline: none;\n  text-decoration: none;\n}\n\n.Documentation-exampleOutputLabel {\n  color: var(--color-text-subtle);\n}\n\n.Documentation-exampleError {\n  color: var(--pink);\n  margin-right: 0.4rem;\n  padding-right: 0.5rem;\n}\n\n/* See https://golang.org/issue/43368 for context. */\n.Documentation-function pre,\n.Documentation-typeFunc pre,\n.Documentation-typeMethod pre {\n  white-space: pre-wrap;\n  word-break: break-all;\n  word-wrap: break-word;\n}\n\n.Documentation-indexDeprecated {\n  margin-left: 0.5rem;\n}\n\n.Documentation-deprecatedBody {\n  color: var(--color-text-subtle);\n  font-size: 0.87rem;\n  font-weight: 400;\n  margin-left: 0.25rem;\n  margin-right: 0.5rem;\n}\n\n.Documentation-deprecatedTag {\n  background-color: var(--color-border);\n  border-radius: 0.125rem;\n  color: var(--color-text-inverted);\n  font-size: 0.75rem;\n  font-weight: normal;\n  line-height: 1.375;\n  padding: 0.125rem 0.25rem;\n  text-transform: uppercase;\n  vertical-align: middle;\n}\n\n.Documentation-deprecatedTitle {\n  align-items: center;\n  display: flex;\n  gap: 0.5rem;\n}\n\n.Documentation-deprecatedDetails {\n  color: var(--color-text-subtle);\n}\n\n.Documentation-deprecatedDetails a {\n  color: var(--color-text-subtle);\n}\n\n.Documentation-deprecatedDetails[open] {\n  color: var(--color-text);\n}\n\n.Documentation-deprecatedDetails[open] a {\n  color: var(--color-brand-primary);\n}\n\n.Documentation-deprecatedDetails .Documentation-deprecatedBody::after {\n  color: var(--color-brand-primary);\n  content: 'Show';\n}\n\n.Documentation-deprecatedDetails[open] .Documentation-deprecatedBody::after {\n  color: var(--color-brand-primary);\n  content: 'Hide';\n}\n\n.Documentation-deprecatedDetails > summary {\n  list-style: none;\n  opacity: 1;\n}\n\n.Documentation-deprecatedDetails .Documentation-source {\n  opacity: 1;\n}\n\n.Documentation-deprecatedItemBody {\n  padding: 1rem 1rem 0.5rem;\n}\n\n.Documentation-deprecatedMessage {\n  align-items: center;\n  display: flex;\n  gap: 0.5rem;\n  margin-bottom: 1rem;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitFiles {\n  margin-bottom: 2rem;\n}\n\n.UnitFiles-titleLink {\n  position: relative;\n}\n\n.UnitFiles-titleLink a {\n  bottom: 1rem;\n  font-size: 0.875rem;\n  position: absolute;\n  right: 0;\n}\n\n.UnitFiles-titleLink a::after {\n  background-image: url('/static/shared/icon/launch_gm_grey_24dp.svg');\n  background-repeat: no-repeat;\n  background-size: 0.875rem 1.25rem;\n  content: '';\n  display: inline-block;\n  height: 1rem;\n  left: 0.3125rem;\n  position: relative;\n  top: 0.125rem;\n  width: 1rem;\n}\n\n.UnitFiles h2 a.UnitFiles-idLink,\n.UnitFiles summary a {\n  opacity: 0;\n}\n\n.UnitFiles h2:hover a,\n.UnitFiles summary:focus a {\n  opacity: 1;\n}\n\n.UnitFiles-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  margin: 0.5rem 0 0;\n  padding-bottom: 1rem;\n}\n\n.UnitFiles-title img {\n  margin: auto 1rem auto 0;\n}\n\n.UnitFiles-fileList {\n  columns: 12.5rem 5;\n  line-height: 1.5rem;\n  list-style: none;\n  margin-top: 1rem;\n  padding-left: 0;\n  word-break: break-all;\n}\n", "/*!\n* Copyright 2019-2020 The Go Authors. All rights reserved.\n* Use of this source code is governed by a BSD-style\n* license that can be found in the LICENSE file.\n*/\n\n.UnitMeta {\n  display: grid;\n  gap: 1rem 2rem;\n  grid-template-columns: max-content auto;\n  white-space: nowrap;\n}\n\n.UnitMeta-details,\n.UnitMeta-links {\n  display: flex;\n  flex-flow: wrap;\n  flex-direction: row;\n  gap: 1rem 2rem;\n}\n\n.UnitMeta-repo {\n  align-items: center;\n  display: flex;\n  overflow: hidden;\n}\n\n.UnitMeta-repo a {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n@media (min-width: 50rem) {\n  .UnitMeta {\n    grid-template-columns: max-content auto;\n  }\n\n  .UnitMeta-details,\n  .UnitMeta-links {\n    flex-direction: row;\n  }\n}\n@media (min-width: 112rem) {\n  :root[data-layout='responsive'] .UnitMeta {\n    grid-template-columns: 100%;\n  }\n\n  :root[data-layout='responsive'] .UnitMeta-details,\n  :root[data-layout='responsive'] .UnitMeta-links {\n    flex-direction: column;\n    white-space: nowrap;\n  }\n}\n\n.UnitMeta-detailsLearn {\n  width: 100%;\n}\n@media (min-width: 50rem) {\n  .UnitMeta-detailsLearn {\n    width: initial;\n  }\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitOutline-jumpTo {\n  display: flex;\n  margin-bottom: 1rem;\n}\n\n.UnitOutline-jumpTo button {\n  align-items: center;\n  background-color: var(--color-background);\n  border: var(--border);\n  border-radius: 0.25rem;\n  color: var(--color-text-subtle);\n  cursor: pointer;\n  height: 2rem;\n  padding-left: 1rem;\n  text-align: left;\n  width: 100%;\n}\n\n.UnitOutline-jumpTo button:hover:not([disabled]) {\n  border-color: var(--color-border);\n}\n\n.UnitOutline-jumpToInput:disabled {\n  background-color: var(--gray-9);\n}\n", "/*!\n* Copyright 2019-2020 The Go Authors. All rights reserved.\n* Use of this source code is governed by a BSD-style\n* license that can be found in the LICENSE file.\n*/\n\n/* ---------- */\n/*\n/* The CSS classes below are generated using devtools/cmd/css/main.go\n/* If the generated CSS already exists, the file is overwritten\n/*\n/* ---------- */\n\n.Overview-readmeContent details {\n  display: block;\n}\n.Overview-readmeContent summary {\n  display: list-item;\n}\n.Overview-readmeContent a {\n  background-color: initial;\n}\n.Overview-readmeContent a:active,\n.Overview-readmeContent a:hover {\n  outline-width: 0;\n}\n.Overview-readmeContent strong {\n  font-weight: inherit;\n  font-weight: bolder;\n}\n.Overview-readmeContent h3 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n.Overview-readmeContent img {\n  border-style: none;\n}\n.Overview-readmeContent code,\n.Overview-readmeContent kbd,\n.Overview-readmeContent pre {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n.Overview-readmeContent hr {\n  box-sizing: initial;\n  height: 0;\n  overflow: visible;\n}\n.Overview-readmeContent input {\n  font: inherit;\n  margin: 0;\n}\n.Overview-readmeContent input {\n  overflow: visible;\n}\n.Overview-readmeContent [type='checkbox'] {\n  box-sizing: border-box;\n  padding: 0;\n}\n.Overview-readmeContent * {\n  box-sizing: border-box;\n}\n.Overview-readmeContent input {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n.Overview-readmeContent a {\n  color: var(--color-brand-primary);\n  text-decoration: none;\n}\n.Overview-readmeContent a:hover {\n  text-decoration: underline;\n}\n.Overview-readmeContent strong {\n  font-weight: 600;\n}\n.Overview-readmeContent hr {\n  height: 0;\n  margin: 0.9375rem 0;\n  overflow: hidden;\n  background: transparent;\n  border: 0;\n  border-bottom: var(--border);\n}\n.Overview-readmeContent hr:after,\n.Overview-readmeContent hr:before {\n  display: table;\n  content: '';\n}\n.Overview-readmeContent hr:after {\n  clear: both;\n}\n.Overview-readmeContent table {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\n.Overview-readmeContent td,\n.Overview-readmeContent th {\n  padding: 0;\n}\n.Overview-readmeContent details summary {\n  cursor: pointer;\n}\n.Overview-readmeContent kbd {\n  display: inline-block;\n  padding: 0.1875rem 0.3125rem;\n  font: 0.6875rem SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  line-height: 0.625rem;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-radius: 0.1875rem;\n  box-shadow: inset 0 -0.0625rem 0 var(--border);\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4,\n.Overview-readmeContent h5,\n.Overview-readmeContent h6,\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent h3 {\n  font-size: 2rem;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4 {\n  font-weight: 600;\n}\n.Overview-readmeContent h4 {\n  font-size: 1.5rem;\n}\n.Overview-readmeContent h5 {\n  font-size: 1.25rem;\n}\n.Overview-readmeContent h5,\n.Overview-readmeContent h6 {\n  font-weight: 600;\n}\n.Overview-readmeContent h6 {\n  font-size: 1rem;\n}\n.Overview-readmeContent div[aria-level='7'] {\n  font-size: 0.875rem;\n}\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  font-weight: 600;\n}\n.Overview-readmeContent div[aria-level='8'] {\n  font-size: 0.75rem;\n}\n.Overview-readmeContent p {\n  margin-top: 0;\n  margin-bottom: 0.625rem;\n}\n.Overview-readmeContent blockquote {\n  margin: 0;\n}\n.Overview-readmeContent ol,\n.Overview-readmeContent ul {\n  padding-left: 0;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent ol ol,\n.Overview-readmeContent ul ol {\n  list-style-type: lower-roman;\n}\n.Overview-readmeContent ol ol ol,\n.Overview-readmeContent ol ul ol,\n.Overview-readmeContent ul ol ol,\n.Overview-readmeContent ul ul ol {\n  list-style-type: lower-alpha;\n}\n.Overview-readmeContent dd {\n  margin-left: 0;\n}\n.Overview-readmeContent code,\n.Overview-readmeContent pre {\n  font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  font-size: 0.75rem;\n}\n.Overview-readmeContent pre {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent input::-webkit-inner-spin-button,\n.Overview-readmeContent input::-webkit-outer-spin-button {\n  margin: 0;\n  -webkit-appearance: none;\n  appearance: none;\n}\n.Overview-readmeContent :checked + .radio-label {\n  position: relative;\n  z-index: 1;\n  border-color: var(--color-brand-primary);\n}\n.Overview-readmeContent hr {\n  border-bottom-color: var(--color-border);\n}\n.Overview-readmeContent kbd {\n  display: inline-block;\n  padding: 0.1875rem 0.3125rem;\n  font: 0.6875rem SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  line-height: 0.625rem;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-radius: 0.1875rem;\n  box-shadow: inset 0 -0.0625rem 0 var(--color-border);\n}\n.Overview-readmeContent a:not([href]) {\n  color: inherit;\n  text-decoration: none;\n}\n.Overview-readmeContent blockquote,\n.Overview-readmeContent details,\n.Overview-readmeContent dl,\n.Overview-readmeContent ol,\n.Overview-readmeContent p,\n.Overview-readmeContent pre,\n.Overview-readmeContent table,\n.Overview-readmeContent ul {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n.Overview-readmeContent hr {\n  height: 0.25em;\n  padding: 0;\n  margin: 1.5rem 0;\n  background-color: var(--color-border);\n  border: 0;\n}\n.Overview-readmeContent blockquote {\n  padding: 0 1em;\n  color: var(--color-text-subtle);\n  border-left: 0.25em solid var(--color-border);\n}\n.Overview-readmeContent blockquote > :first-child {\n  margin-top: 0;\n}\n.Overview-readmeContent blockquote > :last-child {\n  margin-bottom: 0;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4,\n.Overview-readmeContent h5,\n.Overview-readmeContent h6,\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  margin-top: 1.5rem;\n  margin-bottom: 1rem;\n  font-weight: 600;\n  line-height: 1.25;\n}\n.Overview-readmeContent h3 {\n  font-size: 2em;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4 {\n  padding-bottom: 0.3em;\n  border-bottom: var(--border);\n}\n.Overview-readmeContent h4 {\n  font-size: 1.5em;\n}\n.Overview-readmeContent h5 {\n  font-size: 1.25em;\n}\n.Overview-readmeContent h6 {\n  font-size: 1em;\n}\n.Overview-readmeContent div[aria-level='7'] {\n  font-size: 0.875em;\n}\n.Overview-readmeContent div[aria-level='8'] {\n  font-size: 0.85em;\n  color: var(--color-text-subtle);\n}\n.Overview-readmeContent ol,\n.Overview-readmeContent ul {\n  padding-left: 2em;\n}\n.Overview-readmeContent ol ol,\n.Overview-readmeContent ol ul,\n.Overview-readmeContent ul ol,\n.Overview-readmeContent ul ul {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent li {\n  word-wrap: break-all;\n}\n.Overview-readmeContent li > p {\n  margin-top: 1rem;\n}\n.Overview-readmeContent li + li {\n  margin-top: 0.25em;\n}\n.Overview-readmeContent dl {\n  padding: 0;\n}\n.Overview-readmeContent dl dt {\n  padding: 0;\n  margin-top: 1rem;\n  font-size: 1em;\n  font-style: italic;\n  font-weight: 600;\n}\n.Overview-readmeContent dl dd {\n  padding: 0 1rem;\n  margin-bottom: 1rem;\n}\n.Overview-readmeContent table {\n  display: block;\n  width: 100%;\n  overflow: auto;\n}\n.Overview-readmeContent table th {\n  font-weight: 600;\n}\n.Overview-readmeContent table td,\n.Overview-readmeContent table th {\n  padding: 0.375rem 0.8125rem;\n  border: var(--border);\n}\n.Overview-readmeContent table tr {\n  background-color: var(--color-background);\n  border-top: var(--border);\n}\n.Overview-readmeContent table tr:nth-child(2n) {\n  background-color: var(--color-background-accented);\n}\n.Overview-readmeContent img {\n  max-width: 100%;\n  box-sizing: initial;\n  background-color: var(--color-background);\n}\n.Overview-readmeContent img[align='right'] {\n  padding-left: 1.25rem;\n}\n.Overview-readmeContent img[align='left'] {\n  padding-right: 1.25rem;\n}\n.Overview-readmeContent code {\n  padding: 0.2em 0.4em;\n  margin: 0;\n  font-size: 85%;\n  background-color: var(--color-background-accented);\n  border-radius: 0.1875rem;\n}\n.Overview-readmeContent pre {\n  word-wrap: normal;\n}\n.Overview-readmeContent pre > code {\n  padding: 0;\n  margin: 0;\n  font-size: 100%;\n  word-break: normal;\n  white-space: pre;\n  background: transparent;\n  border: 0;\n}\n.Overview-readmeContent pre {\n  padding: 1rem;\n  overflow: auto;\n  font-size: 85%;\n  line-height: 1.45;\n  background-color: var(--color-background-accented);\n  border-radius: 0.1875rem;\n}\n.Overview-readmeContent pre code {\n  display: inline;\n  max-width: auto;\n  padding: 0;\n  margin: 0;\n  overflow: visible;\n  line-height: inherit;\n  word-wrap: normal;\n  background-color: initial;\n  border: 0;\n}\n\n/* ---------- */\n/*\n/* End output from devtools/cmd/css/main.go\n/*\n/* ---------- */\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitReadme {\n  margin-bottom: 2rem;\n}\n\n.UnitReadme ul,\n.UnitReadme ol {\n  list-style: circle;\n}\n\n.UnitReadme h2 a.UnitReadme-idLink,\n.UnitReadme summary a {\n  opacity: 0;\n}\n\n.UnitReadme h2:hover a,\n.UnitReadme summary:focus a {\n  opacity: 1;\n}\n\n.UnitReadme-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  padding-bottom: 1rem;\n}\n\n.UnitReadme-title img {\n  margin: auto 1rem auto 0;\n}\n\n.UnitReadme-content {\n  /* stylelint-disable-next-line property-no-vendor-prefix */\n  -webkit-mask-image: linear-gradient(to bottom, black 75%, transparent 100%);\n  mask-image: linear-gradient(to bottom, black 75%, transparent 100%);\n  max-height: 20rem;\n  overflow: hidden;\n  position: relative;\n}\n\n.UnitReadme-content ul {\n  line-height: 1.5rem;\n}\n\n.UnitReadme-expandLink {\n  background: none;\n  border: none;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  padding: 0;\n}\n\n.UnitReadme-collapseLink {\n  background: none;\n  border: none;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  display: none;\n  padding: 0;\n}\n\n.UnitReadme--expanded .UnitReadme-content {\n  /* stylelint-disable-next-line property-no-vendor-prefix */\n  -webkit-mask-image: none;\n  mask-image: none;\n  max-height: initial;\n  overflow: initial;\n}\n\n.UnitReadme--toggle .UnitReadme-expandLink {\n  display: block;\n}\n\n.UnitReadme--expanded .UnitReadme-expandLink {\n  display: none;\n}\n\n.UnitReadme--expanded.UnitReadme--toggle .UnitReadme-collapseLink {\n  display: block;\n}\n\n.Overview-readmeContent {\n  overflow-wrap: break-word;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n@import url('./_build-context.css');\n@import url('./_directories.css');\n@import url('./_doc.css');\n@import url('./_files.css');\n@import url('./_meta.css');\n@import url('./_outline.css');\n@import url('./_readme_gen.css');\n@import url('./_readme.css');\n\n.UnitDetails {\n  column-gap: 2rem;\n  display: grid;\n  grid-template-columns: minmax(0, auto);\n  margin: auto;\n  min-height: 32rem;\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails {\n    grid-template-columns: 15.5rem minmax(30.5rem, 43.125rem) minmax(10rem, 15.5rem);\n  }\n}\n@media only screen and (min-width: 80rem) {\n  .UnitDetails {\n    grid-template-columns: 15.5rem minmax(43.125rem, 60rem) 15.5rem;\n    justify-content: center;\n  }\n}\n\n.UnitDetails :target {\n  scroll-margin-top: calc(var(--js-sticky-header-height, 3.5rem) * 2.15);\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails :target {\n    scroll-margin-top: calc(var(--js-sticky-header-height, 3.5rem) * 1.25);\n  }\n}\n\n.UnitDetails :target:not(details, h2) {\n  background-color: var(--color-background-highlighted);\n  padding: 0.25rem;\n}\n\n.UnitDetails-meta {\n  order: -1;\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails-meta {\n    display: block;\n    margin-top: 2rem;\n    order: initial;\n  }\n}\n\n.UnitDetails-contentEmpty {\n  align-items: center;\n  background-color: var(--color-background-accented);\n  color: var(--color-text-subtle);\n  display: flex;\n  flex-direction: column;\n  height: 15rem;\n  padding-top: 1rem;\n  text-align: center;\n}\n\n.UnitDetails-contentEmpty img {\n  height: 7.8125rem;\n  width: auto;\n}\n"],
+  "mappings": ";;;;;AAMA,qEAEE,+BACA,kBAGF,gCAZA,iBAgBA,sCACE,iCACA,+BACA,mBACA,eAGF,sCACE,+BAGF,uBACE,aAEF,0CACE,uBACE,iBAIJ,wCACE,kBAGF,uFAEE,eACA,kBACA,QCtCF,iBACE,mBAGF,wEAEE,UAGF,6DAEE,UAGF,uBACE,4BACA,mBAtBF,iBAwBE,oBAGF,2BA3BA,wBA+BA,uBACE,yBACA,SACA,kBACA,WAGF,6BACE,iBAGF,6BACE,kDAGF,mCACE,kBAGF,oBACE,4BACA,gBACA,gBArDF,oBAuDE,sBACA,sBAGF,oBA3DA,mBA6DE,gBAGF,2BACE,aAGF,mCACE,eAGF,yCACE,kDAGF,+CACE,YACA,kBA9EF,UAgFE,cAGF,6EAEE,mCACA,oBACA,kBAvFF,UAyFE,cAGF,8BACE,kBACA,aA9FF,oCAiGE,kBACA,mBAGF,2BACE,2BACA,eACA,qBACA,eAGF,sDACE,wBAGF,0BACE,uBACA,aACA,sBACA,oBACA,qBAGF,8BACE,kBAGF,8BACE,0BACA,aACA,sBACA,oBAhIF,mBAoIA,0BACE,aAGF,wDACE,kBAGF,gCACE,aACA,oBACA,kBACA,oBAEF,0CACE,gCACE,gBAGF,oHAEE,cAIJ,yBACE,kBAGF,+BACE,YACA,aACA,SACA,kBACA,QAGF,sCACE,6BACA,YACA,iCACA,eACA,aACA,kBACA,qBAGF,uBACE,+CApLF,sBAsLE,mBACA,gBACA,iBACA,kBACA,mBA1LF,iBA4LE,kBCrLF,SACE,mBACA,sBAGF,gDAEE,UAGF,6CAEE,UAGF,eACE,4BACA,oBAGF,mBA3BA,wBA+BA,sBACE,kDACA,+BACA,gBACA,kBACA,kBAGF,0BACE,iBACA,WAGF,uCA5CA,iBAgDA,2BACE,kBAGF,eACE,cAGF,iBAxDA,cA4DA,oCAEE,kBAGF,iBACE,qBAGF,uBACE,0BAGF,0GAIE,UAGF,uBACE,UAGF,yCACE,UAGF,4IAKE,UAGF,kBACE,mBACA,gBACA,eAGF,qBACE,iBAGF,yCACE,gBACA,mBACA,kBAGF,yCACE,mBACA,mBACA,kBAGF,uBACE,mBAGF,kDA1HA,4BA4HE,yBACA,aAGF,4BACE,gCAGF,wFAIE,iBAGF,qBACE,+BACA,kBAEF,0CACE,mBACE,iBACA,mBAGF,2BACE,WAIJ,yBACE,aAGF,uBACE,gBACA,uBAGF,wMAME,aAGF,sSAUE,oBAGF,0GAIE,qBACA,aACA,8BAGF,4BACE,+BACA,mBACA,gBAGF,kFAEE,aAGF,qBACE,+BACA,mBACA,iBAGF,+BACE,0EAEF,0CACE,+BACE,0EAIJ,sDACE,mBAGF,+BACE,kDACA,qBACA,mBAnOF,4BAqOE,cACA,iBACA,kBAvOF,gBAyOE,iBAGF,uCACE,mBACA,aACA,yBACA,iBAGF,iCACE,8BACA,oCACA,sBACA,eACA,cACA,cACA,eAGF,qGAGE,uCAhQF,qBAkQE,eACA,YACA,kBApQF,eAwQA,gCACE,kCACA,mBAGF,qEAEE,8BACA,uBAGF,8BACE,gBAGF,sCAvRA,8BAyRE,mBACA,mBAGF,2CACE,YACA,aACA,gBACA,YACA,gBACA,WAQF,6DACE,4BACA,6BA7SF,SAiTA,+DACE,yBACA,0BAnTF,iBAuTA,oCACE,iCACA,eACA,mBACA,aACA,qBAGF,kCACE,+BAGF,4BACE,kBACA,mBACA,oBAIF,sFAGE,qBACA,qBACA,qBAGF,+BACE,kBAGF,8BACE,+BACA,iBACA,gBACA,mBACA,mBAGF,6BACE,qCA/VF,sBAiWE,iCACA,iBACA,gBACA,kBApWF,uBAsWE,yBACA,sBAGF,+BACE,mBACA,aACA,UAGF,oEACE,+BAOF,uCACE,wBAGF,yCACE,iCAGF,qEACE,iCACA,eAGF,2EACE,iCACA,eAGF,yCACE,gBACA,UAGF,uDACE,UAGF,kCAnZA,wBAuZA,iCACE,mBACA,aACA,UACA,mBCrZF,WACE,mBAGF,qBACE,kBAGF,uBACE,YACA,kBACA,kBACA,QAGF,6BACE,kEACA,4BACA,gCACA,WACA,qBACA,YACA,cACA,kBACA,YACA,WAGF,sDAEE,UAGF,iDAEE,UAGF,iBACE,4BACA,mBA9CF,iBAgDE,oBAGF,qBAnDA,wBAuDA,oBACE,kBACA,mBACA,gBACA,gBACA,eACA,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",
   "names": []
 }
diff --git a/static/frontend/unit/main/main.ts b/static/frontend/unit/main/main.ts
index 8c11915..c750033 100644
--- a/static/frontend/unit/main/main.ts
+++ b/static/frontend/unit/main/main.ts
@@ -15,6 +15,25 @@
   if (window.location.search.includes('expand-directories')) {
     table.expandAllItems();
   }
+
+  const internalToggle = document.querySelector<HTMLButtonElement>('.js-showInternalDirectories');
+  if (internalToggle) {
+    if (document.querySelector('.UnitDirectories-internal')) {
+      internalToggle.style.display = 'block';
+    }
+    internalToggle.addEventListener('click', () => {
+      if (directories.classList.contains('UnitDirectories-showInternal')) {
+        directories.classList.remove('UnitDirectories-showInternal');
+        internalToggle.innerText = 'Show internal';
+      } else {
+        directories.classList.add('UnitDirectories-showInternal');
+        internalToggle.innerText = 'Hide internal';
+      }
+    });
+  }
+  if (document.querySelector('html[data-local="true"]')) {
+    internalToggle?.click();
+  }
 }
 
 const treeEl = document.querySelector<HTMLElement>('.js-tree');
diff --git a/tests/screentest/testdata/standard-library-540x1080.a.png b/tests/screentest/testdata/standard-library-540x1080.a.png
index 3e44c64..8e3b692 100644
--- a/tests/screentest/testdata/standard-library-540x1080.a.png
+++ b/tests/screentest/testdata/standard-library-540x1080.a.png
Binary files differ
diff --git a/tests/screentest/testdata/standard-library.a.png b/tests/screentest/testdata/standard-library.a.png
index 6de188c..4525d3c 100644
--- a/tests/screentest/testdata/standard-library.a.png
+++ b/tests/screentest/testdata/standard-library.a.png
Binary files differ
diff --git a/tests/screentest/testdata/x-tools-540x1080.a.png b/tests/screentest/testdata/x-tools-540x1080.a.png
index 44ace7d..c4e532a 100644
--- a/tests/screentest/testdata/x-tools-540x1080.a.png
+++ b/tests/screentest/testdata/x-tools-540x1080.a.png
Binary files differ
diff --git a/tests/screentest/testdata/x-tools.a.png b/tests/screentest/testdata/x-tools.a.png
index 4f80168..4928c03 100644
--- a/tests/screentest/testdata/x-tools.a.png
+++ b/tests/screentest/testdata/x-tools.a.png
Binary files differ