@pkistudio/pvkgadgets 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1313 @@
1
+ function Tt($){return $&&$.__esModule&&Object.prototype.hasOwnProperty.call($,"default")?$.default:$}var At={exports:{}},xn;function Or(){return xn||(xn=1,(function($){((S,P)=>{const N=P();$.exports&&($.exports=N),S&&(S.PkiStudioCore=N)})(typeof globalThis<"u"?globalThis:void 0,()=>{const S="0.4.1",P=["Universal","Application","Context-specific","Private"],N={1:"BOOLEAN",2:"INTEGER",3:"BIT STRING",4:"OCTET STRING",5:"NULL",6:"OBJECT IDENTIFIER",10:"ENUMERATED",12:"UTF8String",16:"SEQUENCE",17:"SET",18:"NumericString",19:"PrintableString",20:"TeletexString",22:"IA5String",23:"UTCTime",24:"GeneralizedTime",30:"BMPString"};function O(r){const i=r.reduce((d,g)=>d+g.length,0),a=new Uint8Array(i);let c=0;for(const d of r)a.set(d,c),c+=d.length;return a}function q(r,i){if(r.length!==i.length)return!1;for(let a=0;a<r.length;a+=1)if(r[a]!==i[a])return!1;return!0}function Te(r){if(r instanceof Uint8Array)return r;if(r instanceof ArrayBuffer)return new Uint8Array(r);if(ArrayBuffer.isView(r))return new Uint8Array(r.buffer,r.byteOffset,r.byteLength);throw new Error("Input must be a Uint8Array, ArrayBuffer, typed array, or string")}function Y(r){return new TextDecoder("utf-8",{fatal:!1}).decode(r)}function le(r){return new TextEncoder().encode(r)}function Z(r){return/-----BEGIN [^-]+-----/.test(r)}function Ke(r){const i=r.replace(/\s+/g,"");return!i||i.length%4!==0||!/^[A-Za-z0-9+/]+={0,2}$/.test(i)||/=/.test(i.slice(0,-2))?"":i}function Me(r){if(typeof atob=="function"){const i=atob(r),a=new Uint8Array(i.length);for(let c=0;c<i.length;c+=1)a[c]=i.charCodeAt(c);return a}if(typeof Buffer<"u")return new Uint8Array(Buffer.from(r,"base64"));throw new Error("Base64 decoding is not available in this runtime")}function We(r){if(typeof btoa=="function"){let i="";for(let a=0;a<r.length;a+=1)i+=String.fromCharCode(r[a]);return btoa(i)}if(typeof Buffer<"u")return Buffer.from(r).toString("base64");throw new Error("Base64 encoding is not available in this runtime")}function ue(r){const i=/-----BEGIN ([^-]+)-----([\s\S]*?)-----END \1-----/g,a=[];let c;for(;(c=i.exec(r))!==null;){const d=c[2].split(/\r?\n/).filter(g=>!g.includes(":")).join("").replace(/\s+/g,"");if(!d)throw new Error(`PEM block ${c[1]} has no base64 data`);a.push(Me(d))}if(a.length===0)throw new Error("Could not read a PEM BEGIN/END block");return O(a)}function re(r){const i=Ke(r);if(!i)throw new Error("Headerless PEM data must be valid base64 text");const a=Me(i);return G(a,0,a.length),a}function h(r,i={}){const a=r.replace(/\s+/g,"");if(!a&&i.allowEmpty)return new Uint8Array;if(!a)throw new Error("HEX data is empty");if(!/^[0-9a-fA-F]+$/.test(a))throw new Error("HEX text may contain only 0-9 and a-f");if(a.length%2!==0)throw new Error("HEX text must contain an even number of digits");const c=new Uint8Array(a.length/2);for(let d=0;d<c.length;d+=1)c[d]=parseInt(a.slice(d*2,d*2+2),16);return c}function E(r){return Array.from(r,i=>i.toString(16).padStart(2,"0")).join("")}function u(r,i=32){const a=Math.min(r.length,i),c=Array.from(r.slice(0,a),d=>d.toString(16).padStart(2,"0")).join(" ");return r.length>i?`${c} ...`:c}function _(r,i=42){const a=Math.min(r.length,i),c=Array.from(r.slice(0,a),d=>d.toString(16).padStart(2,"0")).join("");return r.length>i?`${c}...`:c}function fe(r){if(r.length===0)return"0";if(r.length>8)return`0x${E(r)}`;let i=0n;for(const a of r)i=i<<8n|BigInt(a);return(r[0]&128)!==0&&(i-=1n<<BigInt(r.length*8)),i.toString()}function Ve(r){const i=[];for(let a=0;a+1<r.length;a+=2)i.push(r[a]<<8|r[a+1]);return String.fromCharCode(...i)}function De(r){if(r.length===0)return"";const i=r[0],a=i>=80?[2,i-80]:[Math.floor(i/40),i%40];let c=0;for(let d=1;d<r.length;d+=1)c=c*128+(r[d]&127),(r[d]&128)===0&&(a.push(c),c=0);return a.join(".")}function ze(r){const i=[r&127];let a=Math.floor(r/128);for(;a>0;)i.unshift(a&127|128),a=Math.floor(a/128);return i}function I(r){const i=r.trim();if(!/^\d+(?:\.\d+)+$/.test(i))throw new Error("Enter the OID in 1.2.840... format");const a=i.split(".").map(d=>Number(d));if(a.some(d=>!Number.isSafeInteger(d)||d<0))throw new Error("Each OID arc must be a safe non-negative integer");if(a[0]>2)throw new Error("The first OID arc must be 0, 1, or 2");if(a[0]<2&&a[1]>39)throw new Error("When the first OID arc is 0 or 1, the second arc must be 0..39");const c=[a[0]*40+a[1]];for(const d of a.slice(2))c.push(...ze(d));return new Uint8Array(c)}function m(r){return r.valueBytes||new Uint8Array}function B(r){return r.eoc?"EndOfContent":r.tagClass===0?N[r.tagNumber]||`Universal ${r.tagNumber}`:`[${r.tagNumber}] ${P[r.tagClass]}`}function J(r){const i=m(r);if(r.tagClass!==0)return i.length?u(i):"(empty)";switch(r.tagNumber){case 1:return i.length===1?i[0]===0?"FALSE":"TRUE":"Invalid BOOLEAN";case 2:case 10:return fe(i);case 3:return i.length?`unused bits: ${i[0]}, data: ${u(i.slice(1))}`:"Invalid BIT STRING";case 4:return u(i);case 5:return i.length===0?"NULL":"Invalid NULL";case 6:return De(i);case 12:case 18:case 19:case 20:case 22:case 23:case 24:return Y(i);case 30:return Ve(i);default:return i.length?u(i):"(empty)"}}function Q(r,i,a){if(i>=a)throw new Error(`offset ${i}: missing length`);const c=r[i++];if((c&128)===0)return{length:c,offset:i,indefinite:!1};const d=c&127;if(d===0)return{length:0,offset:i,indefinite:!0};if(d>6)throw new Error(`offset ${i-1}: length is too large`);if(i+d>a)throw new Error(`offset ${i-1}: length ends before all bytes are available`);let g=0;for(let A=0;A<d;A+=1)g=g*256+r[i++];return{length:g,offset:i,indefinite:!1}}function ke(r,i,a){return i+2<=a&&r[i]===0&&r[i+1]===0}function F(r,i,a){if(i>=a)throw new Error(`offset ${i}: missing tag`);const c=i,d=r[i++],g=d>>6,A=(d&32)!==0;let w=d&31;if(w===31){w=0;let D=0;for(;;){if(i>=a)throw new Error(`offset ${c}: high-tag-number form ends early`);const oe=r[i++];if(w=w*128+(oe&127),D+=1,(oe&128)===0)break;if(D>6)throw new Error(`offset ${c}: tag number is too large`)}}return{tagClass:g,constructed:A,tagNumber:w,offset:i}}function R(r,i,a,c=0){if(ke(r,i,a))throw new Error(`offset ${i}: unexpected EndOfContent outside an indefinite-length value`);const d=i,g=F(r,i,a),A=Q(r,g.offset,a),w=A.offset;let D=w+A.length,oe=D,Ze=[];if(A.indefinite&&!g.constructed)throw new Error(`offset ${d}: indefinite length is only supported for constructed values`);if(A.indefinite){const z=we(r,w,a,c+1);Ze=z.nodes,D=z.eocStart,oe=z.offset}if(D>a)throw new Error(`offset ${d}: value exceeds the input range`);const T={...g,start:d,headerLength:w-d,length:D-w,indefinite:A.indefinite,valueStart:w,valueEnd:D,end:oe,depth:c,children:Ze,encapsulated:!1,valueBytes:r.slice(w,D),dirty:!1,validationError:""};if(T.constructed&&!T.indefinite)T.children=G(r,w,D,c+1);else if(T.tagClass===0&&(T.tagNumber===3||T.tagNumber===4)){const z=T.tagNumber===3?w+1:w;if((T.tagNumber===4||T.tagNumber===3&&w<D&&r[w]===0)&&z<D)try{const te=G(r,z,D,c+1);te.length>0&&(T.children=te,T.encapsulated=!0)}catch{T.children=[]}}return T}function we(r,i,a,c=0){const d=[];for(;i<a;){if(ke(r,i,a))return{nodes:d,offset:i+2,eocStart:i};const g=R(r,i,a,c);if(g.end<=i)throw new Error(`offset ${i}: parser could not advance`);d.push(g),i=g.end}throw new Error(`offset ${i}: missing EndOfContent for indefinite-length value`)}function G(r,i=0,a=r.length,c=0){const d=[];for(;i<a;){const g=R(r,i,a,c);if(g.end<=i)throw new Error(`offset ${i}: parser could not advance`);d.push(g),i=g.end}if(i!==a)throw new Error(`offset ${i}: DER boundary mismatch`);return d}function ie(r){if(!Number.isSafeInteger(r)||r<0)throw new Error("Invalid tag number");const i=[r&127];let a=Math.floor(r/128);for(;a>0;)i.unshift(a&127|128),a=Math.floor(a/128);return i}function ee(r){const i=r.tagClass<<6|(r.constructed?32:0);return r.tagNumber<31?new Uint8Array([i|r.tagNumber]):new Uint8Array([i|31,...ie(r.tagNumber)])}function ve(r){if(!Number.isSafeInteger(r)||r<0)throw new Error("Invalid length");if(r<128)return new Uint8Array([r]);const i=[];let a=r;for(;a>0;)i.unshift(a&255),a=Math.floor(a/256);return new Uint8Array([128|i.length,...i])}function je(r){if(r.constructed)return V(r.children);if(r.encapsulated&&r.tagClass===0&&r.tagNumber===3){const i=m(r),a=i.length?i[0]:0;return O([new Uint8Array([a]),V(r.children)])}return r.encapsulated&&r.tagClass===0&&r.tagNumber===4?V(r.children):m(r)}function Pe(r){const i=je(r);return r.indefinite?O([ee(r),new Uint8Array([128]),i,new Uint8Array([0,0])]):O([ee(r),ve(i.length),i])}function V(r){return O(r.map(i=>Pe(i)))}function pe(r,i={}){const a=i.format||"auto";if(typeof r=="string")return Se(r,a);const c=Te(r);if(a==="pem")return{bytes:ue(Y(c)),format:"PEM"};if(a==="base64"||a==="headerless-pem")return{bytes:re(Y(c)),format:"headerless PEM"};if(a==="hex")return{bytes:h(Y(c)),format:"HEX"};if(a!=="auto"&&a!=="der"&&a!=="ber")throw new Error(`Unsupported input format: ${a}`);if(a==="auto"){const d=Y(c);if(Z(d))return{bytes:ue(d),format:"PEM"};try{return{bytes:re(d),format:"headerless PEM"}}catch{}}return{bytes:c,format:"DER"}}function Se(r,i){if(i==="pem")return{bytes:ue(r),format:"PEM"};if(i==="base64"||i==="headerless-pem")return{bytes:re(r),format:"headerless PEM"};if(i==="hex")return{bytes:h(r),format:"HEX"};if(i==="der"||i==="ber")return{bytes:le(r),format:"DER"};if(i!=="auto")throw new Error(`Unsupported input format: ${i}`);if(Z(r))return{bytes:ue(r),format:"PEM"};try{return{bytes:re(r),format:"headerless PEM"}}catch{}try{const a=h(r);return G(a,0,a.length),{bytes:a,format:"HEX"}}catch{throw new Error("Text input must be PEM, headerless base64, or HEX when format is auto")}}function ge(r,i=""){let a=1;function c(d){d.id=`${i}${a++}`;for(const g of d.children)c(g)}for(const d of r)c(d);return r}function Xe(r,i={}){const a=pe(r,i),c=ge(G(a.bytes,0,a.bytes.length)),d=V(c);if(i.validateRoundTrip!==!1&&!q(d,a.bytes))throw new Error("The re-encoded DER does not match the original data");return{format:a.format,bytes:a.bytes,encodedBytes:d,nodes:c}}function me(r,i={}){return typeof i=="function"?i(r)||"":typeof i?.resolve=="function"?i.resolve(r)||"":i[r]||""}function Be(r,i={}){return r.tagClass!==0||r.tagNumber!==6?"":me(J(r),i)}function Re(r,i={},a=0){const c=i.maxDepth??1/0,d=m(r),g={id:r.id,tagName:B(r),tagClass:r.tagClass,tagClassName:P[r.tagClass],tagNumber:r.tagNumber,constructed:r.constructed,start:r.start,headerLength:r.headerLength,length:r.length,valueStart:r.valueStart,valueEnd:r.valueEnd,end:r.end,indefinite:r.indefinite,encapsulated:r.encapsulated,value:J(r)},A=Be(r,i.oidResolver||i.oidNames);return A&&(g.oidName=A),i.includeHexPreview!==!1&&!r.constructed&&d.length>0&&(g.hexPreview=_(d,i.hexPreviewLength||72)),i.includeRawValue&&(g.valueHex=E(d)),a<c?g.children=r.children.map(w=>Re(w,i,a+1)):r.children.length>0&&(g.childrenTruncated=r.children.length),g}function Ye(r,i={}){return r.map(a=>Re(a,i))}function $e(r,i={}){const a=Xe(r,i);return{format:a.format,length:a.bytes.length,nodes:Ye(a.nodes,i)}}function Ce(r){const i=[];function a(c){i.push(c);for(const d of c.children)a(d)}for(const c of r)a(c);return i}function Ee(r,i){return Ce(r).find(a=>a.id===String(i))||null}function Oe(r,i){const a=Ee(r,i);if(!a)throw new Error("The node was not found");return Pe(a)}return{VERSION:S,CLASS_NAMES:P,UNIVERSAL_TAGS:N,base64ToBytes:Me,bytesToBase64:We,bytesEqual:q,concatBytes:O,decodeInput:pe,decodeOid:De,decodePem:ue,describeValue:J,encodeNode:Pe,encodeNodes:V,encodeOid:I,findNodeById:Ee,flattenNodes:Ce,getNodeBytes:Oe,getNodeValueBytes:m,getTagName:B,hexToBytes:h,isPemText:Z,parseAsn1:$e,parseElements:G,parseInput:Xe,resolveOid:me,serializeNode:Re,serializeTree:Ye,toLowerHexString:E}})})(At)),At.exports}var Lr=Or();const Ur=Tt(Lr);var Nt={exports:{}};const Hr={0:"ITU-T assigned",1:"ISO assigned",2:"Joint ISO/ITU-T assignment","0.0":"ITU-T Recommendation","0.1":"ITU-T Question","0.2":"ITU-T Administration","0.2.242":"Norway ITU member","0.2.262":"Germany ITU member","0.2.262.1":"Deutsche Telekom AG","0.2.262.1.3":"Public Land Mobile Network (D900-GSM)","0.2.262.2":"MeTechnology Europe GmbH","0.2.262.2.1":"dynamic loadable library descriptions","0.2.262.2.1.1":"modulename","0.2.262.2.1.2":"modulesize","0.2.262.2.1.3":"moduleversion","0.3":"ITU-T Network Operator","0.4":"ITU-T Identified Organization","0.4.0":"ETSI","0.4.0.0":"etsi","0.9":"Data - used in some RFCs","0.9.2342":"Object identifiers under 0.9.2342 - PSS","0.9.2342.19200300":"UCL Data networks","0.9.2342.19200300.100":"Directory Pilot","0.9.2342.19200300.100.1":"Directory Pilot Attributes","0.9.2342.19200300.100.1.1":"Userid","0.9.2342.19200300.100.1.2":"textEncodedOrAddress","0.9.2342.19200300.100.1.3":"rfc822Mailbox","0.9.2342.19200300.100.1.4":"info","0.9.2342.19200300.100.1.5":"favouriteDrink","0.9.2342.19200300.100.1.6":"room number","0.9.2342.19200300.100.1.8":"user class","0.9.2342.19200300.100.1.9":"host","0.9.2342.19200300.100.1.10":"manager","0.9.2342.19200300.100.1.11":"Document Identifier","0.9.2342.19200300.100.1.12":"Document Title","0.9.2342.19200300.100.1.13":"Document Version","0.9.2342.19200300.100.1.25":"domainComponent","0.9.2342.19200300.100.1.44":"uniqueIdentifier","0.9.2342.19200300.100.3":"Directory Pilot Attribute syntaxes","0.9.2342.19200300.100.4":"Directory Pilot Object Classes","0.9.2724":"EIRPAC","0.9.2724.36056001":"TCD Data Networks","1.0":"ISO Standard","1.0.2022":"ISO 2022 Character Set Switching standard","1.0.2022.0":"ISO 2022 transfer syntaxes","1.0.2022.1":"ISO 2022 abstract syntaxes","1.0.8571":"ISO FTAM","1.0.8571.5":"ISO FTAM Document Types","1.0.8571.5.3":"ISO FTAM Unstructured Binary","1.0.10021":"MOTIS","1.0.10021.7":"MOTIS IPMS","1.0.10021.7.0":"MOTIS IPMS Modules","1.0.10021.7.1":"MOTIS IPMS Character Sets","1.0.10021.7.1.0":"MOTIS IPMS Character Sets EIT authority","1.0.10021.7.1.0.1":"Basic control set","1.0.10021.7.1.0.6":"US ANSI X3.4 1968","1.0.10021.7.1.0.100":"ISO 8859/1 1987 (ECMA-94)","1.1":"LDAPv3 (no attributes)","1.2":"ISO member body","1.2.36":"Australia","1.2.36.68980861.1.1.2":"Signet personal","1.2.36.68980861.1.1.3":"Signet business","1.2.36.68980861.1.1.4":"Signet legal","1.2.36.68980861.1.1.10":"Signet pilot","1.2.36.68980861.1.1.11":"Signet intraNet","1.2.36.68980861.1.1.20":"Signet securityPolicy","1.2.36.75878867.1.100.1.1":"Certificates Australia policyIdentifier","1.2.40":"Austria","1.2.110":"Vietnam","1.2.156":"China","1.2.158":"Taiwan","1.2.250":"France","1.2.276":"Germany (DIN)","1.2.344":"Hong Kong","1.2.372":"Ireland (NSAI)","1.2.372.980001":"Baltimore tEchnologies Limited","1.2.372.980001.3":"Baltimore Extensions","1.2.372.980001.3.2":"Baltimore Internal Extensions","1.2.372.980001.3.2.3":"Certificate URL","1.2.392":"Japan","1.2.392.100095":"Japanese Government Cabinet Office","1.2.392.200010":"Hitachi, Ltd.","1.2.392.200011":"Mitsubishi Electric Corporation","1.2.392.200036":"JIRA","1.2.392.200075":"Japan Certification Services, Inc.","1.2.392.200081":"BTJ","1.2.392.200081.1":"BTJ Policies","1.2.392.200081.1.1":"SureServer CertificatePolicy","1.2.392.200081.2":"BTJ Product","1.2.392.200081.10":"BTJ Product","1.2.392.200081.10.1":"DSI Product","1.2.392.200081.10.1.1":"dsi-services","1.2.392.200081.10.1.1.1":"authenticationService","1.2.392.200081.10.1.1.2":"notaryService","1.2.392.200081.10.1.1.3":"archiveService","1.2.392.200081.10.1.1.4":"validationService","1.2.392.200081.10.1.1.5":"contractService","1.2.392.200081.10.1.2":"dsi-datatype","1.2.392.200081.10.1.2.1":"userRole","1.2.392.200081.10.1.2.2":"dvscPublishRequest","1.2.392.200081.10.1.2.3":"dvcsPublishResponse","1.2.392.200081.10.1.2.4":"notaryInfo","1.2.392.200081.10.1.2.5":"clientInfo","1.2.392.200081.10.1.2.10":"dsi-cert-extension","1.2.392.200081.10.1.3":"dsi-dir-attrs","1.2.392.200081.10.1.3.1":"dsiUser","1.2.392.200081.10.1.3.2":"dsiId","1.2.392.200081.10.1.3.3":"dsiRole","1.2.392.200081.10.5":"Honninkakunin Service","1.2.392.200081.10.5.1":"Honninkakunin Service API","1.2.392.200081.10.5.1.1":"Honninkakunin Service method","1.2.392.200081.10.5.1.2":"Honninkakunin Service schema","1.2.392.200081.10.5.1.2.1":"VerificationResult","1.2.392.200081.10.5.1.2.1.1":"surrogate","1.2.392.200081.10.5.1.2.1.1.1":"verificationId","1.2.392.200081.10.5.1.2.1.1.2":"signatureId","1.2.392.200081.10.5.1.2.1.1.3":"serviceOperatorKeyId","1.2.392.200091":"SECOM Trust.net Co., Ltd.","1.2.392.200101":"Teikoku Databank, Ltd.","1.2.392.200149":"JPKI","1.2.392.200149.8":"securityObject","1.2.392.200149.8.5":"PKI","1.2.392.200149.8.5.1":"certificatePolicy","1.2.392.200149.8.5.1.0":"experiment","1.2.392.200149.8.5.1.0.10":"class10","1.2.392.200149.8.5.1.0.100":"TLS","1.2.392.200149.8.5.1.0.200":"CVS","1.2.392.200149.8.5.1.0.300":"OCSP","1.2.392.200149.8.5.1.1":"digitalSignature","1.2.392.200149.8.5.1.1.10":"class10","1.2.392.200149.8.5.1.100":"TLS","1.2.392.200149.8.5.1.200":"CVS","1.2.392.200149.8.5.1.300":"OCSP","1.2.392.200149.8.5.5":"PersonalData","1.2.392.200149.8.5.5.1":"commonName","1.2.392.200149.8.5.5.2":"substituteCharacterOfCommonName","1.2.392.200149.8.5.5.3":"gender","1.2.392.200149.8.5.5.4":"dateOfBirth","1.2.392.200149.8.5.5.5":"address","1.2.392.200149.8.5.5.6":"substituteCharacterOfAddress","1.2.410":"Korea","1.2.578":"Norway ISO member","1.2.616":"Poland (National Registration Authority, KRIO)","1.2.702":"Singapore","1.2.752":"Sweden","1.2.752.34.1":"seis-cp","1.2.752.34.1.1":"SEIS certificatePolicy-s10","1.2.752.34.2":"SEIS pe","1.2.752.34.3":"SEIS at","1.2.752.34.3.1":"SEIS at-personalIdentifier","1.2.826":"Great Britain (GB/UK)","1.2.840":"USA","1.2.840.10003":"ANSI-standard-Z39.50 (10003)","1.2.840.10006":"ieee802dot3","1.2.840.10008":"DICOM Standard","1.2.840.10017":"IEEE-1224","1.2.840.10017.0":"IEEE-1224 OM package","1.2.840.10022":"IEEE802Dot10","1.2.840.10036":"IEEE802Dot11","1.2.840.10036.1":"802.11 SMT Group","1.2.840.10036.2":"802.11 MAC Group","1.2.840.10036.3":"802.11 PHY Group","1.2.840.10036.6":"ieee802dot11f","1.2.840.10036.6.1":"IAPPparameters","1.2.840.10040":"X9-57","1.2.840.10040.2.1":"holdinstruction-none","1.2.840.10040.2.2":"holdinstruction-callissuer","1.2.840.10040.2.3":"holdinstruction-reject","1.2.840.10040.4":"x9algorithm","1.2.840.10040.4.1":"dsa","1.2.840.10040.4.3":"dsaWithSha1","1.2.840.10045":"ansi-x9-62","1.2.840.10045.1":"ecdsa-with-SHA1","1.2.840.10045.1.1":"prime-field","1.2.840.10045.1.2":"characteristic-two-field","1.2.840.10045.1.2.1":"ecPublicKey","1.2.840.10045.1.2.3":"characteristic-two-basis","1.2.840.10045.1.2.3.1":"onBasis","1.2.840.10045.1.2.3.2":"tpBasis","1.2.840.10045.1.2.3.3":"ppBasis","1.2.840.10045.2":"publicKeyType","1.2.840.10045.2.1":"ecPublicKey","1.2.840.10045.3.1.7":"secp256r1","1.2.840.10045.4":"signatures","1.2.840.10045.4.1":"ecdsa-with-SHA1","1.2.840.10045.4.3":"ecdsa-with-SHA2","1.2.840.10045.4.3.1":"ecdsa-with-SHA224","1.2.840.10045.4.3.2":"ecdsa-with-SHA256","1.2.840.10045.4.3.3":"ecdsa-with-SHA384","1.2.840.10045.4.3.4":"ecdsa-with-SHA512","1.2.840.10046.2.1":"dhPublicNumber","1.2.840.113533":"Nortel Networks","1.2.840.113533.7":"Entrust Technologies security OIDs","1.2.840.113533.7.65":"Secure Networks Certificate Extensions","1.2.840.113533.7.65.0":"entrust version extension","1.2.840.113533.7.66":"Secure Networks Algorithms","1.2.840.113533.7.66.3":"cast3CBC","1.2.840.113533.7.66.10":"cast5CBC","1.2.840.113533.7.66.11":"cast5MAC","1.2.840.113533.7.66.12":"pbeWithMD5AndCAST5-CBC","1.2.840.113533.7.66.13":"passwordBasedMac","1.2.840.113533.7.67":"Secure Networks Object Classes","1.2.840.113533.7.67.0":"entrust user","1.2.840.113533.7.67.1":"entrust CA","1.2.840.113533.7.67.4":"Uniquely Identified User","1.2.840.113533.7.67.5":"Simple Auth Object","1.2.840.113533.7.68":"Secure Networks Attributes","1.2.840.113533.7.68.0":"entrust CA info","1.2.840.113533.7.68.10":"attribute certificate","1.2.840.113533.7.69":"Secure Networks Name Forms","1.2.840.113533.7.69.1":"unique persons name form","1.2.840.113533.7.69.2":"unique organizational person name form","1.2.840.113533.7.69.3":"unique residential person name form","1.2.840.113536":"Sun Microsystem","1.2.840.113536.24":"xFN","1.2.840.113536.25":"xFNSupplement","1.2.840.113536.30":"objectReferenceString","1.2.840.113536.31":"nNSReferenceString","1.2.840.113549":"RSA Data Security inc.,","1.2.840.113549.1":"PKCS","1.2.840.113549.1.1":"PKCS-1","1.2.840.113549.1.1.1":"RSA encryption","1.2.840.113549.1.1.2":"MD2 with RSA encryption","1.2.840.113549.1.1.3":"MD4 With RSAEncryption","1.2.840.113549.1.1.4":"MD5 with RSA encryption","1.2.840.113549.1.1.5":"SHA1 with RSA Encryption","1.2.840.113549.1.1.6":"rsaOAEPEncryptionSET","1.2.840.113549.1.1.11":"SHA256 with RSA Encryption","1.2.840.113549.1.1.12":"SHA384 with RSA Encryption","1.2.840.113549.1.1.13":"SHA512 with RSA Encryption","1.2.840.113549.1.3":"pkcs-3","1.2.840.113549.1.3.1":"dhKeyAgreement","1.2.840.113549.1.5":"RSA PKCS 5","1.2.840.113549.1.5.1":"pbeWithMD2AndDES-CBC","1.2.840.113549.1.5.3":"pbeWithMD5AndDES-CBC","1.2.840.113549.1.5.4":"pbeWithMD2AndRC2-CBC","1.2.840.113549.1.5.6":"pbeWithMD5AndRC2-CBC","1.2.840.113549.1.5.9":"pbeWithMD5AndXOR","1.2.840.113549.1.5.10":"pbeWithSHA1AndDES-CBC","1.2.840.113549.1.5.11":"pbeWithSHA1AndRC2-CBC","1.2.840.113549.1.5.12":"PBKDF2 - Key Derivation Function","1.2.840.113549.1.5.13":"PBES2: PBES2 encryption scheme","1.2.840.113549.1.5.14":"PBMAC1 message authentication scheme","1.2.840.113549.1.7":"PKCS-7","1.2.840.113549.1.7.1":"data","1.2.840.113549.1.7.2":"signedData","1.2.840.113549.1.7.3":"envelopedData","1.2.840.113549.1.7.4":"signedAndEnvelopedData","1.2.840.113549.1.7.5":"digestData","1.2.840.113549.1.7.6":"encryptedData","1.2.840.113549.1.7.7":"dataWithAttributes","1.2.840.113549.1.7.8":"encryptedPrivateKeyInfo","1.2.840.113549.1.9":"PKCS-9 - Signatures","1.2.840.113549.1.9.1":"e-mailAddress","1.2.840.113549.1.9.2":"unstructuredName","1.2.840.113549.1.9.3":"contentType","1.2.840.113549.1.9.4":"messageDigest","1.2.840.113549.1.9.5":"Signing Time","1.2.840.113549.1.9.6":"countersignature","1.2.840.113549.1.9.7":"Challenge Password","1.2.840.113549.1.9.8":"unstructuredAddress","1.2.840.113549.1.9.9":"extendedCertificateAttributes","1.2.840.113549.1.9.10":"issuerAndSerialNumber","1.2.840.113549.1.9.11":"passwordCheck","1.2.840.113549.1.9.12":"publicKey","1.2.840.113549.1.9.13":"Signing Description","1.2.840.113549.1.9.14":"extensionReq","1.2.840.113549.1.9.15":"S/Mime capabilities","1.2.840.113549.1.9.15.1":"preferSignedData","1.2.840.113549.1.9.15.2":"canNotDecryptAny","1.2.840.113549.1.9.15.3":"receiptRequest","1.2.840.113549.1.9.15.4":"receipt","1.2.840.113549.1.9.15.5":"contentHints","1.2.840.113549.1.9.15.6":"mlExpansionHistory","1.2.840.113549.1.9.16":"S/MIME Object Identifier Registry","1.2.840.113549.1.9.16.0":"id-mod","1.2.840.113549.1.9.16.0.1":"id-mod-cms","1.2.840.113549.1.9.16.0.2":"id-mod-ess","1.2.840.113549.1.9.16.1":"id-ct","1.2.840.113549.1.9.16.1.1":"id-ct-receipt","1.2.840.113549.1.9.16.1.4":"id-ct-TSTInfo","1.2.840.113549.1.9.16.1.7":"id-ct-DVCSRequestData","1.2.840.113549.1.9.16.1.8":"id-ct-DVCSResponseData","1.2.840.113549.1.9.16.2":"id-aa","1.2.840.113549.1.9.16.2.1":"id-aa-receiptRequest","1.2.840.113549.1.9.16.2.2":"id-aa-securityLabel","1.2.840.113549.1.9.16.2.3":"id-aa-mlExpandHistory","1.2.840.113549.1.9.16.2.4":"id-aa-contentHint","1.2.840.113549.1.9.16.2.12":"id-aa-signingCertificate","1.2.840.113549.1.9.16.2.14":"id-aa-timeStampToken","1.2.840.113549.1.9.16.2.19":"ets-otherSigCert","1.2.840.113549.1.9.16.2.27":"id-aa-ets-archiveTimestamp","1.2.840.113549.1.9.16.2.47":"id-aa-signingCertificateV2","1.2.840.113549.1.9.16.2.48":"id-aa-ets-archiveTimestampV2","1.2.840.113549.1.9.20":"friendlyName","1.2.840.113549.1.9.21":"localKeyID","1.2.840.113549.1.9.22":"certTypes","1.2.840.113549.1.9.22.1":"x509Certificate","1.2.840.113549.1.9.22.2":"sdsiCertificate","1.2.840.113549.1.9.23":"crlTypes","1.2.840.113549.1.9.23.1":"x509Crl","1.2.840.113549.1.9.52":"cmsAlgorithmProtect","1.2.840.113549.1.12":"pkcs-12","1.2.840.113549.1.12.1":"pkcs-12-PbeIds","1.2.840.113549.1.12.1.1":"pbeWithSHAAnd128BitRC4","1.2.840.113549.1.12.1.2":"pbeWithSHAAnd40BitRC4","1.2.840.113549.1.12.1.3":"pbeWithSHAAnd3-KeyTripleDES-CBC","1.2.840.113549.1.12.1.4":"pbeWithSHAAnd2-KeyTripleDES-CBC","1.2.840.113549.1.12.1.5":"pbeWithSHAAnd128BitRC2-CBC","1.2.840.113549.1.12.1.6":"pbeWithSHAAnd40BitRC2-CBC","1.2.840.113549.1.12.2":"pkcs-12-ESPVKID","1.2.840.113549.1.12.2.1":"pkcs-12-PKCS8KeyShrouding","1.2.840.113549.1.12.3":"pkcs-12-BagIds","1.2.840.113549.1.12.3.1":"pkcs-12-keyBagId","1.2.840.113549.1.12.3.2":"pkcs-12-certAndCRLBagId","1.2.840.113549.1.12.3.3":"pkcs-12-secretBagId","1.2.840.113549.1.12.3.4":"pkcs-12-safeContentsId","1.2.840.113549.1.12.3.5":"pkcs-12-pkcs-8ShroudedKeyBagId","1.2.840.113549.1.12.4":"pkcs-12-CertBagID","1.2.840.113549.1.12.4.1":"pkcs-12-X509CertCRLBagID","1.2.840.113549.1.12.4.2":"pkcs-12-SDSICertBagID","1.2.840.113549.1.12.5":"pkcs-12-OID","1.2.840.113549.1.12.5.1":"pkcs-12-PBEID","1.2.840.113549.1.12.5.1.1":"pkcs-12-PBEWithSha1And128BitRC4","1.2.840.113549.1.12.5.1.2":"pkcs-12-PBEWithSha1And40BitRC4","1.2.840.113549.1.12.5.1.3":"pkcs-12-PBEWithSha1AndTripleDESCBC","1.2.840.113549.1.12.5.1.4":"pkcs-12-PBEWithSha1And128BitRC2CBC","1.2.840.113549.1.12.5.1.5":"pkcs-12-PBEWithSha1And40BitRC2CBC","1.2.840.113549.1.12.5.1.6":"pkcs-12-PBEWithSha1AndRC4","1.2.840.113549.1.12.5.1.7":"pkcs-12-PBEWithSha1AndRC2CBC","1.2.840.113549.1.12.5.2":"pkcs-12-EnvelopingID","1.2.840.113549.1.12.5.2.1":"pkcs-12-RSAEncryptionWith128BitRC4","1.2.840.113549.1.12.5.2.2":"pkcs-12-RSAEncryptionWith40BitRC4","1.2.840.113549.1.12.5.2.3":"pkcs-12-RSAEncryptionWithTripleDES","1.2.840.113549.1.12.5.3":"pkcs-12-SignatureID","1.2.840.113549.1.12.5.3.1":"pkcs-12-RSASignatureWithSHA1Digest","1.2.840.113549.1.12.10":"pkcs-12Version1","1.2.840.113549.1.12.10.1":"pkcs-12BadIds","1.2.840.113549.1.12.10.1.1":"pkcs-12-keyBag","1.2.840.113549.1.12.10.1.2":"pkcs-12-pkcs-8ShroudedKeyBag","1.2.840.113549.1.12.10.1.3":"pkcs-12-certBag","1.2.840.113549.1.12.10.1.4":"pkcs-12-crlBag","1.2.840.113549.1.12.10.1.5":"pkcs-12-secretBag","1.2.840.113549.1.12.10.1.6":"pkcs-12-safeContentsBag","1.2.840.113549.2":"digestAlgorithm","1.2.840.113549.2.2":"md2","1.2.840.113549.2.4":"md4","1.2.840.113549.2.5":"md5","1.2.840.113549.2.7":"HMAC-SHA-1 pseudorandom function","1.2.840.113549.3":"Encryption Algorithms","1.2.840.113549.3.2":"rc2CBC","1.2.840.113549.3.3":"rc2ECB","1.2.840.113549.3.4":"rc4","1.2.840.113549.3.5":"rc4WithMAC","1.2.840.113549.3.6":"DESX-CBC","1.2.840.113549.3.7":"DES-EDE3-CBC","1.2.840.113549.3.8":"RC5CBC","1.2.840.113549.3.9":"RC5-CBCPad","1.2.840.113549.3.10":"desCDMF","1.2.840.113554":"MIT","1.2.840.113556":"Microsoft","1.2.840.113556.1":"Microsoft OID used with DEN","1.2.840.113556.1.4":"Microsoft OID used with DEN","1.2.840.113556.1.4.319":"pagedResultsControl","1.2.840.113556.1.4.473":"LDAP Server Sort Result extesion","1.2.840.113556.1.4.474":"LDAP Server Sort Result extension response control","1.2.840.113556.1.4.616":"LDAP_CONTROL_REFERRALS","1.2.840.113556.1.4.1302":"Microsoft OID used with DEN Attributes","1.2.840.113556.1.4.1413":"LDAP ease modify restrictions","1.2.840.113556.1.5":"NTDS Classes","1.2.840.113556.3":"Microsoft OIDs (MAPI)","1.2.840.113556.3.10":"Microsoft MAPI OIDs","1.2.840.113556.3.10.1":"Microsoft MAPI TNEF","1.2.840.113556.3.10.2":"Microsoft MAPI Attachment - generic mapi attachment","1.2.840.113556.4.2":"Microsoft Word","1.2.840.113556.4.3":"Microsoft Excel","1.2.840.113556.4.4":"Titled with OID","1.2.840.113556.4.5":"Microsoft PowerPoint","1.2.840.113556.4.6":"Microsoft Works","1.2.840.113560":"COLUMBIA UNIVERSITY","1.2.840.113572":"Unisys Corp.","1.2.840.113572.1":"Unisys Universal Messaging","1.2.840.113572.1.1":"Unisys Universal Messaging - URL Attachment","1.2.840.113572.3":"Unisys A Series OSI","1.2.840.113583":"Adobe Systems Incorporated","1.2.840.113583.1":"Acrobat","1.2.840.113583.1.1":"Acrobat Security","1.2.840.113583.1.1.8":"revocationInfoArchival","1.2.840.113618":"The University of Texas System","1.2.840.113618.1":"The University of Texas at Austin","1.2.840.113658":"XAPIA","1.2.840.113699":"WordPerfect","1.2.840.113741":"Intel Corporation","1.2.840.114021":"Identrus","1.2.840.114050":"Cognos","1.2.840.114222":"Centers for Disease Control","1.2.862":"Venezuela - via standards Venezuela","1.2.886":"Taiwan","1.3.2":"SIRENE (French national business register)","1.3.6":"US Department of Defense","1.3.6.1":"Internet","1.3.6.1.1":"Directory","1.3.6.1.2":"Management","1.3.6.1.3":"Experimental","1.3.6.1.4":"Private","1.3.6.1.4.1":"Enterprise","1.3.6.1.4.1.311":"Microsoft","1.3.6.1.4.1.311.2":"Authenticode","1.3.6.1.4.1.311.2.1":"MS Software Publishing","1.3.6.1.4.1.311.2.1.4":"spcIndirectDataContext","1.3.6.1.4.1.311.2.1.10":"spcAgencyInfo","1.3.6.1.4.1.311.2.1.11":"spcStatementType","1.3.6.1.4.1.311.2.1.12":"spcSpOpusInfo","1.3.6.1.4.1.311.2.1.14":"certExtensions","1.3.6.1.4.1.311.2.1.15":"spcPelmageData","1.3.6.1.4.1.311.2.1.18":"spcRawFileData","1.3.6.1.4.1.311.2.1.19":"spcStructuredStorageData","1.3.6.1.4.1.311.2.1.20":"spcJavaClass","1.3.6.1.4.1.311.2.1.21":"individualCodeSigning","1.3.6.1.4.1.311.2.1.22":"commercialCodeSigning","1.3.6.1.4.1.311.2.1.25":"spcCabData","1.3.6.1.4.1.311.2.1.26":"spcMinimalCriteriaInfo","1.3.6.1.4.1.311.2.1.27":"spcFinancialCriteriaInfo","1.3.6.1.4.1.311.2.1.28":"spcLink","1.3.6.1.4.1.311.2.1.29":"spcHashInfo","1.3.6.1.4.1.311.2.1.30":"spcSipInfo","1.3.6.1.4.1.311.2.2":"MS Software Publishing Trusted CAs","1.3.6.1.4.1.311.2.2.1":"TrustedCodeSigningCaList","1.3.6.1.4.1.311.2.2.2":"TrustedClientAuthCaList","1.3.6.1.4.1.311.2.2.3":"TrustedServerAuthCaList","1.3.6.1.4.1.311.3":"MS Time Stamping","1.3.6.1.4.1.311.3.2.1":"MS Time Stamp Request","1.3.6.1.4.1.311.4":"MS Permissions","1.3.6.1.4.1.311.10":"MS Crypto 2.0","1.3.6.1.4.1.311.10.1":"certTrustList","1.3.6.1.4.1.311.10.1.1":"certTrustList(sorted)","1.3.6.1.4.1.311.10.2":"nextUpdateLocation","1.3.6.1.4.1.311.10.3.1":"certTrustListSigning","1.3.6.1.4.1.311.10.3.2":"timeStampSigning","1.3.6.1.4.1.311.10.3.3":"serverGatedCrypto","1.3.6.1.4.1.311.10.3.3.1":"serverGatedCrypto(serialized)","1.3.6.1.4.1.311.10.3.4":"encryptedFileSystem","1.3.6.1.4.1.311.10.3.4.1":"encryptedFileSystem(recovery)","1.3.6.1.4.1.311.10.3.5":"Windows Hardware Compatible","1.3.6.1.4.1.311.10.3.6":"NT5 Crypto","1.3.6.1.4.1.311.10.3.7":"Windows Hardware Compatible(OEM)","1.3.6.1.4.1.311.10.3.8":"Embedded NT Crypto","1.3.6.1.4.1.311.10.3.9":"rootListSigner","1.3.6.1.4.1.311.10.3.10":"qualifiedSubordination","1.3.6.1.4.1.311.10.3.11":"keyRecovery","1.3.6.1.4.1.311.10.3.12":"documentSigner","1.3.6.1.4.1.311.10.3.13":"lifeTimeSigner","1.3.6.1.4.1.311.10.3.14":"mobileDeviceSoftware","1.3.6.1.4.1.311.10.3.15":"smartDisplay","1.3.6.1.4.1.311.10.3.16":"cspSignature","1.3.6.1.4.1.311.10.4.1":"yesnoTrustAttr","1.3.6.1.4.1.311.10.5.1":"DRM","1.3.6.1.4.1.311.10.5.2":"DRM Individualization","1.3.6.1.4.1.311.10.6.1":"licenses","1.3.6.1.4.1.311.10.6.2":"licenseServer","1.3.6.1.4.1.311.10.7.1":"keyid","1.3.6.1.4.1.311.10.8.1":"remove Certificate","1.3.6.1.4.1.311.10.9.1":"crossCert DistributionPoint","1.3.6.1.4.1.311.10.10":"CMC","1.3.6.1.4.1.311.10.10.1":"CMC add Attribute","1.3.6.1.4.1.311.10.11":"CERT_PROP","1.3.6.1.4.1.311.10.12":"CryptUI","1.3.6.1.4.1.311.10.12.1":"anyApplicationPolicy","1.3.6.1.4.1.311.13":"Microsoft PKCS#10","1.3.6.1.4.1.311.13.1":"renewalCertificate","1.3.6.1.4.1.311.13.2.1":"nameValuePair","1.3.6.1.4.1.311.13.2.2":"cspProvider","1.3.6.1.4.1.311.13.2.3":"osVersion","1.3.6.1.4.1.311.15":"Microsoft Java","1.3.6.1.4.1.311.16":"Outlook/Exchange","1.3.6.1.4.1.311.16.4":"Outlook Express","1.3.6.1.4.1.311.17":"Microsoft PKCS#12","1.3.6.1.4.1.311.17.1":"keyProviderName","1.3.6.1.4.1.311.17.2":"localMachineKeyset","1.3.6.1.4.1.311.17.3":"extendedAttributes","1.3.6.1.4.1.311.17.4":"protectedPasswordSecretBag","1.3.6.1.4.1.311.20":"Microsoft enrollment Infra","1.3.6.1.4.1.311.20.1":"autoEnroll","1.3.6.1.4.1.311.20.2":"enrollCertType","1.3.6.1.4.1.311.20.2.1":"enrollAgent","1.3.6.1.4.1.311.20.2.2":"smartCardLogon","1.3.6.1.4.1.311.20.2.3":"principalName","1.3.6.1.4.1.311.20.3":"certManifold","1.3.6.1.4.1.311.21":"Microsoft CA","1.3.6.1.4.1.311.21.1":"version","1.3.6.1.4.1.311.21.2":"previousCertHash (SHA-1)","1.3.6.1.4.1.311.21.3":"baseCrlNumber","1.3.6.1.4.1.311.21.4":"nextUpdateExpected","1.3.6.1.4.1.311.21.5":"caExchange","1.3.6.1.4.1.311.21.6":"keyRecoveryAgent","1.3.6.1.4.1.311.21.7":"certTemplate","1.3.6.1.4.1.311.21.8":"enterprise","1.3.6.1.4.1.311.21.9":"dummySigner","1.3.6.1.4.1.311.21.10":"appCertPolicy","1.3.6.1.4.1.311.21.11":"appPolicyMappings","1.3.6.1.4.1.311.21.12":"appPolicyConstraints","1.3.6.1.4.1.311.21.13":"archivedKeyAttr","1.3.6.1.4.1.311.21.14":"crlSelfCDP","1.3.6.1.4.1.311.21.15":"requireCertChainPolicy","1.3.6.1.4.1.311.21.16":"archivedKeyCertHash","1.3.6.1.4.1.311.21.17":"issuedCertHash","1.3.6.1.4.1.311.21.19":"dsEmailReplication","1.3.6.1.4.1.311.21.20":"requestClientInfo","1.3.6.1.4.1.311.21.21":"encryptedKeyHash","1.3.6.1.4.1.311.21.22":"crossCaVersion","1.3.6.1.4.1.311.25":"Microsoft Directory","1.3.6.1.4.1.311.25.1":"dsReplication","1.3.6.1.4.1.311.30":"IIS","1.3.6.1.4.1.311.30.1":"IIS VirtualServer","1.3.6.1.4.1.311.31":"windowsUpdate","1.3.6.1.4.1.311.31.1":"productUpdate","1.3.6.1.4.1.311.40":"Microsoft Fonts","1.3.6.1.4.1.311.41":"Microsoft Licensing & Registration","1.3.6.1.4.1.311.42":"Microsoft ITG","1.3.6.1.4.1.311.44":"Microsoft PeerNetworking","1.3.6.1.4.1.311.44.0.1":"peerNet certType","1.3.6.1.4.1.311.44.0.2":"peerNet peerName","1.3.6.1.4.1.311.44.0.3":"peerNet classifier","1.3.6.1.4.1.311.44.0.4":"peerNet certVersion","1.3.6.1.4.1.311.44.1":"peerNet RNPP","1.3.6.1.4.1.311.44.1.1":"peerNet RNPP address","1.3.6.1.4.1.311.44.1.2":"peerNet RNPP flags","1.3.6.1.4.1.311.44.1.3":"peerNet RNPP payload","1.3.6.1.4.1.311.44.1.4":"peerNet RNPP id","1.3.6.1.4.1.311.44.2":"peerNet Identity","1.3.6.1.4.1.311.44.2.2":"peerNet Identity flags","1.3.6.1.4.1.311.44.3":"peerNet Grouping","1.3.6.1.4.1.311.44.3.1":"peerNet Grouping peerName","1.3.6.1.4.1.311.44.3.2":"peerNet Grouping flags","1.3.6.1.4.1.311.44.3.3":"peerNet Grouping roles","1.3.6.1.4.1.311.44.3.5":"peerNet Grouping classifiers","1.3.6.1.4.1.311.45":"Microsoft MobileDeviceCodeSigning","1.3.6.1.4.1.311.60.1.1":"rootProgramFlags","1.3.6.1.4.1.311.61.1.1":"kernelModeSigning","1.3.6.1.4.1.311.88":"CAPICOM","1.3.6.1.4.1.311.88.1":"CAPICOM version","1.3.6.1.4.1.311.88.2":"CAPICOM attr","1.3.6.1.4.1.311.88.2.1":"documentType","1.3.6.1.4.1.311.88.2.2":"documentDesc","1.3.6.1.4.1.311.88.3":"CAPICOM encryptedData","1.3.6.1.4.1.311.88.3.1":"encryptedDataContent","1.3.6.1.4.1.955":"SEIKO","1.3.6.1.4.1.955.1.10":"SEIKO Timestamp Service","1.3.6.1.4.1.955.1.10.1.3.3":"Accredited Type G","1.3.6.1.4.1.955.1.10.1.3.4":"Accredited Type GT","1.3.6.1.4.1.955.1.10.1.3.5":"Accredited Type GL","1.3.6.1.4.1.955.1.10.1.4.2":"Accredited Type A","1.3.6.1.4.1.955.1.10.1.5.1":"Accredited Type A2","1.3.6.1.4.1.955.1.10.1.5.2":"Accredited Type A2L","1.3.6.1.4.1.955.1.10.1.100.1":"Advanced Type G","1.3.6.1.4.1.955.1.10.1.101.1":"Advanced Type A","1.3.6.1.4.1.955.1.10.1.102.1":"Advanced Type A2","1.3.6.1.4.1.2428.10.1.1":"UNINETT policyIdentifier","1.3.6.1.4.1.2712.10":"ICE-TEL policyIdentifier","1.3.6.1.4.1.3029.32.1":"cryptlibEnvelope","1.3.6.1.4.1.3029.32.2":"cryptlibPrivateKey","1.3.6.1.4.1.11129":"Google","1.3.6.1.4.1.11129.2.4.1":"Google proofExt","1.3.6.1.4.1.11129.2.4.2":"Google embeddedProofExt","1.3.6.1.4.1.11129.2.4.3":"Google poisonExt","1.3.6.1.4.1.11129.2.4.4":"Google ctExtendedKeyUsage","1.3.6.1.5":"Security","1.3.6.1.5.5":"Mechanisms","1.3.6.1.5.5.1":"Simple Public Key GSS-API Mechanism","1.3.6.1.5.5.1.1":"SPKM-1","1.3.6.1.5.5.1.2":"SPKM-2","1.3.6.1.5.5.1.3":"SPKM-3","1.3.6.1.5.5.2":"SPNEGO pseudo-mechanism","1.3.6.1.5.5.7":"pkix","1.3.6.1.5.5.7.1":"privateExtension","1.3.6.1.5.5.7.1.1":"authorityInfoAccess","1.3.6.1.5.5.7.1.2":"biometricInfo","1.3.6.1.5.5.7.1.3":"qcStatements","1.3.6.1.5.5.7.1.11":"subjectInfoAccess","1.3.6.1.5.5.7.1.12":"logoType","1.3.6.1.5.5.7.2":"policyQualifierIds","1.3.6.1.5.5.7.2.1":"cps","1.3.6.1.5.5.7.2.2":"unotice","1.3.6.1.5.5.7.3":"extended key purpose","1.3.6.1.5.5.7.3.1":"serverAuth","1.3.6.1.5.5.7.3.2":"clientAuth","1.3.6.1.5.5.7.3.3":"codeSigning","1.3.6.1.5.5.7.3.4":"emailProtection","1.3.6.1.5.5.7.3.5":"ipsecEndSystem","1.3.6.1.5.5.7.3.6":"ipsecTunnel","1.3.6.1.5.5.7.3.7":"ipsecUser","1.3.6.1.5.5.7.3.8":"timeStamping","1.3.6.1.5.5.7.3.9":"OCSPSigning","1.3.6.1.5.5.7.4":"cmpInformationTypes","1.3.6.1.5.5.7.4.1":"caProtEncCert","1.3.6.1.5.5.7.4.2":"signKeyPairTypes","1.3.6.1.5.5.7.4.3":"encKeyPairTypes","1.3.6.1.5.5.7.4.4":"preferredSymmAlg","1.3.6.1.5.5.7.4.5":"caKeyUpdateInfo","1.3.6.1.5.5.7.4.6":"currentCRL","1.3.6.1.5.5.7.9":"personal data attributes","1.3.6.1.5.5.7.9.1":"dateOfBirth","1.3.6.1.5.5.7.9.2":"placeOfBirth","1.3.6.1.5.5.7.9.3":"gender","1.3.6.1.5.5.7.9.4":"countryOfCitizenship","1.3.6.1.5.5.7.9.5":"countryOfResidence","1.3.6.1.5.5.7.10":"X.509 Attribute Certificates","1.3.6.1.5.5.7.11":"QC statements","1.3.6.1.5.5.7.11.1":"pkixQCSyntax-v1","1.3.6.1.5.5.7.48.1":"ocsp","1.3.6.1.5.5.7.48.1.1":"Basic OCSP Response","1.3.6.1.5.5.7.48.1.2":"OCSP nonce","1.3.6.1.5.5.7.48.1.3":"OCSP CRL Reference","1.3.6.1.5.5.7.48.1.5":"OCSP No Check","1.3.6.1.5.5.7.48.2":"caIssuers","1.3.6.1.5.5.7.48.3":"timestamping","1.3.6.1.5.5.8.1.1":"HMAC-MD5","1.3.6.1.5.5.8.1.2":"HMAC-SHA","1.3.6.1.6":"SNMPv2","1.3.6.1.7":"mail","1.3.14":"Open Systems Implementors Workshop","1.3.14.2.26.5":"sha","1.3.14.3":"Security Special Interest Group","1.3.14.3.2":"Security Special Interest Group defined algorithms","1.3.14.3.2.1.1":"rsa","1.3.14.3.2.2":"md4WitRSA","1.3.14.3.2.2.1":"sqmod-N","1.3.14.3.2.3":"md5WithRSA","1.3.14.3.2.3.1":"sqmod-NwithRSA","1.3.14.3.2.4":"md4WithRSAEncryption","1.3.14.3.2.6":"desECB","1.3.14.3.2.7":"desCBC","1.3.14.3.2.8":"desOFB","1.3.14.3.2.9":"desCFB","1.3.14.3.2.10":"desMAC","1.3.14.3.2.11":"rsaSignature","1.3.14.3.2.12":"dsa","1.3.14.3.2.13":"dsaWithSHA","1.3.14.3.2.14":"mdc2WithRSASignature","1.3.14.3.2.15":"shaWithRSASignature","1.3.14.3.2.16":"dhWithCommonModulus","1.3.14.3.2.17":"desEDE","1.3.14.3.2.18":"sha","1.3.14.3.2.19":"mdc-2","1.3.14.3.2.20":"dsaCommon","1.3.14.3.2.21":"dsaCommonWithSHA","1.3.14.3.2.22":"rsaKeyTransport","1.3.14.3.2.23":"keyed-hash-seal","1.3.14.3.2.24":"md2WithRSASignature","1.3.14.3.2.25":"md5WithRSASignature","1.3.14.3.2.26":"sha1","1.3.14.3.2.27":"dsaWithSHA1","1.3.14.3.2.28":"dsaWithCommonSHA1","1.3.14.3.2.29":"sha-1WithRSAEncryption","1.3.14.3.3.1":"simple-strong-auth-mechanism","1.3.14.7.2.1.1":"ElGamal","1.3.14.7.2.3.1":"md2WithRSA","1.3.14.7.2.3.2":"md2WithElGamal","1.3.36":"TeleTrusT","1.3.36.3":"algorithm","1.3.36.3.1":"encryptionAlgorithm","1.3.36.3.1.1":"des","1.3.36.3.1.1.1.1":"desECBPad","1.3.36.3.1.1.1.1.1":"desECBPadISO","1.3.36.3.1.1.2.1":"desCBCPad","1.3.36.3.1.1.2.1.1":"desCBCPadISO","1.3.36.3.1.2":"idea","1.3.36.3.1.2.1":"ideaECB","1.3.36.3.1.2.1.1":"ideaECBPad","1.3.36.3.1.2.1.1.1":"ideaECBPadISO","1.3.36.3.1.2.2":"ideaCBC","1.3.36.3.1.2.2.1":"ideaCBCPad","1.3.36.3.1.2.2.1.1":"ideaCBCPadISO","1.3.36.3.1.2.3":"ideaOFB","1.3.36.3.1.2.4":"ideaCFB","1.3.36.3.1.3":"des-3","1.3.36.3.1.3.1.1":"des-3ECBPad","1.3.36.3.1.3.1.1.1":"des-3ECBPadISO","1.3.36.3.1.3.2.1":"des-3CBCPad","1.3.36.3.1.3.2.1.1":"des-3CBCPadISO","1.3.36.3.2":"hashAlgorithm","1.3.36.3.2.1":"ripemd160","1.3.36.3.2.2":"ripemd128","1.3.36.3.2.3":"ripemd256","1.3.36.3.2.4":"mdc2singleLength","1.3.36.3.2.5":"mdc2doubleLength","1.3.36.3.3":"signatureAlgorithm","1.3.36.3.3.1":"rsa","1.3.36.3.3.1.1":"rsaMitSHA-1","1.3.36.3.3.1.2":"rsaMitRIPEMD160","1.3.36.3.3.2":"ellipticCurve","1.3.36.3.4":"signatureScheme","1.3.36.3.4.1":"iso9796-1","1.3.36.3.4.2.1":"iso9796-2","1.3.36.3.4.2.2":"iso9796-2rsa","1.3.36.4":"attribute","1.3.36.5":"policy","1.3.36.6":"api","1.3.36.6.1":"manufacturerSpecific","1.3.36.6.2":"functionalitySpecific","1.3.36.7":"api","1.3.36.7.1":"keyAgreement","1.3.36.7.2":"keyTransport","1.3.36.8":"Industrial Signature Interoperability Specification","1.3.132.0.34":"secp384r1","1.3.132.0.35":"secp521r1","2.1":"ASN.1","2.1.0":"ASN.1 Specification","2.1.0.0":"ASN.1 Modules","2.1.0.0.0":"ASN.1 Character Module","2.1.0.1":"ASN.1 Character Strings","2.1.0.1.0":"ASN.1 Numeric String","2.1.0.1.1":"ASN.1 PrintableString","2.1.1":"BER Encoding rules","2.1.2":"BER derived Encoding rules","2.1.2.0":"Canonical Encoding rules","2.1.2.1":"Distinguished Encoding rules","2.5":"X.500 Directory Services","2.5.4":"X.500 attribute types","2.5.4.0":"objectClass","2.5.4.1":"aliasObjectName","2.5.4.2":"knowledgeInformation","2.5.4.3":"commonName","2.5.4.4":"surname","2.5.4.5":"serialNumber","2.5.4.6":"countryName","2.5.4.7":"localityName","2.5.4.8":"stateOrProvinceName","2.5.4.9":"streetAddress","2.5.4.10":"organizationName","2.5.4.11":"organizationalUnitName","2.5.4.12":"title","2.5.4.13":"description","2.5.4.14":"searchGuide","2.5.4.15":"businessCategory","2.5.4.16":"postalAddress","2.5.4.17":"postalCode","2.5.4.18":"postOfficeBox","2.5.4.19":"physicalDeliveryOfficeName","2.5.4.20":"telephoneNumber","2.5.4.21":"telexNumber","2.5.4.22":"teletexTerminalIdentifier","2.5.4.23":"facsimileTelephoneNumber","2.5.4.24":"x121Address","2.5.4.25":"internationalISDNNumber","2.5.4.26":"registeredAddress","2.5.4.27":"destinationIndicator","2.5.4.28":"preferredDeliveryMehtod","2.5.4.29":"presentationAddress","2.5.4.30":"supportedApplicationContext","2.5.4.31":"member","2.5.4.32":"owner","2.5.4.33":"roleOccupant","2.5.4.34":"seeAlso","2.5.4.35":"userPassword","2.5.4.36":"userCertificate","2.5.4.37":"caCertificate","2.5.4.38":"authorityRevocationList","2.5.4.39":"certificateRevocationList","2.5.4.40":"crossCertificatePair","2.5.4.41":"name","2.5.4.42":"givenName","2.5.4.43":"initials","2.5.4.44":"generationQualifier","2.5.4.45":"uniqueIdentifier","2.5.4.46":"dnQualifier","2.5.4.47":"enhancedSearchGuide","2.5.4.48":"protocolInformation","2.5.4.49":"distinguishedName","2.5.4.50":"uniqueMember","2.5.4.51":"houseIdentifier","2.5.4.52":"supportedAlgorithms","2.5.4.53":"deltaRevocationList","2.5.4.58":"crossCertificatePair","2.5.4.65":"pseudonym","2.5.8":"X.500-Algorithms","2.5.8.1":"X.500-Alg-Encryption","2.5.8.1.1":"rsa","2.5.29.1":"authorityKeyIdentifier","2.5.29.2":"keyAttributes","2.5.29.3":"certificatePolicies","2.5.29.4":"keyUsageRestriction","2.5.29.5":"policyMapping","2.5.29.6":"subtreesConstraint","2.5.29.7":"subjectAltName","2.5.29.8":"issuerAltName","2.5.29.9":"subjectDirectoryAttributes","2.5.29.10":"basicConstraints","2.5.29.11":"nameConstraints","2.5.29.12":"policyConstraints","2.5.29.13":"basicConstraints","2.5.29.14":"subjectKeyIdentifier","2.5.29.15":"keyUsage","2.5.29.16":"privateKeyUsagePeriod","2.5.29.17":"subjectAltName","2.5.29.18":"issuerAltName","2.5.29.19":"basicConstraints","2.5.29.20":"cRLNumber","2.5.29.21":"cRLReason","2.5.29.22":"expirationDate","2.5.29.23":"instructionCode","2.5.29.24":"invalidityDate","2.5.29.25":"cRLDistributionPoints","2.5.29.26":"issuingDistributionPoint","2.5.29.27":"deltaCRLIndicator","2.5.29.28":"issuingDistributionPoint","2.5.29.29":"certificateIssuer","2.5.29.30":"nameConstraints","2.5.29.31":"cRLDistributionPoints","2.5.29.32":"certificatePolicies","2.5.29.32.0":"anyPolicy","2.5.29.33":"policyMappings","2.5.29.34":"policyConstraints","2.5.29.35":"authorityKeyIdentifier","2.5.29.36":"policyConstraints","2.5.29.37":"extKeyUsage","2.5.29.37.0":"anyExtendedKeyUsage","2.5.29.46":"freshestCRL","2.5.29.54":"inhibitAnyPolicy","2.16":"Country assignments","2.16.840":"USA","2.16.840.1":"US company arc","2.16.840.1.101":"US Government","2.16.840.1.101.2.1.1.1":"sdnsSignatureAlgorithm","2.16.840.1.101.2.1.1.2":"mosaicSignatureAlgorithm","2.16.840.1.101.2.1.1.3":"sdnsConfidentialityAlgorithm","2.16.840.1.101.2.1.1.4":"mosaicConfidentialityAlgorithm","2.16.840.1.101.2.1.1.5":"sdnsIntegrityAlgorithm","2.16.840.1.101.2.1.1.6":"mosaicIntegrityAlgorithm","2.16.840.1.101.2.1.1.7":"sdnsTokenProtectionAlgorithm","2.16.840.1.101.2.1.1.8":"mosaicTokenProtectionAlgorithm","2.16.840.1.101.2.1.1.9":"sdnsKeyManagementAlgorithm","2.16.840.1.101.2.1.1.10":"mosaicKeyManagementAlgorithm","2.16.840.1.101.2.1.1.11":"sdnsKMandSigAlgorithm","2.16.840.1.101.2.1.1.12":"mosaicKMandSigAlgorithm","2.16.840.1.101.2.1.1.13":"SuiteASignatureAlgorithm","2.16.840.1.101.2.1.1.14":"SuiteAConfidentialityAlgorithm","2.16.840.1.101.2.1.1.15":"SuiteAIntegrityAlgorithm","2.16.840.1.101.2.1.1.16":"SuiteATokenProtectionAlgorithm","2.16.840.1.101.2.1.1.17":"SuiteAKeyManagementAlgorithm","2.16.840.1.101.2.1.1.18":"SuiteAKMandSigAlgorithm","2.16.840.1.101.2.1.1.19":"mosaicUpdatedSigAlgorithm","2.16.840.1.101.2.1.1.20":"mosaicKMandUpdSigAlgorithms","2.16.840.1.101.2.1.1.21":"mosaicUpdatedIntegAlgorithm","2.16.840.1.101.2.1.1.22":"mosaicKeyEncryptionAlgorithm","2.16.840.1.101.3.4.2.1":"sha-256","2.16.840.1.101.3.4.2.2":"sha-384","2.16.840.1.101.3.4.2.3":"sha-512","2.16.840.1.101.3.6.9.1":"PIV NACI Indicator","2.16.840.1.113730.1":"Netscape certificate extension","2.16.840.1.113730.1.1":"Netscape certificate type","2.16.840.1.113730.1.2":"Netscape Base URL","2.16.840.1.113730.1.3":"Netscape Revocation URL","2.16.840.1.113730.1.4":"Netscape CA Revocation URL","2.16.840.1.113730.1.7":"Netscape Renewal URL","2.16.840.1.113730.1.8":"Netscape CA policy URL","2.16.840.1.113730.1.9":"Netscape url","2.16.840.1.113730.1.10":"Netscape EntityLogo","2.16.840.1.113730.1.11":"Netscape UserPicture","2.16.840.1.113730.1.12":"Netscape SSL server name","2.16.840.1.113730.1.13":"Netscape certificate comment","2.16.840.1.113730.2":"data-type","2.16.840.1.113730.2.1":"GIF","2.16.840.1.113730.2.2":"JPEG","2.16.840.1.113730.2.3":"URL","2.16.840.1.113730.2.4":"HTML","2.16.840.1.113730.2.5":"netscape-cert-sequence","2.16.840.1.113730.2.6":"netscape-cert-url","2.16.840.1.113730.3":"Netscape LDAP","2.16.840.1.113730.4.1":"serverGatedCrypto","2.16.840.1.113733.1.6.3":"Unknown Verisign extension","2.16.840.1.113733.1.6.6":"Unknown Verisign extension","2.16.840.1.113733.1.7.1.1":"Verisign certificatePolicy","2.16.840.1.113733.1.7.1.1.1":"Unknown Verisign policy qualifier","2.16.840.1.113733.1.7.1.1.2":"Unknown Verisign policy qualifier","2.23.42":"Secure Electronic Transactions","2.23.42.0":"contentType","2.23.42.0.0":"PANData","2.23.42.0.1":"PANToken","2.23.42.0.2":"PANOnly","2.23.42.1":"msgExt","2.23.42.2":"field","2.23.42.2.0":"fullName","2.23.42.2.1":"givenName","2.23.42.2.2":"familyName","2.23.42.2.3":"birthFamilyName","2.23.42.2.4":"placeName","2.23.42.2.5":"identificationNumber","2.23.42.2.6":"month","2.23.42.2.7":"date","2.23.42.2.7.11":"accountNumber","2.23.42.2.7.12":"passPhrase","2.23.42.2.8":"address","2.23.42.2.9":"telephone","2.23.42.2.10":"amount","2.23.42.3":"attribute","2.23.42.3.0":"cert","2.23.42.3.0.0":"rootKeyThumb","2.23.42.3.0.1":"additionalPolicy","2.23.42.4":"algorithm","2.23.42.5":"policy","2.23.42.5.0":"root","2.23.42.6":"module","2.23.42.7":"certExt","2.23.42.7.0":"hashedRootKey","2.23.42.7.1":"certificateType","2.23.42.7.2":"merchantData","2.23.42.7.3":"cardCertRequired","2.23.42.7.4":"tunneling","2.23.42.7.5":"setExtensions","2.23.42.7.6":"setQualifier","2.23.42.8":"brand","2.23.42.8.1":"IATA-ATA","2.23.42.8.4":"VISA","2.23.42.8.5":"MasterCard","2.23.42.8.30":"Diners","2.23.42.8.34":"AmericanExpress","2.23.42.8.6011":"Novus","2.23.42.9":"vendor","2.23.42.9.0":"GlobeSet","2.23.42.9.1":"IBM","2.23.42.9.2":"CyberCash","2.23.42.9.3":"Terisa","2.23.42.9.4":"RSADSI","2.23.42.9.5":"VeriFone","2.23.42.9.6":"TrinTech","2.23.42.9.7":"BankGate","2.23.42.9.8":"GTE","2.23.42.9.9":"CompuSource","2.23.42.9.10":"Griffin","2.23.42.9.11":"Certicom","2.23.42.9.12":"OSS","2.23.42.9.13":"TenthMountain","2.23.42.9.14":"Antares","2.23.42.9.15":"ECC","2.23.42.9.16":"Maithean","2.23.42.9.17":"Netscape","2.23.42.9.18":"Verisign","2.23.42.9.19":"BlueMoney","2.23.42.9.20":"Lacerte","2.23.42.9.21":"Fujitsu","2.23.42.9.22":"eLab","2.23.42.9.23":"Entrust","2.23.42.9.24":"VIAnet","2.23.42.9.25":"III","2.23.42.9.26":"OpenMarket","2.23.42.9.27":"Lexem","2.23.42.9.28":"Intertrader","2.23.42.9.29":"Persimmon","2.23.42.9.30":"NABLE","2.23.42.9.31":"espace-net","2.23.42.9.32":"Hitachi","2.23.42.9.33":"Microsoft","2.23.42.9.34":"NEC","2.23.42.9.35":"Mitsubishi","2.23.42.9.36":"NCR","2.23.42.9.37":"e-COMM","2.23.42.9.38":"Gemplus","2.23.42.10":"national","2.23.42.10.192":"Japan","2.54.1775.2":"hashedRootKey","2.54.1775.3":"certificateType","2.54.1775.4":"merchantData","2.54.1775.5":"cardCertRequired","2.54.1775.6":"tunneling","2.54.1775.7":"setQualifier","2.54.1775.99":"set-data"};var wn;function qr(){return wn||(wn=1,(function($){((S,P)=>{let N={};$.exports?N=Hr:S?.PkiStudioOidNames&&(N=S.PkiStudioOidNames);const O=P(N);$.exports&&($.exports=O),S&&(S.PkiStudioOidResolver=O)})(typeof globalThis<"u"?globalThis:void 0,S=>{function P(q){if(!q)return{};if(typeof q!="object"||Array.isArray(q))throw new Error("OID names must be an object keyed by dotted OID strings");return q}function N(q={},Te={}){const Y=P(Te.baseNames||S),le=Object.freeze({...Y,...P(q)});return Object.freeze({names:le,resolve(Z){return le[String(Z)]||""},create(Z={}){return N(Z,{baseNames:le})}})}const O=N();return Object.freeze({names:O.names,resolve:O.resolve,create:N})})})(Nt)),Nt.exports}var Fr=qr();const Gr=Tt(Fr);var It={exports:{}},vn;function Kr(){return vn||(vn=1,(function($){((S,P)=>{const N=P(S);$.exports&&($.exports=N),S&&S.document&&(S.PkiStudio=N)})(typeof globalThis<"u"?globalThis:void 0,S=>{let P=null;const N="0.4.1";function O(){if(!S||!S.document||!S.window)throw new Error("PkiStudio viewer requires a browser DOM. Importing pkistudiojs/viewer is supported, but init() must run in a browser.")}const q=`:host {
2
+ color-scheme: light dark;
3
+ --bg-start: #f7f9fc;
4
+ --bg: #eef1f5;
5
+ --window: #f8f8f8;
6
+ --chrome-start: #ffffff;
7
+ --chrome: #f2f2f2;
8
+ --panel: #ffffff;
9
+ --panel-border: #b8c0ca;
10
+ --control-border: #8f98a3;
11
+ --subtle-border: #c9cdd3;
12
+ --tree-line: #b9b9b9;
13
+ --text: #111827;
14
+ --muted: #5b6470;
15
+ --accent: #2563eb;
16
+ --accent-soft: #eef6ff;
17
+ --hover-border: #9dbce5;
18
+ --hover-bg: #eaf3ff;
19
+ --selection: #cfe8ff;
20
+ --selection-border: #99c7ee;
21
+ --folder: #f3c14f;
22
+ --folder-edge: #c69324;
23
+ --folder-highlight: #ffe08a;
24
+ --folder-start: #ffe28f;
25
+ --leaf: #f7f7f7;
26
+ --leaf-edge: #8b8b8b;
27
+ --leaf-fold: #dcdcdc;
28
+ --encapsulated-edge: #5f6f84;
29
+ --encapsulated-fold: #d5dbe3;
30
+ --encapsulated-strip: #d89b20;
31
+ --encapsulated-line: #6f5324;
32
+ --encapsulated-start: #f8fbff;
33
+ --encapsulated-end: #dfe8f4;
34
+ --comment: #4b5563;
35
+ --constructed: #166534;
36
+ --danger: #b91c1c;
37
+ --error-border: #e7a4a4;
38
+ --error-bg: #fff5f5;
39
+ --field-border: rgba(148, 163, 184, 0.14);
40
+ --field-bg: rgba(15, 23, 42, 0.46);
41
+ --dialog-overlay: rgba(15, 23, 42, 0.22);
42
+ --shadow-soft: rgba(15, 23, 42, 0.08);
43
+ --shadow-strong: rgba(15, 23, 42, 0.18);
44
+ --shadow-dialog: rgba(15, 23, 42, 0.22);
45
+ --button-bg-start: #ffffff;
46
+ --button-bg-end: #e7e9ee;
47
+ --disabled-text: #8a8f98;
48
+ --disabled-bg: #f1f2f4;
49
+ --readonly-bg: #f7f7f7;
50
+ --toggle-border: #7f7f7f;
51
+ --toggle-text: #333333;
52
+ --toggle-bg: #ffffff;
53
+ }
54
+
55
+ @media (prefers-color-scheme: dark) {
56
+ :host {
57
+ color-scheme: dark;
58
+ --bg-start: #202329;
59
+ --bg: #171a20;
60
+ --window: #202329;
61
+ --chrome-start: #2b2f36;
62
+ --chrome: #242830;
63
+ --panel: #1b1f26;
64
+ --panel-border: #4a5360;
65
+ --control-border: #66707d;
66
+ --subtle-border: #4c5561;
67
+ --tree-line: #6d7480;
68
+ --text: #e7eaf0;
69
+ --muted: #a8b0bc;
70
+ --accent: #7db3ff;
71
+ --accent-soft: #26384d;
72
+ --hover-border: #81a9dc;
73
+ --hover-bg: #28384b;
74
+ --selection: #21496f;
75
+ --selection-border: #5d91cc;
76
+ --folder: #d5a83f;
77
+ --folder-edge: #a77d25;
78
+ --folder-highlight: #f0c969;
79
+ --folder-start: #f3d27a;
80
+ --leaf: #dadde3;
81
+ --leaf-edge: #8d96a3;
82
+ --leaf-fold: #aeb5bf;
83
+ --encapsulated-edge: #8ba0bc;
84
+ --encapsulated-fold: #9aa7b8;
85
+ --encapsulated-strip: #d1a04a;
86
+ --encapsulated-line: #8f6b31;
87
+ --encapsulated-start: #e6edf6;
88
+ --encapsulated-end: #bcc9d9;
89
+ --comment: #b6bfca;
90
+ --constructed: #73d39a;
91
+ --danger: #ff9b9b;
92
+ --error-border: #965f63;
93
+ --error-bg: #341f24;
94
+ --field-border: rgba(148, 163, 184, 0.28);
95
+ --field-bg: rgba(255, 255, 255, 0.06);
96
+ --dialog-overlay: rgba(0, 0, 0, 0.48);
97
+ --shadow-soft: rgba(0, 0, 0, 0.22);
98
+ --shadow-strong: rgba(0, 0, 0, 0.42);
99
+ --shadow-dialog: rgba(0, 0, 0, 0.5);
100
+ --button-bg-start: #343943;
101
+ --button-bg-end: #252a32;
102
+ --disabled-text: #808793;
103
+ --disabled-bg: #282c34;
104
+ --readonly-bg: #2a2e36;
105
+ --toggle-border: #8d96a3;
106
+ --toggle-text: #e7eaf0;
107
+ --toggle-bg: #242830;
108
+ }
109
+ }
110
+
111
+ :host([data-pkistudio-theme="light"]) {
112
+ color-scheme: light;
113
+ --bg-start: #f7f9fc;
114
+ --bg: #eef1f5;
115
+ --window: #f8f8f8;
116
+ --chrome-start: #ffffff;
117
+ --chrome: #f2f2f2;
118
+ --panel: #ffffff;
119
+ --panel-border: #b8c0ca;
120
+ --control-border: #8f98a3;
121
+ --subtle-border: #c9cdd3;
122
+ --tree-line: #b9b9b9;
123
+ --text: #111827;
124
+ --muted: #5b6470;
125
+ --accent: #2563eb;
126
+ --accent-soft: #eef6ff;
127
+ --hover-border: #9dbce5;
128
+ --hover-bg: #eaf3ff;
129
+ --selection: #cfe8ff;
130
+ --selection-border: #99c7ee;
131
+ --folder: #f3c14f;
132
+ --folder-edge: #c69324;
133
+ --folder-highlight: #ffe08a;
134
+ --folder-start: #ffe28f;
135
+ --leaf: #f7f7f7;
136
+ --leaf-edge: #8b8b8b;
137
+ --leaf-fold: #dcdcdc;
138
+ --encapsulated-edge: #5f6f84;
139
+ --encapsulated-fold: #d5dbe3;
140
+ --encapsulated-strip: #d89b20;
141
+ --encapsulated-line: #6f5324;
142
+ --encapsulated-start: #f8fbff;
143
+ --encapsulated-end: #dfe8f4;
144
+ --comment: #4b5563;
145
+ --constructed: #166534;
146
+ --danger: #b91c1c;
147
+ --error-border: #e7a4a4;
148
+ --error-bg: #fff5f5;
149
+ --field-border: rgba(148, 163, 184, 0.14);
150
+ --field-bg: rgba(15, 23, 42, 0.46);
151
+ --dialog-overlay: rgba(15, 23, 42, 0.22);
152
+ --shadow-soft: rgba(15, 23, 42, 0.08);
153
+ --shadow-strong: rgba(15, 23, 42, 0.18);
154
+ --shadow-dialog: rgba(15, 23, 42, 0.22);
155
+ --button-bg-start: #ffffff;
156
+ --button-bg-end: #e7e9ee;
157
+ --disabled-text: #8a8f98;
158
+ --disabled-bg: #f1f2f4;
159
+ --readonly-bg: #f7f7f7;
160
+ --toggle-border: #7f7f7f;
161
+ --toggle-text: #333333;
162
+ --toggle-bg: #ffffff;
163
+ }
164
+
165
+ :host([data-pkistudio-theme="dark"]) {
166
+ color-scheme: dark;
167
+ --bg-start: #202329;
168
+ --bg: #171a20;
169
+ --window: #202329;
170
+ --chrome-start: #2b2f36;
171
+ --chrome: #242830;
172
+ --panel: #1b1f26;
173
+ --panel-border: #4a5360;
174
+ --control-border: #66707d;
175
+ --subtle-border: #4c5561;
176
+ --tree-line: #6d7480;
177
+ --text: #e7eaf0;
178
+ --muted: #a8b0bc;
179
+ --accent: #7db3ff;
180
+ --accent-soft: #26384d;
181
+ --hover-border: #81a9dc;
182
+ --hover-bg: #28384b;
183
+ --selection: #21496f;
184
+ --selection-border: #5d91cc;
185
+ --folder: #d5a83f;
186
+ --folder-edge: #a77d25;
187
+ --folder-highlight: #f0c969;
188
+ --folder-start: #f3d27a;
189
+ --leaf: #dadde3;
190
+ --leaf-edge: #8d96a3;
191
+ --leaf-fold: #aeb5bf;
192
+ --encapsulated-edge: #8ba0bc;
193
+ --encapsulated-fold: #9aa7b8;
194
+ --encapsulated-strip: #d1a04a;
195
+ --encapsulated-line: #8f6b31;
196
+ --encapsulated-start: #e6edf6;
197
+ --encapsulated-end: #bcc9d9;
198
+ --comment: #b6bfca;
199
+ --constructed: #73d39a;
200
+ --danger: #ff9b9b;
201
+ --error-border: #965f63;
202
+ --error-bg: #341f24;
203
+ --field-border: rgba(148, 163, 184, 0.28);
204
+ --field-bg: rgba(255, 255, 255, 0.06);
205
+ --dialog-overlay: rgba(0, 0, 0, 0.48);
206
+ --shadow-soft: rgba(0, 0, 0, 0.22);
207
+ --shadow-strong: rgba(0, 0, 0, 0.42);
208
+ --shadow-dialog: rgba(0, 0, 0, 0.5);
209
+ --button-bg-start: #343943;
210
+ --button-bg-end: #252a32;
211
+ --disabled-text: #808793;
212
+ --disabled-bg: #282c34;
213
+ --readonly-bg: #2a2e36;
214
+ --toggle-border: #8d96a3;
215
+ --toggle-text: #e7eaf0;
216
+ --toggle-bg: #242830;
217
+ }
218
+
219
+ * {
220
+ box-sizing: border-box;
221
+ }
222
+
223
+ :host {
224
+ display: block;
225
+ margin: 0;
226
+ width: 100%;
227
+ height: 100dvh;
228
+ min-height: 0;
229
+ overflow: hidden;
230
+ font-family: Tahoma, "MS UI Gothic", "Yu Gothic UI", system-ui, sans-serif;
231
+ font-size: 13px;
232
+ color: var(--text);
233
+ background: linear-gradient(var(--bg-start), var(--bg));
234
+ }
235
+
236
+ :host([data-pkistudio-fullscreen]) {
237
+ position: fixed;
238
+ inset: 0;
239
+ width: auto;
240
+ height: auto;
241
+ }
242
+
243
+ main {
244
+ display: flex;
245
+ flex-direction: column;
246
+ width: 100%;
247
+ height: 100%;
248
+ min-height: 0;
249
+ margin: 0;
250
+ padding: 0;
251
+ }
252
+
253
+ .menu {
254
+ position: sticky;
255
+ top: 0;
256
+ z-index: 10;
257
+ display: flex;
258
+ flex-wrap: wrap;
259
+ gap: 2px;
260
+ align-items: center;
261
+ margin-bottom: 0;
262
+ border: 1px solid var(--panel-border);
263
+ border-bottom: 0;
264
+ border-radius: 0;
265
+ padding: 4px;
266
+ background: linear-gradient(var(--chrome-start), var(--chrome));
267
+ box-shadow: 0 1px 2px var(--shadow-soft);
268
+ }
269
+
270
+ .menu button {
271
+ border: 1px solid transparent;
272
+ border-radius: 3px;
273
+ padding: 4px 12px;
274
+ color: var(--text);
275
+ background: transparent;
276
+ font: inherit;
277
+ cursor: pointer;
278
+ }
279
+
280
+ .menu button:hover,
281
+ .menu button:focus-visible {
282
+ outline: none;
283
+ border-color: var(--hover-border);
284
+ background: var(--hover-bg);
285
+ }
286
+
287
+ .menu-group {
288
+ position: relative;
289
+ }
290
+
291
+ .submenu {
292
+ position: absolute;
293
+ top: calc(100% + 4px);
294
+ left: 0;
295
+ z-index: 20;
296
+ display: grid;
297
+ min-width: 230px;
298
+ border: 1px solid var(--control-border);
299
+ border-radius: 3px;
300
+ padding: 3px;
301
+ background: var(--panel);
302
+ box-shadow: 0 8px 20px var(--shadow-strong);
303
+ }
304
+
305
+ .submenu[hidden] {
306
+ display: none;
307
+ }
308
+
309
+ .submenu button {
310
+ width: 100%;
311
+ text-align: left;
312
+ white-space: nowrap;
313
+ }
314
+
315
+ .hero {
316
+ display: none;
317
+ }
318
+
319
+ .badge {
320
+ display: inline-flex;
321
+ width: fit-content;
322
+ align-items: center;
323
+ gap: 8px;
324
+ border: 1px solid var(--panel-border);
325
+ border-radius: 999px;
326
+ padding: 8px 12px;
327
+ color: var(--muted);
328
+ background: var(--field-bg);
329
+ }
330
+
331
+ h1 {
332
+ margin: 0;
333
+ font-size: clamp(2.4rem, 7vw, 5.5rem);
334
+ letter-spacing: -0.07em;
335
+ line-height: 0.94;
336
+ }
337
+
338
+ p {
339
+ margin: 0;
340
+ color: var(--muted);
341
+ line-height: 1.5;
342
+ }
343
+
344
+ .card {
345
+ display: flex;
346
+ flex: 1 1 auto;
347
+ flex-direction: column;
348
+ align-items: stretch;
349
+ gap: 6px;
350
+ min-height: 0;
351
+ border: 1px solid var(--panel-border);
352
+ border-right: 0;
353
+ border-left: 0;
354
+ border-radius: 0;
355
+ padding: 6px;
356
+ background: var(--window);
357
+ box-shadow: none;
358
+ overflow: hidden;
359
+ }
360
+
361
+ input[type="file"] {
362
+ position: absolute;
363
+ width: 1px;
364
+ height: 1px;
365
+ overflow: hidden;
366
+ clip: rect(0, 0, 0, 0);
367
+ }
368
+
369
+ .viewer {
370
+ flex: 1 1 auto;
371
+ width: 100%;
372
+ height: auto;
373
+ min-width: min(320px, 100%);
374
+ min-height: 0;
375
+ max-width: 100%;
376
+ max-height: none;
377
+ overflow: auto;
378
+ border: 0;
379
+ border-radius: 0;
380
+ padding: 4px 6px;
381
+ background: transparent;
382
+ font-family: Consolas, "Courier New", monospace;
383
+ font-size: 12px;
384
+ line-height: 1.35;
385
+ }
386
+
387
+ .viewer.empty {
388
+ display: grid;
389
+ place-items: center;
390
+ padding: 32px;
391
+ color: var(--muted);
392
+ }
393
+
394
+ .viewer.dragover {
395
+ background: var(--accent-soft);
396
+ }
397
+
398
+ .tree {
399
+ display: grid;
400
+ gap: 0;
401
+ min-width: 900px;
402
+ }
403
+
404
+ details.node {
405
+ position: relative;
406
+ border: 0;
407
+ border-radius: 0;
408
+ background: transparent;
409
+ }
410
+
411
+ details.node details.node {
412
+ margin-left: 19px;
413
+ }
414
+
415
+ details.node details.node::before {
416
+ content: "";
417
+ position: absolute;
418
+ top: -2px;
419
+ bottom: 8px;
420
+ left: -11px;
421
+ border-left: 1px dotted var(--tree-line);
422
+ }
423
+
424
+ summary {
425
+ position: relative;
426
+ display: flex;
427
+ flex-wrap: nowrap;
428
+ gap: 4px;
429
+ align-items: flex-start;
430
+ min-height: 19px;
431
+ padding: 1px 4px 1px 0;
432
+ cursor: default;
433
+ list-style: none;
434
+ white-space: nowrap;
435
+ line-height: 16px;
436
+ }
437
+
438
+ summary::-webkit-details-marker {
439
+ display: none;
440
+ }
441
+
442
+ summary::before {
443
+ display: none;
444
+ }
445
+
446
+ .node-toggle {
447
+ display: inline-grid;
448
+ place-items: center;
449
+ position: relative;
450
+ z-index: 1;
451
+ width: 11px;
452
+ height: 11px;
453
+ flex: 0 0 auto;
454
+ margin-top: 2px;
455
+ margin-right: 2px;
456
+ border: 1px solid var(--toggle-border);
457
+ color: var(--toggle-text);
458
+ background: var(--toggle-bg);
459
+ font: 10px/1 Arial, sans-serif;
460
+ cursor: pointer;
461
+ user-select: none;
462
+ }
463
+
464
+ .node-toggle .toggle-open {
465
+ display: none;
466
+ }
467
+
468
+ details[open] > summary .node-toggle .toggle-open {
469
+ display: inline;
470
+ }
471
+
472
+ details[open] > summary .node-toggle .toggle-closed {
473
+ display: none;
474
+ }
475
+
476
+ details.node:not(:has(.children)) > summary .node-toggle {
477
+ border-color: transparent;
478
+ background: transparent;
479
+ cursor: default;
480
+ pointer-events: none;
481
+ }
482
+
483
+ details.node:not(:has(.children)) > summary .node-toggle .toggle-open,
484
+ details.node:not(:has(.children)) > summary .node-toggle .toggle-closed {
485
+ display: none;
486
+ }
487
+
488
+ summary::after {
489
+ content: "";
490
+ position: absolute;
491
+ top: 9px;
492
+ left: 8px;
493
+ width: 11px;
494
+ border-top: 1px dotted var(--tree-line);
495
+ transform: translateX(-100%);
496
+ }
497
+
498
+ .icon {
499
+ position: relative;
500
+ width: 15px;
501
+ height: 12px;
502
+ flex: 0 0 auto;
503
+ margin-top: 2px;
504
+ margin-right: 2px;
505
+ }
506
+
507
+ .icon[data-node-icon] {
508
+ cursor: context-menu;
509
+ }
510
+
511
+ .icon.folder::before {
512
+ content: "";
513
+ position: absolute;
514
+ left: 1px;
515
+ top: 1px;
516
+ width: 7px;
517
+ height: 4px;
518
+ border: 1px solid var(--folder-edge);
519
+ border-bottom: 0;
520
+ background: var(--folder-highlight);
521
+ }
522
+
523
+ .icon.folder::after {
524
+ content: "";
525
+ position: absolute;
526
+ left: 0;
527
+ top: 4px;
528
+ width: 14px;
529
+ height: 8px;
530
+ border: 1px solid var(--folder-edge);
531
+ background: linear-gradient(var(--folder-start), var(--folder));
532
+ }
533
+
534
+ .icon.leaf::before {
535
+ content: "";
536
+ position: absolute;
537
+ left: 2px;
538
+ top: 0;
539
+ width: 10px;
540
+ height: 12px;
541
+ border: 1px solid var(--leaf-edge);
542
+ background: linear-gradient(135deg, transparent 0 18%, var(--leaf-fold) 19% 26%, var(--leaf) 27%);
543
+ }
544
+
545
+ .icon.encapsulated::before {
546
+ content: "";
547
+ position: absolute;
548
+ left: 2px;
549
+ top: 0;
550
+ width: 10px;
551
+ height: 12px;
552
+ border: 1px solid var(--encapsulated-edge);
553
+ background:
554
+ linear-gradient(135deg, transparent 0 18%, var(--encapsulated-fold) 19% 26%, transparent 27%),
555
+ linear-gradient(90deg, transparent 0 2px, var(--encapsulated-strip) 2px 5px, transparent 5px),
556
+ repeating-linear-gradient(180deg, transparent 0 2px, var(--encapsulated-line) 2px 3px, transparent 3px 4px),
557
+ linear-gradient(var(--encapsulated-start), var(--encapsulated-end));
558
+ background-position: 0 0, 0 0, 3px 1px, 0 0;
559
+ background-size: auto, auto, 2px 9px, auto;
560
+ }
561
+
562
+ summary:hover .node-line {
563
+ background: var(--accent-soft);
564
+ }
565
+
566
+ details[open] > summary .node-line {
567
+ border-color: transparent;
568
+ }
569
+
570
+ .node-line {
571
+ display: inline-flex;
572
+ align-items: center;
573
+ flex-wrap: nowrap;
574
+ gap: 4px;
575
+ min-height: 16px;
576
+ border: 1px solid transparent;
577
+ border-radius: 2px;
578
+ padding: 0 3px;
579
+ line-height: 16px;
580
+ }
581
+
582
+ .tag {
583
+ color: var(--text);
584
+ font-weight: 400;
585
+ }
586
+
587
+ .pill {
588
+ border: 0;
589
+ border-radius: 0;
590
+ padding: 0;
591
+ color: var(--muted);
592
+ background: transparent;
593
+ font-size: inherit;
594
+ }
595
+
596
+ .constructed {
597
+ color: var(--constructed);
598
+ }
599
+
600
+ .value {
601
+ color: var(--text);
602
+ }
603
+
604
+ .hex,
605
+ .comment {
606
+ color: var(--comment);
607
+ }
608
+
609
+ .content {
610
+ display: none;
611
+ }
612
+
613
+ .field {
614
+ overflow-wrap: anywhere;
615
+ border: 1px solid var(--field-border);
616
+ border-radius: 12px;
617
+ padding: 10px;
618
+ background: var(--field-bg);
619
+ font: 0.86rem/1.55 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
620
+ }
621
+
622
+ .field span {
623
+ display: block;
624
+ margin-bottom: 4px;
625
+ color: var(--muted);
626
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
627
+ font-size: 0.74rem;
628
+ }
629
+
630
+ .children {
631
+ display: grid;
632
+ gap: 0;
633
+ padding: 0;
634
+ }
635
+
636
+ .error {
637
+ border: 1px solid var(--error-border);
638
+ border-radius: 3px;
639
+ padding: 10px;
640
+ color: var(--danger);
641
+ background: var(--error-bg);
642
+ }
643
+
644
+ .notice {
645
+ flex: 0 0 auto;
646
+ margin-top: 0;
647
+ width: 100%;
648
+ font-size: 12px;
649
+ }
650
+
651
+ .node-context-menu {
652
+ position: fixed;
653
+ z-index: 20;
654
+ min-width: 150px;
655
+ border: 1px solid var(--control-border);
656
+ border-radius: 3px;
657
+ padding: 3px;
658
+ background: var(--panel);
659
+ box-shadow: 0 8px 20px var(--shadow-strong);
660
+ }
661
+
662
+ .node-context-menu[hidden] {
663
+ display: none;
664
+ }
665
+
666
+ .node-context-menu button[hidden] {
667
+ display: none;
668
+ }
669
+
670
+ .context-menu-group {
671
+ position: relative;
672
+ }
673
+
674
+ .node-context-menu button {
675
+ display: block;
676
+ width: 100%;
677
+ border: 1px solid transparent;
678
+ border-radius: 2px;
679
+ padding: 4px 18px 4px 8px;
680
+ color: var(--text);
681
+ background: transparent;
682
+ font: inherit;
683
+ text-align: left;
684
+ white-space: nowrap;
685
+ cursor: pointer;
686
+ }
687
+
688
+ .context-submenu-trigger::after {
689
+ content: "\\203a";
690
+ position: absolute;
691
+ right: 8px;
692
+ }
693
+
694
+ .node-context-submenu {
695
+ position: absolute;
696
+ top: -3px;
697
+ left: 100%;
698
+ z-index: 21;
699
+ display: none;
700
+ min-width: 150px;
701
+ border: 1px solid var(--control-border);
702
+ border-radius: 3px;
703
+ padding: 3px;
704
+ background: var(--panel);
705
+ box-shadow: 0 8px 20px var(--shadow-strong);
706
+ }
707
+
708
+ .node-context-menu.open-left .node-context-submenu {
709
+ right: 100%;
710
+ left: auto;
711
+ }
712
+
713
+ .context-menu-group:hover .node-context-submenu,
714
+ .context-menu-group:focus-within .node-context-submenu,
715
+ .context-menu-group.submenu-open .node-context-submenu {
716
+ display: block;
717
+ }
718
+
719
+ .node-context-menu button:hover,
720
+ .node-context-menu button:focus-visible {
721
+ outline: none;
722
+ border-color: var(--hover-border);
723
+ background: var(--hover-bg);
724
+ }
725
+
726
+ .edit-dialog {
727
+ position: fixed;
728
+ inset: 0;
729
+ z-index: 30;
730
+ display: grid;
731
+ place-items: center;
732
+ background: var(--dialog-overlay);
733
+ }
734
+
735
+ .edit-dialog[hidden] {
736
+ display: none;
737
+ }
738
+
739
+ .edit-panel {
740
+ width: min(520px, calc(100vw - 28px));
741
+ border: 1px solid var(--panel-border);
742
+ border-radius: 6px;
743
+ padding: 10px;
744
+ background: var(--panel);
745
+ box-shadow: 0 18px 40px var(--shadow-dialog);
746
+ }
747
+
748
+ .der-panel {
749
+ width: min(620px, calc(100vw - 28px));
750
+ }
751
+
752
+ .der-group {
753
+ margin: 0 0 8px;
754
+ border: 1px solid var(--panel-border);
755
+ border-radius: 3px;
756
+ padding: 8px 10px 10px;
757
+ }
758
+
759
+ .der-group legend {
760
+ padding: 0 4px;
761
+ color: var(--text);
762
+ }
763
+
764
+ .der-identifier-grid {
765
+ display: grid;
766
+ grid-template-columns: minmax(175px, 1fr) minmax(145px, 0.85fr) minmax(135px, 0.75fr);
767
+ gap: 6px;
768
+ align-items: stretch;
769
+ }
770
+
771
+ .der-subgroup {
772
+ margin: 0;
773
+ border: 1px solid var(--subtle-border);
774
+ border-radius: 2px;
775
+ padding: 8px 10px;
776
+ }
777
+
778
+ .der-radio-list {
779
+ display: grid;
780
+ gap: 5px;
781
+ }
782
+
783
+ .der-radio-list label,
784
+ .der-length-row label {
785
+ display: flex;
786
+ gap: 6px;
787
+ align-items: center;
788
+ min-width: 0;
789
+ white-space: nowrap;
790
+ }
791
+
792
+ .edit-panel .der-radio-list label,
793
+ .edit-panel .der-length-row label {
794
+ display: flex;
795
+ }
796
+
797
+ .der-panel input[type="radio"],
798
+ .der-panel input[type="checkbox"] {
799
+ width: auto;
800
+ flex: 0 0 auto;
801
+ }
802
+
803
+ .der-index-field,
804
+ .der-length-row {
805
+ display: grid;
806
+ gap: 8px;
807
+ align-items: center;
808
+ }
809
+
810
+ .der-length-row {
811
+ grid-template-columns: auto 1fr;
812
+ }
813
+
814
+ .der-panel input[readonly],
815
+ .der-panel textarea[readonly] {
816
+ background: var(--readonly-bg);
817
+ }
818
+
819
+ .der-tag-name {
820
+ margin-top: 6px;
821
+ border: 1px solid var(--subtle-border);
822
+ border-radius: 2px;
823
+ padding: 8px;
824
+ text-align: center;
825
+ background: var(--readonly-bg);
826
+ }
827
+
828
+ .der-content-summary {
829
+ display: grid;
830
+ grid-template-columns: auto 1fr;
831
+ gap: 8px 12px;
832
+ align-items: center;
833
+ margin-bottom: 6px;
834
+ }
835
+
836
+ .der-value-preview {
837
+ min-width: 0;
838
+ overflow: hidden;
839
+ text-overflow: ellipsis;
840
+ white-space: nowrap;
841
+ font-family: Consolas, "Courier New", monospace;
842
+ }
843
+
844
+ .der-panel textarea {
845
+ width: 100%;
846
+ min-height: 98px;
847
+ resize: vertical;
848
+ border: 1px solid var(--control-border);
849
+ border-radius: 3px;
850
+ padding: 6px 8px;
851
+ color: var(--text);
852
+ background: var(--panel);
853
+ font: 12px/1.4 Consolas, "Courier New", monospace;
854
+ }
855
+
856
+ .time-panel {
857
+ width: min(440px, calc(100vw - 28px));
858
+ }
859
+
860
+ .octet-panel {
861
+ width: min(560px, calc(100vw - 28px));
862
+ }
863
+
864
+ .about-panel {
865
+ width: min(380px, calc(100vw - 28px));
866
+ }
867
+
868
+ .about-name {
869
+ margin: 0 0 6px;
870
+ color: var(--text);
871
+ font-size: 18px;
872
+ font-weight: 700;
873
+ }
874
+
875
+ .about-version {
876
+ margin-bottom: 8px;
877
+ font-family: Consolas, "Courier New", monospace;
878
+ }
879
+
880
+ .about-description {
881
+ margin-bottom: 10px;
882
+ }
883
+
884
+ .octet-panel textarea {
885
+ width: 100%;
886
+ min-height: 150px;
887
+ resize: vertical;
888
+ border: 1px solid var(--control-border);
889
+ border-radius: 3px;
890
+ padding: 6px 8px;
891
+ color: var(--text);
892
+ background: var(--panel);
893
+ font: 12px/1.4 Consolas, "Courier New", monospace;
894
+ }
895
+
896
+ .bit-unused-row {
897
+ display: grid;
898
+ grid-template-columns: auto minmax(72px, 110px);
899
+ gap: 8px;
900
+ align-items: center;
901
+ margin-bottom: 8px;
902
+ }
903
+
904
+ .bit-unused-row[hidden] {
905
+ display: none;
906
+ }
907
+
908
+ .octet-tools {
909
+ display: flex;
910
+ gap: 6px;
911
+ align-items: center;
912
+ margin-top: 8px;
913
+ }
914
+
915
+ .octet-tools button {
916
+ border: 1px solid var(--control-border);
917
+ border-radius: 3px;
918
+ padding: 5px 12px;
919
+ color: var(--text);
920
+ background: linear-gradient(var(--button-bg-start), var(--button-bg-end));
921
+ font: inherit;
922
+ cursor: pointer;
923
+ }
924
+
925
+ .time-grid {
926
+ display: grid;
927
+ grid-template-columns: minmax(220px, 1fr) minmax(150px, auto);
928
+ gap: 8px 10px;
929
+ align-items: start;
930
+ }
931
+
932
+ .time-fields {
933
+ display: grid;
934
+ gap: 8px;
935
+ }
936
+
937
+ .time-row {
938
+ display: grid;
939
+ grid-template-columns: 1fr auto;
940
+ gap: 8px;
941
+ align-items: center;
942
+ }
943
+
944
+ .time-row label,
945
+ .time-zone-options label,
946
+ .time-tag-options label {
947
+ display: flex;
948
+ gap: 6px;
949
+ align-items: center;
950
+ min-width: 0;
951
+ white-space: nowrap;
952
+ }
953
+
954
+ .edit-panel .time-row label,
955
+ .edit-panel .time-zone-options label,
956
+ .edit-panel .time-tag-options label {
957
+ display: flex;
958
+ }
959
+
960
+ .time-panel input[type="radio"],
961
+ .time-panel input[type="checkbox"] {
962
+ width: auto;
963
+ flex: 0 0 auto;
964
+ }
965
+
966
+ .time-panel input[type="date"],
967
+ .time-panel input[type="time"] {
968
+ font: 12px/1.4 Consolas, "Courier New", monospace;
969
+ }
970
+
971
+ .time-tag-options,
972
+ .time-zone-options {
973
+ display: flex;
974
+ gap: 5px;
975
+ flex-direction: column;
976
+ }
977
+
978
+ .time-zone-options {
979
+ display: grid;
980
+ grid-template-columns: repeat(2, minmax(72px, auto));
981
+ align-items: center;
982
+ }
983
+
984
+ .time-offset-row {
985
+ display: grid;
986
+ grid-template-columns: auto 1fr 1fr;
987
+ gap: 6px;
988
+ align-items: center;
989
+ margin-top: 6px;
990
+ }
991
+
992
+ .time-offset-row input {
993
+ min-width: 0;
994
+ }
995
+
996
+ .edit-panel label {
997
+ display: grid;
998
+ gap: 6px;
999
+ }
1000
+
1001
+ .edit-panel input {
1002
+ width: 100%;
1003
+ border: 1px solid var(--control-border);
1004
+ border-radius: 3px;
1005
+ padding: 6px 8px;
1006
+ color: var(--text);
1007
+ background: var(--panel);
1008
+ font: 12px/1.4 Consolas, "Courier New", monospace;
1009
+ }
1010
+
1011
+ .edit-title {
1012
+ margin: 0 0 8px;
1013
+ color: var(--text);
1014
+ font-weight: 700;
1015
+ }
1016
+
1017
+ .edit-error {
1018
+ min-height: 18px;
1019
+ margin-top: 6px;
1020
+ color: var(--danger);
1021
+ }
1022
+
1023
+ .edit-actions {
1024
+ display: flex;
1025
+ justify-content: flex-end;
1026
+ gap: 6px;
1027
+ margin-top: 8px;
1028
+ }
1029
+
1030
+ .edit-actions button {
1031
+ border: 1px solid var(--control-border);
1032
+ border-radius: 3px;
1033
+ padding: 5px 14px;
1034
+ color: var(--text);
1035
+ background: linear-gradient(var(--button-bg-start), var(--button-bg-end));
1036
+ font: inherit;
1037
+ cursor: pointer;
1038
+ }
1039
+
1040
+ .edit-actions button:disabled {
1041
+ color: var(--disabled-text);
1042
+ cursor: not-allowed;
1043
+ background: var(--disabled-bg);
1044
+ }
1045
+
1046
+ @media (max-width: 640px) {
1047
+ .der-identifier-grid,
1048
+ .der-length-row,
1049
+ .der-content-summary,
1050
+ .time-grid,
1051
+ .time-row {
1052
+ grid-template-columns: 1fr;
1053
+ }
1054
+ }`,Te=`<main>
1055
+ <nav class="menu" aria-label="Application actions">
1056
+ <div class="menu-group">
1057
+ <button type="button" data-action="toggle-load-menu" aria-haspopup="menu" aria-expanded="false">Load</button>
1058
+ <div id="loadMenu" class="submenu" role="menu" hidden>
1059
+ <button type="button" role="menuitem" data-action="open">from File</button>
1060
+ <button type="button" role="menuitem" data-action="load-clipboard-pem">from Clipboard as PEM</button>
1061
+ <button type="button" role="menuitem" data-action="load-clipboard-hex">from Clipboard as HEX</button>
1062
+ </div>
1063
+ </div>
1064
+ <div class="menu-group">
1065
+ <button type="button" data-action="toggle-save-menu" aria-haspopup="menu" aria-expanded="false">Save</button>
1066
+ <div id="saveMenu" class="submenu" role="menu" hidden>
1067
+ <button type="button" role="menuitem" data-action="save-der-file">to File as DER</button>
1068
+ </div>
1069
+ </div>
1070
+ <button type="button" data-action="close">Close</button>
1071
+ <div class="menu-group">
1072
+ <button type="button" data-action="toggle-tools-menu" aria-haspopup="menu" aria-expanded="false">Tools</button>
1073
+ <div id="toolsMenu" class="submenu" role="menu" hidden>
1074
+ <button type="button" role="menuitem" data-action="expand-all">Expand All</button>
1075
+ <button type="button" role="menuitem" data-action="collapse-all">Collapse All</button>
1076
+ </div>
1077
+ </div>
1078
+ <button type="button" data-action="about">About</button>
1079
+ </nav>
1080
+
1081
+ <section class="hero">
1082
+ <div class="badge">pkistudio · ASN.1 DER Viewer · :8080</div>
1083
+ <h1>View DER as a Tree</h1>
1084
+ <p>
1085
+ Parse ASN.1 DER binaries in your browser and inspect tags, lengths, offsets, and values as a tree.
1086
+ File contents are never uploaded to the server.
1087
+ </p>
1088
+ </section>
1089
+
1090
+ <section class="card">
1091
+ <input id="fileInput" type="file" accept=".der,.pem,.cer,.crt,.csr,.p7b,.p7c,.crl,.bin,application/pkix-cert,application/pkcs10,application/octet-stream,text/plain" hidden />
1092
+ <div id="viewer" class="viewer empty">No DER / PEM file selected yet.</div>
1093
+ <p id="fileNotice" class="notice">
1094
+ PEM and headerless base64 input are decoded before parsing.
1095
+ </p>
1096
+ </section>
1097
+ </main>
1098
+
1099
+ <div id="nodeContextMenu" class="node-context-menu" role="menu" hidden>
1100
+ <button type="button" role="menuitem" data-node-action="edit">Edit</button>
1101
+ <div class="context-menu-group" role="none">
1102
+ <button type="button" class="context-submenu-trigger" role="menuitem" data-node-action="insert-before" aria-haspopup="menu" aria-expanded="false">Insert before</button>
1103
+ <div class="node-context-submenu" role="menu" aria-label="Insert before">
1104
+ <button type="button" role="menuitem" data-node-action="insert-before-new-item">New Item</button>
1105
+ <button type="button" role="menuitem" data-node-action="insert-before-clipboard-hex">from Clipboard as HEX Text</button>
1106
+ </div>
1107
+ </div>
1108
+ <div class="context-menu-group" role="none" data-add-menu>
1109
+ <button type="button" class="context-submenu-trigger" role="menuitem" data-node-action="add-child" aria-haspopup="menu" aria-expanded="false">Add</button>
1110
+ <div class="node-context-submenu" role="menu" aria-label="Add">
1111
+ <button type="button" role="menuitem" data-node-action="add-child-new-item">New Item</button>
1112
+ <button type="button" role="menuitem" data-node-action="add-child-clipboard-hex">from Clipboard as HEX Text</button>
1113
+ </div>
1114
+ </div>
1115
+ <button type="button" role="menuitem" data-node-action="delete">Delete</button>
1116
+ <div class="context-menu-group" role="none">
1117
+ <button type="button" class="context-submenu-trigger" role="menuitem" data-node-action="send-to" aria-haspopup="menu" aria-expanded="false">Send to</button>
1118
+ <div class="node-context-submenu" role="menu" aria-label="Send to">
1119
+ <button type="button" role="menuitem" data-node-action="send-new-window">New Window</button>
1120
+ <button type="button" role="menuitem" data-node-action="send-new-window-extracted" hidden>New Window as Extracted</button>
1121
+ <button type="button" role="menuitem" data-node-action="copy-tree">Clipboard as Tree Text</button>
1122
+ <button type="button" role="menuitem" data-node-action="copy-hex">Clipboard as HEX Text</button>
1123
+ </div>
1124
+ </div>
1125
+ </div>
1126
+
1127
+ <div id="derDialog" class="edit-dialog" hidden>
1128
+ <form id="derForm" class="edit-panel der-panel">
1129
+ <p id="derTitle" class="edit-title">Edit DER</p>
1130
+ <fieldset class="der-group">
1131
+ <legend>Identifier</legend>
1132
+ <div class="der-identifier-grid">
1133
+ <fieldset class="der-subgroup">
1134
+ <legend>Class</legend>
1135
+ <div class="der-radio-list">
1136
+ <label><input type="radio" name="derClass" value="0" disabled /> Universal</label>
1137
+ <label><input type="radio" name="derClass" value="1" disabled /> Application</label>
1138
+ <label><input type="radio" name="derClass" value="2" disabled /> Context-specific</label>
1139
+ <label><input type="radio" name="derClass" value="3" disabled /> Private</label>
1140
+ </div>
1141
+ </fieldset>
1142
+ <fieldset class="der-subgroup">
1143
+ <legend>Method</legend>
1144
+ <div class="der-radio-list">
1145
+ <label><input type="radio" name="derMethod" value="constructed" disabled /> Structured</label>
1146
+ <label><input type="radio" name="derMethod" value="primitive" disabled /> Primitive</label>
1147
+ </div>
1148
+ </fieldset>
1149
+ <fieldset class="der-subgroup der-index-field">
1150
+ <legend>Index</legend>
1151
+ <input id="derIndex" type="number" readonly />
1152
+ </fieldset>
1153
+ </div>
1154
+ <div id="derTagName" class="der-tag-name"></div>
1155
+ </fieldset>
1156
+ <fieldset class="der-group">
1157
+ <legend>Length</legend>
1158
+ <div class="der-length-row">
1159
+ <label><input id="derIndefinite" type="checkbox" disabled /> Indefinite</label>
1160
+ <input id="derLength" type="text" readonly />
1161
+ </div>
1162
+ </fieldset>
1163
+ <fieldset class="der-group">
1164
+ <legend>Content</legend>
1165
+ <div class="der-content-summary">
1166
+ <button type="button" data-der-action="edit-content">Edit...</button>
1167
+ <output id="derValuePreview" class="der-value-preview"></output>
1168
+ </div>
1169
+ <textarea id="derHex" readonly spellcheck="false"></textarea>
1170
+ </fieldset>
1171
+ <div class="edit-actions">
1172
+ <button type="submit">OK</button>
1173
+ <button type="button" data-der-action="cancel">Cancel</button>
1174
+ </div>
1175
+ </form>
1176
+ </div>
1177
+
1178
+ <div id="editDialog" class="edit-dialog" hidden>
1179
+ <form id="editForm" class="edit-panel">
1180
+ <p id="editTitle" class="edit-title">Edit</p>
1181
+ <label>
1182
+ Value
1183
+ <input id="editValue" name="value" autocomplete="off" />
1184
+ </label>
1185
+ <div id="editError" class="edit-error" role="alert"></div>
1186
+ <div class="edit-actions">
1187
+ <button type="button" data-edit-action="cancel">Cancel</button>
1188
+ <button type="submit">Apply</button>
1189
+ </div>
1190
+ </form>
1191
+ </div>
1192
+
1193
+ <div id="timeDialog" class="edit-dialog" hidden>
1194
+ <form id="timeForm" class="edit-panel time-panel">
1195
+ <p id="timeTitle" class="edit-title">Time</p>
1196
+ <div class="time-grid">
1197
+ <div class="time-fields">
1198
+ <input id="timeDate" type="date" required />
1199
+ <div class="time-row">
1200
+ <input id="timeClock" type="time" step="1" required />
1201
+ <label><input id="timeZeroOmitted" type="checkbox" disabled /> Zero Omitted</label>
1202
+ </div>
1203
+ <label>
1204
+ Fractions
1205
+ <input id="timeFractions" type="text" inputmode="numeric" autocomplete="off" disabled />
1206
+ </label>
1207
+ </div>
1208
+ <fieldset class="der-subgroup">
1209
+ <legend>Tag</legend>
1210
+ <div class="time-tag-options">
1211
+ <label><input type="radio" name="timeTag" value="auto" disabled /> Auto</label>
1212
+ <label><input type="radio" name="timeTag" value="23" disabled /> UTCTime</label>
1213
+ <label><input type="radio" name="timeTag" value="24" disabled /> GeneralizedTime</label>
1214
+ </div>
1215
+ </fieldset>
1216
+ </div>
1217
+ <fieldset class="der-group">
1218
+ <legend>Zone</legend>
1219
+ <div class="time-zone-options">
1220
+ <label><input type="radio" name="timeZone" value="gmt" checked /> GMT</label>
1221
+ <label><input type="radio" name="timeZone" value="local" /> Local</label>
1222
+ </div>
1223
+ <div class="time-offset-row">
1224
+ <select id="timeOffsetSign" disabled>
1225
+ <option value="+">+</option>
1226
+ <option value="-">-</option>
1227
+ </select>
1228
+ <input id="timeOffsetHours" type="number" min="0" max="23" value="0" disabled />
1229
+ <input id="timeOffsetMinutes" type="number" min="0" max="59" value="0" disabled />
1230
+ </div>
1231
+ </fieldset>
1232
+ <div id="timeError" class="edit-error" role="alert"></div>
1233
+ <div class="edit-actions">
1234
+ <button type="submit">OK</button>
1235
+ <button type="button" data-time-action="cancel">Cancel</button>
1236
+ </div>
1237
+ </form>
1238
+ </div>
1239
+
1240
+ <div id="octetDialog" class="edit-dialog" hidden>
1241
+ <form id="octetForm" class="edit-panel octet-panel">
1242
+ <p id="octetTitle" class="edit-title">OCTET STRING (HEX)</p>
1243
+ <label id="bitUnusedRow" class="bit-unused-row" hidden>
1244
+ Unused bits
1245
+ <input id="bitUnusedBits" type="number" min="0" max="7" step="1" value="0" />
1246
+ </label>
1247
+ <textarea id="octetHex" spellcheck="false"></textarea>
1248
+ <div class="octet-tools">
1249
+ <button type="button" data-octet-action="load-file">Load from...</button>
1250
+ <input id="octetFileInput" type="file" hidden />
1251
+ </div>
1252
+ <div id="octetError" class="edit-error" role="alert"></div>
1253
+ <div class="edit-actions">
1254
+ <button type="submit">Apply</button>
1255
+ <button type="button" data-octet-action="cancel">Cancel</button>
1256
+ </div>
1257
+ </form>
1258
+ </div>
1259
+
1260
+ <div id="clipboardInsertDialog" class="edit-dialog" hidden>
1261
+ <form id="clipboardInsertForm" class="edit-panel octet-panel">
1262
+ <p id="clipboardInsertTitle" class="edit-title">Insert from Clipboard HEX</p>
1263
+ <label>
1264
+ HEX text
1265
+ <textarea id="clipboardInsertHex" spellcheck="false"></textarea>
1266
+ </label>
1267
+ <div id="clipboardInsertError" class="edit-error" role="alert"></div>
1268
+ <div class="edit-actions">
1269
+ <button id="clipboardInsertSubmit" type="submit">Insert</button>
1270
+ <button type="button" data-clipboard-insert-action="cancel">Cancel</button>
1271
+ </div>
1272
+ </form>
1273
+ </div>
1274
+
1275
+ <div id="aboutDialog" class="edit-dialog" hidden>
1276
+ <section class="edit-panel about-panel" role="dialog" aria-labelledby="aboutTitle" aria-modal="true">
1277
+ <p id="aboutTitle" class="about-name">PkiStudioJS</p>
1278
+ <p class="about-version">Version ${N}</p>
1279
+ <p class="about-description">Browser-based ASN.1 DER viewer and editor.</p>
1280
+ <div class="edit-actions">
1281
+ <button type="button" data-about-action="close">Close</button>
1282
+ </div>
1283
+ </section>
1284
+ </div>`;function Y(h){if(typeof h=="string"){const u=document.querySelector(h);if(!u)throw new Error(`pkistudio mount target was not found: ${h}`);return u}if(h)return h;const E=document.querySelector("[data-pkistudio-mount], [data-pkistudio], #pkistudio");if(!E)throw new Error("pkistudio mount target was not found");return E}function le(h,E){const u=E.shadowRoot!==!1&&typeof h.attachShadow=="function";Z(h),E.fullscreen&&!(h instanceof ShadowRoot)&&(Me(),h.setAttribute("data-pkistudio-fullscreen",""));const _=h instanceof ShadowRoot?h:u?h.shadowRoot||h.attachShadow({mode:"open"}):h;return _.innerHTML=`<style>${q}</style>${Te}`,_}function Z(h){const E=new URL(window.location.href).searchParams.get("theme");if(E!=="dark"&&E!=="light")return;(h instanceof ShadowRoot?h.host:h)?.setAttribute("data-pkistudio-theme",E)}function Ke(){const E=document.querySelector("[data-pkistudio-mount], [data-pkistudio], #pkistudio")?.getAttribute("data-pkistudio-theme");return E==="dark"||E==="light"?E:window.matchMedia?.("(prefers-color-scheme: dark)").matches?"dark":"light"}function Me(){document.documentElement.style.height="100%",document.documentElement.style.margin="0",document.documentElement.style.overflow="hidden",document.body.style.height="100%",document.body.style.margin="0",document.body.style.overflow="hidden"}function We(h={}){O();const E=Y(h.mount),u=le(E,h),_=u.querySelector("#fileInput"),fe=u.querySelector(".menu"),Ve=u.querySelector("#loadMenu"),De=u.querySelector("#saveMenu"),ze=u.querySelector("#toolsMenu"),I=u.querySelector("#viewer"),m=u.querySelector("#fileNotice"),B=u.querySelector("#nodeContextMenu"),J=u.querySelector("#derDialog"),Q=u.querySelector("#derForm"),ke=u.querySelector("#derTitle"),F=u.querySelector("#derIndex"),R=u.querySelector("#derIndefinite"),we=u.querySelector("#derLength"),G=u.querySelector("#derTagName"),ie=u.querySelector("#derValuePreview"),ee=u.querySelector("#derHex"),ve=u.querySelector("#editDialog"),je=u.querySelector("#editForm"),Pe=u.querySelector("#editTitle"),V=u.querySelector("#editValue"),pe=u.querySelector("#editError"),Se=u.querySelector("#timeDialog"),ge=u.querySelector("#timeForm"),Xe=u.querySelector("#timeTitle"),me=u.querySelector("#timeDate"),Be=u.querySelector("#timeClock"),Re=u.querySelector("#timeZeroOmitted"),Ye=u.querySelector("#timeFractions"),$e=u.querySelector("#timeOffsetSign"),Ce=u.querySelector("#timeOffsetHours"),Ee=u.querySelector("#timeOffsetMinutes"),Oe=u.querySelector("#timeError"),r=u.querySelector("#octetDialog"),i=u.querySelector("#octetForm"),a=u.querySelector("#octetTitle"),c=u.querySelector("#bitUnusedRow"),d=u.querySelector("#bitUnusedBits"),g=u.querySelector("#octetHex"),A=u.querySelector("#octetFileInput"),w=u.querySelector("#octetError"),D=u.querySelector("#clipboardInsertDialog"),oe=u.querySelector("#clipboardInsertForm"),Ze=u.querySelector("#clipboardInsertTitle"),T=u.querySelector("#clipboardInsertHex"),z=u.querySelector("#clipboardInsertError"),rt=u.querySelector("#clipboardInsertSubmit"),te=u.querySelector("#aboutDialog"),En=["Universal","Application","Context-specific","Private"],An={1:"BOOLEAN",2:"INTEGER",3:"BIT STRING",4:"OCTET STRING",5:"NULL",6:"OBJECT IDENTIFIER",10:"ENUMERATED",12:"UTF8String",16:"SEQUENCE",17:"SET",18:"NumericString",19:"PrintableString",20:"TeletexString",22:"IA5String",23:"UTCTime",24:"GeneralizedTime",30:"BMPString"},Nn=255,In=250,Tn=4096;let it={},_e=Dt(h.oidResolver||h.oidNames),K=null,U=[],k=new Map,Je=null,Ae=null,ne="view",ot=null,at=null,st=null,dt=null,ct="insert-before",Mt=1;function Dt(e){if(!e)return null;if(typeof e=="function")return{resolve:e};if(typeof e.resolve=="function")return e;if(typeof e=="object"&&!Array.isArray(e))return{resolve:t=>e[t]||""};throw new Error("oidResolver must be a resolver, function, or object keyed by dotted OID strings")}function Mn(e){return _e?_e.resolve(e)||"":it[e]||""}async function Dn(){if(!_e)try{const e=await fetch(h.oidUrl||"oids.json",{cache:"no-cache"});if(!e.ok)throw new Error(`HTTP ${e.status}`);it=await e.json(),_e=Dt(it),U.length>0&&wt()}catch(e){console.warn("OID names could not be loaded.",e)}}function j(e){return String(e).replace(/[&<>'"]/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;","'":"&#39;",'"':"&quot;"})[t])}function kn(e){const t=String(e);return t.length>=Nn?`${t.slice(0,In)}...`:t}function Qe(e,t=32){const n=Math.min(e.length,t),o=Array.from(e.slice(0,n),s=>s.toString(16).padStart(2,"0")).join(" ");return e.length>t?`${o} ...`:o}function Le(e,t=42){const n=Math.min(e.length,t),o=Array.from(e.slice(0,n),s=>s.toString(16).padStart(2,"0")).join("");return e.length>t?`${o}...`:o}function lt(e){return Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}function Pn(e){return Array.from(e,t=>t>=32&&t<=126?String.fromCharCode(t):".").join("")}function Ue(e){const t=e.reduce((s,l)=>s+l.length,0),n=new Uint8Array(t);let o=0;for(const s of e)n.set(s,o),o+=s.length;return n}function kt(e){let t="";for(let n=0;n<e.length;n+=1)t+=String.fromCharCode(e[n]);return btoa(t)}function Pt(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1)if(e[n]!==t[n])return!1;return!0}function Bn(e){if(!Number.isSafeInteger(e)||e<0)throw new Error("Invalid tag number");const t=[e&127];for(e=Math.floor(e/128);e>0;)t.unshift(e&127|128),e=Math.floor(e/128);return t}function Bt(e){const t=e.tagClass<<6|(e.constructed?32:0);return e.tagNumber<31?new Uint8Array([t|e.tagNumber]):new Uint8Array([t|31,...Bn(e.tagNumber)])}function Rn(e){if(!Number.isSafeInteger(e)||e<0)throw new Error("Invalid length");if(e<128)return new Uint8Array([e]);const t=[];let n=e;for(;n>0;)t.unshift(n&255),n=Math.floor(n/256);return new Uint8Array([128|t.length,...t])}function H(e){return e.valueBytes||new Uint8Array}function $n(e){if(e.constructed)return he(e.children);if(e.encapsulated&&e.tagClass===0&&e.tagNumber===3){const t=H(e),n=t.length?t[0]:0;return Ue([new Uint8Array([n]),he(e.children)])}return e.encapsulated&&e.tagClass===0&&e.tagNumber===4?he(e.children):H(e)}function et(e){const t=$n(e);return e.indefinite?Ue([Bt(e),new Uint8Array([128]),t,new Uint8Array([0,0])]):Ue([Bt(e),Rn(t.length),t])}function he(e){return Ue(e.map(t=>et(t)))}function ut(e){return new TextDecoder("utf-8",{fatal:!1}).decode(e)}function ft(e){return/-----BEGIN [^-]+-----/.test(e)}function On(e){const t=e.replace(/\s+/g,"");return!t||t.length%4!==0||!/^[A-Za-z0-9+/]+={0,2}$/.test(t)||/=/.test(t.slice(0,-2))?"":t}function pt(e){const t=atob(e),n=new Uint8Array(t.length);for(let o=0;o<t.length;o+=1)n[o]=t.charCodeAt(o);return n}function Rt(e){const t=/-----BEGIN ([^-]+)-----([\s\S]*?)-----END \1-----/g,n=[];let o;for(;(o=t.exec(e))!==null;){const p=o[2].split(/\r?\n/).filter(b=>!b.includes(":")).join("").replace(/\s+/g,"");if(!p)throw new Error(`PEM block ${o[1]} has no base64 data`);n.push(pt(p))}if(n.length===0)throw new Error("Could not read a PEM BEGIN/END block");const s=n.reduce((p,b)=>p+b.length,0),l=new Uint8Array(s);let f=0;for(const p of n)l.set(p,f),f+=p.length;return l}function $t(e){const t=On(e);if(!t)throw new Error("Headerless PEM data must be valid base64 text");const n=pt(t);return be(n,0,n.length),n}function Ln(e){const t=ut(e);if(ft(t))return{bytes:Rt(t),format:"PEM"};try{return{bytes:$t(t),format:"headerless PEM"}}catch{}return{bytes:e,format:"DER"}}function gt(e){const t=e.replace(/\s+/g,"");if(!t)throw new Error("HEX data is empty");if(!/^[0-9a-fA-F]+$/.test(t))throw new Error("HEX text may contain only 0-9 and a-f");if(t.length%2!==0)throw new Error("HEX text must contain an even number of digits");const n=new Uint8Array(t.length/2);for(let o=0;o<n.length;o+=1)n[o]=parseInt(t.slice(o*2,o*2+2),16);return n}function tt(e){const t=e.replace(/\s+/g,"");return t?gt(t):new Uint8Array}function Ot(e){const t=[];for(let n=0;n+1<e.length;n+=2)t.push(e[n]<<8|e[n+1]);return String.fromCharCode(...t)}function Un(e){if(e.length===0)return"0";if(e.length>8)return`0x${Array.from(e,n=>n.toString(16).padStart(2,"0")).join("")}`;let t=0n;for(const n of e)t=t<<8n|BigInt(n);return(e[0]&128)!==0&&(t-=1n<<BigInt(e.length*8)),t.toString()}function Lt(e){if(e.length===0)return"";const t=e[0],n=t>=80?[2,t-80]:[Math.floor(t/40),t%40];let o=0;for(let s=1;s<e.length;s+=1)o=o*128+(e[s]&127),(e[s]&128)===0&&(n.push(o),o=0);return n.join(".")}function Hn(e){const t=[e&127];for(e=Math.floor(e/128);e>0;)t.unshift(e&127|128),e=Math.floor(e/128);return t}function qn(e){const t=e.trim();if(!/^\d+(?:\.\d+)+$/.test(t))throw new Error("Enter the OID in 1.2.840... format");const n=t.split(".").map(s=>Number(s));if(n.some(s=>!Number.isSafeInteger(s)||s<0))throw new Error("Each OID arc must be a safe non-negative integer");if(n[0]>2)throw new Error("The first OID arc must be 0, 1, or 2");if(n[0]<2&&n[1]>39)throw new Error("When the first OID arc is 0 or 1, the second arc must be 0..39");const o=[n[0]*40+n[1]];for(const s of n.slice(2))o.push(...Hn(s));return new Uint8Array(o)}function x(e,t=2){return String(e).padStart(t,"0")}function Ut(e){return e.tagClass===0&&(e.tagNumber===23||e.tagNumber===24)}function Ht(e,t){const o=(e.tagNumber===23?/^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(Z|[+-]\d{4})$/:/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(Z|[+-]\d{4})$/).exec(t.trim());if(!o)throw new Error(`Enter ${y(e)} in ${e.tagNumber===23?"YYMMDDHHMMSSZ or YYMMDDHHMMSS+0900":"YYYYMMDDHHMMSSZ or YYYYMMDDHHMMSS+0900"} format`);const s=e.tagNumber===23?Number(o[1])>=50?1900+Number(o[1]):2e3+Number(o[1]):Number(o[1]),l=Number(o[2]),f=Number(o[3]),p=Number(o[4]),b=Number(o[5]),v=Number(o[6]),M=o[7],C=new Date(Date.UTC(s,l-1,f,p,b,v));if(C.getUTCFullYear()!==s||C.getUTCMonth()!==l-1||C.getUTCDate()!==f||C.getUTCHours()!==p||C.getUTCMinutes()!==b||C.getUTCSeconds()!==v)throw new Error(`${y(e)} contains an invalid date or time`);return{year:s,month:l,day:f,hour:p,minute:b,second:v,zone:M==="Z"?"gmt":"local",offsetSign:M==="Z"?"+":M[0],offsetHours:M==="Z"?0:Number(M.slice(1,3)),offsetMinutes:M==="Z"?0:Number(M.slice(3,5))}}function Fn(e){return`${e.year}-${x(e.month)}-${x(e.day)}`}function Gn(e){return`${x(e.hour)}:${x(e.minute)}:${x(e.second)}`}function Kn(e,t){try{const n=Ht(e,t),o=n.zone==="gmt"?"GMT":`${n.offsetSign}${x(n.offsetHours)}${x(n.offsetMinutes)}`;return`${n.year}/${x(n.month)}/${x(n.day)} ${x(n.hour)}:${x(n.minute)}:${x(n.second)} [${o}]`}catch{return t}}function Wn(e,t){const{year:n,month:o,day:s,hour:l,minute:f,second:p}=t;if(e.tagNumber===23){if(n<1950||n>2049)throw new Error("UTCTime must be between 1950 and 2049");return`${x(n%100)}${x(o)}${x(s)}${x(l)}${x(f)}${x(p)}${t.zoneSuffix}`}return`${x(n,4)}${x(o)}${x(s)}${x(l)}${x(f)}${x(p)}${t.zoneSuffix}`}function Vn(){if(!me.value||!Be.value)throw new Error("Enter both date and time");const[e,t,n]=me.value.split("-").map(v=>Number(v)),[o,s,l=0]=Be.value.split(":").map(v=>Number(v));if([e,t,n,o,s,l].some(v=>!Number.isInteger(v)))throw new Error("Invalid date or time");const f=new Date(Date.UTC(e,t-1,n,o,s,l));if(f.getUTCFullYear()!==e||f.getUTCMonth()!==t-1||f.getUTCDate()!==n||f.getUTCHours()!==o||f.getUTCMinutes()!==s||f.getUTCSeconds()!==l)throw new Error("Invalid date or time");const p=ge.querySelector('input[name="timeZone"]:checked')?.value||"gmt";let b="Z";if(p==="local"){const v=Number(Ce.value),M=Number(Ee.value);if(!Number.isInteger(v)||v<0||v>23||!Number.isInteger(M)||M<0||M>59)throw new Error("Invalid time zone offset");b=`${$e.value}${x(v)}${x(M)}`}return{year:e,month:t,day:n,hour:o,minute:s,second:l,zoneSuffix:b}}function zn(e){return/^[\x00-\x7F]*$/.test(e)}function jn(e){const t=new Uint8Array(e.length*2);for(let n=0;n<e.length;n+=1){const o=e.charCodeAt(n);t[n*2]=o>>8,t[n*2+1]=o&255}return t}function Xn(e,t){switch(e.tagNumber){case 18:if(!/^[0-9 ]*$/.test(t))throw new Error("NumericString may contain only digits and spaces");break;case 19:if(!/^[A-Za-z0-9 '()+,\-./:=?]*$/.test(t))throw new Error("PrintableString contains unsupported characters");break;case 20:case 22:if(!zn(t))throw new Error(`${y(e)} may contain only ASCII characters`);break;case 23:if(!/^\d{12}(?:Z|[+-]\d{4})$/.test(t))throw new Error("Enter UTCTime in YYMMDDHHMMSSZ or YYMMDDHHMMSS+0900 format");break;case 24:if(!/^\d{14}(?:Z|[+-]\d{4})$/.test(t))throw new Error("Enter GeneralizedTime in YYYYMMDDHHMMSSZ or YYYYMMDDHHMMSS+0900 format");break}}function Yn(e){return e.tagClass===0&&[12,18,19,20,22,23,24,30].includes(e.tagNumber)}function mt(e){return e.tagClass===0&&e.tagNumber===6}function Zn(e){return e.tagClass===0&&e.tagNumber===4&&!e.constructed}function ht(e){return e.tagClass===0&&e.tagNumber===3&&!e.constructed}function _n(e){return Zn(e)||ht(e)}function bt(e){return!e.constructed}function qt(e){return mt(e)?Lt(H(e)):e.tagNumber===30?Ot(H(e)):ut(H(e))}function Jn(e,t){return mt(e)?qn(t):(Xn(e,t),e.tagNumber===30?jn(t):new TextEncoder().encode(t))}function y(e){return e.eoc?"EndOfContent":e.tagClass===0?An[e.tagNumber]||`Universal ${e.tagNumber}`:`[${e.tagNumber}] ${En[e.tagClass]}`}function Ne(e){return e.indefinite?"Indefinite":String(e.length)}function Ft(e){const t=H(e),n=yt(e);if(e.constructed)return"";if(e.tagClass!==0)return t.length?Le(t,72):"";if(e.encapsulated&&e.tagNumber!==3)return"";switch(e.tagNumber){case 1:case 2:case 10:case 5:return n;case 3:return t.length?`[unused bits: ${t[0]}]`:"[invalid BIT STRING]";case 4:return"";case 6:return`{${n}}`;case 12:case 18:case 19:case 20:case 22:case 30:return`"${n}"`;case 23:case 24:return`"${Kn(e,n)}"`;default:return t.length?Le(t,72):""}}function Gt(e){if(e.constructed)return"";const t=H(e);return e.tagClass!==0?"":e.tagNumber===3?t.length>1?Le(t.slice(1),42):"":t.length?Le(t,42):""}function Qn(e){return""}function Kt(e){return e.tagClass!==0||e.tagNumber!==6?"":Mn(yt(e))}function yt(e){const t=H(e);if(e.tagClass!==0)return t.length?Qe(t):"(empty)";switch(e.tagNumber){case 1:return t.length===1?t[0]===0?"FALSE":"TRUE":"Invalid BOOLEAN";case 2:case 10:return Un(t);case 3:return t.length?`unused bits: ${t[0]}, data: ${Qe(t.slice(1))}`:"Invalid BIT STRING";case 4:return Qe(t);case 5:return t.length===0?"NULL":"Invalid NULL";case 6:return Lt(t);case 12:case 18:case 19:case 20:case 22:case 23:case 24:return ut(t);case 30:return Ot(t);default:return t.length?Qe(t):"(empty)"}}function er(e,t,n){if(t>=n)throw new Error(`offset ${t}: missing length`);const o=e[t++];if((o&128)===0)return{length:o,offset:t,indefinite:!1};const s=o&127;if(s===0)return{length:0,offset:t,indefinite:!0};if(s>6)throw new Error(`offset ${t-1}: length is too large`);if(t+s>n)throw new Error(`offset ${t-1}: length ends before all bytes are available`);let l=0;for(let f=0;f<s;f+=1)l=l*256+e[t++];return{length:l,offset:t,indefinite:!1}}function Wt(e,t,n){return t+2<=n&&e[t]===0&&e[t+1]===0}function tr(e,t,n){if(t>=n)throw new Error(`offset ${t}: missing tag`);const o=t,s=e[t++],l=s>>6,f=(s&32)!==0;let p=s&31;if(p===31){p=0;let b=0;for(;;){if(t>=n)throw new Error(`offset ${o}: high-tag-number form ends early`);const v=e[t++];if(p=p*128+(v&127),b+=1,(v&128)===0)break;if(b>6)throw new Error(`offset ${o}: tag number is too large`)}}return{tagClass:l,constructed:f,tagNumber:p,offset:t}}function Vt(e,t,n,o=0){if(Wt(e,t,n))throw new Error(`offset ${t}: unexpected EndOfContent outside an indefinite-length value`);const s=t,l=tr(e,t,n);t=l.offset;const f=er(e,t,n);if(t=f.offset,f.indefinite&&!l.constructed)throw new Error(`offset ${s}: indefinite length is only supported for constructed values`);const p=t;let b=p+f.length,v=b,M=[];if(f.indefinite){const ce=nr(e,p,n,o+1);M=ce.nodes,b=ce.eocStart,v=ce.offset}if(b>n)throw new Error(`offset ${s}: value exceeds the input range`);const C={...l,start:s,headerLength:p-s,length:b-p,indefinite:f.indefinite,valueStart:p,valueEnd:b,end:v,depth:o,children:M,encapsulated:!1,valueBytes:e.slice(p,b),dirty:!1,validationError:""};if(C.constructed&&!C.indefinite)C.children=be(e,p,b,o+1);else if(C.tagClass===0&&(C.tagNumber===3||C.tagNumber===4)){const ce=C.tagNumber===3?p+1:p;if((C.tagNumber===4||C.tagNumber===3&&p<b&&e[p]===0)&&ce<b)try{const Ge=be(e,ce,b,o+1);Ge.length>0&&(C.children=Ge,C.encapsulated=!0)}catch{C.children=[]}}return C}function nr(e,t,n,o=0){const s=[];for(;t<n;){if(Wt(e,t,n))return{nodes:s,offset:t+2,eocStart:t};const l=Vt(e,t,n,o);if(l.end<=t)throw new Error(`offset ${t}: parser could not advance`);s.push(l),t=l.end}throw new Error(`offset ${t}: missing EndOfContent for indefinite-length value`)}function zt(e){k=new Map,Mt=1;function t(n){n.id=String(Mt++),k.set(n.id,n);for(const o of n.children)t(o)}for(const n of e)t(n)}function be(e,t,n,o=0){const s=[];for(;t<n;){const l=Vt(e,t,n,o);if(l.end<=t)throw new Error(`offset ${t}: parser could not advance`);s.push(l),t=l.end}if(t!==n)throw new Error(`offset ${t}: DER boundary mismatch`);return s}function rr(e){return e.encapsulated?"encapsulated":e.constructed||e.children.length>0?"folder":"leaf"}function jt(e){return e.encapsulated?[]:e.indefinite?[...e.children,ir(e)]:e.children}function ir(e){return{id:`${e.id}-eoc`,eoc:!0,tagClass:0,constructed:!1,tagNumber:0,start:e.valueEnd,headerLength:2,length:0,valueStart:e.valueEnd+2,valueEnd:e.valueEnd+2,end:e.valueEnd+2,depth:e.depth+1,children:[],encapsulated:!1,valueBytes:new Uint8Array,dirty:!1,validationError:""}}function Xt(e){const t=y(e),n=Ft(e),o=Gt(e),s=Kt(e),l=Qn();return[t,`(${Ne(e)})`,n,o?`// ${o}`:"",s?`// ${s}`:"",l].filter(Boolean)}function xt(e){return Xt(e).join(" ")}function Yt(e){const t=y(e),n=Ft(e),o=" open",s=rr(e),l=Gt(e),f=Kt(e),b=Xt(e).join(" "),v=kn(b),M=v!==b,C=n?`<span class="value">${j(n)}</span>`:"",ce=l?`<span class="hex">// ${j(l)}</span>`:"",bn=f?`<span class="comment">// ${j(f)}</span>`:"",Ge="",Pr=e.eoc?"":`data-node-icon data-node-id="${e.id}"`,Br=M?`<span class="tag">${j(v)}</span>`:`
1285
+ <span class="tag">${j(t)}</span>
1286
+ <span class="pill">(${j(Ne(e))})</span>
1287
+ ${C}
1288
+ ${ce}
1289
+ ${bn}
1290
+ ${Ge}
1291
+ `,yn=jt(e),Rr=yn.length?`<div class="children">${yn.map($r=>Yt($r)).join("")}</div>`:"";return`
1292
+ <details class="node"${o}>
1293
+ <summary>
1294
+ <span class="node-toggle" data-node-toggle aria-hidden="true"><span class="toggle-closed">+</span><span class="toggle-open">−</span></span>
1295
+ <span class="icon ${s}" ${Pr} aria-hidden="true"></span>
1296
+ <span class="node-line">
1297
+ ${Br}
1298
+ </span>
1299
+ </summary>
1300
+ <div class="content">
1301
+ <div class="field"><span>Tag</span>${j(t)} (${e.tagNumber})</div>
1302
+ <div class="field"><span>Header</span>${e.headerLength} bytes</div>
1303
+ <div class="field"><span>Value range</span>${e.valueStart}..${e.valueEnd}</div>
1304
+ <div class="field"><span>Value</span>${j(n)}</div>
1305
+ </div>
1306
+ ${Rr}
1307
+ </details>
1308
+ `}function wt(){if(U.length===0){I.classList.add("empty"),I.innerHTML="All nodes have been deleted.";return}I.classList.remove("empty"),I.innerHTML=`<div class="tree">${U.map(e=>Yt(e)).join("")}</div>`}function He(){K=he(U),U=be(K,0,K.length),zt(U),wt()}function or(e){const t=k.get(String(e));if(!t)throw new Error("The node was not found");return et(t)}function ye(e){return u.querySelector(`input[name="${e}"]:checked`)?.value||""}function vt(e,t){const n=k.get(e);if(!n)throw new Error("The node to edit was not found");if(n.constructed)throw new Error("This node value cannot be edited directly");n.valueBytes=t,n.length=t.length,n.children=[],n.encapsulated=!1,n.dirty=!0,n.validationError="",He()}function Zt(e,t){const n=e.findIndex(o=>o.id===t);return n>=0?(e.splice(n,1),!0):e.some(o=>Zt(o.children,t))}function _t(e,t,n){const o=e.findIndex(s=>s.id===t);return o>=0?(e.splice(o,0,n),!0):e.some(s=>_t(s.children,t,n))}function ar(){const e=Number(ye("derClass")),t=ye("derMethod")==="constructed",n=Number(F.value);if(!Number.isInteger(e)||e<0||e>3)throw new Error("Select a valid class");if(!Number.isSafeInteger(n)||n<0)throw new Error("Index must be a non-negative integer");const o=t?new Uint8Array:tt(ee.value);return{tagClass:e,constructed:t,tagNumber:n,start:0,headerLength:0,length:o.length,valueStart:0,valueEnd:o.length,end:0,depth:0,children:[],encapsulated:!1,valueBytes:o,indefinite:t&&R.checked,dirty:!0,validationError:""}}function Jt(e,t){if(!_t(U,e,t))throw new Error("The insertion point was not found");He()}function Qt(e,t){const n=k.get(e);if(!n)throw new Error("The parent node was not found");if(!n.constructed)throw new Error("Children can only be added to structured nodes");n.children.push(t),He()}function sr(e,t){const n=k.get(e);if(!n)throw new Error("The node to update was not found");if(!n.constructed)throw new Error("Only structured nodes can use indefinite length");n.indefinite=t,He()}function dr(e){const t=k.get(e);if(!t)throw new Error("The node to delete was not found");if(t.eoc)throw new Error("EndOfContent is controlled by the parent indefinite length setting");const n=y(t);if(!Zt(U,e))throw new Error("The node to delete could not be removed");He(),m.textContent=`Deleted ${n}.`}function cr(e){if(!e.encapsulated||e.children.length===0)return;const t=he(e.children),n=`pkistudio-expanded-${Date.now()}-${Math.random().toString(16).slice(2)}`,o={label:`Encapsulated DER in ${y(e)}`,bytes:kt(t)};try{localStorage.setItem(n,JSON.stringify(o))}catch(f){m.textContent=`Could not send the encapsulated DER to a new window: ${f.message}`;return}const s=tn();s.searchParams.set("expand",n),s.searchParams.set("theme",Ke()),s.hash="";const l=en(s);if(!l){localStorage.removeItem(n),m.textContent="The encapsulated DER could not be opened because the popup was blocked.";return}l.opener=null}function lr(e){const t=et(e),n=`pkistudio-subtree-${Date.now()}-${Math.random().toString(16).slice(2)}`,o={label:`Subtree of ${y(e)}`,bytes:kt(t)};try{localStorage.setItem(n,JSON.stringify(o))}catch(f){m.textContent=`Could not send the subtree to a new window: ${f.message}`;return}const s=tn();s.searchParams.delete("expand"),s.searchParams.set("subtree",n),s.searchParams.set("theme",Ke()),s.hash="";const l=en(s);if(!l){localStorage.removeItem(n),m.textContent="The subtree could not be opened because the popup was blocked.";return}l.opener=null}function en(e){return window.open(e.toString(),"_blank")}function tn(){return new URL(h.newWindowUrl||window.location.href,window.location.href)}async function nn(e){if(navigator.clipboard?.writeText&&window.isSecureContext){await navigator.clipboard.writeText(e);return}const t=document.createElement("textarea");t.value=e,t.setAttribute("readonly",""),t.style.position="fixed",t.style.left="-9999px",t.style.top="0",document.body.appendChild(t),t.select();try{if(!document.execCommand("copy"))throw new Error("copy command failed")}finally{t.remove()}}function ur(e,t){const n=new Blob([e],{type:"application/octet-stream"}),o=URL.createObjectURL(n),s=document.createElement("a");s.href=o,s.download=t,s.style.display="none",document.body.appendChild(s),s.click(),s.remove(),setTimeout(()=>URL.revokeObjectURL(o),1e3)}async function fr(e,t){const n=await window.showSaveFilePicker({suggestedName:t,types:[{description:"DER file",accept:{"application/octet-stream":[".der"]}}]}),o=await n.createWritable();return await o.write(new Blob([e],{type:"application/octet-stream"})),await o.close(),n.name||t}async function pr(){if(!K){m.textContent="Load DER, PEM, or headerless base64 data before saving.";return}const e="pkistudio.der";if(window.showSaveFilePicker&&window.isSecureContext)try{const o=await fr(K,e);m.textContent=`Saved DER as ${o}.`;return}catch(o){if(o.name==="AbortError"){m.textContent="DER file save was canceled.";return}}const t=window.prompt("Save DER file as",e);if(t===null){m.textContent="DER file download was canceled.";return}const n=t.trim()||e;ur(K,n),m.textContent=`Downloaded DER as ${n}.`}async function St(){if(!navigator.clipboard?.readText||!window.isSecureContext)throw new Error("Clipboard reading is not available in this browser context");return navigator.clipboard.readText()}function rn(e,t=0){const n=" ".repeat(t),o=gr(e,t+1);if(o)return!e.constructed&&e.tagNumber!==3&&e.tagNumber!==4?[`${n}${on(e)}`,o].join(`
1309
+ `):[`${n}${on(e)} {`,o,`${n}}`].join(`
1310
+ `);const s=jt(e);return s.length===0?`${n}${xt(e)}`:[`${n}${xt(e)} {`,...s.map(l=>rn(l,t+1)),`${n}}`].join(`
1311
+ `)}function on(e){if(e.eoc)return xt(e);if(e.tagClass===0&&e.tagNumber===3){const t=H(e),n=t.length?t[0].toString(16).padStart(2,"0"):"invalid";return`${y(e)} (${Ne(e)}) [${n}]`}return e.tagClass===0&&e.tagNumber===4?`${y(e)} (${Ne(e)})`:`${y(e)} (${Ne(e)})`}function gr(e,t){if(e.eoc||e.constructed)return"";const n=H(e),o=e.tagNumber===3?n.slice(1):n;return o.length===0?"":mr(o,t)}function mr(e,t){const n=" ".repeat(t),o=Math.max(6,(e.length-1).toString(16).length),s=[];for(let l=0;l<e.length;l+=16){const f=e.slice(l,l+16),p=l.toString(16).padStart(o,"0"),b=(l+f.length-1).toString(16).padStart(o,"0"),v=Array.from(f,M=>M.toString(16).padStart(2,"0")).join(" ").padEnd(47," ");s.push(`${n}Hex:${p}-${b}: ${v} // ${Pn(f)}`)}return s.join(`
1312
+ `)}async function hr(e){const t=lt(et(e));await nn(t),m.textContent=`Copied DER hex for ${y(e)} (${t.length} characters).`}async function br(e){const t=rn(e);await nn(t),m.textContent=`Copied tree text for ${y(e)} (${t.split(`
1313
+ `).length} lines).`}function an(e){const t=gt(e),n=be(t,0,t.length),o=he(n);if(!Pt(o,t))throw new Error("The clipboard HEX is not a canonical DER/BER node");if(n.length!==1)throw new Error("Clipboard HEX must contain exactly one ASN.1 element");return n[0]}function yr(e,t){const n=k.get(e);if(!n)throw new Error("The insertion point was not found");const o=an(t),s=y(o),l=y(n);Jt(e,o),m.textContent=`Inserted ${s} from clipboard HEX before ${l}.`}function xr(e,t){const n=k.get(e);if(!n)throw new Error("The parent node was not found");if(!n.constructed)throw new Error("Children can only be added to structured nodes");const o=an(t),s=y(o),l=y(n);Qt(e,o),m.textContent=`Added ${s} from clipboard HEX to ${l}.`}function sn(e,t,n){if(t==="add-child"){xr(e,n);return}yr(e,n)}async function dn(e,t){let n;try{n=await St()}catch(o){wr(e,t,o.message);return}sn(e,t,n)}function W(){Je=null,B.classList.remove("open-left"),qe(null),B.hidden=!0}function qe(e){for(const t of B.querySelectorAll(".context-menu-group")){const n=t===e;t.classList.toggle("submenu-open",n),t.querySelector(".context-submenu-trigger")?.setAttribute("aria-expanded",String(n))}}function Ie(e,t){for(const n of u.querySelectorAll(`input[name="${e}"]`))n.checked=n.value===String(t)}function X(){Ae=null,ne="view",J.hidden=!0}function ae(){ot=null,ve.hidden=!0,pe.textContent=""}function se(){at=null,Se.hidden=!0,Oe.textContent=""}function de(){st=null,r.hidden=!0,w.textContent="",A.value=""}function wr(e,t,n=""){dt=e,ct=t,Ze.textContent=t==="add-child"?"Add from Clipboard HEX":"Insert from Clipboard HEX",rt.textContent=t==="add-child"?"Add":"Insert",T.value="",z.textContent=n?`Clipboard read failed: ${n}`:"",D.hidden=!1,T.focus(),T.select()}function xe(){dt=null,ct="insert-before",D.hidden=!0,z.textContent="",rt.textContent="Insert",T.value=""}function vr(){te.hidden=!1,te.querySelector('[data-about-action="close"]')?.focus()}function cn(){te.hidden=!0}function ln(){const e=ge.querySelector('input[name="timeZone"]:checked')?.value==="local";$e.disabled=!e,Ce.disabled=!e,Ee.disabled=!e}function un(e){for(const t of Q.querySelectorAll('input[name="derClass"], input[name="derMethod"]'))t.disabled=!e;F.readOnly=!e,ee.readOnly=!e,Q.querySelector('[data-der-action="edit-content"]').hidden=e,R.disabled=!0}function Ct(){if(ne==="view")return;const e=ye("derMethod")==="constructed";if(ee.readOnly=e,R.disabled=!e,e){we.value=R.checked?"Indefinite":"0",ie.textContent=R.checked?"Structured content ends with EndOfContent.":"Structured content starts empty.";return}R.checked=!1;try{const t=tt(ee.value);we.value=String(t.length),ie.textContent=t.length?`${t.length} byte${t.length===1?"":"s"}`:"(empty)"}catch(t){we.value="",ie.textContent=t.message}}function Sr(e){ne="view",Ae=e.id;const t=y(e),n=H(e),o=Q.querySelector('[data-der-action="edit-content"]');un(!1),ke.textContent="Edit DER",F.value=e.tagNumber,R.checked=!!e.indefinite,R.disabled=!e.constructed,we.value=Ne(e),G.textContent=t,ie.textContent=yt(e),ee.value=Le(n,Tn),o.disabled=!bt(e),o.title=o.disabled?`${t} cannot be edited in detail yet`:"",Ie("derClass",e.tagClass),Ie("derMethod",e.constructed?"constructed":"primitive"),J.hidden=!1,o.focus()}function fn(e,t){ne=e,Ae=t.id,un(!0),ke.textContent=e==="add-child"?`Add child to ${y(t)}`:`Insert before ${y(t)}`,F.value="4",R.checked=!1,R.disabled=!0,G.textContent="OCTET STRING",ee.value="",Ie("derClass",0),Ie("derMethod","primitive"),Ct(),J.hidden=!1,F.focus(),F.select()}function nt(e){if(!bt(e)){m.textContent=`${y(e)} cannot be edited yet.`;return}ot=e.id,Pe.textContent=`Edit ${y(e)}`,V.value=qt(e),pe.textContent="",ve.hidden=!1,V.focus(),V.select()}function Cr(e){if(!Ut(e)){nt(e);return}try{const t=Ht(e,qt(e));at=e.id,Xe.textContent="Time",me.value=Fn(t),Be.value=Gn(t),Re.checked=t.second===0,Ye.value="",Oe.textContent="",Ie("timeTag",e.tagNumber),Ie("timeZone",t.zone),$e.value=t.offsetSign,Ce.value=String(t.offsetHours),Ee.value=String(t.offsetMinutes),ln(),Se.hidden=!1,me.focus()}catch(t){nt(e),pe.textContent=t.message}}function pn(e){if(!bt(e)){nt(e);return}st=e.id,a.textContent=`${y(e)} (HEX)`;const t=H(e),n=ht(e);c.hidden=!n,d.value=n?String(t.length?t[0]:0):"0",g.value=lt(n?t.slice(1):t),w.textContent="",A.value="",r.hidden=!1,g.focus(),g.select()}function Er(e){if(_n(e)){pn(e);return}if(Ut(e)){Cr(e);return}if(Yn(e)||mt(e)){nt(e);return}pn(e)}function Ar(e,t,n){const o=k.get(e),s=B.querySelector("[data-add-menu]"),l=B.querySelector('[data-node-action="send-new-window-extracted"]');s.hidden=!o?.constructed,l.hidden=!(o?.encapsulated&&o.children.length>0),Je=e,qe(null),B.classList.remove("open-left"),B.hidden=!1;const f=B.getBoundingClientRect();B.classList.toggle("open-left",t+f.width+150>window.innerWidth-8);const p=Math.min(t,window.innerWidth-f.width-8),b=Math.min(n,window.innerHeight-f.height-8);B.style.left=`${Math.max(8,p)}px`,B.style.top=`${Math.max(8,b)}px`}function gn(){_.value="",K=null,U=[],k=new Map,W(),X(),ae(),se(),de(),xe(),I.classList.add("empty"),I.innerHTML="No DER / PEM file selected yet.",m.textContent="PEM and headerless base64 input are decoded before parsing."}async function mn(e){try{const t=Ln(new Uint8Array(await e.arrayBuffer())),{bytes:n,format:o}=t;Fe(n,`Loaded as a ${o} file.`)}catch(t){K=null,U=[],k=new Map,W(),X(),ae(),se(),de(),xe(),I.classList.remove("empty"),I.innerHTML=`<div class="error"><strong>Could not parse as DER.</strong><br>${j(t.message)}</div>`}}async function Nr(){try{const e=await St(),t=ft(e)?Rt(e):$t(e);Fe(t,`Loaded ${ft(e)?"PEM":"headerless PEM"} from the clipboard.`)}catch(e){m.textContent=`Could not load PEM from the clipboard: ${e.message}`}}async function Ir(){try{const e=await St();Fe(gt(e),"Loaded HEX from the clipboard.")}catch(e){m.textContent=`Could not load HEX from the clipboard: ${e.message}`}}function Fe(e,t){const n=be(e,0,e.length),o=he(n);if(!Pt(o,e))throw new Error("The re-encoded DER does not match the original data");K=o,U=be(K,0,K.length),zt(U),W(),X(),ae(),se(),de(),xe(),wt(),m.textContent=t}function Tr(){const e=new URL(window.location.href),t=e.searchParams.has("subtree")?"subtree":"expand",n=e.searchParams.get(t);if(n)try{const o=JSON.parse(localStorage.getItem(n)||"null");if(localStorage.removeItem(n),!o?.bytes)throw new Error("Expanded data was not found");Fe(pt(o.bytes),`Displayed ${o.label||"DER"}.`)}catch(o){I.classList.remove("empty"),I.innerHTML=`<div class="error"><strong>Could not display the new-window data.</strong><br>${j(o.message)}</div>`}finally{e.searchParams.delete(t),e.searchParams.delete("theme"),window.history.replaceState(null,"",`${e.pathname}${e.search}${e.hash}`)}}Dn(),Tr();function hn(e){for(const t of I.querySelectorAll("details.node"))t.open=e;W(),m.textContent=e?"Expanded all tree nodes.":"Collapsed all tree nodes."}function Mr(){Ve.hidden=!0,fe.querySelector('[data-action="toggle-load-menu"]')?.setAttribute("aria-expanded","false")}function Dr(){De.hidden=!0,fe.querySelector('[data-action="toggle-save-menu"]')?.setAttribute("aria-expanded","false")}function kr(){ze.hidden=!0,fe.querySelector('[data-action="toggle-tools-menu"]')?.setAttribute("aria-expanded","false")}function L(){Mr(),Dr(),kr()}function Et(e,t){const n=fe.querySelector(`[data-action="${e}"]`),o=t.hidden;L(),t.hidden=!o,n?.setAttribute("aria-expanded",String(o)),o&&t.querySelector("button")?.focus()}fe.addEventListener("click",async e=>{const t=e.target.closest("button[data-action]");t&&(t.dataset.action==="toggle-load-menu"?Et("toggle-load-menu",Ve):t.dataset.action==="toggle-save-menu"?Et("toggle-save-menu",De):t.dataset.action==="toggle-tools-menu"?Et("toggle-tools-menu",ze):t.dataset.action==="open"?(L(),_.click()):t.dataset.action==="load-clipboard-pem"?(L(),await Nr()):t.dataset.action==="load-clipboard-hex"?(L(),await Ir()):t.dataset.action==="save-der-file"?(L(),await pr()):t.dataset.action==="expand-all"?(L(),hn(!0)):t.dataset.action==="collapse-all"?(L(),hn(!1)):t.dataset.action==="close"?(L(),gn()):t.dataset.action==="about"&&(L(),vr()))}),I.addEventListener("click",e=>{const t=e.target.closest("summary"),n=e.target.closest("[data-node-toggle]");if(t&&e.preventDefault(),n){e.stopPropagation(),W();const s=n.closest("details.node");s&&s.querySelector(".children")&&(s.open=!s.open);return}const o=e.target.closest(".icon[data-node-icon]");if(!o){W();return}e.preventDefault(),e.stopPropagation(),Ar(o.dataset.nodeId,e.clientX,e.clientY)}),B.addEventListener("click",async e=>{const t=e.target.closest("button[data-node-action]");if(!t)return;if(t.classList.contains("context-submenu-trigger")){e.preventDefault();const s=t.closest(".context-menu-group"),l=s?.classList.contains("submenu-open");qe(l?null:s);return}const n=Je,o=k.get(Je);if(W(),!!o)if(t.dataset.nodeAction==="edit")Sr(o);else if(t.dataset.nodeAction==="insert-before-new-item")fn("insert-before",o);else if(t.dataset.nodeAction==="add-child-new-item")o.constructed&&fn("add-child",o);else if(t.dataset.nodeAction==="send-new-window")lr(o);else if(t.dataset.nodeAction==="send-new-window-extracted")cr(o);else if(t.dataset.nodeAction==="copy-hex")try{await hr(o)}catch(s){m.textContent=`Could not copy to the clipboard: ${s.message}`}else if(t.dataset.nodeAction==="copy-tree")try{await br(o)}catch(s){m.textContent=`Could not copy to the clipboard: ${s.message}`}else if(t.dataset.nodeAction==="insert-before-clipboard-hex")try{await dn(n,"insert-before")}catch(s){m.textContent=`Could not insert from the clipboard: ${s.message}`}else if(t.dataset.nodeAction==="add-child-clipboard-hex")try{await dn(n,"add-child")}catch(s){m.textContent=`Could not add from the clipboard: ${s.message}`}else t.dataset.nodeAction==="delete"&&dr(n)}),B.addEventListener("pointerover",e=>{const t=e.target.closest("button[data-node-action]");t&&qe(t.closest(".context-menu-group"))}),B.addEventListener("focusin",e=>{const t=e.target.closest("button[data-node-action]");t&&qe(t.closest(".context-menu-group"))}),Q.addEventListener("submit",e=>{if(e.preventDefault(),ne==="insert-before"||ne==="add-child"){try{const n=Ae,o=ar(),s=y(o);ne==="insert-before"?(Jt(n,o),m.textContent=`Inserted ${s}.`):(Qt(n,o),m.textContent=`Added ${s}.`),X()}catch(n){ie.textContent=n.message}return}const t=k.get(Ae);if(t?.constructed&&t.indefinite!==R.checked)try{const n=y(t);sr(t.id,R.checked),m.textContent=`${n} length set to ${R.checked?"Indefinite":"definite"}.`}catch(n){ie.textContent=n.message;return}X()}),Q.addEventListener("input",e=>{if(ne!=="view"){if(e.target===F){const t={tagClass:Number(ye("derClass")),tagNumber:Number(F.value),constructed:ye("derMethod")==="constructed"};G.textContent=Number.isSafeInteger(t.tagNumber)&&t.tagNumber>=0?y(t):""}Ct()}}),Q.addEventListener("change",e=>{if(ne!=="view"){if(e.target.name==="derClass"||e.target.name==="derMethod"){const t={tagClass:Number(ye("derClass")),tagNumber:Number(F.value),constructed:ye("derMethod")==="constructed"};G.textContent=Number.isSafeInteger(t.tagNumber)&&t.tagNumber>=0?y(t):""}Ct()}}),Q.addEventListener("click",e=>{const t=e.target.closest("button[data-der-action]");if(t){if(t.dataset.derAction==="cancel"){X();return}if(t.dataset.derAction==="edit-content"){const n=k.get(Ae);if(!n){X();return}X(),Er(n)}}}),J.addEventListener("click",e=>{e.target===J&&X()}),ge.addEventListener("change",e=>{e.target.name==="timeZone"&&ln()}),ge.addEventListener("submit",e=>{e.preventDefault();const t=k.get(at);if(!t){se();return}try{const n=Wn(t,Vn());vt(t.id,new TextEncoder().encode(n)),se(),m.textContent=`Updated ${y(t)}.`}catch(n){Oe.textContent=n.message}}),ge.addEventListener("click",e=>{e.target.closest('button[data-time-action="cancel"]')&&se()}),Se.addEventListener("click",e=>{e.target===Se&&se()}),i.addEventListener("submit",e=>{e.preventDefault();const t=k.get(st);if(!t){de();return}try{let n;if(ht(t)){const s=Number(d.value);if(!Number.isInteger(s)||s<0||s>7)throw new Error("Unused bits must be an integer from 0 to 7");const l=tt(g.value);if(l.length===0&&s!==0)throw new Error("Unused bits must be 0 when the data is empty");n=Ue([new Uint8Array([s]),l])}else n=tt(g.value);const o=y(t);vt(t.id,n),de(),m.textContent=`Updated ${o}.`}catch(n){w.textContent=n.message}}),i.addEventListener("click",e=>{const t=e.target.closest("button[data-octet-action]");t&&(t.dataset.octetAction==="cancel"?de():t.dataset.octetAction==="load-file"&&A.click())}),A.addEventListener("change",async()=>{const[e]=A.files;if(e)try{g.value=lt(new Uint8Array(await e.arrayBuffer())),w.textContent=""}catch(t){w.textContent=`Could not load the file: ${t.message}`}finally{A.value=""}}),r.addEventListener("click",e=>{e.target===r&&de()}),oe.addEventListener("submit",e=>{e.preventDefault();try{sn(dt,ct,T.value),xe()}catch(t){z.textContent=t.message}}),oe.addEventListener("click",e=>{e.target.closest('button[data-clipboard-insert-action="cancel"]')&&xe()}),D.addEventListener("click",e=>{e.target===D&&xe()}),je.addEventListener("submit",e=>{e.preventDefault();const t=k.get(ot);if(!t){ae();return}try{const n=Jn(t,V.value),o=y(t);vt(t.id,n),ae(),m.textContent=`Updated ${o}.`}catch(n){pe.textContent=n.message}}),je.addEventListener("click",e=>{e.target.closest('button[data-edit-action="cancel"]')&&ae()}),ve.addEventListener("click",e=>{e.target===ve&&ae()}),te.addEventListener("click",e=>{(e.target===te||e.target.closest('[data-about-action="close"]'))&&cn()}),document.addEventListener("keydown",e=>{e.key==="Escape"&&(W(),X(),ae(),se(),de(),xe(),cn(),L())}),u.addEventListener("click",e=>{e.target.closest("#nodeContextMenu")||W(),e.target.closest(".menu-group")||L()}),window.addEventListener("resize",W),window.addEventListener("scroll",W,!0),window.addEventListener("resize",L),window.addEventListener("scroll",L,!0),_.addEventListener("change",()=>{const[e]=_.files;e&&mn(e)});for(const e of["dragenter","dragover"])I.addEventListener(e,t=>{t.preventDefault(),I.classList.add("dragover")});for(const e of["dragleave","drop"])I.addEventListener(e,t=>{t.preventDefault(),I.classList.remove("dragover")});return I.addEventListener("drop",e=>{const[t]=e.dataTransfer.files;t&&mn(t)}),{close:gn,getNodeBytes:or,loadBytes:Fe,mount:E,root:u}}const ue={core:S?.PkiStudioCore||null,init:We,autoInit:re,version:N};function re(){if(!S?.document)return null;if(P)return P;if(document.querySelector('script[data-pkistudio-auto-init="false"]'))return null;const h=document.querySelector("[data-pkistudio-mount], [data-pkistudio], #pkistudio");return h?(P=We({mount:h,fullscreen:!0}),P):null}return S?.document&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",re,{once:!0}):re()),ue})})(It)),It.exports}var Wr=Kr();const Vr=Tt(Wr),Sn=Ur,zr=Gr,Cn=Vr;Cn.core??=Sn;typeof window<"u"&&(window.PkiStudioCore=Sn,window.PkiStudio=Cn);export{Cn as PkiStudio,Sn as PkiStudioCore,zr as PkiStudioOidResolver};