From 95888edba80b90c105dce26767b0678dd58c6d9a Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 16 Jan 2026 15:20:26 -0800 Subject: [PATCH 01/15] Add new decode response page --- public/assets/js/header.js | 2 + public/decoderesponse/index.html | 78 ++++++++++++++++++++++++++++++++ public/decoderesponse/script.js | 1 + public/sitemap.txt | 4 ++ public/sitemap.xml | 32 +++++++------ 5 files changed, 103 insertions(+), 14 deletions(-) create mode 100644 public/decoderesponse/index.html create mode 100644 public/decoderesponse/script.js create mode 100644 public/sitemap.txt diff --git a/public/assets/js/header.js b/public/assets/js/header.js index 2f2207e..fc16e83 100644 --- a/public/assets/js/header.js +++ b/public/assets/js/header.js @@ -5,6 +5,7 @@ function loadHeader(options) { const homePath = `${rootPath}/`; const featureDetectPath = `${basePath}/featuredetect/`; const relatedOriginsPath = `${basePath}/relatedorigins/`; + const decodeResponsePath = `${basePath}/decoderesponse/`; const currentPath = window.location.pathname; @@ -33,6 +34,7 @@ function loadHeader(options) { diff --git a/public/decoderesponse/index.html b/public/decoderesponse/index.html new file mode 100644 index 0000000..aead53a --- /dev/null +++ b/public/decoderesponse/index.html @@ -0,0 +1,78 @@ + + + + + + + WebAuthn Related Origin Requests Validator | Passkey Developer Tools + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

WebAuthn
Response Decoder

+

+ Get a human-readable view into WebAuthn registration and authentication + responses. +

+
+ +
+
+
+
+ +
+

+ Paste the JSON-ified output from + navigator.credentials.create() or + navigator.credentials.get() + below. + ArrayBuffer values should be encoded into base64url strings. +

+
+
+
+
+
+
+ + + + + + + + + diff --git a/public/decoderesponse/script.js b/public/decoderesponse/script.js new file mode 100644 index 0000000..e921523 --- /dev/null +++ b/public/decoderesponse/script.js @@ -0,0 +1 @@ +console.log('hello'); diff --git a/public/sitemap.txt b/public/sitemap.txt new file mode 100644 index 0000000..1411f7b --- /dev/null +++ b/public/sitemap.txt @@ -0,0 +1,4 @@ +https://tools.passkeys.dev/ +https://tools.passkeys.dev/decoderesponse +https://tools.passkeys.dev/featuredetect +https://tools.passkeys.dev/relatedorigins diff --git a/public/sitemap.xml b/public/sitemap.xml index 936bce1..9313d59 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -1,15 +1,19 @@ - + - - https://tools.passkeys.dev/ - 2026-01-14T23:00:14Z - - - https://tools.passkeys.dev/featuredetect/ - 2026-01-14T23:00:14Z - - - https://tools.passkeys.dev/relatedorigins/ - 2026-01-14T23:00:14Z - - \ No newline at end of file + + https://tools.passkeys.dev/ + 2026-01-16T01:25:49.339Z + + + https://tools.passkeys.dev/decoderesponse + 2026-01-16T23:20:49.870Z + + + https://tools.passkeys.dev/featuredetect + 2026-01-16T01:25:49.338Z + + + https://tools.passkeys.dev/relatedorigins + 2026-01-16T01:25:49.339Z + + From f8a57b684495850611fd10b3d2c9baead8f8f5d7 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 16 Jan 2026 16:05:58 -0800 Subject: [PATCH 02/15] Vendor the CodeFlask package --- public/assets/js/codeflask.1.4.1.min.js | 1 + public/decoderesponse/index.html | 2 +- public/relatedorigins/index.html | 2 +- public/sitemap.xml | 4 ++-- 4 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 public/assets/js/codeflask.1.4.1.min.js diff --git a/public/assets/js/codeflask.1.4.1.min.js b/public/assets/js/codeflask.1.4.1.min.js new file mode 100644 index 0000000..d186f85 --- /dev/null +++ b/public/assets/js/codeflask.1.4.1.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.CodeFlask=t()}(this,function(){"use strict";var e,t,n,a='"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace',s="\n .codeflask {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n\n .codeflask, .codeflask * {\n box-sizing: border-box;\n }\n\n .codeflask__pre {\n pointer-events: none;\n z-index: 3;\n overflow: hidden;\n }\n\n .codeflask__textarea {\n background: none;\n border: none;\n color: "+(e="caret-color",t="#000",("undefined"!=typeof CSS?CSS.supports(e,t):"undefined"!=typeof document&&(n=(n=e).split("-").filter(function(e){return!!e}).map(function(e){return e[0].toUpperCase()+e.substr(1)}).join(""))[0].toLowerCase()+n.substr(1)in document.body.style)?"#fff":"#ccc")+";\n z-index: 1;\n resize: none;\n font-family: "+a+";\n -webkit-appearance: pre;\n caret-color: #111;\n z-index: 2;\n width: 100%;\n height: 100%;\n }\n\n .codeflask--has-line-numbers .codeflask__textarea {\n width: calc(100% - 40px);\n }\n\n .codeflask__code {\n display: block;\n font-family: "+a+";\n overflow: hidden;\n }\n\n .codeflask__flatten {\n padding: 10px;\n font-size: 13px;\n line-height: 20px;\n white-space: pre;\n position: absolute;\n top: 0;\n left: 0;\n overflow: auto;\n margin: 0 !important;\n outline: none;\n text-align: left;\n }\n\n .codeflask--has-line-numbers .codeflask__flatten {\n width: calc(100% - 40px);\n left: 40px;\n }\n\n .codeflask__line-highlight {\n position: absolute;\n top: 10px;\n left: 0;\n width: 100%;\n height: 20px;\n background: rgba(0,0,0,0.1);\n z-index: 1;\n }\n\n .codeflask__lines {\n padding: 10px 4px;\n font-size: 12px;\n line-height: 20px;\n font-family: 'Cousine', monospace;\n position: absolute;\n left: 0;\n top: 0;\n width: 40px;\n height: 100%;\n text-align: right;\n color: #999;\n z-index: 2;\n }\n\n .codeflask__lines__line {\n display: block;\n }\n\n .codeflask.codeflask--has-line-numbers {\n padding-left: 40px;\n }\n\n .codeflask.codeflask--has-line-numbers:before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n width: 40px;\n height: 100%;\n background: #eee;\n z-index: 1;\n }\n";function i(e,t,n){var a=t||"codeflask-style",s=n||document.head;if(!e)return!1;if(document.getElementById(a))return!0;var i=document.createElement("style");return i.innerHTML=e,i.id=a,s.appendChild(i),!0}var r={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};function o(e){return String(e).replace(/[&<>"'`=/]/g,function(e){return r[e]})}var l="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};var c,u=(function(e){var t=function(e){var t=/\blang(?:uage)?-([\w-]+)\b/i,n=0,a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof s?new s(e.type,a.util.encode(e.content),e.alias):Array.isArray(e)?e.map(a.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(v instanceof s)){if(f&&k!=t.length-1){if(p.lastIndex=x,!(S=p.exec(e)))break;for(var w=S.index+(g?S[1].length:0),F=S.index+S[0].length,A=k,C=x,T=t.length;A=(C+=t[A].length)&&(++k,x=C);if(t[k]instanceof s)continue;_=A-k,v=e.slice(x,C),S.index-=x}else{p.lastIndex=0;var S=p.exec(v),_=1}if(S){g&&(b=S[1]?S[1].length:0);F=(w=S.index+b)+(S=S[0].slice(b)).length;var L=v.slice(0,w),E=v.slice(F),N=[k,_];L&&(++k,x+=L.length,N.push(L));var j=new s(c,h?a.tokenize(S,h):S,m,S,f);if(N.push(j),E&&N.push(E),Array.prototype.splice.apply(t,N),1!=_&&a.matchGrammar(e,t,n,k,x,!0,c),o)break}else if(o)break}}}}},tokenize:function(e,t){var n=[e],s=t.rest;if(s){for(var i in s)t[i]=s[i];delete t.rest}return a.matchGrammar(e,n,t,0,0,!1),n},hooks:{all:{},add:function(e,t){var n=a.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=a.hooks.all[e];if(n&&n.length)for(var s,i=0;s=n[i++];)s(t)}},Token:s};function s(e,t,n,a,s){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length,this.greedy=!!s}if(e.Prism=a,s.stringify=function(e,t,n){if("string"==typeof e)return e;if(Array.isArray(e))return e.map(function(n){return s.stringify(n,t,e)}).join("");var i={type:e.type,content:s.stringify(e.content,t,n),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:n};if(e.alias){var r=Array.isArray(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(i.classes,r)}a.hooks.run("wrap",i);var o=Object.keys(i.attributes).map(function(e){return e+'="'+(i.attributes[e]||"").replace(/"/g,""")+'"'}).join(" ");return"<"+i.tag+' class="'+i.classes.join(" ")+'"'+(o?" "+o:"")+">"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",function(t){var n=JSON.parse(t.data),s=n.language,i=n.code,r=n.immediateClose;e.postMessage(a.highlight(i,a.languages[s],s)),r&&e.close()},!1),a):a;var i=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return i&&(a.filename=i.src,a.manual||i.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(a.highlightAll):window.setTimeout(a.highlightAll,16):document.addEventListener("DOMContentLoaded",a.highlightAll))),a}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});e.exports&&(e.exports=t),void 0!==l&&(l.Prism=t),t.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},t.languages.markup.tag.inside["attr-value"].inside.entity=t.languages.markup.entity,t.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(t.languages.markup.tag,"addInlined",{value:function(e,n){var a={};a["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:t.languages[n]},a.cdata=/^$/i;var s={"included-cdata":{pattern://i,inside:a}};s["language-"+n]={pattern:/[\s\S]+/,inside:t.languages[n]};var i={};i[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g,e),"i"),lookbehind:!0,greedy:!0,inside:s},t.languages.insertBefore("markup","cdata",i)}}),t.languages.xml=t.languages.extend("markup",{}),t.languages.html=t.languages.markup,t.languages.mathml=t.languages.markup,t.languages.svg=t.languages.markup,function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?[\s\S]*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:RegExp("url\\((?:"+t.source+"|.*?)\\)","i"),selector:RegExp("[^{}\\s](?:[^{};\"']|"+t.source+")*?(?=\\s*\\{)"),string:{pattern:t,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:n.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},n.tag))}(t),t.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},t.languages.javascript=t.languages.extend("clike",{"class-name":[t.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.])\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+)n?|\d+n|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,function:/[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),t.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,t.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:t.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:t.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:t.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:t.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),t.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\${[^}]+}/,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:t.languages.javascript}},string:/[\s\S]+/}}}),t.languages.markup&&t.languages.markup.tag.addInlined("script","javascript"),t.languages.js=t.languages.javascript,"undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector&&(self.Prism.fileHighlight=function(e){e=e||document;var n={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"};Array.prototype.slice.call(e.querySelectorAll("pre[data-src]")).forEach(function(e){if(!e.hasAttribute("data-src-loaded")){for(var a,s=e.getAttribute("data-src"),i=e,r=/\blang(?:uage)?-([\w-]+)\b/i;i&&!r.test(i.className);)i=i.parentNode;if(i&&(a=(e.className.match(r)||[,""])[1]),!a){var o=(s.match(/\.(\w+)$/)||[,""])[1];a=n[o]||o}var l=document.createElement("code");l.className="language-"+a,e.textContent="",l.textContent="Loading…",e.appendChild(l);var c=new XMLHttpRequest;c.open("GET",s,!0),c.onreadystatechange=function(){4==c.readyState&&(c.status<400&&c.responseText?(l.textContent=c.responseText,t.highlightElement(l),e.setAttribute("data-src-loaded","")):c.status>=400?l.textContent="✖ Error "+c.status+" while fetching file: "+c.statusText:l.textContent="✖ Error: File does not exist or is empty")},c.send(null)}}),t.plugins.toolbar&&t.plugins.toolbar.registerButton("download-file",function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-src")&&t.hasAttribute("data-download-link")){var n=t.getAttribute("data-src"),a=document.createElement("a");return a.textContent=t.getAttribute("data-download-link-label")||"Download",a.setAttribute("download",""),a.href=n,a}})},document.addEventListener("DOMContentLoaded",function(){self.Prism.fileHighlight()}))}(c={exports:{}},c.exports),c.exports),d=function(e,t){if(!e)throw Error("CodeFlask expects a parameter which is Element or a String selector");if(!t)throw Error("CodeFlask expects an object containing options as second parameter");if(e.nodeType)this.editorRoot=e;else{var n=document.querySelector(e);n&&(this.editorRoot=n)}this.opts=t,this.startEditor()};return d.prototype.startEditor=function(){if(!i(s,null,this.opts.styleParent))throw Error("Failed to inject CodeFlask CSS.");this.createWrapper(),this.createTextarea(),this.createPre(),this.createCode(),this.runOptions(),this.listenTextarea(),this.populateDefault(),this.updateCode(this.code)},d.prototype.createWrapper=function(){this.code=this.editorRoot.innerHTML,this.editorRoot.innerHTML="",this.elWrapper=this.createElement("div",this.editorRoot),this.elWrapper.classList.add("codeflask")},d.prototype.createTextarea=function(){this.elTextarea=this.createElement("textarea",this.elWrapper),this.elTextarea.classList.add("codeflask__textarea","codeflask__flatten")},d.prototype.createPre=function(){this.elPre=this.createElement("pre",this.elWrapper),this.elPre.classList.add("codeflask__pre","codeflask__flatten")},d.prototype.createCode=function(){this.elCode=this.createElement("code",this.elPre),this.elCode.classList.add("codeflask__code","language-"+(this.opts.language||"html"))},d.prototype.createLineNumbers=function(){this.elLineNumbers=this.createElement("div",this.elWrapper),this.elLineNumbers.classList.add("codeflask__lines"),this.setLineNumber()},d.prototype.createElement=function(e,t){var n=document.createElement(e);return t.appendChild(n),n},d.prototype.runOptions=function(){this.opts.rtl=this.opts.rtl||!1,this.opts.tabSize=this.opts.tabSize||2,this.opts.enableAutocorrect=this.opts.enableAutocorrect||!1,this.opts.lineNumbers=this.opts.lineNumbers||!1,this.opts.defaultTheme=!1!==this.opts.defaultTheme,this.opts.areaId=this.opts.areaId||null,this.opts.ariaLabelledby=this.opts.ariaLabelledby||null,this.opts.readonly=this.opts.readonly||null,"boolean"!=typeof this.opts.handleTabs&&(this.opts.handleTabs=!0),"boolean"!=typeof this.opts.handleSelfClosingCharacters&&(this.opts.handleSelfClosingCharacters=!0),"boolean"!=typeof this.opts.handleNewLineIndentation&&(this.opts.handleNewLineIndentation=!0),!0===this.opts.rtl&&(this.elTextarea.setAttribute("dir","rtl"),this.elPre.setAttribute("dir","rtl")),!1===this.opts.enableAutocorrect&&(this.elTextarea.setAttribute("spellcheck","false"),this.elTextarea.setAttribute("autocapitalize","off"),this.elTextarea.setAttribute("autocomplete","off"),this.elTextarea.setAttribute("autocorrect","off")),this.opts.lineNumbers&&(this.elWrapper.classList.add("codeflask--has-line-numbers"),this.createLineNumbers()),this.opts.defaultTheme&&i("\n.codeflask {\n background: #fff;\n color: #4f559c;\n}\n\n.codeflask .token.punctuation {\n color: #4a4a4a;\n}\n\n.codeflask .token.keyword {\n color: #8500ff;\n}\n\n.codeflask .token.operator {\n color: #ff5598;\n}\n\n.codeflask .token.string {\n color: #41ad8f;\n}\n\n.codeflask .token.comment {\n color: #9badb7;\n}\n\n.codeflask .token.function {\n color: #8500ff;\n}\n\n.codeflask .token.boolean {\n color: #8500ff;\n}\n\n.codeflask .token.number {\n color: #8500ff;\n}\n\n.codeflask .token.selector {\n color: #8500ff;\n}\n\n.codeflask .token.property {\n color: #8500ff;\n}\n\n.codeflask .token.tag {\n color: #8500ff;\n}\n\n.codeflask .token.attr-value {\n color: #8500ff;\n}\n","theme-default",this.opts.styleParent),this.opts.areaId&&this.elTextarea.setAttribute("id",this.opts.areaId),this.opts.ariaLabelledby&&this.elTextarea.setAttribute("aria-labelledby",this.opts.ariaLabelledby),this.opts.readonly&&this.enableReadonlyMode()},d.prototype.updateLineNumbersCount=function(){for(var e="",t=1;t<=this.lineNumber;t++)e=e+''+t+"";this.elLineNumbers.innerHTML=e},d.prototype.listenTextarea=function(){var e=this;this.elTextarea.addEventListener("input",function(t){e.code=t.target.value,e.elCode.innerHTML=o(t.target.value),e.highlight(),setTimeout(function(){e.runUpdate(),e.setLineNumber()},1)}),this.elTextarea.addEventListener("keydown",function(t){e.handleTabs(t),e.handleSelfClosingCharacters(t),e.handleNewLineIndentation(t)}),this.elTextarea.addEventListener("scroll",function(t){e.elPre.style.transform="translate3d(-"+t.target.scrollLeft+"px, -"+t.target.scrollTop+"px, 0)",e.elLineNumbers&&(e.elLineNumbers.style.transform="translate3d(0, -"+t.target.scrollTop+"px, 0)")})},d.prototype.handleTabs=function(e){if(this.opts.handleTabs){if(9!==e.keyCode)return;e.preventDefault();var t=this.elTextarea,n=t.selectionDirection,a=t.selectionStart,s=t.selectionEnd,i=t.value,r=i.substr(0,a),o=i.substring(a,s),l=i.substring(s),c=" ".repeat(this.opts.tabSize);if(a!==s&&o.length>=c.length){var u=a-r.split("\n").pop().length,d=c.length,p=c.length;if(e.shiftKey)i.substr(u,c.length)===c?(d=-d,u>a?(o=o.substring(0,u)+o.substring(u+c.length),p=0):u===a?(d=0,p=0,o=o.substring(c.length)):(p=-p,r=r.substring(0,u)+r.substring(u+c.length))):(d=0,p=0),o=o.replace(new RegExp("\n"+c.split("").join("\\"),"g"),"\n");else r=r.substr(0,u)+c+r.substring(u,a),o=o.replace(/\n/g,"\n"+c);t.value=r+o+l,t.selectionStart=a+d,t.selectionEnd=a+o.length+p,t.selectionDirection=n}else t.value=r+c+l,t.selectionStart=a+c.length,t.selectionEnd=a+c.length;var h=t.value;this.updateCode(h),this.elTextarea.selectionEnd=s+this.opts.tabSize}},d.prototype.handleSelfClosingCharacters=function(e){if(this.opts.handleSelfClosingCharacters){var t=e.key;if(["(","[","{","<","'",'"'].includes(t)||[")","]","}",">","'",'"'].includes(t))switch(t){case"(":case")":this.closeCharacter(t);break;case"[":case"]":this.closeCharacter(t);break;case"{":case"}":this.closeCharacter(t);break;case"<":case">":case"'":case'"':this.closeCharacter(t)}}},d.prototype.setLineNumber=function(){this.lineNumber=this.code.split("\n").length,this.opts.lineNumbers&&this.updateLineNumbersCount()},d.prototype.handleNewLineIndentation=function(e){if(this.opts.handleNewLineIndentation&&13===e.keyCode){e.preventDefault();var t=this.elTextarea,n=t.selectionStart,a=t.selectionEnd,s=t.value,i=s.substr(0,n),r=s.substring(a),o=s.lastIndexOf("\n",n-1),l=o+s.slice(o+1).search(/[^ ]|$/),c=l>o?l-o:0,u=i+"\n"+" ".repeat(c)+r;t.value=u,t.selectionStart=n+c+1,t.selectionEnd=n+c+1,this.updateCode(t.value)}},d.prototype.closeCharacter=function(e){var t=this.elTextarea.selectionStart,n=this.elTextarea.selectionEnd;if(this.skipCloseChar(e)){var a=this.code.substr(n,1)===e,s=a?n+1:n,i=!a&&["'",'"'].includes(e)?e:"",r=""+this.code.substring(0,t)+i+this.code.substring(s);this.updateCode(r),this.elTextarea.selectionEnd=++this.elTextarea.selectionStart}else{var o=e;switch(e){case"(":o=String.fromCharCode(e.charCodeAt()+1);break;case"<":case"{":case"[":o=String.fromCharCode(e.charCodeAt()+2)}var l=this.code.substring(t,n),c=""+this.code.substring(0,t)+l+o+this.code.substring(n);this.updateCode(c)}this.elTextarea.selectionEnd=t},d.prototype.skipCloseChar=function(e){var t=this.elTextarea.selectionStart,n=this.elTextarea.selectionEnd,a=Math.abs(n-t)>0;return[")","}","]",">"].includes(e)||["'",'"'].includes(e)&&!a},d.prototype.updateCode=function(e){this.code=e,this.elTextarea.value=e,this.elCode.innerHTML=o(e),this.highlight(),this.setLineNumber(),setTimeout(this.runUpdate.bind(this),1)},d.prototype.updateLanguage=function(e){var t=this.opts.language;this.elCode.classList.remove("language-"+t),this.elCode.classList.add("language-"+e),this.opts.language=e,this.highlight()},d.prototype.addLanguage=function(e,t){u.languages[e]=t},d.prototype.populateDefault=function(){this.updateCode(this.code)},d.prototype.highlight=function(){u.highlightElement(this.elCode,!1)},d.prototype.onUpdate=function(e){if(e&&"[object Function]"!=={}.toString.call(e))throw Error("CodeFlask expects callback of type Function");this.updateCallBack=e},d.prototype.getCode=function(){return this.code},d.prototype.runUpdate=function(){this.updateCallBack&&this.updateCallBack(this.code)},d.prototype.enableReadonlyMode=function(){this.elTextarea.setAttribute("readonly",!0)},d.prototype.disableReadonlyMode=function(){this.elTextarea.removeAttribute("readonly")},d}); diff --git a/public/decoderesponse/index.html b/public/decoderesponse/index.html index aead53a..1ad9f25 100644 --- a/public/decoderesponse/index.html +++ b/public/decoderesponse/index.html @@ -30,7 +30,6 @@ - @@ -68,6 +67,7 @@

WebAuthn
Response Decoder

+ diff --git a/public/relatedorigins/index.html b/public/relatedorigins/index.html index 3331ea6..1236142 100644 --- a/public/relatedorigins/index.html +++ b/public/relatedorigins/index.html @@ -30,7 +30,7 @@ - + diff --git a/public/sitemap.xml b/public/sitemap.xml index 9313d59..90d9de4 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -6,7 +6,7 @@ https://tools.passkeys.dev/decoderesponse - 2026-01-16T23:20:49.870Z + 2026-01-17T00:03:39.410Z https://tools.passkeys.dev/featuredetect @@ -14,6 +14,6 @@ https://tools.passkeys.dev/relatedorigins - 2026-01-16T01:25:49.339Z + 2026-01-17T00:06:48.047Z From cca882d48875dc93f18f520fb794d75d2d1f70aa Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 16 Jan 2026 16:17:03 -0800 Subject: [PATCH 03/15] Make log() into a common utility --- public/assets/js/common.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 public/assets/js/common.js diff --git a/public/assets/js/common.js b/public/assets/js/common.js new file mode 100644 index 0000000..521123f --- /dev/null +++ b/public/assets/js/common.js @@ -0,0 +1,34 @@ +/** + * Output an error message + * + * @param {{ + * outputElem: HTMLDivElement, + * message: string, + * type: ("info"|"warn"|"error"|"success"), + * overwrite: boolean, + * }} opts opts: + * - `outputElem` - Where to visually display the log message + * - `message` - The log message being captured + * - `type` - The level of the log message. Defaults to `"info"` + * - `overwrite` - Replace all existing log messages in outputElem. Defaults to `false` + */ +export function log(opts) { + const { outputElem, message, type = "info", overwrite = false } = opts; + + const line = document.createElement('div'); + let colorClass = "text-body"; + if (type === "warn") colorClass = "text-warning"; + if (type === "error") colorClass = "text-danger"; + if (type === "success") colorClass = "text-success"; + + line.className = `mb-1 ${colorClass}`; + line.innerText = message; + + if (overwrite) { + outputElem.replaceChildren(line); + } else { + outputElem.appendChild(line); + } + + console.log(`[${type}] ${message}`); +} From fbcc18bd8144b6e41e61ebb6641c6b9c6f7ec82a Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 16 Jan 2026 16:17:12 -0800 Subject: [PATCH 04/15] Add initial interactivity --- public/decoderesponse/index.html | 13 ++++++-- public/decoderesponse/script.js | 55 +++++++++++++++++++++++++++++++- public/sitemap.xml | 2 +- 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/public/decoderesponse/index.html b/public/decoderesponse/index.html index 1ad9f25..8b2b5ec 100644 --- a/public/decoderesponse/index.html +++ b/public/decoderesponse/index.html @@ -60,7 +60,16 @@

WebAuthn
Response Decoder

below. ArrayBuffer values should be encoded into base64url strings.

-
+ + +
+ + +
+
@@ -69,7 +78,7 @@

WebAuthn
Response Decoder

- + diff --git a/public/decoderesponse/script.js b/public/decoderesponse/script.js index e921523..0803d04 100644 --- a/public/decoderesponse/script.js +++ b/public/decoderesponse/script.js @@ -1 +1,54 @@ -console.log('hello'); +import { log } from '../assets/js/common.js'; + +// Create an instance of our fancy text editor +const flask = new CodeFlask("#jsonEditor", { language: "json", lineNumbers: false}); +const flaskTextarea = document.querySelector("#jsonEditor textarea"); +const logOutputElem = document.querySelector('#logOutput'); + +// Set a placeholder to help communicate the shape of the JSON that should be pasted in +flaskTextarea.placeholder = `{ + "id": "...", + "rawId": "...", + "response": { + ... + }, + "type": "public-key" +}`; + +// Attempt to parse whatever was just pasted in +flask.onUpdate((code) => { + // Clear the debug output + logOutputElem.classList.add('d-none'); + + // Try to parse the code + try { + decodeResponse(code); + } catch (err) { + // Don't show an error if nothing's been pasted in + if (code.length > 0) { + logError("This JSON couldn't be parsed, is it valid?"); + } + } +}); + +/** + * @param {string} code The WebAuthn response being parsed + * @returns void +*/ +function decodeResponse(code) { + console.log(JSON.parse(code, null, 2)); +} + +/** + * + * @param {string} message + */ +function logError(message) { + logOutputElem.classList.remove('d-none'); + log({ + outputElem: logOutputElem, + message, + type: 'error', + overwrite: true, + }); +} diff --git a/public/sitemap.xml b/public/sitemap.xml index 90d9de4..8d14cff 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -6,7 +6,7 @@ https://tools.passkeys.dev/decoderesponse - 2026-01-17T00:03:39.410Z + 2026-01-17T00:07:09.743Z https://tools.passkeys.dev/featuredetect From e0e6e199cf5021fbb45094dce51fc3f82f9147d2 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 16 Jan 2026 17:33:03 -0800 Subject: [PATCH 05/15] Add some helpers --- public/assets/js/tiny-cbor.0.3.2.esm.min.js | 8 ++++++++ public/assets/js/tiny-encodings.0.2.11.esm.min.js | 8 ++++++++ public/decoderesponse/index.html | 8 ++++++++ public/sitemap.xml | 2 +- 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 public/assets/js/tiny-cbor.0.3.2.esm.min.js create mode 100644 public/assets/js/tiny-encodings.0.2.11.esm.min.js diff --git a/public/assets/js/tiny-cbor.0.3.2.esm.min.js b/public/assets/js/tiny-cbor.0.3.2.esm.min.js new file mode 100644 index 0000000..25d5ebf --- /dev/null +++ b/public/assets/js/tiny-cbor.0.3.2.esm.min.js @@ -0,0 +1,8 @@ +/** + * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0. + * Original file: /npm/@levischuck/tiny-cbor@0.3.2/esm/index.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +function e(e,t,r){if(t<24)return[t,1];const n=e.byteLength-r-1,o=new DataView(e.buffer,r+1);let i,u=0;switch(t){case 24:n>0&&(i=o.getUint8(0),u=2);break;case 25:n>1&&(i=o.getUint16(0,!1),u=3);break;case 26:n>3&&(i=o.getUint32(0,!1),u=5);break;case 27:if(n>7){const e=o.getBigUint64(0,!1);return e>=24n&&e<=Number.MAX_SAFE_INTEGER?[Number(e),9]:[e,9]}}if(i&&i>=24)return[i,u];throw new Error("Length not supported or not well formed")}function t(e,t){const r=e<<5;if(t<0)throw new Error("CBOR Data Item argument must not be negative");let n;if("number"==typeof t){if(!Number.isInteger(t))throw new Error("CBOR Data Item argument must be an integer");n=BigInt(t)}else n=t;if(1==e){if(0n==n)throw new Error("CBOR Data Item argument cannot be zero when negative");n-=1n}if(n>18446744073709551615n)throw new Error("CBOR number out of range");const o=new Uint8Array(8);return new DataView(o.buffer).setBigUint64(0,n,!1),n<=23?[r|o[7]]:n<=255?[24|r,o[7]]:n<=65535?[25|r,...o.slice(6)]:n<=4294967295?[26|r,...o.slice(4)]:[27|r,...o]}class r{constructor(e,t){Object.defineProperty(this,"tagId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tagValue",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.tagId=e,this.tagValue=t}get tag(){return this.tagId}get value(){return this.tagValue}}function n(t,r,n){return e(t,r,n)}function o(t,r,n){const[o,i]=e(t,r,n);if("bigint"==typeof o)throw new Error("ByteString length is too large");const u=n+i;return[new Uint8Array(t.buffer.slice(u,u+o)),i+o]}const i=new TextDecoder;const u="Map is not supported or well formed";function a(t,f){if(f>=t.byteLength)throw new Error("CBOR stream ended before tag value");const s=t.getUint8(f),c=31&s;switch(s>>5){case 0:return n(t,c,f);case 1:return function(e,t,r){const[o,i]=n(e,t,r);return"bigint"==typeof o?[-o-1n,i]:[-o-1,i]}(t,c,f);case 2:return o(t,c,f);case 3:return function(e,t,r){const[n,u]=o(e,t,r);return[i.decode(n),u]}(t,c,f);case 4:return function(t,r,n){if(0===r)return[[],1];const[o,i]=e(t,r,n);let u=i;const f=[];for(let e=0;ee.byteLength)throw new Error("CBOR stream ended before end of Float 16");const r=e.getUint16(t+1,!1);if(31744==r)return[1/0,3];if(32256==r)return[NaN,3];if(64512==r)return[-1/0,3];throw new Error("Float16 data is unsupported")}(t,f);case 26:return function(e,t){if(t+5>e.byteLength)throw new Error("CBOR stream ended before end of Float 32");return[e.getFloat32(t+1,!1),5]}(t,f);case 27:return function(e,t){if(t+9>e.byteLength)throw new Error("CBOR stream ended before end of Float 64");return[e.getFloat64(t+1,!1),9]}(t,f)}}throw new Error(`Unsupported or not well formed at ${f}`)}function f(e){if(Math.fround(e)==e||!Number.isFinite(e)||Number.isNaN(e)){const t=new Uint8Array(5);t[0]=250;return new DataView(t.buffer).setFloat32(1,e,!1),t}{const t=new Uint8Array(9);t[0]=251;return new DataView(t.buffer).setFloat64(1,e,!1),t}}const s=new TextEncoder;function c(e,n){if("boolean"!=typeof e&&null!==e&&null!=e)if("number"!=typeof e&&"bigint"!=typeof e)if("string"!=typeof e)if(e instanceof Uint8Array)!function(e,r){r.push(...t(2,e.length)),r.push(e)}(e,n);else if(Array.isArray(e))!function(e,r){r.push(...t(4,e.length));for(const t of e)c(t,r)}(e,n);else if(e instanceof Map)!function(e,r){r.push(new Uint8Array(t(5,e.size)));for(const[t,n]of e.entries())c(t,r),c(n,r)}(e,n);else{if(!(e instanceof r))throw new Error("Not implemented");!function(e,r){r.push(...t(6,e.tag)),c(e.value,r)}(e,n)}else!function(e,r){r.push(...t(3,e.length)),r.push(s.encode(e))}(e,n);else n.push(...function(e){return"number"==typeof e?Number.isSafeInteger(e)?e<0?t(1,Math.abs(e)):t(0,e):[f(e)]:e<0n?t(1,-1n*e):t(0,e)}(e));else n.push(function(e){return!0===e?245:!1===e?244:null===e?246:247}(e))}function w(e,t){if(0===e.byteLength||e.byteLength<=t||t<0)throw new Error("No data");const r=Object.getPrototypeOf(e),n=r===ArrayBuffer.prototype,o="undefined"!=typeof SharedArrayBuffer&&r===SharedArrayBuffer.prototype;if(r.constructor===Uint8Array.prototype.constructor)return a(new DataView(e.buffer),t);if(n||o)return a(new DataView(e),t);if(r===DataView.prototype)return a(e,t);throw new Error("Unsupported data type")}function l(e){const[t,r]=w(e,0);if(r!==e.byteLength)throw new Error(`Data was decoded, but the whole stream was not processed ${r} != ${e.byteLength}`);return t}function h(e){const t=[];c(e,t);let r=0;for(const e of t)r+="number"==typeof e?1:e.length;const n=new Uint8Array(r);let o=0;for(const e of t)"number"==typeof e?(n[o]=e,o+=1):(n.set(e,o),o+=e.length);return n}export{r as CBORTag,l as decodeCBOR,w as decodePartialCBOR,h as encodeCBOR};export default null; +//# sourceMappingURL=/sm/73b220a02cb5403327504918d39b24b8221ae9e78c006bcf2db82b1f8314a9bd.map \ No newline at end of file diff --git a/public/assets/js/tiny-encodings.0.2.11.esm.min.js b/public/assets/js/tiny-encodings.0.2.11.esm.min.js new file mode 100644 index 0000000..1df9fce --- /dev/null +++ b/public/assets/js/tiny-encodings.0.2.11.esm.min.js @@ -0,0 +1,8 @@ +/** + * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0. + * Original file: /npm/@levischuck/tiny-encodings@0.2.11/esm/index.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +function t(t){if(t instanceof DataView)return t;if(t instanceof Uint8Array||t instanceof Int8Array||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Uint8ClampedArray||t instanceof Float32Array||t instanceof Float64Array||t instanceof BigInt64Array||t instanceof BigUint64Array)return new DataView(t.buffer);if(t instanceof ArrayBuffer)return new DataView(t);throw new Error("Unsupported type")}const n=new TextDecoder,e=new TextEncoder,r=e.encode("0123456789ABCDEF"),i=new Uint8Array(256);function o(t){if(0==t.byteLength)return"";const e=t.byteLength,i=new Uint8Array(2*t.byteLength);for(let n=0,o=0;n>4],i[o+1]=r[15&e]}return n.decode(i)}function a(t){if(t instanceof Uint8Array||t instanceof Int8Array||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Uint8ClampedArray||t instanceof Float32Array||t instanceof Float64Array||t instanceof BigInt64Array||t instanceof BigUint64Array)return o(new DataView(t.buffer));if(t instanceof ArrayBuffer)return o(new DataView(t));if(t instanceof DataView)return o(t);throw new Error("Bad input to encodeHex")}const f="Bad input to decodeHex";function c(t){if(""==t)return new Uint8Array;const n=e.encode(t);let r=0,o=!1;if(1&n.length)throw new Error(f);if(0==i[0])for(let t=0;t<256;t++)i[t]=t>=48&&t<=57?t-48:t>=65&&t<=70?t-55:t>=97&&t<=102?t-87:255;const a=new Uint8Array(Math.ceil(t.length/2));for(let t=0;t>2],s[y+1]=r[(3&n)<<4|(240&e)>>4],s[y+2]=r[(15&e)<<2|(192&i)>>6],s[y+3]=r[63&i],y+=4}if(1==c){const t=o.getUint8(f);s[y]=r[(252&t)>>2],s[y+1]=r[(3&t)<<4],i&&(s[y+2]=61,s[y+3]=61)}else if(2==c){const t=o.getUint8(f),n=o.getUint8(f+1);s[y]=r[(252&t)>>2],s[y+1]=r[(3&t)<<4|(240&n)>>4],s[y+2]=r[(15&n)<<2],i&&(s[y+3]=61)}return n.decode(s)}function h(t){return A(t,y,!0)}function U(t){return A(t,g,!1)}function b(t,e,r,i,o){let a=0,f=null;const c=e-r;for(let n=0;n>4,i[a+1]=(15&r)<<4|(60&c)>>2,i[a+2]=(3&c)<<6|s,255==e||255==r||255==c||255==s){f=n;break}}if(null!=f)throw new Error("Unsupported characters in base64: "+n.decode(new Uint8Array([t[f],t[f+1],t[f+2],t[f+3]])));if(2==r){const r=t[e-2],f=t[e-1],c=o[r],s=o[f];if(255==(c|s))throw new Error("Unsupported characters in base64: "+n.decode(new Uint8Array([r,f]))+JSON.stringify([c,s]));if(i[a]=c<<2|(48&s)>>4,15&s)throw new Error("Mangled Base64 padding")}else if(3==r){const r=t[e-3],f=t[e-2],c=t[e-1],s=o[r],y=o[f],u=o[c];if(255==(s|y|u))throw new Error("Unsupported characters in base64: "+n.decode(new Uint8Array([r,f,c]))+JSON.stringify([s,y,u]));if(i[a]=s<<2|(48&y)>>4,i[a+1]=(15&y)<<4|(60&u)>>2,3&u)throw new Error("Mangled Base64 padding")}}function d(t){let n=t.length;for(let e=n-1;e>=0;e--)61==t[e]&&(n=e);const e=n%4;let r;if(2==e)r=(n-2)/4*3+1;else if(3==e)r=(n-3)/4*3+2;else{if(0!=e)throw new Error("Invalid base64 length");r=n/4*3}return[n,e,r]}function I(t){if("string"!=typeof t)throw new Error("Expecting a string");if(0==t.length)return new Uint8Array([]);if(0==u[0]){for(let t=0;t<256;t++)u[t]=255;for(let t=0;t<64;t++)u[s.charCodeAt(t)]=t}const n=e.encode(t),[r,i,o]=d(n),a=new Uint8Array(o);return b(n,r,i,a,u),a}function p(t){if("string"!=typeof t)throw new Error("Expecting a string");if(0==t.length)return new Uint8Array([]);if(0==l[0]){for(let t=0;t<256;t++)l[t]=255;for(let t=0;t<64;t++)l[w.charCodeAt(t)]=t}const n=e.encode(t),[r,i,o]=d(n),a=new Uint8Array(o);return b(n,r,i,a,l),a}const E=new Uint8Array(2);function L(){return 0!=E[1]}function B(){return 0!=E[0]}function F(){return L()?"big":"little"}function m(t,n,e,r){const i=new Uint8Array(t.byteLength),o=new DataView(i.buffer),a=t.length,f="little"==n;for(let n=0,i=0;nt.setUint16(n,e,r))):t instanceof Int16Array?m(t,n,2,((t,n,e,r)=>t.setInt16(n,e,r))):t instanceof Uint32Array?m(t,n,4,((t,n,e,r)=>t.setUint32(n,e,r))):t instanceof Int32Array?m(t,n,4,((t,n,e,r)=>t.setInt32(n,e,r))):t instanceof BigUint64Array?m(t,n,8,((t,n,e,r)=>t.setBigUint64(n,e,r))):t instanceof BigInt64Array?m(t,n,8,((t,n,e,r)=>t.setBigInt64(n,e,r))):t instanceof Float32Array?m(t,n,4,((t,n,e,r)=>t.setFloat32(n,e,r))):t instanceof Float64Array?m(t,n,8,((t,n,e,r)=>t.setFloat64(n,e,r))):new Uint8Array(t.buffer)}function x(n,e,r){const i=t(n),o="little"==e;if("int8"==r)return D(i,o,1,new Int8Array(i.byteLength),((t,n,e)=>t.getInt8(n)));if("uint16"==r){if(1&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,2,new Uint16Array(i.byteLength>>>1),((t,n,e)=>t.getUint16(n,e)))}if("int16"==r){if(1&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,2,new Int16Array(i.byteLength>>>1),((t,n,e)=>t.getInt16(n,e)))}if("uint32"==r){if(3&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,4,new Uint32Array(i.byteLength>>>2),((t,n,e)=>t.getUint32(n,e)))}if("int32"==r){if(3&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,4,new Int32Array(i.byteLength>>>2),((t,n,e)=>t.getInt32(n,e)))}if("uint64"==r){if(7&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,8,new BigUint64Array(i.byteLength>>>3),((t,n,e)=>t.getBigUint64(n,e)))}if("int64"==r){if(7&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,8,new BigInt64Array(i.byteLength>>>3),((t,n,e)=>t.getBigInt64(n,e)))}if("float32"==r){if(3&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,4,new Float32Array(i.byteLength>>>2),((t,n,e)=>t.getFloat32(n,e)))}if("float64"==r){if(7&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,8,new Float64Array(i.byteLength>>>3),((t,n,e)=>t.getFloat64(n,e)))}return new Uint8Array(i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength))}new Uint16Array(E.buffer)[0]=1;export{x as arrayFromEndian,q as arrayToEndian,I as decodeBase64,p as decodeBase64Url,c as decodeHex,h as encodeBase64,U as encodeBase64Url,a as encodeHex,F as hostEndianness,L as hostIsBigEndian,B as hostIsLittleEndian};export default null; +//# sourceMappingURL=/sm/80d9c0abfbcfb460a923312f768f74a5eaa9e83f32477d78942e3f831ec9e1fd.map \ No newline at end of file diff --git a/public/decoderesponse/index.html b/public/decoderesponse/index.html index 8b2b5ec..652e4b0 100644 --- a/public/decoderesponse/index.html +++ b/public/decoderesponse/index.html @@ -78,6 +78,14 @@

WebAuthn
Response Decoder

+ diff --git a/public/sitemap.xml b/public/sitemap.xml index 8d14cff..4957199 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -6,7 +6,7 @@
https://tools.passkeys.dev/decoderesponse - 2026-01-17T00:07:09.743Z + 2026-01-17T00:52:23.711Z https://tools.passkeys.dev/featuredetect From 1b2fb1667f564cb13ab39994b6e15ff1fa785730 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 16 Jan 2026 17:33:18 -0800 Subject: [PATCH 06/15] Migrate over helpers --- public/decoderesponse/aaguidToString.js | 21 +++ public/decoderesponse/base64ToBase64URL.js | 11 ++ public/decoderesponse/coseAlgToString.js | 89 ++++++++++ public/decoderesponse/coseKeyTypeToString.js | 27 +++ .../decoderesponse/decodeAttestationObject.js | 27 +++ public/decoderesponse/decodeClientDataJSON.js | 22 +++ .../parseAttestationStatement.js | 146 ++++++++++++++++ public/decoderesponse/parseAuthData.js | 163 ++++++++++++++++++ public/decoderesponse/updateQueryParam.js | 24 +++ public/decoderesponse/x5cToStrings.js | 12 ++ 10 files changed, 542 insertions(+) create mode 100644 public/decoderesponse/aaguidToString.js create mode 100644 public/decoderesponse/base64ToBase64URL.js create mode 100644 public/decoderesponse/coseAlgToString.js create mode 100644 public/decoderesponse/coseKeyTypeToString.js create mode 100644 public/decoderesponse/decodeAttestationObject.js create mode 100644 public/decoderesponse/decodeClientDataJSON.js create mode 100644 public/decoderesponse/parseAttestationStatement.js create mode 100644 public/decoderesponse/parseAuthData.js create mode 100644 public/decoderesponse/updateQueryParam.js create mode 100644 public/decoderesponse/x5cToStrings.js diff --git a/public/decoderesponse/aaguidToString.js b/public/decoderesponse/aaguidToString.js new file mode 100644 index 0000000..5a66343 --- /dev/null +++ b/public/decoderesponse/aaguidToString.js @@ -0,0 +1,21 @@ +/** + * Convert the aaguid buffer in authData into a UUID string + * + * @param {Uint8Array} aaguid + * @returns {string} + */ +export function aaguidToString(aaguid) { + // Raw Hex: adce000235bcc60a648b0b25f1f05503 + const hex = aaguid.toString('hex'); + + const segments = [ + hex.slice(0, 8), // 8 + hex.slice(8, 12), // 4 + hex.slice(12, 16), // 4 + hex.slice(16, 20), // 4 + hex.slice(20, 32), // 8 + ]; + + // Formatted: adce0002-35bc-c60a-648b-0b25f1f05503 + return segments.join('-'); +} diff --git a/public/decoderesponse/base64ToBase64URL.js b/public/decoderesponse/base64ToBase64URL.js new file mode 100644 index 0000000..59f1d18 --- /dev/null +++ b/public/decoderesponse/base64ToBase64URL.js @@ -0,0 +1,11 @@ +/** + * Convert a Base64-formatted string to Base64URL + * @param {string} input + * @returns string + */ +export function base64ToBase64URL(input) { + return input + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/=/g, ''); +} diff --git a/public/decoderesponse/coseAlgToString.js b/public/decoderesponse/coseAlgToString.js new file mode 100644 index 0000000..1c7f1f6 --- /dev/null +++ b/public/decoderesponse/coseAlgToString.js @@ -0,0 +1,89 @@ +/** + * Convert COSE public key alg to a human-friendly value + * + * See https://www.iana.org/assignments/cose/cose.xhtml#algorithms + * + * @param {number} alg A numeric COSE algorithm ID + * @returns {string} + */ +export function coseAlgToString(alg) { + let name = coseAlgNameMap[alg]; + + if (!name) { + name = 'Unknown'; + } + + return `${name} (${alg})`; +} + +/** + * Pulled from https://www.iana.org/assignments/cose/cose.xhtml#algorithms + */ +const coseAlgNameMap = { + '-65535': 'RS1', + '-259': 'RS512', + '-258': 'RS384', + '-257': 'RS256', + '-50': 'ML-DSA-87', + '-49': 'ML-DSA-65', + '-48': 'ML-DSA-44', + '-47': 'ES256K', + '-46': 'HSS-LMS', + '-45': 'SHAKE256 (TEMPORARY - registered 2019-08-13, extension registered 2020-06-19, expires 2021-08-13)', + '-44': 'SHA-512 (TEMPORARY - registered 2019-08-13, extension registered 2020-06-19, expires 2021-08-13)', + '-43': 'SHA-384 (TEMPORARY - registered 2019-08-13, extension registered 2020-06-19, expires 2021-08-13)', + '-42': 'RSAES-OAEP w/ SHA-512', + '-41': 'RSAES-OAEP w/ SHA-256', + '-40': 'RSAES-OAEP w/ RFC 8017 default parameters', + '-39': 'PS512', + '-38': 'PS384', + '-37': 'PS256', + '-36': 'ES512', + '-35': 'ES384', + '-34': 'ECDH-SS + A256KW', + '-33': 'ECDH-SS + A192KW', + '-32': 'ECDH-SS + A128KW', + '-31': 'ECDH-ES + A256KW', + '-30': 'ECDH-ES + A192KW', + '-29': 'ECDH-ES + A128KW', + '-28': 'ECDH-SS + HKDF-512', + '-27': 'ECDH-SS + HKDF-256', + '-26': 'ECDH-ES + HKDF-512', + '-25': 'ECDH-ES + HKDF-256', + '-18': 'SHAKE128 (TEMPORARY - registered 2019-08-13, extension registered 2020-06-19, expires 2021-08-13)', + '-17': 'SHA-512/256 (TEMPORARY - registered 2019-08-13, extension registered 2020-06-19, expires 2021-08-13)', + '-16': 'SHA-256 (TEMPORARY - registered 2019-08-13, extension registered 2020-06-19, expires 2021-08-13)', + '-15': 'SHA-256/64 (TEMPORARY - registered 2019-08-13, extension registered 2020-06-19, expires 2021-08-13)', + '-14': 'SHA-1 (TEMPORARY - registered 2019-08-13, extension registered 2020-06-19, expires 2021-08-13)', + '-13': 'direct+HKDF-AES-256', + '-12': 'direct+HKDF-AES-128', + '-11': 'direct+HKDF-SHA-512', + '-10': 'direct+HKDF-SHA-256', + '-8': 'EdDSA', + '-7': 'ES256', + '-6': 'direct', + '-5': 'A256KW', + '-4': 'A192KW', + '-3': 'A128KW', + '0': 'Reserved', + '1': 'A128GCM', + '2': 'A192GCM', + '3': 'A256GCM', + '4': 'HMAC 256/64', + '5': 'HMAC 256/256', + '6': 'HMAC 384/384', + '7': 'HMAC 512/512', + '10': 'AES-CCM-16-64-128', + '11': 'AES-CCM-16-64-256', + '12': 'AES-CCM-64-64-128', + '13': 'AES-CCM-64-64-256', + '14': 'AES-MAC 128/64', + '15': 'AES-MAC 256/64', + '24': 'ChaCha20/Poly1305', + '25': 'AES-MAC 128/128', + '26': 'AES-MAC 256/128', + '30': 'AES-CCM-16-128-128', + '31': 'AES-CCM-16-128-256', + '32': 'AES-CCM-64-128-128', + '33': 'AES-CCM-64-128-256', +} diff --git a/public/decoderesponse/coseKeyTypeToString.js b/public/decoderesponse/coseKeyTypeToString.js new file mode 100644 index 0000000..eb5c21d --- /dev/null +++ b/public/decoderesponse/coseKeyTypeToString.js @@ -0,0 +1,27 @@ +/** + * Convert a COSE public key's key type and convert it to a human value + * + * See https://www.iana.org/assignments/cose/cose.xhtml#key-type + * + * @param {number} kty A numeric COSE key type ID + * @returns {string} + */ +export function coseKeyTypeToString(kty) { + let keyType = `Unknown`; + + if (kty === 1) { + keyType = 'OKP'; + } else if (kty === 2) { + keyType = 'EC2'; + } else if (kty === 3) { + keyType = 'RSA'; + } else if (kty === 4) { + keyType = 'Symmetric'; + } else if (kty === 5) { + keyType = 'HSS-LMS'; + } else if (kty === 7) { + keyType = 'AKP'; + } + + return `${keyType} (${kty})`; +} diff --git a/public/decoderesponse/decodeAttestationObject.js b/public/decoderesponse/decodeAttestationObject.js new file mode 100644 index 0000000..223f6e2 --- /dev/null +++ b/public/decoderesponse/decodeAttestationObject.js @@ -0,0 +1,27 @@ +import { decodeCBOR } from 'tiny-cbor'; + +/** + * Convert response.attestationObject to a dev-friendly format + * + * @param {string} base64urlString + * @returns {{ + * fmt: "fido-u2f" | "packed" | "android-safetynet" | "android-key" | "tpm" | "none"; + * attStmt: AttestationStatement; + * authData: ArrayBuffer; + * }} + */ +export function decodeAttestationObject(base64urlString) { + return decodeCBOR(base64urlString, 'base64'); +} + +/** + * @typedef AttestationStatement + * @type {object} + * @property {Uint8Array?} sig + * @property {number?} alg + * @property {Uint8Array[]?} x5c + * @property {Uint8Array?} response + * @property {string?} ver + * @property {Uint8Array?} certInfo + * @property {Uint8Array?} pubArea + */ diff --git a/public/decoderesponse/decodeClientDataJSON.js b/public/decoderesponse/decodeClientDataJSON.js new file mode 100644 index 0000000..dde1238 --- /dev/null +++ b/public/decoderesponse/decodeClientDataJSON.js @@ -0,0 +1,22 @@ + +import { decodeBase64Url } from 'tiny-encodings'; + +/** + * Convert response.clientDataJSON to a dev-friendly format + * + * @param {string} base64urlString + * @returns {{ + * type: string; + * challenge: string; + * origin: string; + * crossOrigin?: boolean; + * tokenBinding?: { + * id?: string; + * status: 'present' | 'supported' | 'not-supported'; + * }; + * }} + */ +export function decodeClientDataJSON(base64urlString) { + return JSON.parse(decodeBase64Url(base64urlString)); +} + diff --git a/public/decoderesponse/parseAttestationStatement.js b/public/decoderesponse/parseAttestationStatement.js new file mode 100644 index 0000000..4ef081c --- /dev/null +++ b/public/decoderesponse/parseAttestationStatement.js @@ -0,0 +1,146 @@ +import { decodeBase64Url, encodeBase64Url } from 'tiny-encodings'; + +import coseAlgToString from './coseAlgToString'; +import x5cToStrings from './x5cToStrings'; + +/** + * Break down attestation statement properties + * + * @param {{ + * fmt: "fido-u2f" | "packed" | "android-safetynet" | "android-key" | "tpm" | "none"; + * attStmt: { + * sig?: Uint8Array; + * alg?: number; + * x5c?: Uint8Array[]; + * response?: Uint8Array; + * ver?: string; + * certInfo?: Uint8Array; + * pubArea?: Uint8Array; + * }; + * authData: ArrayBuffer; + * }} statement Output from `decodeAttestationObject()` + * @returns {ParsedAttestationStatement} A human-readable representation of values within the parsed attestation statement + */ +export default function parseAttestationStatement(statement) { + const toReturn = {}; + + // Packed, TPM, AndroidKey + if (statement.alg) { + toReturn.alg = coseAlgToString(statement.alg); + } + + // Packed, TPM, AndroidKey, FIDO-U2F + if (statement.sig) { + toReturn.sig = encodeBase64Url(Uint8Array.from(statement.sig)); + } + + // Packed, TPM, AndroidKey, FIDO-U2F + if (statement.x5c) { + toReturn.x5c = x5cToStrings(statement.x5c); + } + + // Android SafetyNet + if (statement.response) { + const jwt = statement.response.toString('utf8'); + const jwtParts = jwt.split('.'); + + /** + * SafetyNetJWTHeader + * @type {{ + * alg: string; + * x5c: string[]; + * }} + */ + const header = JSON.parse(decode(jwtParts[0])); + /** + * SafetyNetJWTPayload + * @type {{ + * nonce: string; + * timestampMs: number; + * apkPackageName: string; + * apkDigestSha256: string; + * ctsProfileMatch: boolean; + * apkCertificateDigestSha256: string[]; + * basicIntegrity: boolean; + * }} + */ + const payload = JSON.parse(decode(jwtParts[1])); + /** + * SafetyNetJWTSignature + * @type {string} + */ + const signature = jwtParts[2]; + + const certBuffers = header.x5c.map((cert) => decodeBase64Url(cert)); + const headerX5C = x5cToStrings(certBuffers); + + toReturn.response = { + header: { + ...header, + x5c: headerX5C, + }, + payload, + signature, + }; + } + + // TPM, Android SafetyNet + if (statement.ver) { + toReturn.ver = statement.ver; + } + + // TPM + if (statement.certInfo) { + // TODO: Parse this TPM data structure + toReturn.certInfo = encodeBase64Url(Uint8Array.from(statement.certInfo)); + } + + // TPM + if (statement.pubArea) { + // TODO: Parse this TPM data structure + toReturn.pubArea = encodeBase64Url(Uint8Array.from(statement.pubArea)); + } + + return toReturn; +} + +/** + * @typedef ParsedAttestationStatement + * @type {object} + * @property {string?} alg + * @property {string?} sig + * @property {string?} ver + * // Certificate[] + * @property {any[]} x5c + * @property {{ + * header: SafetyNetJWTHeader + * payload: SafetyNetJWTPayload + * signature: SafetyNetJWTSignature + * }?} response + * @property {string?} certInfo + * @property {string?} pubArea + */ + +/** + * @typedef SafetyNetJWTHeader + * @type {object} + * @property {string} alg + * @property {string[]} x5c + */ + +/** + * @typedef SafetyNetJWTPayload + * @type {object} + * @property {string} nonce + * @property {number} timestampMs + * @property {string} apkPackageName + * @property {string} apkDigestSha256 + * @property {boolean} ctsProfileMatch + * @property {string[]} apkCertificateDigestSha256 + * @property {boolean} basicIntegrity + */ + +/** + * @typedef SafetyNetJWTSignature + * @type {string} + */ diff --git a/public/decoderesponse/parseAuthData.js b/public/decoderesponse/parseAuthData.js new file mode 100644 index 0000000..9a2a01b --- /dev/null +++ b/public/decoderesponse/parseAuthData.js @@ -0,0 +1,163 @@ +import { decodeCBOR } from 'tiny-cbor'; +import { encodeBase64Url } from 'tiny-encodings'; + +import aaguidToString from './aaguidToString'; +import coseKeyTypeToString from './coseKeyTypeToString'; +import coseAlgToString from './coseAlgToString'; + +const COSEKEYS = { + kty: 1, + alg: 3, + crv: -1, + x: -2, + y: -3, + // RSA + mod: -1, + exp: -2, + // ML-DSA + pub: -1 +} + +/** + * + * @param {Uint8Array} authData + * @returns {AuthenticatorData} Parsed AuthenticatorData + */ +export default function parseAuthData(authData) { + let buffer = Uint8Array.from(authData); + + const rpIdHash = buffer.slice(0, 32); + buffer = buffer.slice(32); + + const flagsBuf = buffer.slice(0, 1); + buffer = buffer.slice(1); + + /** @type {number} */ + const flagsInt = flagsBuf[0]; + + const flags = { + userPresent: !!(flagsInt & (1 << 0)), // User Presence + userVerified: !!(flagsInt & (1 << 2)), // User Verified + backupEligible: !!(flagsInt & (1 << 3)), // Backup Eligibility + backupStatus: !!(flagsInt & (1 << 4)), // Backup State + attestedData: !!(flagsInt & (1 << 6)), // Attested Credential Data Present + extensionData: !!(flagsInt & (1 << 7)), // Extension Data Present + }; + + const counterBuf = buffer.slice(0, 4); + buffer = buffer.slice(4); + + const counter = counterBuf.readUInt32BE(0); + + /** @type {Uint8Array?} */ + let aaguid; + /** @type {string?} */ + let credentialID; + /** @type {string?} */ + let credentialPublicKey; + /** @type {ParsedCredentialPublicKey?} */ + let parsedCredentialPublicKey; + + if (flags.attestedData) { + aaguid = buffer.slice(0, 16); + buffer = buffer.slice(16); + + const credIDLenBuf = buffer.slice(0, 2); + buffer = buffer.slice(2); + + const credIDLen = credIDLenBuf.readUInt16BE(0); + let credentialIDBuffer = buffer.slice(0, credIDLen); + buffer = buffer.slice(credIDLen); + + // Base64 to Base64URL + credentialID = encodeBase64Url(credentialIDBuffer); + credentialPublicKey = encodeBase64Url(buffer); + + const pubKey = decodeCBOR(buffer); + + // TODO: Handle this differently if this is an RSA key + parsedCredentialPublicKey = { + keyType: pubKey?.[1], + }; + + if (pubKey) { + const kty = pubKey[COSEKEYS.kty]; + + parsedCredentialPublicKey.keyType = coseKeyTypeToString(kty); + parsedCredentialPublicKey.algorithm = coseAlgToString(pubKey[COSEKEYS.alg]); + + if (kty === 3) { + // RSA + parsedCredentialPublicKey.modulus = encodeBase64Url(Uint8Array.from(pubKey[COSEKEYS.mod])); + // TODO: Figure out a non-Node way to do this + parsedCredentialPublicKey.exponent = parseInt(Uint8Array.from(pubKey[COSEKEYS.exp]).toString('hex'), 16); + } else if (kty === 7) { + // ML-DSA + parsedCredentialPublicKey.pub = encodeBase64Url(Uint8Array.from(pubKey[COSEKEYS.pub])); + } else { + // Everything else, including EC2 and OKP + parsedCredentialPublicKey.curve = pubKey[COSEKEYS.crv]; + + parsedCredentialPublicKey.x = encodeBase64Url(Uint8Array.from(pubKey[COSEKEYS.x])); + + // y isn't present in OKP certs + if (pubKey[COSEKEYS.y]) { + parsedCredentialPublicKey.y = encodeBase64Url(Uint8Array.from(pubKey[COSEKEYS.y])); + } + } + } + } + + /** @type {AuthenticatorData} */ + const toReturn = { + rpIdHash: encodeBase64Url(rpIdHash), + flags, + counter, + }; + + if (aaguid) { + toReturn.aaguid = aaguidToString(aaguid) + } + + if (credentialID) { + toReturn.credentialID = credentialID; + } + + if (credentialPublicKey) { + toReturn.credentialPublicKey = credentialPublicKey; + toReturn.parsedCredentialPublicKey = parsedCredentialPublicKey; + } + + return toReturn; +} + +/** + * @typedef AuthenticatorData + * @type {object} + * @property {string} rpIdHash + * @property {{ + * userPresent: boolean + * userVerified: boolean + * attestedData: boolean + * extensionData: boolean + * }} flags + * @property {number} counter + * @property {string?} aaguid + * @property {string?} credentialID + * @property {string?} credentialPublicKey + * @property {ParsedCredentialPublicKey?} parsedCredentialPublicKey + */ + +/** + * @typedef ParsedCredentialPublicKey + * @type {object} + * @property {string?} keyType + * @property {string?} algorithm + * @property {(number | string)?} curve + * @property {string?} x + * @property {string?} y + * @property {string?} modulus + * @property {number?} exponent + * // ML-DSA + * @property {string?}pub + */ diff --git a/public/decoderesponse/updateQueryParam.js b/public/decoderesponse/updateQueryParam.js new file mode 100644 index 0000000..bec22db --- /dev/null +++ b/public/decoderesponse/updateQueryParam.js @@ -0,0 +1,24 @@ +import { encodeBase64Url } from 'tiny-encodings'; + +/** + * Set the given query parameter to the base64url-encoded value + * + * @param {string} param + * @param {string} newValue + * @returns {void} + */ +export default function updateQueryParam(param, newValue) { + const searchParams = new URLSearchParams(window.location.search); + + if (newValue.length < 1) { + // Clear query parameter if there's no value to preserve + searchParams.delete(param); + const newPathQuery = `${window.location.pathname}?${searchParams.toString()}`; + window.history.pushState(null, '', newPathQuery); + } else { + // Set query parameter with new value + searchParams.set(param, encodeBase64Url(newValue)); + const newPathQuery = `${window.location.pathname}?${searchParams.toString()}`; + window.history.pushState(null, '', newPathQuery); + } +} diff --git a/public/decoderesponse/x5cToStrings.js b/public/decoderesponse/x5cToStrings.js new file mode 100644 index 0000000..caf3632 --- /dev/null +++ b/public/decoderesponse/x5cToStrings.js @@ -0,0 +1,12 @@ +import { AsnParser } from "@peculiar/asn1-schema"; +import { Certificate } from "@peculiar/asn1-x509"; + +/** + * Parse X.509 certificates into something legible + * @param {Uint8Array[]} x5c + * // Certificate[] + * @returns {any[]} + */ +export default function x5cToStrings(x5c) { + return x5c.map((cert) => AsnParser.parse(Buffer.from(cert), Certificate)); +} From b202886454d8413829235af579cf7d7174cfd74a Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 16 Jan 2026 22:48:53 -0800 Subject: [PATCH 07/15] Get registration parsing working --- public/decoderesponse/aaguidToString.js | 4 +- .../decoderesponse/decodeAttestationObject.js | 9 +- public/decoderesponse/decodeClientDataJSON.js | 5 +- .../decodeRegistrationCredential.js | 37 ++++++ public/decoderesponse/index.html | 15 ++- .../parseAttestationStatement.js | 6 +- public/decoderesponse/parseAuthData.js | 36 +++--- public/decoderesponse/script.js | 110 ++++++++++++++++-- public/decoderesponse/updateQueryParam.js | 2 +- public/decoderesponse/x5cToStrings.js | 10 +- public/sitemap.xml | 2 +- 11 files changed, 193 insertions(+), 43 deletions(-) create mode 100644 public/decoderesponse/decodeRegistrationCredential.js diff --git a/public/decoderesponse/aaguidToString.js b/public/decoderesponse/aaguidToString.js index 5a66343..d9b7088 100644 --- a/public/decoderesponse/aaguidToString.js +++ b/public/decoderesponse/aaguidToString.js @@ -1,3 +1,5 @@ +import { encodeHex } from 'tiny-encodings'; + /** * Convert the aaguid buffer in authData into a UUID string * @@ -6,7 +8,7 @@ */ export function aaguidToString(aaguid) { // Raw Hex: adce000235bcc60a648b0b25f1f05503 - const hex = aaguid.toString('hex'); + const hex = encodeHex(aaguid); const segments = [ hex.slice(0, 8), // 8 diff --git a/public/decoderesponse/decodeAttestationObject.js b/public/decoderesponse/decodeAttestationObject.js index 223f6e2..9d89461 100644 --- a/public/decoderesponse/decodeAttestationObject.js +++ b/public/decoderesponse/decodeAttestationObject.js @@ -1,4 +1,5 @@ import { decodeCBOR } from 'tiny-cbor'; +import { decodeBase64Url } from 'tiny-encodings'; /** * Convert response.attestationObject to a dev-friendly format @@ -11,7 +12,13 @@ import { decodeCBOR } from 'tiny-cbor'; * }} */ export function decodeAttestationObject(base64urlString) { - return decodeCBOR(base64urlString, 'base64'); + const attestationObjectBytes = decodeBase64Url(base64urlString); + const decoded = decodeCBOR(attestationObjectBytes); + return { + fmt: decoded.get('fmt'), + attStmt: decoded.get('attStmt'), + authData: decoded.get('authData'), + }; } /** diff --git a/public/decoderesponse/decodeClientDataJSON.js b/public/decoderesponse/decodeClientDataJSON.js index dde1238..a593bf0 100644 --- a/public/decoderesponse/decodeClientDataJSON.js +++ b/public/decoderesponse/decodeClientDataJSON.js @@ -17,6 +17,7 @@ import { decodeBase64Url } from 'tiny-encodings'; * }} */ export function decodeClientDataJSON(base64urlString) { - return JSON.parse(decodeBase64Url(base64urlString)); + const jsonBytes = decodeBase64Url(base64urlString); + const jsonString = new TextDecoder().decode(jsonBytes); + return JSON.parse(jsonString); } - diff --git a/public/decoderesponse/decodeRegistrationCredential.js b/public/decoderesponse/decodeRegistrationCredential.js new file mode 100644 index 0000000..9238ecd --- /dev/null +++ b/public/decoderesponse/decodeRegistrationCredential.js @@ -0,0 +1,37 @@ +import { decodeClientDataJSON } from './decodeClientDataJSON.js'; +import { decodeAttestationObject } from './decodeAttestationObject.js'; +import { parseAuthData } from './parseAuthData.js'; +import { parseAttestationStatement } from './parseAttestationStatement.js'; + +/** + * Take a WebAuthn registration response and turn it into a human-readable representation + * + * @param {object} credential JSON-ified output from `navigator.credentials.create()`, using Base64URL encoding for Uint8Array/ArrayBuffer values + * @returns {object} Decoded registration response + */ +export function decodeRegistrationCredential(credential) { + const { response } = credential; + + if (!response.clientDataJSON || !response.attestationObject) { + throw new Error('The "clientDataJSON" and/or "attestationObject" properties are missing from "response"'); + } + + const clientDataJSON = decodeClientDataJSON(response.clientDataJSON); + const attestationObject = decodeAttestationObject(response.attestationObject); + + const authData = parseAuthData(attestationObject.authData); + const attStmt = parseAttestationStatement(attestationObject.attStmt); + + return { + ...credential, + response: { + ...response, + clientDataJSON, + attestationObject: { + ...attestationObject, + attStmt, + authData, + }, + }, + }; +} diff --git a/public/decoderesponse/index.html b/public/decoderesponse/index.html index 652e4b0..799df0c 100644 --- a/public/decoderesponse/index.html +++ b/public/decoderesponse/index.html @@ -51,7 +51,7 @@

WebAuthn
Response Decoder

- + WebAuthn Response (JSON)

Paste the JSON-ified output from @@ -70,6 +70,19 @@

WebAuthn
Response Decoder

class="p-3 mt-3 bg-light border rounded font-monospace small d-none" style="max-height: 300px; overflow-y: auto;">
+ + +
+ {parsedTitle} +
+ +
+
diff --git a/public/decoderesponse/parseAttestationStatement.js b/public/decoderesponse/parseAttestationStatement.js index 4ef081c..3008106 100644 --- a/public/decoderesponse/parseAttestationStatement.js +++ b/public/decoderesponse/parseAttestationStatement.js @@ -1,7 +1,7 @@ import { decodeBase64Url, encodeBase64Url } from 'tiny-encodings'; -import coseAlgToString from './coseAlgToString'; -import x5cToStrings from './x5cToStrings'; +import { coseAlgToString } from './coseAlgToString.js'; +import { x5cToStrings } from './x5cToStrings.js'; /** * Break down attestation statement properties @@ -21,7 +21,7 @@ import x5cToStrings from './x5cToStrings'; * }} statement Output from `decodeAttestationObject()` * @returns {ParsedAttestationStatement} A human-readable representation of values within the parsed attestation statement */ -export default function parseAttestationStatement(statement) { +export function parseAttestationStatement(statement) { const toReturn = {}; // Packed, TPM, AndroidKey diff --git a/public/decoderesponse/parseAuthData.js b/public/decoderesponse/parseAuthData.js index 9a2a01b..275b8f6 100644 --- a/public/decoderesponse/parseAuthData.js +++ b/public/decoderesponse/parseAuthData.js @@ -1,9 +1,9 @@ import { decodeCBOR } from 'tiny-cbor'; -import { encodeBase64Url } from 'tiny-encodings'; +import { encodeBase64Url, encodeHex } from 'tiny-encodings'; -import aaguidToString from './aaguidToString'; -import coseKeyTypeToString from './coseKeyTypeToString'; -import coseAlgToString from './coseAlgToString'; +import { aaguidToString } from './aaguidToString.js'; +import { coseKeyTypeToString } from './coseKeyTypeToString.js'; +import { coseAlgToString } from './coseAlgToString.js'; const COSEKEYS = { kty: 1, @@ -23,7 +23,7 @@ const COSEKEYS = { * @param {Uint8Array} authData * @returns {AuthenticatorData} Parsed AuthenticatorData */ -export default function parseAuthData(authData) { +export function parseAuthData(authData) { let buffer = Uint8Array.from(authData); const rpIdHash = buffer.slice(0, 32); @@ -47,7 +47,7 @@ export default function parseAuthData(authData) { const counterBuf = buffer.slice(0, 4); buffer = buffer.slice(4); - const counter = counterBuf.readUInt32BE(0); + const counter = new DataView(counterBuf.buffer, counterBuf.byteOffset).getUint32(0, false); /** @type {Uint8Array?} */ let aaguid; @@ -65,7 +65,7 @@ export default function parseAuthData(authData) { const credIDLenBuf = buffer.slice(0, 2); buffer = buffer.slice(2); - const credIDLen = credIDLenBuf.readUInt16BE(0); + const credIDLen = new DataView(credIDLenBuf.buffer, credIDLenBuf.byteOffset).getUint16(0, false); let credentialIDBuffer = buffer.slice(0, credIDLen); buffer = buffer.slice(credIDLen); @@ -77,32 +77,30 @@ export default function parseAuthData(authData) { // TODO: Handle this differently if this is an RSA key parsedCredentialPublicKey = { - keyType: pubKey?.[1], + keyType: pubKey.get(COSEKEYS.kty), }; if (pubKey) { - const kty = pubKey[COSEKEYS.kty]; + const kty = pubKey.get(COSEKEYS.kty); parsedCredentialPublicKey.keyType = coseKeyTypeToString(kty); - parsedCredentialPublicKey.algorithm = coseAlgToString(pubKey[COSEKEYS.alg]); + parsedCredentialPublicKey.algorithm = coseAlgToString(pubKey.get(COSEKEYS.alg)); if (kty === 3) { // RSA - parsedCredentialPublicKey.modulus = encodeBase64Url(Uint8Array.from(pubKey[COSEKEYS.mod])); - // TODO: Figure out a non-Node way to do this - parsedCredentialPublicKey.exponent = parseInt(Uint8Array.from(pubKey[COSEKEYS.exp]).toString('hex'), 16); + parsedCredentialPublicKey.modulus = encodeBase64Url(Uint8Array.from(pubKey.get(COSEKEYS.mod))); + parsedCredentialPublicKey.exponent = parseInt(encodeHex(Uint8Array.from(pubKey.get(COSEKEYS.exp))), 16); } else if (kty === 7) { // ML-DSA - parsedCredentialPublicKey.pub = encodeBase64Url(Uint8Array.from(pubKey[COSEKEYS.pub])); + parsedCredentialPublicKey.pub = encodeBase64Url(Uint8Array.from(pubKey.get(COSEKEYS.pub))); } else { // Everything else, including EC2 and OKP - parsedCredentialPublicKey.curve = pubKey[COSEKEYS.crv]; - - parsedCredentialPublicKey.x = encodeBase64Url(Uint8Array.from(pubKey[COSEKEYS.x])); + parsedCredentialPublicKey.curve = pubKey.get(COSEKEYS.crv); + parsedCredentialPublicKey.x = encodeBase64Url(Uint8Array.from(pubKey.get(COSEKEYS.x))); // y isn't present in OKP certs - if (pubKey[COSEKEYS.y]) { - parsedCredentialPublicKey.y = encodeBase64Url(Uint8Array.from(pubKey[COSEKEYS.y])); + if (pubKey.get(COSEKEYS.y)) { + parsedCredentialPublicKey.y = encodeBase64Url(Uint8Array.from(pubKey.get(COSEKEYS.y))); } } } diff --git a/public/decoderesponse/script.js b/public/decoderesponse/script.js index 0803d04..1c18da4 100644 --- a/public/decoderesponse/script.js +++ b/public/decoderesponse/script.js @@ -1,9 +1,12 @@ import { log } from '../assets/js/common.js'; +import { decodeRegistrationCredential } from './decodeRegistrationCredential.js'; // Create an instance of our fancy text editor -const flask = new CodeFlask("#jsonEditor", { language: "json", lineNumbers: false}); +const flask = new CodeFlask("#jsonEditor", { language: "json", lineNumbers: false }); const flaskTextarea = document.querySelector("#jsonEditor textarea"); -const logOutputElem = document.querySelector('#logOutput'); +const logOutputElem = document.getElementById('logOutput'); +const parsedOutputElem = document.getElementById('parsedOutput'); +const parsedTitleElem = document.getElementById('parsedTitle'); // Set a placeholder to help communicate the shape of the JSON that should be pasted in flaskTextarea.placeholder = `{ @@ -17,26 +20,105 @@ flaskTextarea.placeholder = `{ // Attempt to parse whatever was just pasted in flask.onUpdate((code) => { - // Clear the debug output - logOutputElem.classList.add('d-none'); + resetUI(); + + if (code.length === 0) { + return; + } // Try to parse the code try { decodeResponse(code); } catch (err) { - // Don't show an error if nothing's been pasted in - if (code.length > 0) { - logError("This JSON couldn't be parsed, is it valid?"); - } + logError(err); } }); +// DEBUG - Registration +setTimeout(() => { + flask.updateCode(`{ + "id": "0PjLmk8beadc6I1u5bMrZv6rg0JlTfkp", + "rawId": "0PjLmk8beadc6I1u5bMrZv6rg0JlTfkp", + "response": { + "attestationObject": "o2NmbXRkbm9uZWdhdHRTdG10oGhhdXRoRGF0YVicdKbqkhPJnC90siSSsyDPQCYqlMGpUKA5fyklC2CEHvBdAAAAALraVWanqkAfvZZFYZpVEg0AGND4y5pPG3mnXOiNbuWzK2b-q4NCZU35KaUBAgMmIAEhWCBqFugix1y1gg-sUzr8JhsvI-b8Dc5lAUSqlLL4vKTcziJYIE-InBmgUVIpTbCN2D_h5UYzWhA7wJlP0a5CAYdSkb4Q", + "clientDataJSON": "eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoiMVVlLWZCZXkyR3p3QXQteU9LRWROUUloYXV1Vmw1QkRFcy1lLWZqUEdfTlBmU2ZIT0YwQUJ0LWQ1SG1UaWJhSV82SkZ1cHQ1bmp3dmNxWTVNSmpNdGciLCJvcmlnaW4iOiJodHRwczovL3dlYmF1dGhuLmlvIiwiY3Jvc3NPcmlnaW4iOmZhbHNlfQ", + "transports": [ + "internal", + "hybrid" + ], + "publicKeyAlgorithm": -7, + "publicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEahboIsdctYIPrFM6_CYbLyPm_A3OZQFEqpSy-Lyk3M5PiJwZoFFSKU2wjdg_4eVGM1oQO8CZT9GuQgGHUpG-EA", + "authenticatorData": "dKbqkhPJnC90siSSsyDPQCYqlMGpUKA5fyklC2CEHvBdAAAAALraVWanqkAfvZZFYZpVEg0AGND4y5pPG3mnXOiNbuWzK2b-q4NCZU35KaUBAgMmIAEhWCBqFugix1y1gg-sUzr8JhsvI-b8Dc5lAUSqlLL4vKTcziJYIE-InBmgUVIpTbCN2D_h5UYzWhA7wJlP0a5CAYdSkb4Q" + }, + "type": "public-key", + "clientExtensionResults": { + "credProps": { + "rk": true + } + }, + "authenticatorAttachment": "platform" +}`); +}, 10); + +function resetUI() { + // Clear the debug output + logOutputElem.classList.add('d-none'); + parsedOutputElem.classList.add('d-none'); +} + +/** + * + * @param {"Registration" | "Authentication"} responseType + * @param {object} decodedResponse + */ +function showDecodedOutput(responseType, decodedResponse) { + parsedTitleElem.innerText = `WebAuthn ${responseType} Response (Parsed)`; + // TODO: Render this + console.log({ decodedResponse }); + + // Show the output + parsedOutputElem.classList.remove('d-none'); +} + /** * @param {string} code The WebAuthn response being parsed * @returns void */ -function decodeResponse(code) { - console.log(JSON.parse(code, null, 2)); +function decodeResponse(rawCredential) { + let credential; + try { + credential = JSON.parse(rawCredential); + } catch (err) { + throw new Error("This JSON couldn't be parsed, is it valid?"); + } + + const { response } = credential; + if (!response) { + throw new Error('The "response" property is missing from this JSON'); + } + + if (isRegistrationCredential(credential)) { + try { + const decoded = decodeRegistrationCredential(credential); + showDecodedOutput("Registration", decoded); + } catch (err) { + console.error(err); + throw new Error(`There was an error when parsing this registration credential (see console for more info): ${err}`); + } + } else if (isAuthenticationCredential(credential)) { + try { + const decoded = + // TODO: Display the output + setDecoded({ + type: 'Authentication', + value: decodeAuthenticationCredential(credential), + }); + } catch (err) { + throw new Error(`There was an error when parsing this authentication credential (see console for more info): ${err}`); + } + } else { + throw new Error('This JSON is unrecognizable as a valid WebAuthn response') + } } /** @@ -52,3 +134,11 @@ function logError(message) { overwrite: true, }); } + +function isRegistrationCredential(credential) { + return !!(credential.response?.attestationObject); +} + +function isAuthenticationCredential(credential) { + return !!(credential.response?.authenticatorData); +} diff --git a/public/decoderesponse/updateQueryParam.js b/public/decoderesponse/updateQueryParam.js index bec22db..34f15b7 100644 --- a/public/decoderesponse/updateQueryParam.js +++ b/public/decoderesponse/updateQueryParam.js @@ -7,7 +7,7 @@ import { encodeBase64Url } from 'tiny-encodings'; * @param {string} newValue * @returns {void} */ -export default function updateQueryParam(param, newValue) { +export function updateQueryParam(param, newValue) { const searchParams = new URLSearchParams(window.location.search); if (newValue.length < 1) { diff --git a/public/decoderesponse/x5cToStrings.js b/public/decoderesponse/x5cToStrings.js index caf3632..aba9889 100644 --- a/public/decoderesponse/x5cToStrings.js +++ b/public/decoderesponse/x5cToStrings.js @@ -1,5 +1,6 @@ -import { AsnParser } from "@peculiar/asn1-schema"; -import { Certificate } from "@peculiar/asn1-x509"; +// import { AsnParser } from "@peculiar/asn1-schema"; +// import { Certificate } from "@peculiar/asn1-x509"; +import { encodeBase64Url } from 'tiny-encodings'; /** * Parse X.509 certificates into something legible @@ -7,6 +8,7 @@ import { Certificate } from "@peculiar/asn1-x509"; * // Certificate[] * @returns {any[]} */ -export default function x5cToStrings(x5c) { - return x5c.map((cert) => AsnParser.parse(Buffer.from(cert), Certificate)); +export function x5cToStrings(x5c) { + // return x5c.map((cert) => AsnParser.parse(Buffer.from(cert), Certificate)); + return x5c.map((cert) => encodeBase64Url(cert)); } diff --git a/public/sitemap.xml b/public/sitemap.xml index 4957199..562b669 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -6,7 +6,7 @@
https://tools.passkeys.dev/decoderesponse - 2026-01-17T00:52:23.711Z + 2026-01-17T06:47:11.858Z https://tools.passkeys.dev/featuredetect From f92ba078376311ab798bea2fd15549853ff539f2 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 16 Jan 2026 22:59:29 -0800 Subject: [PATCH 08/15] Add sourcemaps for tiny- libs --- public/assets/js/tiny-cbor.0.3.2.esm.min.js | 2 +- public/assets/js/tiny-cbor.0.3.2.esm.min.map | 1 + public/assets/js/tiny-encodings.0.2.11.esm.min.js | 2 +- public/assets/js/tiny-encodings.0.2.11.esm.min.map | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 public/assets/js/tiny-cbor.0.3.2.esm.min.map create mode 100644 public/assets/js/tiny-encodings.0.2.11.esm.min.map diff --git a/public/assets/js/tiny-cbor.0.3.2.esm.min.js b/public/assets/js/tiny-cbor.0.3.2.esm.min.js index 25d5ebf..4a56d91 100644 --- a/public/assets/js/tiny-cbor.0.3.2.esm.min.js +++ b/public/assets/js/tiny-cbor.0.3.2.esm.min.js @@ -5,4 +5,4 @@ * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files */ function e(e,t,r){if(t<24)return[t,1];const n=e.byteLength-r-1,o=new DataView(e.buffer,r+1);let i,u=0;switch(t){case 24:n>0&&(i=o.getUint8(0),u=2);break;case 25:n>1&&(i=o.getUint16(0,!1),u=3);break;case 26:n>3&&(i=o.getUint32(0,!1),u=5);break;case 27:if(n>7){const e=o.getBigUint64(0,!1);return e>=24n&&e<=Number.MAX_SAFE_INTEGER?[Number(e),9]:[e,9]}}if(i&&i>=24)return[i,u];throw new Error("Length not supported or not well formed")}function t(e,t){const r=e<<5;if(t<0)throw new Error("CBOR Data Item argument must not be negative");let n;if("number"==typeof t){if(!Number.isInteger(t))throw new Error("CBOR Data Item argument must be an integer");n=BigInt(t)}else n=t;if(1==e){if(0n==n)throw new Error("CBOR Data Item argument cannot be zero when negative");n-=1n}if(n>18446744073709551615n)throw new Error("CBOR number out of range");const o=new Uint8Array(8);return new DataView(o.buffer).setBigUint64(0,n,!1),n<=23?[r|o[7]]:n<=255?[24|r,o[7]]:n<=65535?[25|r,...o.slice(6)]:n<=4294967295?[26|r,...o.slice(4)]:[27|r,...o]}class r{constructor(e,t){Object.defineProperty(this,"tagId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tagValue",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.tagId=e,this.tagValue=t}get tag(){return this.tagId}get value(){return this.tagValue}}function n(t,r,n){return e(t,r,n)}function o(t,r,n){const[o,i]=e(t,r,n);if("bigint"==typeof o)throw new Error("ByteString length is too large");const u=n+i;return[new Uint8Array(t.buffer.slice(u,u+o)),i+o]}const i=new TextDecoder;const u="Map is not supported or well formed";function a(t,f){if(f>=t.byteLength)throw new Error("CBOR stream ended before tag value");const s=t.getUint8(f),c=31&s;switch(s>>5){case 0:return n(t,c,f);case 1:return function(e,t,r){const[o,i]=n(e,t,r);return"bigint"==typeof o?[-o-1n,i]:[-o-1,i]}(t,c,f);case 2:return o(t,c,f);case 3:return function(e,t,r){const[n,u]=o(e,t,r);return[i.decode(n),u]}(t,c,f);case 4:return function(t,r,n){if(0===r)return[[],1];const[o,i]=e(t,r,n);let u=i;const f=[];for(let e=0;ee.byteLength)throw new Error("CBOR stream ended before end of Float 16");const r=e.getUint16(t+1,!1);if(31744==r)return[1/0,3];if(32256==r)return[NaN,3];if(64512==r)return[-1/0,3];throw new Error("Float16 data is unsupported")}(t,f);case 26:return function(e,t){if(t+5>e.byteLength)throw new Error("CBOR stream ended before end of Float 32");return[e.getFloat32(t+1,!1),5]}(t,f);case 27:return function(e,t){if(t+9>e.byteLength)throw new Error("CBOR stream ended before end of Float 64");return[e.getFloat64(t+1,!1),9]}(t,f)}}throw new Error(`Unsupported or not well formed at ${f}`)}function f(e){if(Math.fround(e)==e||!Number.isFinite(e)||Number.isNaN(e)){const t=new Uint8Array(5);t[0]=250;return new DataView(t.buffer).setFloat32(1,e,!1),t}{const t=new Uint8Array(9);t[0]=251;return new DataView(t.buffer).setFloat64(1,e,!1),t}}const s=new TextEncoder;function c(e,n){if("boolean"!=typeof e&&null!==e&&null!=e)if("number"!=typeof e&&"bigint"!=typeof e)if("string"!=typeof e)if(e instanceof Uint8Array)!function(e,r){r.push(...t(2,e.length)),r.push(e)}(e,n);else if(Array.isArray(e))!function(e,r){r.push(...t(4,e.length));for(const t of e)c(t,r)}(e,n);else if(e instanceof Map)!function(e,r){r.push(new Uint8Array(t(5,e.size)));for(const[t,n]of e.entries())c(t,r),c(n,r)}(e,n);else{if(!(e instanceof r))throw new Error("Not implemented");!function(e,r){r.push(...t(6,e.tag)),c(e.value,r)}(e,n)}else!function(e,r){r.push(...t(3,e.length)),r.push(s.encode(e))}(e,n);else n.push(...function(e){return"number"==typeof e?Number.isSafeInteger(e)?e<0?t(1,Math.abs(e)):t(0,e):[f(e)]:e<0n?t(1,-1n*e):t(0,e)}(e));else n.push(function(e){return!0===e?245:!1===e?244:null===e?246:247}(e))}function w(e,t){if(0===e.byteLength||e.byteLength<=t||t<0)throw new Error("No data");const r=Object.getPrototypeOf(e),n=r===ArrayBuffer.prototype,o="undefined"!=typeof SharedArrayBuffer&&r===SharedArrayBuffer.prototype;if(r.constructor===Uint8Array.prototype.constructor)return a(new DataView(e.buffer),t);if(n||o)return a(new DataView(e),t);if(r===DataView.prototype)return a(e,t);throw new Error("Unsupported data type")}function l(e){const[t,r]=w(e,0);if(r!==e.byteLength)throw new Error(`Data was decoded, but the whole stream was not processed ${r} != ${e.byteLength}`);return t}function h(e){const t=[];c(e,t);let r=0;for(const e of t)r+="number"==typeof e?1:e.length;const n=new Uint8Array(r);let o=0;for(const e of t)"number"==typeof e?(n[o]=e,o+=1):(n.set(e,o),o+=e.length);return n}export{r as CBORTag,l as decodeCBOR,w as decodePartialCBOR,h as encodeCBOR};export default null; -//# sourceMappingURL=/sm/73b220a02cb5403327504918d39b24b8221ae9e78c006bcf2db82b1f8314a9bd.map \ No newline at end of file +//# sourceMappingURL=./tiny-cbor.0.3.2.esm.min.map diff --git a/public/assets/js/tiny-cbor.0.3.2.esm.min.map b/public/assets/js/tiny-cbor.0.3.2.esm.min.map new file mode 100644 index 0000000..7800f99 --- /dev/null +++ b/public/assets/js/tiny-cbor.0.3.2.esm.min.map @@ -0,0 +1 @@ +{"version":3,"sources":["jsdelivr-header.js","/npm/@levischuck/tiny-cbor@0.3.2/esm/cbor/cbor_internal.js","/npm/@levischuck/tiny-cbor@0.3.2/esm/cbor/cbor.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNO,SAAS,EAAa,EAAM,EAAU,GACzC,GAAI,EAAW,GACX,MAAO,CAAC,EAAU,GAEtB,MAAM,EAAsB,EAAK,WAAa,EAAQ,EAChD,EAAO,IAAI,SAAS,EAAK,OAAQ,EAAQ,GAC/C,IAAI,EACA,EAAQ,EACZ,OAAQ,GACJ,KAAK,GACG,EAAsB,IACtB,EAAS,EAAK,SAAS,GACvB,EAAQ,GAEZ,MAEJ,KAAK,GACG,EAAsB,IACtB,EAAS,EAAK,UAAU,GAAG,GAC3B,EAAQ,GAEZ,MAEJ,KAAK,GACG,EAAsB,IACtB,EAAS,EAAK,UAAU,GAAG,GAC3B,EAAQ,GAEZ,MAEJ,KAAK,GACD,GAAI,EAAsB,EAAG,CACzB,MAAM,EAAY,EAAK,aAAa,GAAG,GAGvC,OAAI,GAAa,KAAO,GAAa,OAAO,iBACjC,CAAC,OAAO,GAAY,GAGpB,CAAC,EAAW,EAEvC,EAII,GAAI,GAAU,GAAU,GACpB,MAAO,CAAC,EAAQ,GAEpB,MAAM,IAAI,MAAM,0CACpB,CASO,SAAS,EAAa,EAAO,GAChC,MAAM,EAAe,GAAS,EAC9B,GAAI,EAAW,EACX,MAAM,IAAI,MAAM,gDAOpB,IAAI,EACJ,GAAuB,iBAAZ,EAAsB,CAC7B,IAAK,OAAO,UAAU,GAClB,MAAM,IAAI,MAAM,8CAEpB,EAAiB,OAAO,EAChC,MAEQ,EAAiB,EAGrB,GA5BuC,GA4BnC,EAAsC,CACtC,GAAsB,IAAlB,EACA,MAAM,IAAI,MAAM,wDAEpB,GAAkC,EAC1C,CACI,GAAI,EAAiB,sBACjB,MAAM,IAAI,MAAM,4BAGpB,MAAM,EAAS,IAAI,WAAW,GAG9B,OAFa,IAAI,SAAS,EAAO,QAC5B,aAAa,EAAG,GAAgB,GACjC,GAAkB,GACX,CAAC,EAAe,EAAO,IAEzB,GAAkB,IAChB,CAAgB,GAAf,EAAmB,EAAO,IAE7B,GAAkB,MAChB,CAAgB,GAAf,KAAsB,EAAO,MAAM,IAEtC,GAAkB,WAChB,CACY,GAAf,KACG,EAAO,MAAM,IAIb,CACY,GAAf,KACG,EAGf,CCxGO,MAAM,EAQT,WAAA,CAAY,EAAK,GACb,OAAO,eAAe,KAAM,QAAS,CACjC,YAAY,EACZ,cAAc,EACd,UAAU,EACV,WAAO,IAEX,OAAO,eAAe,KAAM,WAAY,CACpC,YAAY,EACZ,cAAc,EACd,UAAU,EACV,WAAO,IAEX,KAAK,MAAQ,EACb,KAAK,SAAW,CACxB,CAII,OAAI,GACA,OAAO,KAAK,KACpB,CAII,SAAI,GACA,OAAO,KAAK,QACpB,EAEA,SAAS,EAAsB,EAAM,EAAU,GAC3C,OAAO,EAAa,EAAM,EAAU,EACxC,CAQA,SAAS,EAAiB,EAAM,EAAU,GACtC,MAAO,EAAa,GAAkB,EAAa,EAAM,EAAU,GACnE,GAA2B,iBAAhB,EACP,MAAM,IAAI,MAAM,kCAEpB,MAAM,EAAiB,EAAQ,EAC/B,MAAO,CACH,IAAI,WAAW,EAAK,OAAO,MAAM,EAAgB,EAAiB,IAClE,EAAiB,EAEzB,CACA,MAAM,EAAe,IAAI,YAuBzB,MAAM,EAAY,sCAkFlB,SAAS,EAAW,EAAM,GACtB,GAAI,GAAS,EAAK,WACd,MAAM,IAAI,MAAM,sCAEpB,MAAM,EAAO,EAAK,SAAS,GAErB,EAAkB,GAAP,EACjB,OAFkB,GAAQ,GAGtB,KDlImC,ECmI/B,OAAO,EAAsB,EAAM,EAAU,GAEjD,KDpImC,ECqI/B,OAvIZ,SAA+B,EAAM,EAAU,GAC3C,MAAO,EAAO,GAAU,EAAsB,EAAM,EAAU,GAC9D,MAAqB,iBAAV,EACA,EAAE,EAAQ,GAAI,GAElB,EAAE,EAAQ,EAAG,EACxB,CAiImB,CAAsB,EAAM,EAAU,GAEjD,KDtI8B,ECuI1B,OAAO,EAAiB,EAAM,EAAU,GAE5C,KDxI8B,ECyI1B,OA1HZ,SAAsB,EAAM,EAAU,GAClC,MAAO,EAAO,GAAU,EAAiB,EAAM,EAAU,GACzD,MAAO,CAAC,EAAa,OAAO,GAAQ,EACxC,CAuHmB,CAAa,EAAM,EAAU,GAExC,KD1IwB,EC2IpB,OAzHZ,SAAqB,EAAM,EAAU,GACjC,GAAiB,IAAb,EACA,MAAO,CAAC,GAAI,GAEhB,MAAO,EAAQ,GAAkB,EAAa,EAAM,EAAU,GAC9D,IAAI,EAAiB,EACrB,MAAM,EAAQ,GACd,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,IAAK,CAE7B,GAD4B,EAAK,WAAa,EAAQ,GAC3B,EACvB,MAAM,IAAI,MAAM,yCAEpB,MAAO,EAAc,GAAY,EAAW,EAAM,EAAQ,GAC1D,EAAM,KAAK,GACX,GAAkB,CAC1B,CACI,MAAO,CAAC,EAAO,EACnB,CAwGmB,CAAY,EAAM,EAAU,GAEvC,KD5IsB,EC6IlB,OAzGZ,SAAmB,EAAM,EAAU,GAC/B,GAAiB,IAAb,EACA,MAAO,CAAC,IAAI,IAAO,GAEvB,MAAO,EAAQ,GAAkB,EAAa,EAAM,EAAU,GAC9D,IAAI,EAAiB,EACrB,MAAM,EAAS,IAAI,IACnB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,IAAK,CAC7B,IAAI,EAAsB,EAAK,WAAa,EAAQ,EACpD,GAAI,GAAuB,EACvB,MAAM,IAAI,MAAM,GAGpB,MAAO,EAAK,GAAe,EAAW,EAAM,EAAQ,GAIpD,GAHA,GAAkB,EAClB,GAAuB,EAEnB,GAAuB,EACvB,MAAM,IAAI,MAAM,GAQpB,GAAmB,iBAAR,GAAmC,iBAAR,EAClC,MAAM,IAAI,MAAM,GAGpB,GAAI,EAAO,IAAI,GACX,MAAM,IAAI,MAAM,GAGpB,MAAO,EAAO,GAAiB,EAAW,EAAM,EAAQ,GACxD,GAAkB,EAClB,EAAO,IAAI,EAAK,EACxB,CACI,MAAO,CAAC,EAAQ,EACpB,CAkEmB,CAAU,EAAM,EAAU,GAErC,KD9IsB,EC+IlB,OAhCZ,SAAmB,EAAM,EAAU,GAC/B,MAAO,EAAK,GAAY,EAAa,EAAM,EAAU,IAC9C,EAAO,GAAc,EAAW,EAAM,EAAQ,GACrD,MAAO,CAAC,IAAI,EAAQ,EAAK,GAAQ,EAAW,EAChD,CA4BmB,CAAU,EAAM,EAAU,GAErC,KDhJkC,ECiJ9B,OAAQ,GACJ,KAAK,GACD,MAAO,EAAC,EAAO,GACnB,KAAK,GACD,MAAO,EAAC,EAAM,GAClB,KAAK,GACD,MAAO,CAAC,KAAM,GAClB,KAAK,GACD,MAAO,MAAC,EAAW,GAEvB,KAAK,GACD,OAlFpB,SAAuB,EAAM,GACzB,GAAI,EAAQ,EAAI,EAAK,WACjB,MAAM,IAAI,MAAM,4CAGpB,MAAM,EAAS,EAAK,UAAU,EAAQ,GAAG,GAEzC,GAAc,OAAV,EACA,MAAO,CAAC,IAAU,GAEjB,GAAc,OAAV,EACL,MAAO,CAAC,IAAK,GAEZ,GAAc,OAAV,EACL,MAAO,EAAC,IAAW,GAEvB,MAAM,IAAI,MAAM,8BACpB,CAiE2B,CAAc,EAAM,GAC/B,KAAK,GACD,OAlEpB,SAAuB,EAAM,GACzB,GAAI,EAAQ,EAAI,EAAK,WACjB,MAAM,IAAI,MAAM,4CAKpB,MAAO,CAFQ,EAAK,WAAW,EAAQ,GAAG,GAE1B,EACpB,CA0D2B,CAAc,EAAM,GAC/B,KAAK,GACD,OA3DpB,SAAuB,EAAM,GACzB,GAAI,EAAQ,EAAI,EAAK,WACjB,MAAM,IAAI,MAAM,4CAKpB,MAAO,CAFQ,EAAK,WAAW,EAAQ,GAAG,GAE1B,EACpB,CAmD2B,CAAc,EAAM,IAM3C,MAAM,IAAI,MAAM,qCAAqC,IACzD,CAcA,SAAS,EAAY,GACjB,GAAI,KAAK,OAAO,IAAS,IAAS,OAAO,SAAS,IAAS,OAAO,MAAM,GAAO,CAE3E,MAAM,EAAS,IAAI,WAAW,GAC9B,EAAO,GAAK,IAGZ,OAFa,IAAI,SAAS,EAAO,QAC5B,WAAW,EAAG,GAAM,GAClB,CACf,CACS,CAED,MAAM,EAAS,IAAI,WAAW,GAC9B,EAAO,GAAK,IAGZ,OAFa,IAAI,SAAS,EAAO,QAC5B,WAAW,EAAG,GAAM,GAClB,CACf,CACA,CAuBA,MAAM,EAAU,IAAI,YA0BpB,SAAS,EAAkB,EAAM,GAC7B,GAAmB,kBAAR,GAA8B,OAAT,GAAyB,MAAR,EAIjD,GAAmB,iBAAR,GAAmC,iBAAR,EAItC,GAAmB,iBAAR,EAIX,GAAI,aAAgB,YAlCxB,SAAqB,EAAM,GACvB,EAAO,QAAQ,EDxOmB,ECwOkB,EAAK,SACzD,EAAO,KAAK,EAChB,CAgCQ,CAAY,EAAM,QAGtB,GAAI,MAAM,QAAQ,IAlCtB,SAAqB,EAAM,GACvB,EAAO,QAAQ,ED1Oa,EC0OkB,EAAK,SACnD,IAAK,MAAM,KAAW,EAClB,EAAkB,EAAS,EAEnC,CA8BQ,CAAY,EAAM,QAGtB,GAAI,aAAgB,KAhCxB,SAAmB,EAAM,GACrB,EAAO,KAAK,IAAI,WAAW,ED/OD,EC+O8B,EAAK,QAC7D,IAAK,MAAO,EAAK,KAAU,EAAK,UAC5B,EAAkB,EAAK,GACvB,EAAkB,EAAO,EAEjC,CA2BQ,CAAU,EAAM,OADpB,CAIA,KAAI,aAAgB,GAIpB,MAAM,IAAI,MAAM,oBAjCpB,SAAmB,EAAK,GACpB,EAAO,QAAQ,EDrPW,ECqPkB,EAAI,MAChD,EAAkB,EAAI,MAAO,EACjC,CA2BQ,CAAU,EAAM,EAFxB,MAjDA,SAAsB,EAAM,GACxB,EAAO,QAAQ,EDnOmB,ECmOkB,EAAK,SACzD,EAAO,KAAK,EAAQ,OAAO,GAC/B,CAgCQ,CAAa,EAAM,QAJnB,EAAO,QAtDf,SAAsB,GAClB,MAAmB,iBAAR,EACH,OAAO,cAAc,GAEjB,EAAO,EACA,EDlNoB,ECkNsB,KAAK,IAAI,IAGnD,EDtNoB,ECsNsB,GAGlD,CAAC,EAAY,IAGhB,EAAO,GACA,ED5NwB,GC4N0B,GAAR,GAG1C,EDhOwB,ECgOkB,EAG7D,CAiCuB,CAAa,SAJ5B,EAAO,KAjFf,SAAsB,GAClB,OAAa,IAAT,EACO,KAEO,IAAT,EACE,IAEO,OAAT,EACE,IAGJ,GACX,CAqEoB,CAAa,GA4BjC,CAoBO,SAAS,EAAkB,EAAM,GACpC,GAAwB,IAApB,EAAK,YAAoB,EAAK,YAAc,GAAS,EAAQ,EAC7D,MAAM,IAAI,MAAM,WAEpB,MAAM,EAAY,OAAO,eAAe,GAClC,EAAgB,IAAc,YAAY,UAE1C,EAAmD,oBAAtB,mBAC/B,IAAc,kBAAkB,UACpC,GAAI,EAAU,cAAgB,WAAW,UAAU,YAC/C,OAAO,EAAW,IAAI,SAAS,EAAK,QAAS,GAE5C,GAAI,GAAiB,EACtB,OAAO,EAAW,IAAI,SAAS,GAAO,GAErC,GAAI,IAAc,SAAS,UAC5B,OAAO,EAAW,EAAM,GAGxB,MAAM,IAAI,MAAM,wBAExB,CAyBO,SAAS,EAAW,GACvB,MAAO,EAAO,GAAU,EAAkB,EAAM,GAChD,GAAI,IAAW,EAAK,WAChB,MAAM,IAAI,MAAM,4DAA4D,QAAa,EAAK,cAElG,OAAO,CACX,CAuBO,SAAS,EAAW,GACvB,MAAM,EAAU,GAChB,EAAkB,EAAM,GACxB,IAAI,EAAS,EACb,IAAK,MAAM,KAAU,EAEb,GADiB,iBAAV,EACG,EAGA,EAAO,OAGzB,MAAM,EAAS,IAAI,WAAW,GAC9B,IAAI,EAAQ,EACZ,IAAK,MAAM,KAAU,EACI,iBAAV,GACP,EAAO,GAAS,EAChB,GAAS,IAGT,EAAO,IAAI,EAAQ,GACnB,GAAS,EAAO,QAGxB,OAAO,CACX,Q","file":"/npm/@levischuck/tiny-cbor@0.3.2/esm/index.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/@levischuck/tiny-cbor@0.3.2/esm/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export function decodeLength(data, argument, index) {\n if (argument < 24) {\n return [argument, 1];\n }\n const remainingDataLength = data.byteLength - index - 1;\n const view = new DataView(data.buffer, index + 1);\n let output;\n let bytes = 0;\n switch (argument) {\n case 24: {\n if (remainingDataLength > 0) {\n output = view.getUint8(0);\n bytes = 2;\n }\n break;\n }\n case 25: {\n if (remainingDataLength > 1) {\n output = view.getUint16(0, false);\n bytes = 3;\n }\n break;\n }\n case 26: {\n if (remainingDataLength > 3) {\n output = view.getUint32(0, false);\n bytes = 5;\n }\n break;\n }\n case 27: {\n if (remainingDataLength > 7) {\n const bigOutput = view.getBigUint64(0, false);\n // Bound it to [24, MAX_SAFE_INTEGER], where it is safe\n // to encode as a javascript number\n if (bigOutput >= 24n && bigOutput <= Number.MAX_SAFE_INTEGER) {\n return [Number(bigOutput), 9];\n }\n else {\n return [bigOutput, 9];\n }\n }\n break;\n }\n }\n if (output && output >= 24) {\n return [output, bytes];\n }\n throw new Error(\"Length not supported or not well formed\");\n}\nexport const MAJOR_TYPE_UNSIGNED_INTEGER = 0;\nexport const MAJOR_TYPE_NEGATIVE_INTEGER = 1;\nexport const MAJOR_TYPE_BYTE_STRING = 2;\nexport const MAJOR_TYPE_TEXT_STRING = 3;\nexport const MAJOR_TYPE_ARRAY = 4;\nexport const MAJOR_TYPE_MAP = 5;\nexport const MAJOR_TYPE_TAG = 6;\nexport const MAJOR_TYPE_SIMPLE_OR_FLOAT = 7;\nexport function encodeLength(major, argument) {\n const majorEncoded = major << 5;\n if (argument < 0) {\n throw new Error(\"CBOR Data Item argument must not be negative\");\n }\n // Convert to bigint first.\n // Encode integers around and above 32 bits in big endian / network byte order\n // is unreliable in javascript.\n // https://tc39.es/ecma262/#sec-bitwise-shift-operators\n // Bit shifting operations result in 32 bit signed numbers\n let bigintArgument;\n if (typeof argument == \"number\") {\n if (!Number.isInteger(argument)) {\n throw new Error(\"CBOR Data Item argument must be an integer\");\n }\n bigintArgument = BigInt(argument);\n }\n else {\n bigintArgument = argument;\n }\n // Negative 0 is not a thing\n if (major == MAJOR_TYPE_NEGATIVE_INTEGER) {\n if (bigintArgument == 0n) {\n throw new Error(\"CBOR Data Item argument cannot be zero when negative\");\n }\n bigintArgument = bigintArgument - 1n;\n }\n if (bigintArgument > 18446744073709551615n) {\n throw new Error(\"CBOR number out of range\");\n }\n // Encode into 64 bits and extract the tail\n const buffer = new Uint8Array(8);\n const view = new DataView(buffer.buffer);\n view.setBigUint64(0, bigintArgument, false);\n if (bigintArgument <= 23) {\n return [majorEncoded | buffer[7]];\n }\n else if (bigintArgument <= 255) {\n return [majorEncoded | 24, buffer[7]];\n }\n else if (bigintArgument <= 65535) {\n return [majorEncoded | 25, ...buffer.slice(6)];\n }\n else if (bigintArgument <= 4294967295) {\n return [\n majorEncoded | 26,\n ...buffer.slice(4),\n ];\n }\n else {\n return [\n majorEncoded | 27,\n ...buffer,\n ];\n }\n}\n","import { decodeLength, encodeLength, MAJOR_TYPE_ARRAY, MAJOR_TYPE_BYTE_STRING, MAJOR_TYPE_MAP, MAJOR_TYPE_NEGATIVE_INTEGER, MAJOR_TYPE_SIMPLE_OR_FLOAT, MAJOR_TYPE_TAG, MAJOR_TYPE_TEXT_STRING, MAJOR_TYPE_UNSIGNED_INTEGER, } from \"./cbor_internal.js\";\n/**\n * A value which is wrapped with a CBOR Tag.\n * Several tags are registered with defined meanings like 0 for a date string.\n * These meanings are **not interpreted** when decoded or encoded.\n *\n * This class is an immutable record.\n * If the tag number or value needs to change, then construct a new tag\n */\nexport class CBORTag {\n /**\n * Wrap a value with a tag number.\n * When encoded, this tag will be attached to the value.\n *\n * @param tag Tag number\n * @param value Wrapped value\n */\n constructor(tag, value) {\n Object.defineProperty(this, \"tagId\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"tagValue\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.tagId = tag;\n this.tagValue = value;\n }\n /**\n * Read the tag number\n */\n get tag() {\n return this.tagId;\n }\n /**\n * Read the value\n */\n get value() {\n return this.tagValue;\n }\n}\nfunction decodeUnsignedInteger(data, argument, index) {\n return decodeLength(data, argument, index);\n}\nfunction decodeNegativeInteger(data, argument, index) {\n const [value, length] = decodeUnsignedInteger(data, argument, index);\n if (typeof value === \"bigint\") {\n return [-value - 1n, length];\n }\n return [-value - 1, length];\n}\nfunction decodeByteString(data, argument, index) {\n const [lengthValue, lengthConsumed] = decodeLength(data, argument, index);\n if (typeof lengthValue === \"bigint\") {\n throw new Error(\"ByteString length is too large\");\n }\n const dataStartIndex = index + lengthConsumed;\n return [\n new Uint8Array(data.buffer.slice(dataStartIndex, dataStartIndex + lengthValue)),\n lengthConsumed + lengthValue,\n ];\n}\nconst TEXT_DECODER = new TextDecoder();\nfunction decodeString(data, argument, index) {\n const [value, length] = decodeByteString(data, argument, index);\n return [TEXT_DECODER.decode(value), length];\n}\nfunction decodeArray(data, argument, index) {\n if (argument === 0) {\n return [[], 1];\n }\n const [length, lengthConsumed] = decodeLength(data, argument, index);\n let consumedLength = lengthConsumed;\n const value = [];\n for (let i = 0; i < length; i++) {\n const remainingDataLength = data.byteLength - index - consumedLength;\n if (remainingDataLength <= 0) {\n throw new Error(\"array is not supported or well formed\");\n }\n const [decodedValue, consumed] = decodeNext(data, index + consumedLength);\n value.push(decodedValue);\n consumedLength += consumed;\n }\n return [value, consumedLength];\n}\nconst MAP_ERROR = \"Map is not supported or well formed\";\nfunction decodeMap(data, argument, index) {\n if (argument === 0) {\n return [new Map(), 1];\n }\n const [length, lengthConsumed] = decodeLength(data, argument, index);\n let consumedLength = lengthConsumed;\n const result = new Map();\n for (let i = 0; i < length; i++) {\n let remainingDataLength = data.byteLength - index - consumedLength;\n if (remainingDataLength <= 0) {\n throw new Error(MAP_ERROR);\n }\n // Load key\n const [key, keyConsumed] = decodeNext(data, index + consumedLength);\n consumedLength += keyConsumed;\n remainingDataLength -= keyConsumed;\n // Check that there's enough to have a value\n if (remainingDataLength <= 0) {\n throw new Error(MAP_ERROR);\n }\n // Technically CBOR maps can have any type as the key, and so can JS Maps\n // However, JS Maps can only reference such keys as references which would\n // require key iteration and pattern matching.\n // For simplicity, since such keys are not in use with WebAuthn, this\n // capability is not implemented and the types are restricted to strings\n // and numbers.\n if (typeof key !== \"string\" && typeof key !== \"number\") {\n throw new Error(MAP_ERROR);\n }\n // CBOR Maps are not well formed if there are duplicate keys\n if (result.has(key)) {\n throw new Error(MAP_ERROR);\n }\n // Load value\n const [value, valueConsumed] = decodeNext(data, index + consumedLength);\n consumedLength += valueConsumed;\n result.set(key, value);\n }\n return [result, consumedLength];\n}\nfunction decodeFloat16(data, index) {\n if (index + 3 > data.byteLength) {\n throw new Error(\"CBOR stream ended before end of Float 16\");\n }\n // Skip the first byte\n const result = data.getUint16(index + 1, false);\n // A minimal selection of supported values\n if (result == 0x7c00) {\n return [Infinity, 3];\n }\n else if (result == 0x7e00) {\n return [NaN, 3];\n }\n else if (result == 0xfc00) {\n return [-Infinity, 3];\n }\n throw new Error(\"Float16 data is unsupported\");\n}\nfunction decodeFloat32(data, index) {\n if (index + 5 > data.byteLength) {\n throw new Error(\"CBOR stream ended before end of Float 32\");\n }\n // Skip the first byte\n const result = data.getFloat32(index + 1, false);\n // First byte + 4 byte float\n return [result, 5];\n}\nfunction decodeFloat64(data, index) {\n if (index + 9 > data.byteLength) {\n throw new Error(\"CBOR stream ended before end of Float 64\");\n }\n // Skip the first byte\n const result = data.getFloat64(index + 1, false);\n // First byte + 8 byte float\n return [result, 9];\n}\nfunction decodeTag(data, argument, index) {\n const [tag, tagBytes] = decodeLength(data, argument, index);\n const [value, valueBytes] = decodeNext(data, index + tagBytes);\n return [new CBORTag(tag, value), tagBytes + valueBytes];\n}\nfunction decodeNext(data, index) {\n if (index >= data.byteLength) {\n throw new Error(\"CBOR stream ended before tag value\");\n }\n const byte = data.getUint8(index);\n const majorType = byte >> 5;\n const argument = byte & 0x1f;\n switch (majorType) {\n case MAJOR_TYPE_UNSIGNED_INTEGER: {\n return decodeUnsignedInteger(data, argument, index);\n }\n case MAJOR_TYPE_NEGATIVE_INTEGER: {\n return decodeNegativeInteger(data, argument, index);\n }\n case MAJOR_TYPE_BYTE_STRING: {\n return decodeByteString(data, argument, index);\n }\n case MAJOR_TYPE_TEXT_STRING: {\n return decodeString(data, argument, index);\n }\n case MAJOR_TYPE_ARRAY: {\n return decodeArray(data, argument, index);\n }\n case MAJOR_TYPE_MAP: {\n return decodeMap(data, argument, index);\n }\n case MAJOR_TYPE_TAG: {\n return decodeTag(data, argument, index);\n }\n case MAJOR_TYPE_SIMPLE_OR_FLOAT: {\n switch (argument) {\n case 20:\n return [false, 1];\n case 21:\n return [true, 1];\n case 22:\n return [null, 1];\n case 23:\n return [undefined, 1];\n // 24: Simple value (value 32..255 in following byte)\n case 25: // IEEE 754 Half-Precision Float (16 bits follow)\n return decodeFloat16(data, index);\n case 26: // IEEE 754 Single-Precision Float (32 bits follow)\n return decodeFloat32(data, index);\n case 27: // IEEE 754 Double-Precision Float (64 bits follow)\n return decodeFloat64(data, index);\n // 28-30: Reserved, not well-formed in the present document\n // 31: \"break\" stop code for indefinite-length items\n }\n }\n }\n throw new Error(`Unsupported or not well formed at ${index}`);\n}\nfunction encodeSimple(data) {\n if (data === true) {\n return 0xf5;\n }\n else if (data === false) {\n return 0xf4;\n }\n else if (data === null) {\n return 0xf6;\n }\n // Else undefined\n return 0xf7;\n}\nfunction encodeFloat(data) {\n if (Math.fround(data) == data || !Number.isFinite(data) || Number.isNaN(data)) {\n // Float32\n const output = new Uint8Array(5);\n output[0] = 0xfa;\n const view = new DataView(output.buffer);\n view.setFloat32(1, data, false);\n return output;\n }\n else {\n // Float64\n const output = new Uint8Array(9);\n output[0] = 0xfb;\n const view = new DataView(output.buffer);\n view.setFloat64(1, data, false);\n return output;\n }\n}\nfunction encodeNumber(data) {\n if (typeof data == \"number\") {\n if (Number.isSafeInteger(data)) {\n // Encode integer\n if (data < 0) {\n return encodeLength(MAJOR_TYPE_NEGATIVE_INTEGER, Math.abs(data));\n }\n else {\n return encodeLength(MAJOR_TYPE_UNSIGNED_INTEGER, data);\n }\n }\n return [encodeFloat(data)];\n }\n else {\n if (data < 0n) {\n return encodeLength(MAJOR_TYPE_NEGATIVE_INTEGER, data * -1n);\n }\n else {\n return encodeLength(MAJOR_TYPE_UNSIGNED_INTEGER, data);\n }\n }\n}\nconst ENCODER = new TextEncoder();\nfunction encodeString(data, output) {\n output.push(...encodeLength(MAJOR_TYPE_TEXT_STRING, data.length));\n output.push(ENCODER.encode(data));\n}\nfunction encodeBytes(data, output) {\n output.push(...encodeLength(MAJOR_TYPE_BYTE_STRING, data.length));\n output.push(data);\n}\nfunction encodeArray(data, output) {\n output.push(...encodeLength(MAJOR_TYPE_ARRAY, data.length));\n for (const element of data) {\n encodePartialCBOR(element, output);\n }\n}\nfunction encodeMap(data, output) {\n output.push(new Uint8Array(encodeLength(MAJOR_TYPE_MAP, data.size)));\n for (const [key, value] of data.entries()) {\n encodePartialCBOR(key, output);\n encodePartialCBOR(value, output);\n }\n}\nfunction encodeTag(tag, output) {\n output.push(...encodeLength(MAJOR_TYPE_TAG, tag.tag));\n encodePartialCBOR(tag.value, output);\n}\nfunction encodePartialCBOR(data, output) {\n if (typeof data == \"boolean\" || data === null || data == undefined) {\n output.push(encodeSimple(data));\n return;\n }\n if (typeof data == \"number\" || typeof data == \"bigint\") {\n output.push(...encodeNumber(data));\n return;\n }\n if (typeof data == \"string\") {\n encodeString(data, output);\n return;\n }\n if (data instanceof Uint8Array) {\n encodeBytes(data, output);\n return;\n }\n if (Array.isArray(data)) {\n encodeArray(data, output);\n return;\n }\n if (data instanceof Map) {\n encodeMap(data, output);\n return;\n }\n if (data instanceof CBORTag) {\n encodeTag(data, output);\n return;\n }\n throw new Error(\"Not implemented\");\n}\n/**\n * Like {decodeCBOR}, but the length of the data is unknown and there is likely\n * more -- possibly unrelated non-CBOR -- data afterwards.\n *\n * Examples:\n *\n * ```ts\n * import {decodePartialCBOR} from './cbor.ts'\n * decodePartialCBOR(new Uint8Array([1, 2, 245, 3, 4]), 2)\n * // returns [true, 1]\n * // It did not decode the leading [1, 2] or trailing [3, 4]\n * ```\n *\n * @param data a data stream to read data from\n * @param index where to start reading in the data stream\n * @returns a tuple of the value followed by bytes read.\n * @throws {Error}\n * When the data stream ends early or the CBOR data is not well formed\n */\nexport function decodePartialCBOR(data, index) {\n if (data.byteLength === 0 || data.byteLength <= index || index < 0) {\n throw new Error(\"No data\");\n }\n const prototype = Object.getPrototypeOf(data);\n const isArrayBuffer = prototype === ArrayBuffer.prototype;\n // SharedArrayBuffer only exists when the page is viewed from a secure context.\n const isSharedArrayBuffer = typeof SharedArrayBuffer !== \"undefined\" &&\n prototype === SharedArrayBuffer.prototype;\n if (prototype.constructor === Uint8Array.prototype.constructor) {\n return decodeNext(new DataView(data.buffer), index);\n }\n else if (isArrayBuffer || isSharedArrayBuffer) {\n return decodeNext(new DataView(data), index);\n }\n else if (prototype === DataView.prototype) {\n return decodeNext(data, index);\n }\n else {\n throw new Error(\"Unsupported data type\");\n }\n}\n/**\n * Decode CBOR data from a binary stream\n *\n * The entire data stream from [0, length) will be consumed.\n * If you require a partial decoding, see {decodePartialCBOR}.\n *\n * Examples:\n *\n * ```ts\n * import {decodeCBOR, CBORTag, CBORType} from './cbor.ts'\n * decodeCBOR(new Uint8Array([162, 99, 107, 101, 121, 101, 118, 97, 108, 117, 101, 1, 109, 97, 110, 111, 116, 104, 101, 114, 32, 118, 97, 108, 117, 101]));\n * // returns new Map([\n * // [\"key\", \"value\"],\n * // [1, \"another value\"]\n * // ]);\n *\n * const taggedItem = new Uint8Array([217, 4, 210, 101, 104, 101, 108, 108, 111]);\n * decodeCBOR(new DataView(taggedItem.buffer))\n * // returns new CBORTag(1234, \"hello\")\n * ```\n *\n * @param data a data stream, multiple types are supported\n * @returns\n */\nexport function decodeCBOR(data) {\n const [value, length] = decodePartialCBOR(data, 0);\n if (length !== data.byteLength) {\n throw new Error(`Data was decoded, but the whole stream was not processed ${length} != ${data.byteLength}`);\n }\n return value;\n}\n/**\n * Encode a supported structure to a CBOR byte string.\n *\n * Example:\n *\n * ```ts\n * import {encodeCBOR, CBORType, CBORTag} from './cbor.ts'\n * encodeCBOR(new Map([\n * [\"key\", \"value\"],\n * [1, \"another value\"]\n * ]));\n * // returns new Uint8Array([162, 99, 107, 101, 121, 101, 118, 97, 108, 117, 101, 1, 109, 97, 110, 111, 116, 104, 101, 114, 32 118, 97, 108, 117, 101])\n *\n * encodeCBOR(new CBORTag(1234, \"hello\"))\n * // returns new UInt8Array([217, 4, 210, 101, 104, 101, 108, 108, 111])\n * ```\n *\n * @param data Data to encode\n * @returns A byte string as a Uint8Array\n * @throws Error\n * if unsupported data is found during encoding\n */\nexport function encodeCBOR(data) {\n const results = [];\n encodePartialCBOR(data, results);\n let length = 0;\n for (const result of results) {\n if (typeof result == \"number\") {\n length += 1;\n }\n else {\n length += result.length;\n }\n }\n const output = new Uint8Array(length);\n let index = 0;\n for (const result of results) {\n if (typeof result == \"number\") {\n output[index] = result;\n index += 1;\n }\n else {\n output.set(result, index);\n index += result.length;\n }\n }\n return output;\n}\n"]} \ No newline at end of file diff --git a/public/assets/js/tiny-encodings.0.2.11.esm.min.js b/public/assets/js/tiny-encodings.0.2.11.esm.min.js index 1df9fce..91f5182 100644 --- a/public/assets/js/tiny-encodings.0.2.11.esm.min.js +++ b/public/assets/js/tiny-encodings.0.2.11.esm.min.js @@ -5,4 +5,4 @@ * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files */ function t(t){if(t instanceof DataView)return t;if(t instanceof Uint8Array||t instanceof Int8Array||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Uint8ClampedArray||t instanceof Float32Array||t instanceof Float64Array||t instanceof BigInt64Array||t instanceof BigUint64Array)return new DataView(t.buffer);if(t instanceof ArrayBuffer)return new DataView(t);throw new Error("Unsupported type")}const n=new TextDecoder,e=new TextEncoder,r=e.encode("0123456789ABCDEF"),i=new Uint8Array(256);function o(t){if(0==t.byteLength)return"";const e=t.byteLength,i=new Uint8Array(2*t.byteLength);for(let n=0,o=0;n>4],i[o+1]=r[15&e]}return n.decode(i)}function a(t){if(t instanceof Uint8Array||t instanceof Int8Array||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Uint8ClampedArray||t instanceof Float32Array||t instanceof Float64Array||t instanceof BigInt64Array||t instanceof BigUint64Array)return o(new DataView(t.buffer));if(t instanceof ArrayBuffer)return o(new DataView(t));if(t instanceof DataView)return o(t);throw new Error("Bad input to encodeHex")}const f="Bad input to decodeHex";function c(t){if(""==t)return new Uint8Array;const n=e.encode(t);let r=0,o=!1;if(1&n.length)throw new Error(f);if(0==i[0])for(let t=0;t<256;t++)i[t]=t>=48&&t<=57?t-48:t>=65&&t<=70?t-55:t>=97&&t<=102?t-87:255;const a=new Uint8Array(Math.ceil(t.length/2));for(let t=0;t>2],s[y+1]=r[(3&n)<<4|(240&e)>>4],s[y+2]=r[(15&e)<<2|(192&i)>>6],s[y+3]=r[63&i],y+=4}if(1==c){const t=o.getUint8(f);s[y]=r[(252&t)>>2],s[y+1]=r[(3&t)<<4],i&&(s[y+2]=61,s[y+3]=61)}else if(2==c){const t=o.getUint8(f),n=o.getUint8(f+1);s[y]=r[(252&t)>>2],s[y+1]=r[(3&t)<<4|(240&n)>>4],s[y+2]=r[(15&n)<<2],i&&(s[y+3]=61)}return n.decode(s)}function h(t){return A(t,y,!0)}function U(t){return A(t,g,!1)}function b(t,e,r,i,o){let a=0,f=null;const c=e-r;for(let n=0;n>4,i[a+1]=(15&r)<<4|(60&c)>>2,i[a+2]=(3&c)<<6|s,255==e||255==r||255==c||255==s){f=n;break}}if(null!=f)throw new Error("Unsupported characters in base64: "+n.decode(new Uint8Array([t[f],t[f+1],t[f+2],t[f+3]])));if(2==r){const r=t[e-2],f=t[e-1],c=o[r],s=o[f];if(255==(c|s))throw new Error("Unsupported characters in base64: "+n.decode(new Uint8Array([r,f]))+JSON.stringify([c,s]));if(i[a]=c<<2|(48&s)>>4,15&s)throw new Error("Mangled Base64 padding")}else if(3==r){const r=t[e-3],f=t[e-2],c=t[e-1],s=o[r],y=o[f],u=o[c];if(255==(s|y|u))throw new Error("Unsupported characters in base64: "+n.decode(new Uint8Array([r,f,c]))+JSON.stringify([s,y,u]));if(i[a]=s<<2|(48&y)>>4,i[a+1]=(15&y)<<4|(60&u)>>2,3&u)throw new Error("Mangled Base64 padding")}}function d(t){let n=t.length;for(let e=n-1;e>=0;e--)61==t[e]&&(n=e);const e=n%4;let r;if(2==e)r=(n-2)/4*3+1;else if(3==e)r=(n-3)/4*3+2;else{if(0!=e)throw new Error("Invalid base64 length");r=n/4*3}return[n,e,r]}function I(t){if("string"!=typeof t)throw new Error("Expecting a string");if(0==t.length)return new Uint8Array([]);if(0==u[0]){for(let t=0;t<256;t++)u[t]=255;for(let t=0;t<64;t++)u[s.charCodeAt(t)]=t}const n=e.encode(t),[r,i,o]=d(n),a=new Uint8Array(o);return b(n,r,i,a,u),a}function p(t){if("string"!=typeof t)throw new Error("Expecting a string");if(0==t.length)return new Uint8Array([]);if(0==l[0]){for(let t=0;t<256;t++)l[t]=255;for(let t=0;t<64;t++)l[w.charCodeAt(t)]=t}const n=e.encode(t),[r,i,o]=d(n),a=new Uint8Array(o);return b(n,r,i,a,l),a}const E=new Uint8Array(2);function L(){return 0!=E[1]}function B(){return 0!=E[0]}function F(){return L()?"big":"little"}function m(t,n,e,r){const i=new Uint8Array(t.byteLength),o=new DataView(i.buffer),a=t.length,f="little"==n;for(let n=0,i=0;nt.setUint16(n,e,r))):t instanceof Int16Array?m(t,n,2,((t,n,e,r)=>t.setInt16(n,e,r))):t instanceof Uint32Array?m(t,n,4,((t,n,e,r)=>t.setUint32(n,e,r))):t instanceof Int32Array?m(t,n,4,((t,n,e,r)=>t.setInt32(n,e,r))):t instanceof BigUint64Array?m(t,n,8,((t,n,e,r)=>t.setBigUint64(n,e,r))):t instanceof BigInt64Array?m(t,n,8,((t,n,e,r)=>t.setBigInt64(n,e,r))):t instanceof Float32Array?m(t,n,4,((t,n,e,r)=>t.setFloat32(n,e,r))):t instanceof Float64Array?m(t,n,8,((t,n,e,r)=>t.setFloat64(n,e,r))):new Uint8Array(t.buffer)}function x(n,e,r){const i=t(n),o="little"==e;if("int8"==r)return D(i,o,1,new Int8Array(i.byteLength),((t,n,e)=>t.getInt8(n)));if("uint16"==r){if(1&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,2,new Uint16Array(i.byteLength>>>1),((t,n,e)=>t.getUint16(n,e)))}if("int16"==r){if(1&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,2,new Int16Array(i.byteLength>>>1),((t,n,e)=>t.getInt16(n,e)))}if("uint32"==r){if(3&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,4,new Uint32Array(i.byteLength>>>2),((t,n,e)=>t.getUint32(n,e)))}if("int32"==r){if(3&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,4,new Int32Array(i.byteLength>>>2),((t,n,e)=>t.getInt32(n,e)))}if("uint64"==r){if(7&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,8,new BigUint64Array(i.byteLength>>>3),((t,n,e)=>t.getBigUint64(n,e)))}if("int64"==r){if(7&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,8,new BigInt64Array(i.byteLength>>>3),((t,n,e)=>t.getBigInt64(n,e)))}if("float32"==r){if(3&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,4,new Float32Array(i.byteLength>>>2),((t,n,e)=>t.getFloat32(n,e)))}if("float64"==r){if(7&i.byteLength)throw new Error("Incomplete byte sequence");return D(i,o,8,new Float64Array(i.byteLength>>>3),((t,n,e)=>t.getFloat64(n,e)))}return new Uint8Array(i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength))}new Uint16Array(E.buffer)[0]=1;export{x as arrayFromEndian,q as arrayToEndian,I as decodeBase64,p as decodeBase64Url,c as decodeHex,h as encodeBase64,U as encodeBase64Url,a as encodeHex,F as hostEndianness,L as hostIsBigEndian,B as hostIsLittleEndian};export default null; -//# sourceMappingURL=/sm/80d9c0abfbcfb460a923312f768f74a5eaa9e83f32477d78942e3f831ec9e1fd.map \ No newline at end of file +//# sourceMappingURL=./tiny-encodings.0.2.11.esm.min.map diff --git a/public/assets/js/tiny-encodings.0.2.11.esm.min.map b/public/assets/js/tiny-encodings.0.2.11.esm.min.map new file mode 100644 index 0000000..c343576 --- /dev/null +++ b/public/assets/js/tiny-encodings.0.2.11.esm.min.map @@ -0,0 +1 @@ +{"version":3,"sources":["jsdelivr-header.js","/npm/@levischuck/tiny-encodings@0.2.11/esm/internal.js","/npm/@levischuck/tiny-encodings@0.2.11/esm/encoding.js","/npm/@levischuck/tiny-encodings@0.2.11/esm/endianness_internal.js","/npm/@levischuck/tiny-encodings@0.2.11/esm/endianness.js"],"names":[],"mappings":"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","file":"/npm/@levischuck/tiny-encodings@0.2.11/esm/index.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/@levischuck/tiny-encodings@0.2.11/esm/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export function bufferToDataView(v) {\n if (v instanceof DataView) {\n return v;\n }\n else if (v instanceof Uint8Array ||\n v instanceof Int8Array ||\n v instanceof Int16Array ||\n v instanceof Uint16Array ||\n v instanceof Int32Array ||\n v instanceof Uint32Array ||\n v instanceof Uint8ClampedArray ||\n v instanceof Float32Array ||\n v instanceof Float64Array ||\n v instanceof BigInt64Array ||\n v instanceof BigUint64Array) {\n return new DataView(v.buffer);\n }\n else if (v instanceof ArrayBuffer) {\n return new DataView(v);\n }\n throw new Error(\"Unsupported type\");\n}\n","import { bufferToDataView } from \"./internal.js\";\nconst DECODER = new TextDecoder();\nconst ENCODER = new TextEncoder();\nconst HEX = ENCODER.encode(\"0123456789ABCDEF\");\nconst HEX_CACHE = new Uint8Array(256);\nfunction encodeHexFromView(view) {\n if (view.byteLength == 0) {\n return \"\";\n }\n const length = view.byteLength;\n const hexBytes = new Uint8Array(view.byteLength * 2);\n for (let index = 0, outIndex = 0; index < length; index++, outIndex += 2) {\n const byte = view.getUint8(index);\n hexBytes[outIndex] = HEX[(byte & 0xF0) >> 4];\n hexBytes[outIndex + 1] = HEX[byte & 0x0F];\n }\n return DECODER.decode(hexBytes);\n}\n/**\n * Encode a data view, typed array, or array buffer as a hex string\n *\n * Note that multi-byte types will be encoded according to the process's\n * endianness. Therefore, for portability, it is recommended to use\n * `arrayToEndian` on multi-byte typed arrays, such as Uint32Array before\n * encoding as hex.\n *\n * @param array input array to encode\n * @returns a string which when decoded as hex will have the same bytes as was\n * input.\n */\nexport function encodeHex(array) {\n if (array instanceof Uint8Array ||\n array instanceof Int8Array ||\n array instanceof Int16Array ||\n array instanceof Uint16Array ||\n array instanceof Int32Array ||\n array instanceof Uint32Array ||\n array instanceof Uint8ClampedArray ||\n array instanceof Float32Array ||\n array instanceof Float64Array ||\n array instanceof BigInt64Array ||\n array instanceof BigUint64Array) {\n return encodeHexFromView(new DataView(array.buffer));\n }\n else if (array instanceof ArrayBuffer) {\n return encodeHexFromView(new DataView(array));\n }\n else if (array instanceof DataView) {\n return encodeHexFromView(array);\n }\n else {\n throw new Error(\"Bad input to encodeHex\");\n }\n}\nconst BAD_INPUT_HEX = \"Bad input to decodeHex\";\n/**\n * Decode a hex string into a Uint8Array\n *\n * Will throw when the input text has non hex characters, including spaces,\n * or when the input text has a length which is not even.\n *\n * Upper and lower A-F are accepted.\n * Characters outside of 0-9, A-F, a-f will throw.\n *\n * @param text input text of hex characters\n * @returns a decoded Uint8Array\n */\nexport function decodeHex(text) {\n if (text == \"\") {\n return new Uint8Array();\n }\n const hexBytes = ENCODER.encode(text);\n let index = 0;\n let badHex = false;\n if (hexBytes.length & 1) {\n // Only even lengths\n throw new Error(BAD_INPUT_HEX);\n }\n if (HEX_CACHE[0] == 0) {\n for (let i = 0; i < 256; i++) {\n if (i >= 48 && i <= 57) {\n HEX_CACHE[i] = i - 48;\n }\n else if (i >= 65 && i <= 70) {\n HEX_CACHE[i] = i - 55;\n }\n else if (i >= 97 && i <= 102) {\n HEX_CACHE[i] = i - 87;\n }\n else {\n HEX_CACHE[i] = 255;\n }\n }\n }\n const bytes = new Uint8Array(Math.ceil(text.length / 2));\n for (let i = 0; i < hexBytes.length; i += 2, index++) {\n const leftHex = hexBytes[i];\n const rightHex = hexBytes[i + 1];\n const left = HEX_CACHE[leftHex];\n const right = HEX_CACHE[rightHex];\n bytes[index] = left << 4 | right;\n if (left == 255 || right == 255) {\n badHex = true;\n break;\n }\n }\n if (badHex) {\n throw new Error(BAD_INPUT_HEX);\n }\n return bytes;\n}\nfunction encodeBase64Length(bufferLength, padding) {\n const chunks = Math.ceil(bufferLength / 3);\n const withPadding = chunks * 4;\n const mod3 = bufferLength % 3;\n const completeChunks = mod3 == 0 ? bufferLength : (bufferLength - mod3);\n if (padding || mod3 == 0) {\n return [withPadding, completeChunks, mod3];\n }\n if (mod3 == 1) {\n return [withPadding - 2, completeChunks, mod3];\n }\n // mod3 == 2\n return [withPadding - 1, completeChunks, mod3];\n}\nconst BASE64_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst BASE64_OUT = ENCODER.encode(BASE64_ALPHABET);\nconst BASE64_CACHE = new Uint8Array(256);\nconst BASE64_URL_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst BASE64_URL_OUT = ENCODER.encode(BASE64_URL_ALPHABET);\nconst BASE64_URL_CACHE = new Uint8Array(256);\nfunction encodeBase64Alphabet(array, out, padding) {\n const view = bufferToDataView(array);\n const [encodedLength, encodedChunkableLength, mod3] = encodeBase64Length(view.byteLength, padding);\n const output = new Uint8Array(encodedLength);\n let outputIndex = 0;\n for (let i = 0; i < encodedChunkableLength; i += 3) {\n const a = view.getUint8(i);\n const b = view.getUint8(i + 1);\n const c = view.getUint8(i + 2);\n output[outputIndex] = out[(a & 0b1111_1100) >> 2];\n output[outputIndex + 1] = out[(a & 0b11) << 4 | (b & 0b1111_0000) >> 4];\n output[outputIndex + 2] = out[(b & 0b1111) << 2 | (c & 0b1100_0000) >> 6];\n output[outputIndex + 3] = out[c & 0b0011_1111];\n outputIndex += 4;\n }\n if (mod3 == 1) {\n const a = view.getUint8(encodedChunkableLength);\n output[outputIndex] = out[(a & 0b1111_1100) >> 2];\n output[outputIndex + 1] = out[(a & 0b0000_0011) << 4];\n if (padding) {\n output[outputIndex + 2] = 61;\n output[outputIndex + 3] = 61;\n }\n }\n else if (mod3 == 2) {\n const a = view.getUint8(encodedChunkableLength);\n const b = view.getUint8(encodedChunkableLength + 1);\n output[outputIndex] = out[(a & 0b1111_1100) >> 2];\n output[outputIndex + 1] =\n out[(a & 0b0000_0011) << 4 | (b & 0b1111_0000) >> 4];\n output[outputIndex + 2] = out[(b & 0b1111) << 2];\n if (padding) {\n output[outputIndex + 3] = 61;\n }\n }\n return DECODER.decode(output);\n}\n/**\n * A base64 standard implementation, see RFC4648\n * https://datatracker.ietf.org/doc/html/rfc4648\n * section Base 64 Encoding\n *\n * This function will encode input bytes into a string using the characters\n * A-Z, a-z, 0-9, +, /, and = as padding at the end.\n *\n * Note that multi-byte types will be encoded according to the process's\n * endianness. Therefore, for portability, it is recommended to use\n * `arrayToEndian` on multi-byte typed arrays, such as Uint32Array before\n * encoding as hex.\n *\n * @param array Input data to encode\n * @returns a text string matching Base64\n */\nexport function encodeBase64(array) {\n return encodeBase64Alphabet(array, BASE64_OUT, true);\n}\n/**\n * A base64 url implementation, see RFC4648\n * https://datatracker.ietf.org/doc/html/rfc4648 section\n * Base 64 Encoding with URL and Filename Safe Alphabet\n *\n * This function will encode input bytes into a string using the characters\n * A-Z, a-z, 0-9, -, _, and with no padding.\n *\n * Note that multi-byte types will be encoded according to the process's\n * endianness. Therefore, for portability, it is recommended to use\n * `arrayToEndian` on multi-byte typed arrays, such as Uint32Array before\n * encoding as hex.\n *\n * @param array Input data to encode\n * @returns a text string matching Base64\n */\nexport function encodeBase64Url(array) {\n return encodeBase64Alphabet(array, BASE64_URL_OUT, false);\n}\nfunction decodeBase64Alphabet(input, length, lengthMod4, output, alphabet) {\n let index = 0;\n let unsupported = null;\n const totalLength = length - lengthMod4;\n for (let i = 0; i < totalLength; i += 4, index += 3) {\n const aValue = alphabet[input[i]];\n const bValue = alphabet[input[i + 1]];\n const cValue = alphabet[input[i + 2]];\n const dValue = alphabet[input[i + 3]];\n output[index] = (aValue << 2) | ((bValue & 0b110000) >> 4);\n output[index + 1] = ((bValue & 0xF) << 4) | ((cValue & 0b111100) >> 2);\n output[index + 2] = ((cValue & 0b11) << 6) | dValue;\n if (aValue == 255 || bValue == 255 || cValue == 255 || dValue == 255) {\n unsupported = i;\n break;\n }\n }\n if (unsupported != null) {\n throw new Error(\"Unsupported characters in base64: \" + DECODER.decode(new Uint8Array([\n input[unsupported],\n input[unsupported + 1],\n input[unsupported + 2],\n input[unsupported + 3],\n ])));\n }\n if (lengthMod4 == 2) {\n const a = input[length - 2];\n const b = input[length - 1];\n const aValue = alphabet[a];\n const bValue = alphabet[b];\n if ((aValue | bValue) == 255) {\n throw new Error(\"Unsupported characters in base64: \" +\n DECODER.decode(new Uint8Array([a, b])) +\n JSON.stringify([aValue, bValue]));\n }\n output[index] = (aValue << 2) | ((bValue & 0b110000) >> 4);\n if ((bValue & 0b1111) != 0) {\n throw new Error(\"Mangled Base64 padding\");\n }\n }\n else if (lengthMod4 == 3) {\n const a = input[length - 3];\n const b = input[length - 2];\n const c = input[length - 1];\n const aValue = alphabet[a];\n const bValue = alphabet[b];\n const cValue = alphabet[c];\n if ((aValue | bValue | cValue) == 255) {\n throw new Error(\"Unsupported characters in base64: \" +\n DECODER.decode(new Uint8Array([a, b, c])) +\n JSON.stringify([aValue, bValue, cValue]));\n }\n output[index] = (aValue << 2) | ((bValue & 0b110000) >> 4);\n output[index + 1] = ((bValue & 0xF) << 4) | ((cValue & 0b111100) >> 2);\n if ((cValue & 0b11) != 0) {\n throw new Error(\"Mangled Base64 padding\");\n }\n }\n}\nfunction calculateLength(text) {\n let length = text.length;\n // Subtract padding\n for (let i = length - 1; i >= 0; i--) {\n if (text[i] == 61) {\n length = i;\n }\n }\n const lengthMod4 = length % 4;\n let byteLength;\n if (lengthMod4 == 2) {\n byteLength = ((length - 2) / 4) * 3 + 1;\n }\n else if (lengthMod4 == 3) {\n byteLength = ((length - 3) / 4) * 3 + 2;\n }\n else if (lengthMod4 == 0) {\n byteLength = length / 4 * 3;\n }\n else {\n throw new Error(\"Invalid base64 length\");\n }\n return [length, lengthMod4, byteLength];\n}\n/**\n * Decode a base64 standard input into a Uint8Array\n *\n * This function will throw when characters other than A-Z, a-z, 0-9, +, and\n * / are used, with the exception of allowing = at the end.\n *\n * This function will throw when the base64 input padding is mangled.\n *\n * This function will throw when the length does not meet expectations.\n *\n * @param text Input base64 standard string\n * @returns an output Uint8Array of decoded bytes\n */\nexport function decodeBase64(text) {\n if (typeof text != \"string\") {\n throw new Error(\"Expecting a string\");\n }\n if (text.length == 0) {\n return new Uint8Array([]);\n }\n if (BASE64_CACHE[0] == 0) {\n for (let i = 0; i < 256; i++) {\n BASE64_CACHE[i] = 255;\n }\n for (let i = 0; i < BASE64_ALPHABET.length; i++) {\n BASE64_CACHE[BASE64_ALPHABET.charCodeAt(i)] = i;\n }\n }\n const input = ENCODER.encode(text);\n const [length, lengthMod4, byteLength] = calculateLength(input);\n const output = new Uint8Array(byteLength);\n decodeBase64Alphabet(input, length, lengthMod4, output, BASE64_CACHE);\n return output;\n}\n/**\n * Decode a base64 url input into a Uint8Array\n *\n * This function will throw when characters other than A-Z, a-z, 0-9, -, and\n * _ are used. No padding is expected.\n *\n * This function will throw when the base64 input padding is mangled.\n *\n * This function will throw when the length does not meet expectations.\n *\n * @param text Input base64 standard string\n * @returns an output Uint8Array of decoded bytes\n */\nexport function decodeBase64Url(text) {\n if (typeof text != \"string\") {\n throw new Error(\"Expecting a string\");\n }\n if (text.length == 0) {\n return new Uint8Array([]);\n }\n if (BASE64_URL_CACHE[0] == 0) {\n for (let i = 0; i < 256; i++) {\n BASE64_URL_CACHE[i] = 255;\n }\n for (let i = 0; i < BASE64_URL_ALPHABET.length; i++) {\n BASE64_URL_CACHE[BASE64_URL_ALPHABET.charCodeAt(i)] = i;\n }\n }\n const input = ENCODER.encode(text);\n const [length, lengthMod4, byteLength] = calculateLength(input);\n const output = new Uint8Array(byteLength);\n decodeBase64Alphabet(input, length, lengthMod4, output, BASE64_URL_CACHE);\n return output;\n}\n","export const ENDIAN_TEST = new Uint8Array(2);\nconst MULTI_BYTE_VIEW = new Uint16Array(ENDIAN_TEST.buffer);\nMULTI_BYTE_VIEW[0] = 1;\nexport function testOnlySetBigEndian() {\n ENDIAN_TEST[0] = 0;\n ENDIAN_TEST[1] = 1;\n}\nexport function testOnlySetLittleEndian() {\n ENDIAN_TEST[0] = 1;\n ENDIAN_TEST[1] = 0;\n}\n","import { ENDIAN_TEST } from \"./endianness_internal.js\";\nimport { bufferToDataView } from \"./internal.js\";\n/**\n * Inspect if the byte ordering of this process is big endian.\n *\n * @returns true if the process uses big endian memory order\n */\nexport function hostIsBigEndian() {\n return ENDIAN_TEST[1] != 0;\n}\n/**\n * Inspect if the byte ordering of this process is little endian.\n *\n * @returns true if the process uses little endian memory order\n */\nexport function hostIsLittleEndian() {\n return ENDIAN_TEST[0] != 0;\n}\n/**\n * Inspect if the byte ordering of this process is big or little endian.\n *\n * @returns \"big\" if the system is big endian, otherwise \"little\".\n */\nexport function hostEndianness() {\n return hostIsBigEndian() ? \"big\" : \"little\";\n}\nfunction internalArrayTo(array, endianness, width, fun) {\n const out = new Uint8Array(array.byteLength);\n const view = new DataView(out.buffer);\n const length = array.length;\n const little = endianness == \"little\";\n for (let i = 0, outIndex = 0; i < length; i++, outIndex += width) {\n fun(view, outIndex, array[i], little);\n }\n return out;\n}\nfunction internalArrayFrom(view, littleEndian, width, output, fun) {\n for (let i = 0, j = 0; i < view.byteLength; j++, i += width) {\n output[j] = fun(view, i, littleEndian);\n }\n return output;\n}\n/**\n * This function takes a typed input array and encodes all elements in the\n * requested endianness order, so that the input array may be communicated\n * in a reliable way to another recipient.\n *\n * Protocols may specify that numbers are encoded in \"big\" endian, while the\n * host uses \"little\" endian byte ordering in memory. This function may help\n * in ensuring that sequences of multi-byte numbers are portable between\n * processes.\n *\n * @param array Input array to encode\n * @param endianness what endianness to encode the input array as\n * @returns an output Uint8Array with bytes set in the requested endianness\n * order which represents the multi-byte numbers in the input array.\n */\nexport function arrayToEndian(array, endianness) {\n if (array instanceof Uint8Array) {\n return array;\n }\n else if (array instanceof Uint16Array) {\n return internalArrayTo(array, endianness, 2, (v, i, n, l) => v.setUint16(i, n, l));\n }\n else if (array instanceof Int16Array) {\n return internalArrayTo(array, endianness, 2, (v, i, n, l) => v.setInt16(i, n, l));\n }\n else if (array instanceof Uint32Array) {\n return internalArrayTo(array, endianness, 4, (v, i, n, l) => v.setUint32(i, n, l));\n }\n else if (array instanceof Int32Array) {\n return internalArrayTo(array, endianness, 4, (v, i, n, l) => v.setInt32(i, n, l));\n }\n else if (array instanceof BigUint64Array) {\n return internalArrayTo(array, endianness, 8, (v, i, n, l) => v.setBigUint64(i, n, l));\n }\n else if (array instanceof BigInt64Array) {\n return internalArrayTo(array, endianness, 8, (v, i, n, l) => v.setBigInt64(i, n, l));\n }\n else if (array instanceof Float32Array) {\n return internalArrayTo(array, endianness, 4, (v, i, n, l) => v.setFloat32(i, n, l));\n }\n else if (array instanceof Float64Array) {\n return internalArrayTo(array, endianness, 8, (v, i, n, l) => v.setFloat64(i, n, l));\n }\n // Int8Array\n return new Uint8Array(array.buffer);\n}\n/**\n * This function receives a sequence of bytes, which is known to contain\n * multi-byte numbers encoded with a known endianness, and outputs a typed\n * array of those multi-byte numbers in the requested format / type.\n *\n * Will throw if the input array is not sized for the type that is asked for.\n * If you are processing a section of data in a larger sequence of bytes then\n * use a DataView.\n *\n * @param array Source bytes to read from, various types are supported, the\n * bytes will be read as they are stored in memory. While it can\n * take a Uint32Array type, this is not advised.\n * @param endianness the endianness of bytes, most protocols use \"big\",\n * while most systems use \"little\".\n * @param type the output type desired, for example \"uint32\" will\n * return a Uint32Array.\n * @returns a typed array populated with the numbers sourced from the input\n * array with the endianness taken into account\n */\nexport function arrayFromEndian(array, endianness, type) {\n const view = bufferToDataView(array);\n const littleEndian = endianness == \"little\";\n if (type == \"int8\") {\n return internalArrayFrom(view, littleEndian, 1, new Int8Array(view.byteLength), (v, i, _l) => v.getInt8(i));\n }\n else if (type == \"uint16\") {\n if (view.byteLength & 1) {\n throw new Error(\"Incomplete byte sequence\");\n }\n return internalArrayFrom(view, littleEndian, 2, new Uint16Array(view.byteLength >>> 1), (v, i, l) => v.getUint16(i, l));\n }\n else if (type == \"int16\") {\n if (view.byteLength & 1) {\n throw new Error(\"Incomplete byte sequence\");\n }\n return internalArrayFrom(view, littleEndian, 2, new Int16Array(view.byteLength >>> 1), (v, i, l) => v.getInt16(i, l));\n }\n else if (type == \"uint32\") {\n if (view.byteLength & 3) {\n throw new Error(\"Incomplete byte sequence\");\n }\n return internalArrayFrom(view, littleEndian, 4, new Uint32Array(view.byteLength >>> 2), (v, i, l) => v.getUint32(i, l));\n }\n else if (type == \"int32\") {\n if (view.byteLength & 3) {\n throw new Error(\"Incomplete byte sequence\");\n }\n return internalArrayFrom(view, littleEndian, 4, new Int32Array(view.byteLength >>> 2), (v, i, l) => v.getInt32(i, l));\n }\n else if (type == \"uint64\") {\n if (view.byteLength & 7) {\n throw new Error(\"Incomplete byte sequence\");\n }\n return internalArrayFrom(view, littleEndian, 8, new BigUint64Array(view.byteLength >>> 3), (v, i, l) => v.getBigUint64(i, l));\n }\n else if (type == \"int64\") {\n if (view.byteLength & 7) {\n throw new Error(\"Incomplete byte sequence\");\n }\n return internalArrayFrom(view, littleEndian, 8, new BigInt64Array(view.byteLength >>> 3), (v, i, l) => v.getBigInt64(i, l));\n }\n else if (type == \"float32\") {\n if (view.byteLength & 3) {\n throw new Error(\"Incomplete byte sequence\");\n }\n return internalArrayFrom(view, littleEndian, 4, new Float32Array(view.byteLength >>> 2), (v, i, l) => v.getFloat32(i, l));\n }\n else if (type == \"float64\") {\n if (view.byteLength & 7) {\n throw new Error(\"Incomplete byte sequence\");\n }\n return internalArrayFrom(view, littleEndian, 8, new Float64Array(view.byteLength >>> 3), (v, i, l) => v.getFloat64(i, l));\n }\n // Last is uint8\n return new Uint8Array(view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength));\n}\n"]} \ No newline at end of file From 5a73ba912b4e8efb9a2842f410d2d920103b75d4 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 16 Jan 2026 22:59:39 -0800 Subject: [PATCH 09/15] Pull in JSON viewer webcomponent --- public/assets/js/json-viewer.2.2.0.esm.min.js | 8 ++++++++ public/assets/js/json-viewer.2.2.0.esm.min.map | 1 + public/decoderesponse/index.html | 1 + public/sitemap.xml | 2 +- 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 public/assets/js/json-viewer.2.2.0.esm.min.js create mode 100644 public/assets/js/json-viewer.2.2.0.esm.min.map diff --git a/public/assets/js/json-viewer.2.2.0.esm.min.js b/public/assets/js/json-viewer.2.2.0.esm.min.js new file mode 100644 index 0000000..156b0ab --- /dev/null +++ b/public/assets/js/json-viewer.2.2.0.esm.min.js @@ -0,0 +1,8 @@ +/** + * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0. + * Original file: /npm/@andypf/json-viewer@2.2.0/dist/esm/index.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +var e=`.container{background-color:var(--base00);color:var(--base05);padding:10px;letter-spacing:0.5px;font-family:monospace;border-radius:3px}.toolbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;padding-bottom:5px;border-bottom:solid 1px var(--base02)}.toolbar .options,.toolbar .search-wrapper{display:flex;align-items:center}.toolbar .icon-wrapper{height:15px;display:flex;align-items:center;padding:2px 5px}.toolbar .icon-wrapper:hover{background-color:var(--base02);border-radius:3px}.toolbar .icon-wrapper:first-child{margin-left:0px}.toolbar .search.icon{margin-right:5px}.toolbar .search-input{border:none;background:transparent;outline:none;flex:1;font-size:16px;color:var(--base0D)}.match{background-color:yellow;font-weight:bold;color:red}.data-row{padding:3px 0}.data-row .data-row{border-left:solid 1px var(--base02);padding-left:20px;margin-left:5px;display:none}.data-row.expanded>.data-row{display:block}.data-row .key-value-wrapper{display:flex;align-items:center}.data-row .key{color:var(--base07)}.data-row .key.number{color:var(--base0C)}.data-row .colon{color:var(--base07);margin:0 5px 0 0}.clickable{cursor:pointer}.data-row .opening-parenthesis,.data-row .closing-parenthesis{color:var(--base07)}.data-row .ellipsis{color:var(--base09)}.data-row.expanded>.key-value-wrapper .closing-parenthesis,.data-row.expanded>.key-value-wrapper .ellipsis{display:none}.data-row>.closing-parenthesis{display:none}.data-row.expanded>.closing-parenthesis{display:inline-block}.data-row .items-size{margin-left:10px;color:var(--base04);font-style:italic;display:none}.show-size .data-row .items-size{display:inline-block}.data-row .value.bool,.data-row .value.boolean{color:var(--base0E)}.data-row .value.function{color:var(--base0D)}.data-row .value.int,.data-row .value.integer{color:var(--base0F)}.data-row .value.float{color:var(--base0B)}.data-row .value.string{color:var(--base09)}.data-row .value.string .content{overflow-wrap:break-word}.data-row .value.string .content::before{content:open-quote}.data-row .value.string .content::after{content:close-quote}.data-row .value.regexp{color:var(--base0A)}.data-row .value.nan{color:var(--base08)}.data-row .value.null{color:var(--base0A)}.data-row .value.undefined{color:var(--base05)}.data-row .value.date{color:var(--base0D)}.data-row .value.nan,.data-row .value.null,.data-row .value.undefined{border-radius:3px;background-color:var(--base02);padding:1px 2px}.data-row .value .type{font-size:smaller;margin-right:4px;opacity:0.8;display:none}.data-row .value .value-data{word-break:break-all}.show-data-types .data-row .value .type{display:inline-block}.icon-wrapper,.copy-icon-wrapper{display:inline-block;cursor:pointer}.icon{display:block;position:relative}.icon:before,.icon:after{content:"";position:absolute;display:block}.expand.icon{margin-right:5px}.expand-icon-arrow .expand.icon{margin-left:3px;width:0;height:0;border-left:solid 6px var(--base0E);border-top:solid 6px transparent;border-bottom:solid 6px transparent}.expand-icon-arrow .expanded>.key-value-wrapper .expand.icon,.expand-icon-arrow .expanded.icon.expand{transform:rotate(90deg);border-left-color:var(--base0D)}.expand-icon-square .expand.icon,.expand-icon-circle .expand.icon{display:block;width:9px;height:9px;border-radius:2px;border:solid 1px var(--base0E)}.expand-icon-circle .expand.icon{border-radius:50%}.expand-icon-square .expand.icon:before,.expand-icon-circle .expand.icon:before,.expand-icon-square .expand.icon:after,.expand-icon-circle .expand.icon:after{width:5px;height:1px;background-color:var(--base0E);left:2px;top:4px}.expand-icon-square .expand.icon:after,.expand-icon-circle .expand.icon:after{transform:rotate(90deg)}.expand-icon-square .expanded>.key-value-wrapper .expand.icon:after,.expand-icon-circle .expanded>.key-value-wrapper .expand.icon:after,.expand-icon-square .expand.icon.expanded:after,.expand-icon-circle .expand.icon.expanded:after{display:none}.expand-icon-square .expanded>.key-value-wrapper .expand.icon,.expand-icon-circle .expanded>.key-value-wrapper .expand.icon,.expand-icon-square .expand.icon.expanded,.expand-icon-circle .expanded.expand.icon{border-color:var(--base0D)}.expand-icon-square .expanded>.key-value-wrapper .expand.icon:before,.expand-icon-circle .expanded>.key-value-wrapper .expand.icon:before,.expand-icon-square .expanded.expand.icon:before,.expand-icon-circle .expanded.expand.icon:before{background-color:var(--base0D)}.icon-wrapper{display:inline-block;cursor:pointer}.show-copy .key-value-wrapper:hover .icon.copy{display:block}.copy.icon{margin-left:10px;display:none;width:8px;height:10px;border:solid 1px var(--base0D);border-radius:1px;position:relative;top:4px;transition:0.2s all}.copy.icon:active{transform:scale(1.6);background-color:var(--base0B)}.copy.icon:before{content:"";display:block;left:-3px;top:-3px;width:8px;height:10px;border-top:solid 1px var(--base0D);border-left:solid 1px var(--base0D);border-radius:1px 0 0 0}.plus.icon{width:11px;height:1px;background-color:var(--base0D)}.plus.icon:after{content:"";width:11px;height:1px;background-color:var(--base0D);-webkit-transform:rotate(90deg);transform:rotate(90deg)}.minus.icon{width:11px;height:1px;background-color:var(--base0D)}.indent.icon{color:var(--base0D);width:17px;height:8px;border-top:solid 1px var(--base0D);border-bottom:solid 1px var(--base0D)}.indent.icon:before{content:"";position:absolute;top:2px;right:0;width:11px;height:2px;border-top:solid 1px var(--base0D);border-bottom:solid 1px var(--base0D)}.indent.icon:after{content:"";position:absolute;top:1px;width:0;height:0;border-top:solid 3px transparent;border-bottom:solid 3px transparent;border-left:solid 3px var(--base0D);border-right:solid 3px transparent}.outdent.icon{color:var(--base0D);margin-left:2px;width:17px;height:8px;border-top:solid 1px var(--base0D);border-bottom:solid 1px var(--base0D)}.outdent.icon:before{content:"";top:2px;right:0;width:11px;height:2px;border-top:solid 1px var(--base0D);border-bottom:solid 1px var(--base0D)}.outdent.icon:after{content:"";top:1px;left:-3px;width:0;height:0;border-top:solid 3px transparent;border-bottom:solid 3px transparent;border-left:solid 3px transparent;border-right:solid 3px var(--base0D)}.refresh.icon{color:var(--base0D);width:10px;height:10px;border-radius:50%;border-top:solid 1px var(--base0D);border-bottom:solid 1px var(--base0D);border-left:solid 1px transparent;border-right:solid 1px var(--base0D)}.refresh.icon:before{content:"";left:1px;top:8px;width:3px;height:3px;border-top:solid 1px var(--base0D);border-left:solid 1px var(--base0D);-webkit-transform:rotate(-22.5deg);transform:rotate(-22.5deg)}.info.icon{width:12px;height:11px;border:solid 1px var(--base0D);border-radius:2px}.info.icon::before{top:5px;left:5px;width:2px;height:5px;background-color:var(--base0D)}.info.icon::after{top:2px;left:5px;width:2px;height:2px;background-color:var(--base0D)}.info.icon.active{background-color:var(--base0D)}.info.icon.active::before,.info.icon.active::after{background-color:var(--base02)}.search.icon{color:var(--base0D);width:11px;height:11px;border:solid 1px var(--base0D);border-radius:100%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.search.icon:before{content:"";top:11px;left:5px;height:6px;width:1px;background-color:var(--base0D)}\n`;var a={apathy:["#031a16","#0b342d","#184e45","#2b685e","#5f9c92","#81b5ac","#a7cec8","#d2e7e4","#3e9688","#3e7996","#3e4c96","#883e96","#963e4c","#96883e","#4c963e","#3e965b"],ashes:["#1c2023","#393f45","#565e65","#747c84","#adb3ba","#c7ccd1","#dfe2e5","#f3f4f5","#c7ae95","#c7c795","#aec795","#95c7ae","#95aec7","#ae95c7","#c795ae","#c79595"],"atelier-dune-light":["#fefbec","#e8e4cf","#a6a28c","#999580","#7d7a68","#6e6b5e","#292824","#20201d","#d73737","#b65611","#ae9513","#60ac39","#1fad83","#6684e1","#b854d4","#d43552"],"atelier-dune":["#20201d","#292824","#6e6b5e","#7d7a68","#999580","#a6a28c","#e8e4cf","#fefbec","#d73737","#b65611","#ae9513","#60ac39","#1fad83","#6684e1","#b854d4","#d43552"],atlas:["#002635","#00384d","#517f8d","#6c8b91","#869696","#a1a19a","#e6e6dc","#fafaf8","#ff5a67","#f08e48","#ffcc1b","#7fc06e","#14747e","#5dd7b9","#9a70a4","#c43060"],bespin:["#28211c","#36312e","#5e5d5c","#666666","#797977","#8a8986","#9d9b97","#baae9e","#cf6a4c","#cf7d34","#f9ee98","#54be0d","#afc4db","#5ea6ea","#9b859d","#937121"],"black-metal":["#000000","#121212","#222222","#333333","#999999","#c1c1c1","#999999","#c1c1c1","#5f8787","#aaaaaa","#a06666","#dd9999","#aaaaaa","#888888","#999999","#444444"],brewer:["#0c0d0e","#2e2f30","#515253","#737475","#959697","#b7b8b9","#dadbdc","#fcfdfe","#e31a1c","#e6550d","#dca060","#31a354","#80b1d3","#3182bd","#756bb1","#b15928"],bright:["#000000","#303030","#505050","#b0b0b0","#d0d0d0","#e0e0e0","#f5f5f5","#ffffff","#fb0120","#fc6d24","#fda331","#a1c659","#76c7b7","#6fb3d2","#d381c3","#be643c"],brogrammer:["#1f1f1f","#f81118","#2dc55e","#ecba0f","#2a84d2","#4e5ab7","#1081d6","#d6dbe5","#d6dbe5","#de352e","#1dd361","#f3bd09","#1081d6","#5350b9","#0f7ddb","#ffffff"],"brushtrees-dark":["#485867","#5a6d7a","#6d828e","#8299a1","#98afb5","#b0c5c8","#c9dbdc","#e3efef","#b38686","#d8bba2","#aab386","#87b386","#86b3b3","#868cb3","#b386b2","#b39f9f"],brushtrees:["#e3efef","#c9dbdc","#b0c5c8","#98afb5","#8299a1","#6d828e","#5a6d7a","#485867","#b38686","#d8bba2","#aab386","#87b386","#86b3b3","#868cb3","#b386b2","#b39f9f"],chalk:["#151515","#202020","#303030","#505050","#b0b0b0","#d0d0d0","#e0e0e0","#f5f5f5","#fb9fb1","#eda987","#ddb26f","#acc267","#12cfc0","#6fc2ef","#e1a3ee","#deaf8f"],circus:["#191919","#202020","#303030","#5f5a60","#505050","#a7a7a7","#808080","#ffffff","#dc657d","#4bb1a7","#c3ba63","#84b97c","#4bb1a7","#639ee4","#b888e2","#b888e2"],"classic-dark":["#151515","#202020","#303030","#505050","#b0b0b0","#d0d0d0","#e0e0e0","#f5f5f5","#ac4142","#d28445","#f4bf75","#90a959","#75b5aa","#6a9fb5","#aa759f","#8f5536"],"classic-light":["#f5f5f5","#e0e0e0","#d0d0d0","#b0b0b0","#505050","#303030","#202020","#151515","#ac4142","#d28445","#f4bf75","#90a959","#75b5aa","#6a9fb5","#aa759f","#8f5536"],codeschool:["#232c31","#1c3657","#2a343a","#3f4944","#84898c","#9ea7a6","#a7cfa3","#b5d8f6","#2a5491","#43820d","#a03b1e","#237986","#b02f30","#484d79","#c59820","#c98344"],cupcake:["#fbf1f2","#f2f1f4","#d8d5dd","#bfb9c6","#a59daf","#8b8198","#72677e","#585062","#d57e85","#ebb790","#dcb16c","#a3b367","#69a9a7","#7297b9","#bb99b4","#baa58c"],cupertino:["#ffffff","#c0c0c0","#c0c0c0","#808080","#808080","#404040","#404040","#5e5e5e","#c41a15","#eb8500","#826b28","#007400","#318495","#0000ff","#a90d91","#826b28"],darcula:["#2b2b2b","#323232","#323232","#606366","#a4a3a3","#a9b7c6","#ffc66d","#ffffff","#4eade5","#689757","#bbb529","#6a8759","#629755","#9876aa","#cc7832","#808080"],darktooth:["#1d2021","#32302f","#504945","#665c54","#928374","#a89984","#d5c4a1","#fdf4c1","#fb543f","#fe8625","#fac03b","#95c085","#8ba59b","#0d6678","#8f4673","#a87322"],"default-dark":["#181818","#282828","#383838","#585858","#b8b8b8","#d8d8d8","#e8e8e8","#f8f8f8","#ab4642","#dc9656","#f7ca88","#a1b56c","#86c1b9","#7cafc2","#ba8baf","#a16946"],"default-light":["#ffffff","#e8e8e8","#d8d8d8","#b8b8b8","#585858","#383838","#282828","#181818","#ab4642","#dc9656","#ab4642","#a1b56c","#86c1b9","#7cafc2","#ba8baf","#a16946"],dracula:["#282936","#3a3c4e","#4d4f68","#626483","#62d6e8","#e9e9f4","#f1f2f8","#f7f7fb","#ea51b2","#b45bcf","#00f769","#ebff87","#a1efe4","#62d6e8","#b45bcf","#00f769"],eighties:["#2d2d2d","#393939","#515151","#747369","#a09f93","#d3d0c8","#e8e6df","#f2f0ec","#f2777a","#f99157","#ffcc66","#99cc99","#66cccc","#6699cc","#cc99cc","#d27b53"],embers:["#16130f","#2c2620","#433b32","#5a5047","#8a8075","#a39a90","#beb6ae","#dbd6d1","#826d57","#828257","#6d8257","#57826d","#576d82","#6d5782","#82576d","#825757"],flat:["#2c3e50","#34495e","#7f8c8d","#95a5a6","#bdc3c7","#e0e0e0","#f5f5f5","#ecf0f1","#e74c3c","#e67e22","#f1c40f","#2ecc71","#1abc9c","#3498db","#9b59b6","#be643c"],"fruit-soda":["#f1ecf1","#e0dee0","#d8d5d5","#b5b4b6","#979598","#515151","#474545","#2d2c2c","#fe3e31","#fe6d08","#f7e203","#47f74c","#0f9cfd","#2931df","#611fce","#b16f40"],github:["#ffffff","#f5f5f5","#c8c8fa","#969896","#e8e8e8","#333333","#ffffff","#969896","#ed6a43","#0086b3","#795da3","#183691","#183691","#795da3","#a71d5d","#333333"],"google-dark":["#1d1f21","#282a2e","#373b41","#969896","#b4b7b4","#c5c8c6","#e0e0e0","#ffffff","#cc342b","#f96a38","#fba922","#198844","#3971ed","#3971ed","#a36ac7","#3971ed"],"google-light":["#ffffff","#e0e0e0","#c5c8c6","#b4b7b4","#969896","#373b41","#282a2e","#1d1f21","#cc342b","#f96a38","#fba922","#198844","#3971ed","#3971ed","#a36ac7","#3971ed"],"grayscale-dark":["#101010","#252525","#464646","#525252","#ababab","#b9b9b9","#e3e3e3","#f7f7f7","#7c7c7c","#999999","#a0a0a0","#8e8e8e","#868686","#686868","#747474","#5e5e5e"],"grayscale-light":["#f7f7f7","#e3e3e3","#b9b9b9","#ababab","#525252","#464646","#252525","#101010","#7c7c7c","#999999","#a0a0a0","#8e8e8e","#868686","#686868","#747474","#5e5e5e"],greenscreen:["#001100","#003300","#005500","#007700","#009900","#00bb00","#00dd00","#00ff00","#007700","#009900","#007700","#00bb00","#005500","#009900","#00bb00","#005500"],"gruvbox-dark-hard":["#1d2021","#3c3836","#504945","#665c54","#bdae93","#d5c4a1","#ebdbb2","#fbf1c7","#fb4934","#fe8019","#fabd2f","#b8bb26","#8ec07c","#83a598","#d3869b","#d65d0e"],"gruvbox-light-hard":["#f9f5d7","#ebdbb2","#d5c4a1","#bdae93","#665c54","#504945","#3c3836","#282828","#9d0006","#af3a03","#b57614","#79740e","#427b58","#076678","#8f3f71","#d65d0e"],"harmonic-dark":["#0b1c2c","#223b54","#405c79","#627e99","#aabcce","#cbd6e2","#e5ebf1","#f7f9fb","#bf8b56","#bfbf56","#8bbf56","#56bf8b","#568bbf","#8b56bf","#bf568b","#bf5656"],"harmonic-light":["#f7f9fb","#e5ebf1","#cbd6e2","#aabcce","#627e99","#405c79","#223b54","#0b1c2c","#bf8b56","#bfbf56","#8bbf56","#56bf8b","#568bbf","#8b56bf","#bf568b","#bf5656"],"heetch-light":["#feffff","#392551","#7b6d8b","#9c92a8","#ddd6e5","#5a496e","#470546","#190134","#27d9d5","#bdb6c5","#5ba2b6","#f80059","#c33678","#47f9f5","#bd0152","#dedae2"],heetch:["#190134","#392551","#5a496e","#7b6d8b","#9c92a8","#bdb6c5","#dedae2","#feffff","#27d9d5","#5ba2b6","#8f6c97","#c33678","#f80059","#bd0152","#82034c","#470546"],helios:["#1d2021","#383c3e","#53585b","#6f7579","#cdcdcd","#d5d5d5","#dddddd","#e5e5e5","#d72638","#eb8413","#f19d1a","#88b92d","#1ba595","#1e8bac","#be4264","#c85e0d"],hopscotch:["#322931","#433b42","#5c545b","#797379","#989498","#b9b5b8","#d5d3d5","#ffffff","#dd464c","#fd8b19","#fdcc59","#8fc13e","#149b93","#1290bf","#c85e7c","#b33508"],"horizon-dark":["#1c1e26","#232530","#2e303e","#676a8d","#ced1d0","#cbced0","#dcdfe4","#e3e6ee","#e93c58","#e58d7d","#efb993","#efaf8e","#24a8b4","#df5273","#b072d1","#e4a382"],"ia-dark":["#1a1a1a","#222222","#1d414d","#767676","#b8b8b8","#cccccc","#e8e8e8","#f8f8f8","#d88568","#d86868","#b99353","#83a471","#7c9cae","#8eccdd","#b98eb2","#8b6c37"],"ia-light":["#f6f6f6","#dedede","#bde5f2","#898989","#767676","#181818","#e8e8e8","#898989","#9c5a02","#c43e18","#c48218","#38781c","#2d6bb1","#48bac2","#a94598","#8b6c37"],icy:["#021012","#031619","#041f23","#052e34","#064048","#095b67","#0c7c8c","#109cb0","#16c1d9","#b3ebf2","#80deea","#4dd0e1","#26c6da","#00bcd4","#00acc1","#0097a7"],isotope:["#000000","#404040","#606060","#808080","#c0c0c0","#d0d0d0","#e0e0e0","#ffffff","#ff0000","#ff9900","#ff0099","#33ff00","#00ffff","#0066ff","#cc00ff","#3300ff"],macintosh:["#000000","#404040","#404040","#808080","#808080","#c0c0c0","#c0c0c0","#ffffff","#dd0907","#ff6403","#fbf305","#1fb714","#02abea","#0000d3","#4700a5","#90713a"],marrakesh:["#201602","#302e00","#5f5b17","#6c6823","#86813b","#948e48","#ccc37a","#faf0a5","#c35359","#b36144","#a88339","#18974e","#75a738","#477ca1","#8868b3","#b3588e"],materia:["#263238","#2c393f","#37474f","#707880","#c9ccd3","#cdd3de","#d5dbe5","#ffffff","#ec5f67","#ea9560","#ffcc00","#8bd649","#80cbc4","#89ddff","#82aaff","#ec5f67"],"material-lighter":["#fafafa","#e7eaec","#cceae7","#ccd7da","#8796b0","#80cbc4","#80cbc4","#666666","#ff5370","#f76d47","#ffb62c","#91b859","#39adb5","#6182b8","#7c4dff","#e53935"],material:["#263238","#2e3c43","#314549","#546e7a","#b2ccd6","#eeffff","#eeffff","#ffffff","#f07178","#f78c6c","#ffcb6b","#c3e88d","#89ddff","#82aaff","#c792ea","#ff5370"],"mellow-purple":["#1e0528","#1a092d","#331354","#320f55","#873582","#ffeeff","#ffeeff","#f8c0ff","#00d9e9","#aa00a3","#955ae7","#05cb0d","#b900b1","#550068","#8991bb","#4d6fff"],"mexico-light":["#f8f8f8","#e8e8e8","#d8d8d8","#b8b8b8","#585858","#383838","#282828","#181818","#ab4642","#dc9656","#f79a0e","#538947","#4b8093","#7cafc2","#96609e","#a16946"],mocha:["#3b3228","#534636","#645240","#7e705a","#b8afad","#d0c8c6","#e9e1dd","#f5eeeb","#cb6077","#d28b71","#f4bc87","#beb55b","#7bbda4","#8ab3b5","#a89bb9","#bb9584"],monokai:["#272822","#383830","#49483e","#75715e","#a59f85","#f8f8f2","#f5f4f1","#f9f8f5","#f92672","#fd971f","#f4bf75","#a6e22e","#a1efe4","#66d9ef","#ae81ff","#cc6633"],nord:["#2e3440","#3b4252","#434c5e","#4c566a","#d8dee9","#e5e9f0","#eceff4","#8fbcbb","#88c0d0","#81a1c1","#5e81ac","#bf616a","#d08770","#ebcb8b","#a3be8c","#b48ead"],ocean:["#2b303b","#343d46","#4f5b66","#65737e","#a7adba","#c0c5ce","#dfe1e8","#eff1f5","#bf616a","#d08770","#ebcb8b","#a3be8c","#96b5b4","#8fa1b3","#b48ead","#ab7967"],"one-light":["#fafafa","#f0f0f1","#e5e5e6","#a0a1a7","#696c77","#383a42","#202227","#090a0b","#ca1243","#d75f00","#c18401","#50a14f","#0184bc","#4078f2","#a626a4","#986801"],onedark:["#282c34","#353b45","#3e4451","#545862","#565c64","#abb2bf","#b6bdca","#c8ccd4","#e06c75","#d19a66","#e5c07b","#98c379","#56b6c2","#61afef","#c678dd","#be5046"],"papercolor-dark":["#1c1c1c","#af005f","#5faf00","#d7af5f","#5fafd7","#808080","#d7875f","#d0d0d0","#585858","#5faf5f","#afd700","#af87d7","#ffaf00","#ff5faf","#00afaf","#5f8787"],"papercolor-light":["#eeeeee","#af0000","#008700","#5f8700","#0087af","#878787","#005f87","#444444","#bcbcbc","#d70000","#d70087","#8700af","#d75f00","#d75f00","#005faf","#005f87"],paraiso:["#2f1e2e","#41323f","#4f424c","#776e71","#8d8687","#a39e9b","#b9b6b0","#e7e9db","#ef6155","#f99b15","#fec418","#48b685","#5bc4bf","#06b6ef","#815ba4","#e96ba8"],pico:["#000000","#1d2b53","#7e2553","#008751","#ab5236","#5f574f","#c2c3c7","#fff1e8","#ff004d","#ffa300","#fff024","#00e756","#29adff","#83769c","#ff77a8","#ffccaa"],pop:["#000000","#202020","#303030","#505050","#b0b0b0","#d0d0d0","#e0e0e0","#ffffff","#eb008a","#f29333","#f8ca12","#37b349","#00aabb","#0e5a94","#b31e8d","#7a2d00"],railscasts:["#2b2b2b","#272935","#3a4055","#5a647e","#d4cfc9","#e6e1dc","#f4f1ed","#f9f7f3","#da4939","#cc7833","#ffc66d","#a5c261","#519f50","#6d9cbe","#b6b3eb","#bc9458"],seti:["#151718","#282a2b","#3b758c","#41535b","#43a5d5","#d6d6d6","#eeeeee","#ffffff","#cd3f45","#db7b55","#e6cd69","#9fca56","#55dbbe","#55b5db","#a074c4","#8a553f"],"solarized-dark":["#002b36","#073642","#586e75","#657b83","#839496","#93a1a1","#eee8d5","#fdf6e3","#dc322f","#cb4b16","#b58900","#859900","#2aa198","#268bd2","#6c71c4","#d33682"],"solarized-light":["#fdf6e3","#eee8d5","#93a1a1","#839496","#657b83","#586e75","#073642","#002b36","#dc322f","#cb4b16","#b58900","#859900","#2aa198","#268bd2","#6c71c4","#d33682"],spacemacs:["#1f2022","#282828","#444155","#585858","#b8b8b8","#a3a3a3","#e8e8e8","#f8f8f8","#f2241f","#ffa500","#b1951d","#67b11d","#2d9574","#4f97d7","#a31db1","#b03060"],"summerfruit-dark":["#151515","#202020","#303030","#505050","#b0b0b0","#d0d0d0","#e0e0e0","#ffffff","#ff0086","#fd8900","#aba800","#00c918","#1faaaa","#3777e6","#ad00a1","#cc6633"],"summerfruit-light":["#ffffff","#e0e0e0","#d0d0d0","#b0b0b0","#000000","#101010","#151515","#202020","#ff0086","#fd8900","#aba800","#00c918","#1faaaa","#3777e6","#ad00a1","#cc6633"],"tomorrow-night":["#1d1f21","#282a2e","#373b41","#969896","#b4b7b4","#c5c8c6","#e0e0e0","#ffffff","#cc6666","#de935f","#f0c674","#b5bd68","#8abeb7","#81a2be","#b294bb","#a3685a"],tomorrow:["#ffffff","#e0e0e0","#d6d6d6","#8e908c","#969896","#4d4d4c","#282a2e","#1d1f21","#c82829","#f5871f","#eab700","#718c00","#3e999f","#4271ae","#8959a8","#a3685a"],tube:["#231f20","#1c3f95","#5a5758","#737171","#959ca1","#d9d8d8","#e7e7e8","#ffffff","#ee2e24","#f386a1","#ffd204","#00853e","#85cebc","#009ddc","#98005d","#b06110"],twilight:["#1e1e1e","#323537","#464b50","#5f5a60","#838184","#a7a7a7","#c3c3c3","#ffffff","#cf6a4c","#cda869","#f9ee98","#8f9d6a","#afc4db","#7587a6","#9b859d","#9b703f"],woodland:["#231e18","#302b25","#48413a","#9d8b70","#b4a490","#cabcb1","#d7c8bc","#e4d4c8","#d35c5c","#ca7f32","#e0ac16","#b7ba53","#6eb958","#88a4d3","#bb90e2","#b49368"],zenburn:["#383838","#404040","#606060","#6f6f6f","#808080","#dcdccc","#c0c0c0","#ffffff","#dca3a3","#dfaf8f","#e0cf9f","#5f7f5f","#93e0e3","#7cb8bb","#dc8cc3","#000000"]},d=e=>{let d;if(typeof e=="string"){if(a[e]===void 0)throw new Error(`${e} not found`);d=a[e].reduce(((e,a,d)=>{let t=`base0${d.toString(16).toUpperCase()}`;return e[t]=a,e}),{})}else d=e;return`.container{${Object.keys(d).map((e=>`--${e}: ${d[e]};`)).join("")}}`};var t=e=>{try{return!!new URL(e)}catch{return!1}},c=e=>{if(Array.isArray(e))return"array";if(e===null)return"null";if(e instanceof RegExp)return"regexp";let a=typeof e;return a==="number"?isNaN(e)?"NaN":isFinite(e)?Number.isInteger(e)?"int":"float":"Infinity":a==="boolean"?"bool":a==="object"&&e instanceof Date?"date":a};var o=e=>{if(typeof e=="boolean")return e;if(e==="true")return!0;if(e==="false")return!1;throw new Error("should be a boolean!")},n=e=>{if(typeof e=="string")return e;throw new Error("should be a string!")},r=e=>{if(typeof e=="number"&&e>=0)return e;if(typeof e=="string"&&(e=parseFloat(e)),isNaN(e)||e<0)throw new Error("should be a positive number!");return e},f=e=>{if(typeof e=="boolean"||typeof e=="number")return e;if(e==="true")return!0;if(e==="false")return!1;if(typeof e=="string"&&(e=parseFloat(e),!isNaN(e)&&e>=0))return e;throw new Error("should be a boolean or a positive number!")},i=e=>{if(typeof e=="object")return e;if(typeof e=="string")try{return JSON.parse(e)}catch{return e}throw new Error("should be a string or JSON!")};var b=function({key:e,value:a,expanded:d,indent:t,onToggleExpand:o,level:n=0,parentRow:r}){let f=document.createElement("div");this.maxLevel=n;let i=c(a),s=i==="array"||i==="object",l=d===!0||d>n,p,h,x,u;f.className=`data-row ${l?"expanded":""}`,f.dataset.key=e,f.dataset.level=n,n>0&&(f.style.paddingLeft=`${t*5}px`);let m=document.createElement("span");m.className="key-value-wrapper",f.appendChild(m);let w=()=>{f.classList.toggle("expanded"),o&&(f.classList.contains("expanded")?o(n+1):o(n))};if(s){let e=document.createElement("span");e.className="icon-wrapper",m.appendChild(e),p=document.createElement("span"),p.className="expand icon clickable",p.setAttribute("title",l?"Collapse":"Expand"),e.appendChild(p),e.addEventListener("click",(()=>w()))}if(e!==null&&e!==""){let a=typeof e;x=document.createElement("span"),x.className=`key clickable ${a==="number"?"number":""}`,x.textContent=a==="number"?e:`${e}`,x.addEventListener("click",(()=>w())),m.appendChild(x);let d=document.createElement("span");d.classList.add("colon"),d.textContent=":",m.appendChild(d)}if(s){let e=document.createElement("span");e.className="opening-parenthesis",e.textContent=i==="array"?"[":"{",m.appendChild(e);let c=document.createElement("span");c.className="ellipsis clickable",c.textContent="...",c.addEventListener("click",(()=>w())),m.appendChild(c);let r=document.createElement("span");r.className="closing-parenthesis",r.textContent=i==="array"?"]":"}",m.appendChild(r);let s=document.createElement("span"),l=i==="array"?a.length:Object.keys(a).length;s.className="items-size",s.textContent=`${l} item${l===1?"":"s"}`,m.appendChild(s),h=[],(i==="array"?a.map(((e,a)=>a)):Object.keys(a)).forEach((e=>{let c=new b({key:e,value:a[e],expanded:d,indent:t,onToggleExpand:o,level:n+1,parentRow:f});h.push(c),f.appendChild(c.element),this.maxLevel=Math.max(this.maxLevel,c.maxLevel)}));let p=document.createElement("span");p.className="closing-parenthesis",p.textContent=i==="array"?"]":"}",f.appendChild(p)}else{let e=null;["nan","NaN","undefined","null"].includes(i)||(e=document.createElement("span"),e.className="type",e.textContent=i.toLowerCase());let d=document.createElement("span");d.className=`value ${i.toLowerCase()}`,u=document.createElement("span"),u.className="value-data",u.textContent=i==="string"?`"${a}"`:a,e&&d.appendChild(e),d.appendChild(u),m.appendChild(d)}let g=document.createElement("span");g.className="copy icon",g.setAttribute("title","Copy to clipboard");let v=document.createElement("span");v.className="icon-wrapper",v.addEventListener("click",(()=>{navigator.clipboard.writeText(JSON.stringify(a,null,t))})),v.appendChild(g),m.appendChild(v);let y=e=>{let a=new RegExp(e,"gi"),d=[];x&&d.push(x),u&&d.push(u);let t=!1;d.forEach((d=>{let c=d.textContent;if(d.innerHTML=c,!e||e==="")return;let o=[...c.matchAll(a)].map((e=>e.index)),n=[],r=0;o.forEach((a=>{t=!0,n.push(c.slice(r,a)),n.push(`${e}`),r=a+e.length})),n.push(c.slice(r)),d.innerHTML=n.join("")})),t&&!f.classList.contains("expanded")&&(w(),r&&r.classList.add("expanded"))};this.update=({expanded:e,indent:a,searchTerm:d})=>{a!==void 0&&n>0&&(f.style.paddingLeft=`${a*5}px`),e!==void 0&&(l=e===!0||e>n,f.classList.toggle("expanded",l),p&&(p.title=l?"Collapse":"Expand")),d!=null&&y(d),h&&h.forEach((t=>t.update({expanded:e,indent:a,searchTerm:d})))},this.element=f},s=b;var l=function({expanded:e,indent:a,onChange:d,onSearch:t,showDetails:c}){this.indent=a||2,this.expanded=typeof e=="number"?e:2,this.showDetails=c!==!1,this.maxExpandLevel=0;let o,n=document.createElement("div");n.className="toolbar";let r=document.createElement("div");r.className="options",n.appendChild(r);let f=document.createElement("div");f.className="search-wrapper",n.appendChild(f);let i=document.createElement("div");i.className="icon-wrapper clickable",r.appendChild(i);let b=document.createElement("span");b.className="icon refresh",i.onclick=()=>this.refresh(),i.appendChild(b);let s=document.createElement("div");s.className="icon-wrapper clickable",r.appendChild(s);let l=document.createElement("span");l.className="icon plus",s.appendChild(l),s.onclick=()=>{this.expanded{this.expanded>this.maxExpandLevel&&(this.expanded=this.maxExpandLevel),this.expanded>0&&(this.expanded-=1),d({expanded:this.expanded})};let x=document.createElement("div");x.className="icon-wrapper clickable",r.appendChild(x);let u=document.createElement("span");u.className="icon indent",x.onclick=()=>{this.indent+=1,d({indent:this.indent})},x.appendChild(u);let m=document.createElement("div");m.className="icon-wrapper clickable",r.appendChild(m);let w=document.createElement("span");w.className="icon outdent",m.onclick=()=>{this.indent-=1,d({indent:this.indent})},m.appendChild(w);let g=document.createElement("div");g.className="icon-wrapper clickable",r.appendChild(g);let v=document.createElement("span");v.className=`icon info ${this.showDetails?"active":""}`,g.onclick=()=>{v.classList.toggle("active"),this.showDetails=!this.showDetails,d({showDetails:this.showDetails})},g.appendChild(v);let y=document.createElement("span");y.className="icon search",f.appendChild(y),o=document.createElement("input"),o.className="search-input",o.placeholder="Search",o.oninput=e=>{t(e.target.value)},f.appendChild(o),this.refresh=()=>{this.expanded=1,this.indent=2,o&&(o.value=""),d({indent:2,expanded:1}),t("")},this.updateShowDetails=e=>{this.showDetails=e,this.showDetails?v.classList.add("active"):v.classList.remove("active")},this.element=n},p=l;function h(e,a={}){let d=document.createElement("div");d.className="container",e.appendChild(d);let t=null,c=null,o={};this.update=({data:e,expanded:a,indent:n,expandIconType:r,showDataTypes:f,showToolbar:i,showSize:b,showCopy:l})=>{if(e){let r=JSON.stringify(e);o.dataComapreString!==r&&(o.dataComapreString=r,t=new s({key:"",value:e,expanded:a,indent:n,onToggleExpand:e=>{c&&(c.expanded=e),o.expanded=e}}),d.replaceChildren(t.element),o.showToolbar&&c&&(d.prepend(c.element),c.maxExpandLevel=t.maxLevel,c.refresh()))}if(i!==void 0&&o.showToolbar!==i)if(o.showToolbar=i,i)c||(c=new p({expanded:o.expanded,indent:o.indent,onChange:({expanded:e,indent:a,showDetails:d})=>{let t={expanded:e,indent:a};d!==void 0&&(t.showCopy=d,t.showSize=d,t.showDataTypes=d),this.update(t)},onSearch:e=>{t&&t.update({searchTerm:e})}})),t&&(c.maxExpandLevel=t.maxLevel),d.prepend(c.element);else{let e=d.querySelector(".toolbar");e&&e.remove()}let h={};a!==void 0&&o.expanded!==a&&(o.expanded=a,h.expanded=a),n!==void 0&&o.indent!==n&&(o.indent=n,h.indent=n),Object.keys(h).length>0&&t&&t.update(h),l!==void 0&&o.showCopy!==l&&(o.showCopy=l,d.classList.toggle("show-copy",l)),b!==void 0&&o.showSize!==b&&(o.showSize=b,d.classList.toggle("show-size",b),c&&c.updateShowDetails(o.showSize||o.showDataTypes)),f!==void 0&&o.showDataTypes!==f&&(o.showDataTypes=f,d.classList.toggle("show-data-types",f),c&&c.updateShowDetails(o.showSize||o.showDataTypes)),r!==void 0&&o.expandIconType!==r&&(d.classList.add(`expand-icon-${r}`),d.classList.remove(`expand-icon-${o.expandIconType}`),o.expandIconType=r)},this.update(a)}var x=h;var u={indent:2,expanded:1,theme:"default-light",showDataTypes:!0,showToolbar:!1,expandIconType:"arrow",showCopy:!0,showSize:!0,data:null},m=class a extends HTMLElement{#e;#a;#d;#t;constructor(){super(),this.#a={...u},this.#e=document.createElement("style");let a=this.attachShadow({mode:"open"}),d=document.createElement("style");d.textContent=`${e}`,a.appendChild(d),a.appendChild(this.#e),this.theme=this.#a.theme,this.#t=new x(a,this.#a)}static get observedAttributes(){return Object.keys(u).map((e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()))}static allowedAttributes=["id"].concat(a.observedAttributes);#c=(...e)=>{console.warn(`JsonViewer${this.id?` (${this.id})`:""}:`,...e)};#o=(e,a,d,t)=>{try{if(a=d(a),t&&!t.includes(a))throw new Error(`should be one of ${t.join(", ")}`);if(this.#a[e]===a)return;this.#a[e]=a,this.#n()}catch(a){this.#c(`Attribute ${e}: ${a.message}`)}};set showDataTypes(e){this.#o("showDataTypes",e,o)}set showToolbar(e){this.#o("showToolbar",e,o)}set indent(e){this.#o("indent",e,r)}set expandIconType(e){this.#o("expandIconType",e,n,["arrow","square","circle"])}set expanded(e){this.#o("expanded",e,f)}set showSize(e){this.#o("showSize",e,o)}set showCopy(e){this.#o("showCopy",e,o)}set theme(e){try{if(e=i(e),this.#a.theme===e&&this.#e.textContent!=="")return;this.#e.textContent=d(e),this.#a.theme=e}catch(e){this.#c(`Attribute theme: ${e.message}`)}}set data(e){try{e=i(e);let a=JSON.stringify(e);if(this.#a.data===a)return;this.#a.data=a,t(e)?fetch(e).then((e=>e.json())).then((e=>{this.#d=e,this.#n()})):(this.#d=e,this.#n())}catch(e){this.#c(`Attribute data: ${e.message}`)}}get options(){return this.#a}connectedCallback(){window.addEventListener("DOMContentLoaded",(()=>{let e=this.textContent;this.textContent="",e&&(this.data=e)}))}attributeChangedCallback(e,d,t){if(a.allowedAttributes.indexOf(e)>-1){let a=e.replace(/-([a-z])/g,(e=>e[1].toUpperCase()));this[a]=t}else this.#c(`Attribute ${e} is not supported and will be ignored!`),this.removeAttribute(e)}#n=()=>{this.#t.update({data:this.#d,expanded:this.#a.expanded,expandIconType:this.#a.expandIconType,indent:this.#a.indent,showDataTypes:this.#a.showDataTypes,showToolbar:this.#a.showToolbar,showSize:this.#a.showSize,showCopy:this.#a.showCopy})}};customElements.get("andypf-json-viewer")||customElements.define("andypf-json-viewer",m); +//# sourceMappingURL=./json-viewer.2.2.0.esm.min.map diff --git a/public/assets/js/json-viewer.2.2.0.esm.min.map b/public/assets/js/json-viewer.2.2.0.esm.min.map new file mode 100644 index 0000000..45ffa68 --- /dev/null +++ b/public/assets/js/json-viewer.2.2.0.esm.min.map @@ -0,0 +1 @@ +{"version":3,"sources":["jsdelivr-header.js","/npm/@andypf/json-viewer@2.2.0/dist/esm/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACoBA,IAAI,EAAE,spOACD,IAAC,EAAE,CAAC,OAAO,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,MAAM,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,qBAAqB,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,eAAe,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,MAAM,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,OAAO,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,cAAc,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,OAAO,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,OAAO,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,WAAW,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,kBAAkB,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,WAAW,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,MAAM,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,OAAO,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,eAAe,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,gBAAgB,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,WAAW,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,QAAQ,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,UAAU,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,QAAQ,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,UAAU,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,eAAe,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,gBAAgB,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,QAAQ,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,SAAS,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,OAAO,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU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","file":"/npm/@andypf/json-viewer@2.2.0/dist/esm/index.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/@andypf/json-viewer@2.2.0/dist/esm/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\n/*\nMIT License\n\nCopyright (c) 2025 Andreas Pfau\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\n \nvar q=`.container{background-color:var(--base00);color:var(--base05);padding:10px;letter-spacing:0.5px;font-family:monospace;border-radius:3px}.toolbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;padding-bottom:5px;border-bottom:solid 1px var(--base02)}.toolbar .options,.toolbar .search-wrapper{display:flex;align-items:center}.toolbar .icon-wrapper{height:15px;display:flex;align-items:center;padding:2px 5px}.toolbar .icon-wrapper:hover{background-color:var(--base02);border-radius:3px}.toolbar .icon-wrapper:first-child{margin-left:0px}.toolbar .search.icon{margin-right:5px}.toolbar .search-input{border:none;background:transparent;outline:none;flex:1;font-size:16px;color:var(--base0D)}.match{background-color:yellow;font-weight:bold;color:red}.data-row{padding:3px 0}.data-row .data-row{border-left:solid 1px var(--base02);padding-left:20px;margin-left:5px;display:none}.data-row.expanded>.data-row{display:block}.data-row .key-value-wrapper{display:flex;align-items:center}.data-row .key{color:var(--base07)}.data-row .key.number{color:var(--base0C)}.data-row .colon{color:var(--base07);margin:0 5px 0 0}.clickable{cursor:pointer}.data-row .opening-parenthesis,.data-row .closing-parenthesis{color:var(--base07)}.data-row .ellipsis{color:var(--base09)}.data-row.expanded>.key-value-wrapper .closing-parenthesis,.data-row.expanded>.key-value-wrapper .ellipsis{display:none}.data-row>.closing-parenthesis{display:none}.data-row.expanded>.closing-parenthesis{display:inline-block}.data-row .items-size{margin-left:10px;color:var(--base04);font-style:italic;display:none}.show-size .data-row .items-size{display:inline-block}.data-row .value.bool,.data-row .value.boolean{color:var(--base0E)}.data-row .value.function{color:var(--base0D)}.data-row .value.int,.data-row .value.integer{color:var(--base0F)}.data-row .value.float{color:var(--base0B)}.data-row .value.string{color:var(--base09)}.data-row .value.string .content{overflow-wrap:break-word}.data-row .value.string .content::before{content:open-quote}.data-row .value.string .content::after{content:close-quote}.data-row .value.regexp{color:var(--base0A)}.data-row .value.nan{color:var(--base08)}.data-row .value.null{color:var(--base0A)}.data-row .value.undefined{color:var(--base05)}.data-row .value.date{color:var(--base0D)}.data-row .value.nan,.data-row .value.null,.data-row .value.undefined{border-radius:3px;background-color:var(--base02);padding:1px 2px}.data-row .value .type{font-size:smaller;margin-right:4px;opacity:0.8;display:none}.data-row .value .value-data{word-break:break-all}.show-data-types .data-row .value .type{display:inline-block}.icon-wrapper,.copy-icon-wrapper{display:inline-block;cursor:pointer}.icon{display:block;position:relative}.icon:before,.icon:after{content:\"\";position:absolute;display:block}.expand.icon{margin-right:5px}.expand-icon-arrow .expand.icon{margin-left:3px;width:0;height:0;border-left:solid 6px var(--base0E);border-top:solid 6px transparent;border-bottom:solid 6px transparent}.expand-icon-arrow .expanded>.key-value-wrapper .expand.icon,.expand-icon-arrow .expanded.icon.expand{transform:rotate(90deg);border-left-color:var(--base0D)}.expand-icon-square .expand.icon,.expand-icon-circle .expand.icon{display:block;width:9px;height:9px;border-radius:2px;border:solid 1px var(--base0E)}.expand-icon-circle .expand.icon{border-radius:50%}.expand-icon-square .expand.icon:before,.expand-icon-circle .expand.icon:before,.expand-icon-square .expand.icon:after,.expand-icon-circle .expand.icon:after{width:5px;height:1px;background-color:var(--base0E);left:2px;top:4px}.expand-icon-square .expand.icon:after,.expand-icon-circle .expand.icon:after{transform:rotate(90deg)}.expand-icon-square .expanded>.key-value-wrapper .expand.icon:after,.expand-icon-circle .expanded>.key-value-wrapper .expand.icon:after,.expand-icon-square .expand.icon.expanded:after,.expand-icon-circle .expand.icon.expanded:after{display:none}.expand-icon-square .expanded>.key-value-wrapper .expand.icon,.expand-icon-circle .expanded>.key-value-wrapper .expand.icon,.expand-icon-square .expand.icon.expanded,.expand-icon-circle .expanded.expand.icon{border-color:var(--base0D)}.expand-icon-square .expanded>.key-value-wrapper .expand.icon:before,.expand-icon-circle .expanded>.key-value-wrapper .expand.icon:before,.expand-icon-square .expanded.expand.icon:before,.expand-icon-circle .expanded.expand.icon:before{background-color:var(--base0D)}.icon-wrapper{display:inline-block;cursor:pointer}.show-copy .key-value-wrapper:hover .icon.copy{display:block}.copy.icon{margin-left:10px;display:none;width:8px;height:10px;border:solid 1px var(--base0D);border-radius:1px;position:relative;top:4px;transition:0.2s all}.copy.icon:active{transform:scale(1.6);background-color:var(--base0B)}.copy.icon:before{content:\"\";display:block;left:-3px;top:-3px;width:8px;height:10px;border-top:solid 1px var(--base0D);border-left:solid 1px var(--base0D);border-radius:1px 0 0 0}.plus.icon{width:11px;height:1px;background-color:var(--base0D)}.plus.icon:after{content:\"\";width:11px;height:1px;background-color:var(--base0D);-webkit-transform:rotate(90deg);transform:rotate(90deg)}.minus.icon{width:11px;height:1px;background-color:var(--base0D)}.indent.icon{color:var(--base0D);width:17px;height:8px;border-top:solid 1px var(--base0D);border-bottom:solid 1px var(--base0D)}.indent.icon:before{content:\"\";position:absolute;top:2px;right:0;width:11px;height:2px;border-top:solid 1px var(--base0D);border-bottom:solid 1px var(--base0D)}.indent.icon:after{content:\"\";position:absolute;top:1px;width:0;height:0;border-top:solid 3px transparent;border-bottom:solid 3px transparent;border-left:solid 3px var(--base0D);border-right:solid 3px transparent}.outdent.icon{color:var(--base0D);margin-left:2px;width:17px;height:8px;border-top:solid 1px var(--base0D);border-bottom:solid 1px var(--base0D)}.outdent.icon:before{content:\"\";top:2px;right:0;width:11px;height:2px;border-top:solid 1px var(--base0D);border-bottom:solid 1px var(--base0D)}.outdent.icon:after{content:\"\";top:1px;left:-3px;width:0;height:0;border-top:solid 3px transparent;border-bottom:solid 3px transparent;border-left:solid 3px transparent;border-right:solid 3px var(--base0D)}.refresh.icon{color:var(--base0D);width:10px;height:10px;border-radius:50%;border-top:solid 1px var(--base0D);border-bottom:solid 1px var(--base0D);border-left:solid 1px transparent;border-right:solid 1px var(--base0D)}.refresh.icon:before{content:\"\";left:1px;top:8px;width:3px;height:3px;border-top:solid 1px var(--base0D);border-left:solid 1px var(--base0D);-webkit-transform:rotate(-22.5deg);transform:rotate(-22.5deg)}.info.icon{width:12px;height:11px;border:solid 1px var(--base0D);border-radius:2px}.info.icon::before{top:5px;left:5px;width:2px;height:5px;background-color:var(--base0D)}.info.icon::after{top:2px;left:5px;width:2px;height:2px;background-color:var(--base0D)}.info.icon.active{background-color:var(--base0D)}.info.icon.active::before,.info.icon.active::after{background-color:var(--base02)}.search.icon{color:var(--base0D);width:11px;height:11px;border:solid 1px var(--base0D);border-radius:100%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.search.icon:before{content:\"\";top:11px;left:5px;height:6px;width:1px;background-color:var(--base0D)}\n`;var A={apathy:[\"#031a16\",\"#0b342d\",\"#184e45\",\"#2b685e\",\"#5f9c92\",\"#81b5ac\",\"#a7cec8\",\"#d2e7e4\",\"#3e9688\",\"#3e7996\",\"#3e4c96\",\"#883e96\",\"#963e4c\",\"#96883e\",\"#4c963e\",\"#3e965b\"],ashes:[\"#1c2023\",\"#393f45\",\"#565e65\",\"#747c84\",\"#adb3ba\",\"#c7ccd1\",\"#dfe2e5\",\"#f3f4f5\",\"#c7ae95\",\"#c7c795\",\"#aec795\",\"#95c7ae\",\"#95aec7\",\"#ae95c7\",\"#c795ae\",\"#c79595\"],\"atelier-dune-light\":[\"#fefbec\",\"#e8e4cf\",\"#a6a28c\",\"#999580\",\"#7d7a68\",\"#6e6b5e\",\"#292824\",\"#20201d\",\"#d73737\",\"#b65611\",\"#ae9513\",\"#60ac39\",\"#1fad83\",\"#6684e1\",\"#b854d4\",\"#d43552\"],\"atelier-dune\":[\"#20201d\",\"#292824\",\"#6e6b5e\",\"#7d7a68\",\"#999580\",\"#a6a28c\",\"#e8e4cf\",\"#fefbec\",\"#d73737\",\"#b65611\",\"#ae9513\",\"#60ac39\",\"#1fad83\",\"#6684e1\",\"#b854d4\",\"#d43552\"],atlas:[\"#002635\",\"#00384d\",\"#517f8d\",\"#6c8b91\",\"#869696\",\"#a1a19a\",\"#e6e6dc\",\"#fafaf8\",\"#ff5a67\",\"#f08e48\",\"#ffcc1b\",\"#7fc06e\",\"#14747e\",\"#5dd7b9\",\"#9a70a4\",\"#c43060\"],bespin:[\"#28211c\",\"#36312e\",\"#5e5d5c\",\"#666666\",\"#797977\",\"#8a8986\",\"#9d9b97\",\"#baae9e\",\"#cf6a4c\",\"#cf7d34\",\"#f9ee98\",\"#54be0d\",\"#afc4db\",\"#5ea6ea\",\"#9b859d\",\"#937121\"],\"black-metal\":[\"#000000\",\"#121212\",\"#222222\",\"#333333\",\"#999999\",\"#c1c1c1\",\"#999999\",\"#c1c1c1\",\"#5f8787\",\"#aaaaaa\",\"#a06666\",\"#dd9999\",\"#aaaaaa\",\"#888888\",\"#999999\",\"#444444\"],brewer:[\"#0c0d0e\",\"#2e2f30\",\"#515253\",\"#737475\",\"#959697\",\"#b7b8b9\",\"#dadbdc\",\"#fcfdfe\",\"#e31a1c\",\"#e6550d\",\"#dca060\",\"#31a354\",\"#80b1d3\",\"#3182bd\",\"#756bb1\",\"#b15928\"],bright:[\"#000000\",\"#303030\",\"#505050\",\"#b0b0b0\",\"#d0d0d0\",\"#e0e0e0\",\"#f5f5f5\",\"#ffffff\",\"#fb0120\",\"#fc6d24\",\"#fda331\",\"#a1c659\",\"#76c7b7\",\"#6fb3d2\",\"#d381c3\",\"#be643c\"],brogrammer:[\"#1f1f1f\",\"#f81118\",\"#2dc55e\",\"#ecba0f\",\"#2a84d2\",\"#4e5ab7\",\"#1081d6\",\"#d6dbe5\",\"#d6dbe5\",\"#de352e\",\"#1dd361\",\"#f3bd09\",\"#1081d6\",\"#5350b9\",\"#0f7ddb\",\"#ffffff\"],\"brushtrees-dark\":[\"#485867\",\"#5a6d7a\",\"#6d828e\",\"#8299a1\",\"#98afb5\",\"#b0c5c8\",\"#c9dbdc\",\"#e3efef\",\"#b38686\",\"#d8bba2\",\"#aab386\",\"#87b386\",\"#86b3b3\",\"#868cb3\",\"#b386b2\",\"#b39f9f\"],brushtrees:[\"#e3efef\",\"#c9dbdc\",\"#b0c5c8\",\"#98afb5\",\"#8299a1\",\"#6d828e\",\"#5a6d7a\",\"#485867\",\"#b38686\",\"#d8bba2\",\"#aab386\",\"#87b386\",\"#86b3b3\",\"#868cb3\",\"#b386b2\",\"#b39f9f\"],chalk:[\"#151515\",\"#202020\",\"#303030\",\"#505050\",\"#b0b0b0\",\"#d0d0d0\",\"#e0e0e0\",\"#f5f5f5\",\"#fb9fb1\",\"#eda987\",\"#ddb26f\",\"#acc267\",\"#12cfc0\",\"#6fc2ef\",\"#e1a3ee\",\"#deaf8f\"],circus:[\"#191919\",\"#202020\",\"#303030\",\"#5f5a60\",\"#505050\",\"#a7a7a7\",\"#808080\",\"#ffffff\",\"#dc657d\",\"#4bb1a7\",\"#c3ba63\",\"#84b97c\",\"#4bb1a7\",\"#639ee4\",\"#b888e2\",\"#b888e2\"],\"classic-dark\":[\"#151515\",\"#202020\",\"#303030\",\"#505050\",\"#b0b0b0\",\"#d0d0d0\",\"#e0e0e0\",\"#f5f5f5\",\"#ac4142\",\"#d28445\",\"#f4bf75\",\"#90a959\",\"#75b5aa\",\"#6a9fb5\",\"#aa759f\",\"#8f5536\"],\"classic-light\":[\"#f5f5f5\",\"#e0e0e0\",\"#d0d0d0\",\"#b0b0b0\",\"#505050\",\"#303030\",\"#202020\",\"#151515\",\"#ac4142\",\"#d28445\",\"#f4bf75\",\"#90a959\",\"#75b5aa\",\"#6a9fb5\",\"#aa759f\",\"#8f5536\"],codeschool:[\"#232c31\",\"#1c3657\",\"#2a343a\",\"#3f4944\",\"#84898c\",\"#9ea7a6\",\"#a7cfa3\",\"#b5d8f6\",\"#2a5491\",\"#43820d\",\"#a03b1e\",\"#237986\",\"#b02f30\",\"#484d79\",\"#c59820\",\"#c98344\"],cupcake:[\"#fbf1f2\",\"#f2f1f4\",\"#d8d5dd\",\"#bfb9c6\",\"#a59daf\",\"#8b8198\",\"#72677e\",\"#585062\",\"#d57e85\",\"#ebb790\",\"#dcb16c\",\"#a3b367\",\"#69a9a7\",\"#7297b9\",\"#bb99b4\",\"#baa58c\"],cupertino:[\"#ffffff\",\"#c0c0c0\",\"#c0c0c0\",\"#808080\",\"#808080\",\"#404040\",\"#404040\",\"#5e5e5e\",\"#c41a15\",\"#eb8500\",\"#826b28\",\"#007400\",\"#318495\",\"#0000ff\",\"#a90d91\",\"#826b28\"],darcula:[\"#2b2b2b\",\"#323232\",\"#323232\",\"#606366\",\"#a4a3a3\",\"#a9b7c6\",\"#ffc66d\",\"#ffffff\",\"#4eade5\",\"#689757\",\"#bbb529\",\"#6a8759\",\"#629755\",\"#9876aa\",\"#cc7832\",\"#808080\"],darktooth:[\"#1d2021\",\"#32302f\",\"#504945\",\"#665c54\",\"#928374\",\"#a89984\",\"#d5c4a1\",\"#fdf4c1\",\"#fb543f\",\"#fe8625\",\"#fac03b\",\"#95c085\",\"#8ba59b\",\"#0d6678\",\"#8f4673\",\"#a87322\"],\"default-dark\":[\"#181818\",\"#282828\",\"#383838\",\"#585858\",\"#b8b8b8\",\"#d8d8d8\",\"#e8e8e8\",\"#f8f8f8\",\"#ab4642\",\"#dc9656\",\"#f7ca88\",\"#a1b56c\",\"#86c1b9\",\"#7cafc2\",\"#ba8baf\",\"#a16946\"],\"default-light\":[\"#ffffff\",\"#e8e8e8\",\"#d8d8d8\",\"#b8b8b8\",\"#585858\",\"#383838\",\"#282828\",\"#181818\",\"#ab4642\",\"#dc9656\",\"#ab4642\",\"#a1b56c\",\"#86c1b9\",\"#7cafc2\",\"#ba8baf\",\"#a16946\"],dracula:[\"#282936\",\"#3a3c4e\",\"#4d4f68\",\"#626483\",\"#62d6e8\",\"#e9e9f4\",\"#f1f2f8\",\"#f7f7fb\",\"#ea51b2\",\"#b45bcf\",\"#00f769\",\"#ebff87\",\"#a1efe4\",\"#62d6e8\",\"#b45bcf\",\"#00f769\"],eighties:[\"#2d2d2d\",\"#393939\",\"#515151\",\"#747369\",\"#a09f93\",\"#d3d0c8\",\"#e8e6df\",\"#f2f0ec\",\"#f2777a\",\"#f99157\",\"#ffcc66\",\"#99cc99\",\"#66cccc\",\"#6699cc\",\"#cc99cc\",\"#d27b53\"],embers:[\"#16130f\",\"#2c2620\",\"#433b32\",\"#5a5047\",\"#8a8075\",\"#a39a90\",\"#beb6ae\",\"#dbd6d1\",\"#826d57\",\"#828257\",\"#6d8257\",\"#57826d\",\"#576d82\",\"#6d5782\",\"#82576d\",\"#825757\"],flat:[\"#2c3e50\",\"#34495e\",\"#7f8c8d\",\"#95a5a6\",\"#bdc3c7\",\"#e0e0e0\",\"#f5f5f5\",\"#ecf0f1\",\"#e74c3c\",\"#e67e22\",\"#f1c40f\",\"#2ecc71\",\"#1abc9c\",\"#3498db\",\"#9b59b6\",\"#be643c\"],\"fruit-soda\":[\"#f1ecf1\",\"#e0dee0\",\"#d8d5d5\",\"#b5b4b6\",\"#979598\",\"#515151\",\"#474545\",\"#2d2c2c\",\"#fe3e31\",\"#fe6d08\",\"#f7e203\",\"#47f74c\",\"#0f9cfd\",\"#2931df\",\"#611fce\",\"#b16f40\"],github:[\"#ffffff\",\"#f5f5f5\",\"#c8c8fa\",\"#969896\",\"#e8e8e8\",\"#333333\",\"#ffffff\",\"#969896\",\"#ed6a43\",\"#0086b3\",\"#795da3\",\"#183691\",\"#183691\",\"#795da3\",\"#a71d5d\",\"#333333\"],\"google-dark\":[\"#1d1f21\",\"#282a2e\",\"#373b41\",\"#969896\",\"#b4b7b4\",\"#c5c8c6\",\"#e0e0e0\",\"#ffffff\",\"#cc342b\",\"#f96a38\",\"#fba922\",\"#198844\",\"#3971ed\",\"#3971ed\",\"#a36ac7\",\"#3971ed\"],\"google-light\":[\"#ffffff\",\"#e0e0e0\",\"#c5c8c6\",\"#b4b7b4\",\"#969896\",\"#373b41\",\"#282a2e\",\"#1d1f21\",\"#cc342b\",\"#f96a38\",\"#fba922\",\"#198844\",\"#3971ed\",\"#3971ed\",\"#a36ac7\",\"#3971ed\"],\"grayscale-dark\":[\"#101010\",\"#252525\",\"#464646\",\"#525252\",\"#ababab\",\"#b9b9b9\",\"#e3e3e3\",\"#f7f7f7\",\"#7c7c7c\",\"#999999\",\"#a0a0a0\",\"#8e8e8e\",\"#868686\",\"#686868\",\"#747474\",\"#5e5e5e\"],\"grayscale-light\":[\"#f7f7f7\",\"#e3e3e3\",\"#b9b9b9\",\"#ababab\",\"#525252\",\"#464646\",\"#252525\",\"#101010\",\"#7c7c7c\",\"#999999\",\"#a0a0a0\",\"#8e8e8e\",\"#868686\",\"#686868\",\"#747474\",\"#5e5e5e\"],greenscreen:[\"#001100\",\"#003300\",\"#005500\",\"#007700\",\"#009900\",\"#00bb00\",\"#00dd00\",\"#00ff00\",\"#007700\",\"#009900\",\"#007700\",\"#00bb00\",\"#005500\",\"#009900\",\"#00bb00\",\"#005500\"],\"gruvbox-dark-hard\":[\"#1d2021\",\"#3c3836\",\"#504945\",\"#665c54\",\"#bdae93\",\"#d5c4a1\",\"#ebdbb2\",\"#fbf1c7\",\"#fb4934\",\"#fe8019\",\"#fabd2f\",\"#b8bb26\",\"#8ec07c\",\"#83a598\",\"#d3869b\",\"#d65d0e\"],\"gruvbox-light-hard\":[\"#f9f5d7\",\"#ebdbb2\",\"#d5c4a1\",\"#bdae93\",\"#665c54\",\"#504945\",\"#3c3836\",\"#282828\",\"#9d0006\",\"#af3a03\",\"#b57614\",\"#79740e\",\"#427b58\",\"#076678\",\"#8f3f71\",\"#d65d0e\"],\"harmonic-dark\":[\"#0b1c2c\",\"#223b54\",\"#405c79\",\"#627e99\",\"#aabcce\",\"#cbd6e2\",\"#e5ebf1\",\"#f7f9fb\",\"#bf8b56\",\"#bfbf56\",\"#8bbf56\",\"#56bf8b\",\"#568bbf\",\"#8b56bf\",\"#bf568b\",\"#bf5656\"],\"harmonic-light\":[\"#f7f9fb\",\"#e5ebf1\",\"#cbd6e2\",\"#aabcce\",\"#627e99\",\"#405c79\",\"#223b54\",\"#0b1c2c\",\"#bf8b56\",\"#bfbf56\",\"#8bbf56\",\"#56bf8b\",\"#568bbf\",\"#8b56bf\",\"#bf568b\",\"#bf5656\"],\"heetch-light\":[\"#feffff\",\"#392551\",\"#7b6d8b\",\"#9c92a8\",\"#ddd6e5\",\"#5a496e\",\"#470546\",\"#190134\",\"#27d9d5\",\"#bdb6c5\",\"#5ba2b6\",\"#f80059\",\"#c33678\",\"#47f9f5\",\"#bd0152\",\"#dedae2\"],heetch:[\"#190134\",\"#392551\",\"#5a496e\",\"#7b6d8b\",\"#9c92a8\",\"#bdb6c5\",\"#dedae2\",\"#feffff\",\"#27d9d5\",\"#5ba2b6\",\"#8f6c97\",\"#c33678\",\"#f80059\",\"#bd0152\",\"#82034c\",\"#470546\"],helios:[\"#1d2021\",\"#383c3e\",\"#53585b\",\"#6f7579\",\"#cdcdcd\",\"#d5d5d5\",\"#dddddd\",\"#e5e5e5\",\"#d72638\",\"#eb8413\",\"#f19d1a\",\"#88b92d\",\"#1ba595\",\"#1e8bac\",\"#be4264\",\"#c85e0d\"],hopscotch:[\"#322931\",\"#433b42\",\"#5c545b\",\"#797379\",\"#989498\",\"#b9b5b8\",\"#d5d3d5\",\"#ffffff\",\"#dd464c\",\"#fd8b19\",\"#fdcc59\",\"#8fc13e\",\"#149b93\",\"#1290bf\",\"#c85e7c\",\"#b33508\"],\"horizon-dark\":[\"#1c1e26\",\"#232530\",\"#2e303e\",\"#676a8d\",\"#ced1d0\",\"#cbced0\",\"#dcdfe4\",\"#e3e6ee\",\"#e93c58\",\"#e58d7d\",\"#efb993\",\"#efaf8e\",\"#24a8b4\",\"#df5273\",\"#b072d1\",\"#e4a382\"],\"ia-dark\":[\"#1a1a1a\",\"#222222\",\"#1d414d\",\"#767676\",\"#b8b8b8\",\"#cccccc\",\"#e8e8e8\",\"#f8f8f8\",\"#d88568\",\"#d86868\",\"#b99353\",\"#83a471\",\"#7c9cae\",\"#8eccdd\",\"#b98eb2\",\"#8b6c37\"],\"ia-light\":[\"#f6f6f6\",\"#dedede\",\"#bde5f2\",\"#898989\",\"#767676\",\"#181818\",\"#e8e8e8\",\"#898989\",\"#9c5a02\",\"#c43e18\",\"#c48218\",\"#38781c\",\"#2d6bb1\",\"#48bac2\",\"#a94598\",\"#8b6c37\"],icy:[\"#021012\",\"#031619\",\"#041f23\",\"#052e34\",\"#064048\",\"#095b67\",\"#0c7c8c\",\"#109cb0\",\"#16c1d9\",\"#b3ebf2\",\"#80deea\",\"#4dd0e1\",\"#26c6da\",\"#00bcd4\",\"#00acc1\",\"#0097a7\"],isotope:[\"#000000\",\"#404040\",\"#606060\",\"#808080\",\"#c0c0c0\",\"#d0d0d0\",\"#e0e0e0\",\"#ffffff\",\"#ff0000\",\"#ff9900\",\"#ff0099\",\"#33ff00\",\"#00ffff\",\"#0066ff\",\"#cc00ff\",\"#3300ff\"],macintosh:[\"#000000\",\"#404040\",\"#404040\",\"#808080\",\"#808080\",\"#c0c0c0\",\"#c0c0c0\",\"#ffffff\",\"#dd0907\",\"#ff6403\",\"#fbf305\",\"#1fb714\",\"#02abea\",\"#0000d3\",\"#4700a5\",\"#90713a\"],marrakesh:[\"#201602\",\"#302e00\",\"#5f5b17\",\"#6c6823\",\"#86813b\",\"#948e48\",\"#ccc37a\",\"#faf0a5\",\"#c35359\",\"#b36144\",\"#a88339\",\"#18974e\",\"#75a738\",\"#477ca1\",\"#8868b3\",\"#b3588e\"],materia:[\"#263238\",\"#2c393f\",\"#37474f\",\"#707880\",\"#c9ccd3\",\"#cdd3de\",\"#d5dbe5\",\"#ffffff\",\"#ec5f67\",\"#ea9560\",\"#ffcc00\",\"#8bd649\",\"#80cbc4\",\"#89ddff\",\"#82aaff\",\"#ec5f67\"],\"material-lighter\":[\"#fafafa\",\"#e7eaec\",\"#cceae7\",\"#ccd7da\",\"#8796b0\",\"#80cbc4\",\"#80cbc4\",\"#666666\",\"#ff5370\",\"#f76d47\",\"#ffb62c\",\"#91b859\",\"#39adb5\",\"#6182b8\",\"#7c4dff\",\"#e53935\"],material:[\"#263238\",\"#2e3c43\",\"#314549\",\"#546e7a\",\"#b2ccd6\",\"#eeffff\",\"#eeffff\",\"#ffffff\",\"#f07178\",\"#f78c6c\",\"#ffcb6b\",\"#c3e88d\",\"#89ddff\",\"#82aaff\",\"#c792ea\",\"#ff5370\"],\"mellow-purple\":[\"#1e0528\",\"#1a092d\",\"#331354\",\"#320f55\",\"#873582\",\"#ffeeff\",\"#ffeeff\",\"#f8c0ff\",\"#00d9e9\",\"#aa00a3\",\"#955ae7\",\"#05cb0d\",\"#b900b1\",\"#550068\",\"#8991bb\",\"#4d6fff\"],\"mexico-light\":[\"#f8f8f8\",\"#e8e8e8\",\"#d8d8d8\",\"#b8b8b8\",\"#585858\",\"#383838\",\"#282828\",\"#181818\",\"#ab4642\",\"#dc9656\",\"#f79a0e\",\"#538947\",\"#4b8093\",\"#7cafc2\",\"#96609e\",\"#a16946\"],mocha:[\"#3b3228\",\"#534636\",\"#645240\",\"#7e705a\",\"#b8afad\",\"#d0c8c6\",\"#e9e1dd\",\"#f5eeeb\",\"#cb6077\",\"#d28b71\",\"#f4bc87\",\"#beb55b\",\"#7bbda4\",\"#8ab3b5\",\"#a89bb9\",\"#bb9584\"],monokai:[\"#272822\",\"#383830\",\"#49483e\",\"#75715e\",\"#a59f85\",\"#f8f8f2\",\"#f5f4f1\",\"#f9f8f5\",\"#f92672\",\"#fd971f\",\"#f4bf75\",\"#a6e22e\",\"#a1efe4\",\"#66d9ef\",\"#ae81ff\",\"#cc6633\"],nord:[\"#2e3440\",\"#3b4252\",\"#434c5e\",\"#4c566a\",\"#d8dee9\",\"#e5e9f0\",\"#eceff4\",\"#8fbcbb\",\"#88c0d0\",\"#81a1c1\",\"#5e81ac\",\"#bf616a\",\"#d08770\",\"#ebcb8b\",\"#a3be8c\",\"#b48ead\"],ocean:[\"#2b303b\",\"#343d46\",\"#4f5b66\",\"#65737e\",\"#a7adba\",\"#c0c5ce\",\"#dfe1e8\",\"#eff1f5\",\"#bf616a\",\"#d08770\",\"#ebcb8b\",\"#a3be8c\",\"#96b5b4\",\"#8fa1b3\",\"#b48ead\",\"#ab7967\"],\"one-light\":[\"#fafafa\",\"#f0f0f1\",\"#e5e5e6\",\"#a0a1a7\",\"#696c77\",\"#383a42\",\"#202227\",\"#090a0b\",\"#ca1243\",\"#d75f00\",\"#c18401\",\"#50a14f\",\"#0184bc\",\"#4078f2\",\"#a626a4\",\"#986801\"],onedark:[\"#282c34\",\"#353b45\",\"#3e4451\",\"#545862\",\"#565c64\",\"#abb2bf\",\"#b6bdca\",\"#c8ccd4\",\"#e06c75\",\"#d19a66\",\"#e5c07b\",\"#98c379\",\"#56b6c2\",\"#61afef\",\"#c678dd\",\"#be5046\"],\"papercolor-dark\":[\"#1c1c1c\",\"#af005f\",\"#5faf00\",\"#d7af5f\",\"#5fafd7\",\"#808080\",\"#d7875f\",\"#d0d0d0\",\"#585858\",\"#5faf5f\",\"#afd700\",\"#af87d7\",\"#ffaf00\",\"#ff5faf\",\"#00afaf\",\"#5f8787\"],\"papercolor-light\":[\"#eeeeee\",\"#af0000\",\"#008700\",\"#5f8700\",\"#0087af\",\"#878787\",\"#005f87\",\"#444444\",\"#bcbcbc\",\"#d70000\",\"#d70087\",\"#8700af\",\"#d75f00\",\"#d75f00\",\"#005faf\",\"#005f87\"],paraiso:[\"#2f1e2e\",\"#41323f\",\"#4f424c\",\"#776e71\",\"#8d8687\",\"#a39e9b\",\"#b9b6b0\",\"#e7e9db\",\"#ef6155\",\"#f99b15\",\"#fec418\",\"#48b685\",\"#5bc4bf\",\"#06b6ef\",\"#815ba4\",\"#e96ba8\"],pico:[\"#000000\",\"#1d2b53\",\"#7e2553\",\"#008751\",\"#ab5236\",\"#5f574f\",\"#c2c3c7\",\"#fff1e8\",\"#ff004d\",\"#ffa300\",\"#fff024\",\"#00e756\",\"#29adff\",\"#83769c\",\"#ff77a8\",\"#ffccaa\"],pop:[\"#000000\",\"#202020\",\"#303030\",\"#505050\",\"#b0b0b0\",\"#d0d0d0\",\"#e0e0e0\",\"#ffffff\",\"#eb008a\",\"#f29333\",\"#f8ca12\",\"#37b349\",\"#00aabb\",\"#0e5a94\",\"#b31e8d\",\"#7a2d00\"],railscasts:[\"#2b2b2b\",\"#272935\",\"#3a4055\",\"#5a647e\",\"#d4cfc9\",\"#e6e1dc\",\"#f4f1ed\",\"#f9f7f3\",\"#da4939\",\"#cc7833\",\"#ffc66d\",\"#a5c261\",\"#519f50\",\"#6d9cbe\",\"#b6b3eb\",\"#bc9458\"],seti:[\"#151718\",\"#282a2b\",\"#3b758c\",\"#41535b\",\"#43a5d5\",\"#d6d6d6\",\"#eeeeee\",\"#ffffff\",\"#cd3f45\",\"#db7b55\",\"#e6cd69\",\"#9fca56\",\"#55dbbe\",\"#55b5db\",\"#a074c4\",\"#8a553f\"],\"solarized-dark\":[\"#002b36\",\"#073642\",\"#586e75\",\"#657b83\",\"#839496\",\"#93a1a1\",\"#eee8d5\",\"#fdf6e3\",\"#dc322f\",\"#cb4b16\",\"#b58900\",\"#859900\",\"#2aa198\",\"#268bd2\",\"#6c71c4\",\"#d33682\"],\"solarized-light\":[\"#fdf6e3\",\"#eee8d5\",\"#93a1a1\",\"#839496\",\"#657b83\",\"#586e75\",\"#073642\",\"#002b36\",\"#dc322f\",\"#cb4b16\",\"#b58900\",\"#859900\",\"#2aa198\",\"#268bd2\",\"#6c71c4\",\"#d33682\"],spacemacs:[\"#1f2022\",\"#282828\",\"#444155\",\"#585858\",\"#b8b8b8\",\"#a3a3a3\",\"#e8e8e8\",\"#f8f8f8\",\"#f2241f\",\"#ffa500\",\"#b1951d\",\"#67b11d\",\"#2d9574\",\"#4f97d7\",\"#a31db1\",\"#b03060\"],\"summerfruit-dark\":[\"#151515\",\"#202020\",\"#303030\",\"#505050\",\"#b0b0b0\",\"#d0d0d0\",\"#e0e0e0\",\"#ffffff\",\"#ff0086\",\"#fd8900\",\"#aba800\",\"#00c918\",\"#1faaaa\",\"#3777e6\",\"#ad00a1\",\"#cc6633\"],\"summerfruit-light\":[\"#ffffff\",\"#e0e0e0\",\"#d0d0d0\",\"#b0b0b0\",\"#000000\",\"#101010\",\"#151515\",\"#202020\",\"#ff0086\",\"#fd8900\",\"#aba800\",\"#00c918\",\"#1faaaa\",\"#3777e6\",\"#ad00a1\",\"#cc6633\"],\"tomorrow-night\":[\"#1d1f21\",\"#282a2e\",\"#373b41\",\"#969896\",\"#b4b7b4\",\"#c5c8c6\",\"#e0e0e0\",\"#ffffff\",\"#cc6666\",\"#de935f\",\"#f0c674\",\"#b5bd68\",\"#8abeb7\",\"#81a2be\",\"#b294bb\",\"#a3685a\"],tomorrow:[\"#ffffff\",\"#e0e0e0\",\"#d6d6d6\",\"#8e908c\",\"#969896\",\"#4d4d4c\",\"#282a2e\",\"#1d1f21\",\"#c82829\",\"#f5871f\",\"#eab700\",\"#718c00\",\"#3e999f\",\"#4271ae\",\"#8959a8\",\"#a3685a\"],tube:[\"#231f20\",\"#1c3f95\",\"#5a5758\",\"#737171\",\"#959ca1\",\"#d9d8d8\",\"#e7e7e8\",\"#ffffff\",\"#ee2e24\",\"#f386a1\",\"#ffd204\",\"#00853e\",\"#85cebc\",\"#009ddc\",\"#98005d\",\"#b06110\"],twilight:[\"#1e1e1e\",\"#323537\",\"#464b50\",\"#5f5a60\",\"#838184\",\"#a7a7a7\",\"#c3c3c3\",\"#ffffff\",\"#cf6a4c\",\"#cda869\",\"#f9ee98\",\"#8f9d6a\",\"#afc4db\",\"#7587a6\",\"#9b859d\",\"#9b703f\"],woodland:[\"#231e18\",\"#302b25\",\"#48413a\",\"#9d8b70\",\"#b4a490\",\"#cabcb1\",\"#d7c8bc\",\"#e4d4c8\",\"#d35c5c\",\"#ca7f32\",\"#e0ac16\",\"#b7ba53\",\"#6eb958\",\"#88a4d3\",\"#bb90e2\",\"#b49368\"],zenburn:[\"#383838\",\"#404040\",\"#606060\",\"#6f6f6f\",\"#808080\",\"#dcdccc\",\"#c0c0c0\",\"#ffffff\",\"#dca3a3\",\"#dfaf8f\",\"#e0cf9f\",\"#5f7f5f\",\"#93e0e3\",\"#7cb8bb\",\"#dc8cc3\",\"#000000\"]},V=Object.keys(A),R=a=>{let e;if(typeof a==\"string\"){if(A[a]===void 0)throw new Error(`${a} not found`);e=A[a].reduce((d,r,o)=>{let t=`base0${o.toString(16).toUpperCase()}`;return d[t]=r,d},{})}else e=a;return`.container{${Object.keys(e).map(d=>`--${d}: ${e[d]};`).join(\"\")}}`};var j=a=>{try{return!!new URL(a)}catch{return!1}},W=a=>{if(Array.isArray(a))return\"array\";if(a===null)return\"null\";if(a instanceof RegExp)return\"regexp\";let e=typeof a;return e===\"number\"?isNaN(a)?\"NaN\":isFinite(a)?Number.isInteger(a)?\"int\":\"float\":\"Infinity\":e===\"boolean\"?\"bool\":e===\"object\"&&a instanceof Date?\"date\":e};var $=a=>{if(typeof a==\"boolean\")return a;if(a===\"true\")return!0;if(a===\"false\")return!1;throw new Error(\"should be a boolean!\")},J=a=>{if(typeof a==\"string\")return a;throw new Error(\"should be a string!\")},O=a=>{if(typeof a==\"number\"&&a>=0)return a;if(typeof a==\"string\"&&(a=parseFloat(a)),isNaN(a)||a<0)throw new Error(\"should be a positive number!\");return a},B=a=>{if(typeof a==\"boolean\"||typeof a==\"number\")return a;if(a===\"true\")return!0;if(a===\"false\")return!1;if(typeof a==\"string\"&&(a=parseFloat(a),!isNaN(a)&&a>=0))return a;throw new Error(\"should be a boolean or a positive number!\")},z=a=>{if(typeof a==\"object\")return a;if(typeof a==\"string\")try{return JSON.parse(a)}catch{return a}throw new Error(\"should be a string or JSON!\")};var P=function({key:a,value:e,expanded:d,indent:r,onToggleExpand:o,level:t=0,parentRow:v}){let n=document.createElement(\"div\");this.maxLevel=t;let i=W(e),m=i===\"array\"||i===\"object\",x=d===!0||d>t,p,g,b,h;n.className=`data-row ${x?\"expanded\":\"\"}`,n.dataset.key=a,n.dataset.level=t,t>0&&(n.style.paddingLeft=`${r*5}px`);let f=document.createElement(\"span\");f.className=\"key-value-wrapper\",n.appendChild(f);let w=()=>{n.classList.toggle(\"expanded\"),o&&(n.classList.contains(\"expanded\")?o(t+1):o(t))};if(m){let c=document.createElement(\"span\");c.className=\"icon-wrapper\",f.appendChild(c),p=document.createElement(\"span\"),p.className=\"expand icon clickable\",p.setAttribute(\"title\",x?\"Collapse\":\"Expand\"),c.appendChild(p),c.addEventListener(\"click\",()=>w())}if(a!==null&&a!==\"\"){let c=typeof a;b=document.createElement(\"span\"),b.className=`key clickable ${c===\"number\"?\"number\":\"\"}`,b.textContent=c===\"number\"?a:`${a}`,b.addEventListener(\"click\",()=>w()),f.appendChild(b);let s=document.createElement(\"span\");s.classList.add(\"colon\"),s.textContent=\":\",f.appendChild(s)}if(m){let c=document.createElement(\"span\");c.className=\"opening-parenthesis\",c.textContent=i===\"array\"?\"[\":\"{\",f.appendChild(c);let s=document.createElement(\"span\");s.className=\"ellipsis clickable\",s.textContent=\"...\",s.addEventListener(\"click\",()=>w()),f.appendChild(s);let l=document.createElement(\"span\");l.className=\"closing-parenthesis\",l.textContent=i===\"array\"?\"]\":\"}\",f.appendChild(l);let E=document.createElement(\"span\"),D=i===\"array\"?e.length:Object.keys(e).length;E.className=\"items-size\",E.textContent=`${D} item${D===1?\"\":\"s\"}`,f.appendChild(E),g=[],(i===\"array\"?e.map((C,k)=>k):Object.keys(e)).forEach(C=>{let k=new P({key:C,value:e[C],expanded:d,indent:r,onToggleExpand:o,level:t+1,parentRow:n});g.push(k),n.appendChild(k.element),this.maxLevel=Math.max(this.maxLevel,k.maxLevel)});let S=document.createElement(\"span\");S.className=\"closing-parenthesis\",S.textContent=i===\"array\"?\"]\":\"}\",n.appendChild(S)}else{let c=null;[\"nan\",\"NaN\",\"undefined\",\"null\"].includes(i)||(c=document.createElement(\"span\"),c.className=\"type\",c.textContent=i.toLowerCase());let s=document.createElement(\"span\");s.className=`value ${i.toLowerCase()}`,h=document.createElement(\"span\"),h.className=\"value-data\",h.textContent=i===\"string\"?`\"${e}\"`:e,c&&s.appendChild(c),s.appendChild(h),f.appendChild(s)}let u=document.createElement(\"span\");u.className=\"copy icon\",u.setAttribute(\"title\",\"Copy to clipboard\");let y=document.createElement(\"span\");y.className=\"icon-wrapper\",y.addEventListener(\"click\",()=>{navigator.clipboard.writeText(JSON.stringify(e,null,r))}),y.appendChild(u),f.appendChild(y);let N=c=>{let s=new RegExp(c,\"gi\"),l=[];b&&l.push(b),h&&l.push(h);let E=!1;l.forEach(D=>{let L=D.textContent;if(D.innerHTML=L,!c||c===\"\")return;let S=[...L.matchAll(s)].map(I=>I.index),C=[],k=0;S.forEach(I=>{E=!0,C.push(L.slice(k,I)),C.push(`${c}`),k=I+c.length}),C.push(L.slice(k)),D.innerHTML=C.join(\"\")}),E&&!n.classList.contains(\"expanded\")&&(w(),v&&v.classList.add(\"expanded\"))};this.update=({expanded:c,indent:s,searchTerm:l})=>{s!==void 0&&t>0&&(n.style.paddingLeft=`${s*5}px`),c!==void 0&&(x=c===!0||c>t,n.classList.toggle(\"expanded\",x),p&&(p.title=x?\"Collapse\":\"Expand\")),l!=null&&N(l),g&&g.forEach(E=>E.update({expanded:c,indent:s,searchTerm:l}))},this.element=n},U=P;var G=function({expanded:a,indent:e,onChange:d,onSearch:r,showDetails:o}){this.indent=e||2,this.expanded=typeof a==\"number\"?a:2,this.showDetails=o!==!1,this.maxExpandLevel=0;let t,v=document.createElement(\"div\");v.className=\"toolbar\";let n=document.createElement(\"div\");n.className=\"options\",v.appendChild(n);let i=document.createElement(\"div\");i.className=\"search-wrapper\",v.appendChild(i);let m=document.createElement(\"div\");m.className=\"icon-wrapper clickable\",n.appendChild(m);let x=document.createElement(\"span\");x.className=\"icon refresh\",m.onclick=()=>this.refresh(),m.appendChild(x);let p=document.createElement(\"div\");p.className=\"icon-wrapper clickable\",n.appendChild(p);let g=document.createElement(\"span\");g.className=\"icon plus\",p.appendChild(g),p.onclick=()=>{this.expanded{this.expanded>this.maxExpandLevel&&(this.expanded=this.maxExpandLevel),this.expanded>0&&(this.expanded-=1),d({expanded:this.expanded})};let f=document.createElement(\"div\");f.className=\"icon-wrapper clickable\",n.appendChild(f);let w=document.createElement(\"span\");w.className=\"icon indent\",f.onclick=()=>{this.indent+=1,d({indent:this.indent})},f.appendChild(w);let u=document.createElement(\"div\");u.className=\"icon-wrapper clickable\",n.appendChild(u);let y=document.createElement(\"span\");y.className=\"icon outdent\",u.onclick=()=>{this.indent-=1,d({indent:this.indent})},u.appendChild(y);let N=document.createElement(\"div\");N.className=\"icon-wrapper clickable\",n.appendChild(N);let c=document.createElement(\"span\");c.className=`icon info ${this.showDetails?\"active\":\"\"}`,N.onclick=()=>{c.classList.toggle(\"active\"),this.showDetails=!this.showDetails,d({showDetails:this.showDetails})},N.appendChild(c);let s=document.createElement(\"span\");s.className=\"icon search\",i.appendChild(s),t=document.createElement(\"input\"),t.className=\"search-input\",t.placeholder=\"Search\",t.oninput=l=>{r(l.target.value)},i.appendChild(t),this.refresh=()=>{this.expanded=1,this.indent=2,t&&(t.value=\"\"),d({indent:2,expanded:1}),r(\"\")},this.updateShowDetails=l=>{this.showDetails=l,this.showDetails?c.classList.add(\"active\"):c.classList.remove(\"active\")},this.element=v},M=G;function K(a,e={}){let d=document.createElement(\"div\");d.className=\"container\",a.appendChild(d);let r=null,o=null,t={};this.update=({data:v,expanded:n,indent:i,expandIconType:m,showDataTypes:x,showToolbar:p,showSize:g,showCopy:b})=>{if(v){let f=JSON.stringify(v);t.dataComapreString!==f&&(t.dataComapreString=f,r=new U({key:\"\",value:v,expanded:n,indent:i,onToggleExpand:w=>{o&&(o.expanded=w),t.expanded=w}}),d.replaceChildren(r.element),t.showToolbar&&o&&(d.prepend(o.element),o.maxExpandLevel=r.maxLevel,o.refresh()))}if(p!==void 0&&t.showToolbar!==p)if(t.showToolbar=p,p)o||(o=new M({expanded:t.expanded,indent:t.indent,onChange:({expanded:f,indent:w,showDetails:u})=>{let y={expanded:f,indent:w};u!==void 0&&(y.showCopy=u,y.showSize=u,y.showDataTypes=u),this.update(y)},onSearch:f=>{r&&r.update({searchTerm:f})}})),r&&(o.maxExpandLevel=r.maxLevel),d.prepend(o.element);else{let f=d.querySelector(\".toolbar\");f&&f.remove()}let h={};n!==void 0&&t.expanded!==n&&(t.expanded=n,h.expanded=n),i!==void 0&&t.indent!==i&&(t.indent=i,h.indent=i),Object.keys(h).length>0&&r&&r.update(h),b!==void 0&&t.showCopy!==b&&(t.showCopy=b,d.classList.toggle(\"show-copy\",b)),g!==void 0&&t.showSize!==g&&(t.showSize=g,d.classList.toggle(\"show-size\",g),o&&o.updateShowDetails(t.showSize||t.showDataTypes)),x!==void 0&&t.showDataTypes!==x&&(t.showDataTypes=x,d.classList.toggle(\"show-data-types\",x),o&&o.updateShowDetails(t.showSize||t.showDataTypes)),m!==void 0&&t.expandIconType!==m&&(d.classList.add(`expand-icon-${m}`),d.classList.remove(`expand-icon-${t.expandIconType}`),t.expandIconType=m)},this.update(e)}var F=K;var H={indent:2,expanded:1,theme:\"default-light\",showDataTypes:!0,showToolbar:!1,expandIconType:\"arrow\",showCopy:!0,showSize:!0,data:null},T=class a extends HTMLElement{#t;#e;#c;#n;constructor(){super(),this.#e={...H},this.#t=document.createElement(\"style\");let e=this.attachShadow({mode:\"open\"}),d=document.createElement(\"style\");d.textContent=`${q}`,e.appendChild(d),e.appendChild(this.#t),this.theme=this.#e.theme,this.#n=new F(e,this.#e)}static get observedAttributes(){return Object.keys(H).map(e=>e.replace(/([a-z0-9])([A-Z])/g,\"$1-$2\").toLowerCase())}static allowedAttributes=[\"id\"].concat(a.observedAttributes);#d=(...e)=>{console.warn(`JsonViewer${this.id?` (${this.id})`:\"\"}:`,...e)};#a=(e,d,r,o)=>{try{if(d=r(d),o&&!o.includes(d))throw new Error(`should be one of ${o.join(\", \")}`);if(this.#e[e]===d)return;this.#e[e]=d,this.#o()}catch(t){this.#d(`Attribute ${e}: ${t.message}`)}};set showDataTypes(e){this.#a(\"showDataTypes\",e,$)}set showToolbar(e){this.#a(\"showToolbar\",e,$)}set indent(e){this.#a(\"indent\",e,O)}set expandIconType(e){this.#a(\"expandIconType\",e,J,[\"arrow\",\"square\",\"circle\"])}set expanded(e){this.#a(\"expanded\",e,B)}set showSize(e){this.#a(\"showSize\",e,$)}set showCopy(e){this.#a(\"showCopy\",e,$)}set theme(e){try{if(e=z(e),this.#e.theme===e&&this.#t.textContent!==\"\")return;this.#t.textContent=R(e),this.#e.theme=e}catch(d){this.#d(`Attribute theme: ${d.message}`)}}set data(e){try{e=z(e);let d=JSON.stringify(e);if(this.#e.data===d)return;this.#e.data=d,j(e)?fetch(e).then(r=>r.json()).then(r=>{this.#c=r,this.#o()}):(this.#c=e,this.#o())}catch(d){this.#d(`Attribute data: ${d.message}`)}}get options(){return this.#e}connectedCallback(){window.addEventListener(\"DOMContentLoaded\",()=>{let e=this.textContent;this.textContent=\"\",e&&(this.data=e)})}attributeChangedCallback(e,d,r){if(a.allowedAttributes.indexOf(e)>-1){let o=e.replace(/-([a-z])/g,t=>t[1].toUpperCase());this[o]=r}else this.#d(`Attribute ${e} is not supported and will be ignored!`),this.removeAttribute(e)}#o=()=>{this.#n.update({data:this.#c,expanded:this.#e.expanded,expandIconType:this.#e.expandIconType,indent:this.#e.indent,showDataTypes:this.#e.showDataTypes,showToolbar:this.#e.showToolbar,showSize:this.#e.showSize,showCopy:this.#e.showCopy})}};customElements.get(\"andypf-json-viewer\")||customElements.define(\"andypf-json-viewer\",T);\n"]} \ No newline at end of file diff --git a/public/decoderesponse/index.html b/public/decoderesponse/index.html index 799df0c..6006f76 100644 --- a/public/decoderesponse/index.html +++ b/public/decoderesponse/index.html @@ -94,6 +94,7 @@

WebAuthn
Response Decoder