|  |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function parseContentType(str) { | 
					
						
							|  |  |  |   if (str.length === 0) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const params = Object.create(null); | 
					
						
							|  |  |  |   let i = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Parse type
 | 
					
						
							|  |  |  |   for (; i < str.length; ++i) { | 
					
						
							|  |  |  |     const code = str.charCodeAt(i); | 
					
						
							|  |  |  |     if (TOKEN[code] !== 1) { | 
					
						
							|  |  |  |       if (code !== 47/* '/' */ || i === 0) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   // Check for type without subtype
 | 
					
						
							|  |  |  |   if (i === str.length) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const type = str.slice(0, i).toLowerCase(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Parse subtype
 | 
					
						
							|  |  |  |   const subtypeStart = ++i; | 
					
						
							|  |  |  |   for (; i < str.length; ++i) { | 
					
						
							|  |  |  |     const code = str.charCodeAt(i); | 
					
						
							|  |  |  |     if (TOKEN[code] !== 1) { | 
					
						
							|  |  |  |       // Make sure we have a subtype
 | 
					
						
							|  |  |  |       if (i === subtypeStart) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (parseContentTypeParams(str, i, params) === undefined) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   // Make sure we have a subtype
 | 
					
						
							|  |  |  |   if (i === subtypeStart) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const subtype = str.slice(subtypeStart, i).toLowerCase(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { type, subtype, params }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function parseContentTypeParams(str, i, params) { | 
					
						
							|  |  |  |   while (i < str.length) { | 
					
						
							|  |  |  |     // Consume whitespace
 | 
					
						
							|  |  |  |     for (; i < str.length; ++i) { | 
					
						
							|  |  |  |       const code = str.charCodeAt(i); | 
					
						
							|  |  |  |       if (code !== 32/* ' ' */ && code !== 9/* '\t' */) | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Ended on whitespace
 | 
					
						
							|  |  |  |     if (i === str.length) | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Check for malformed parameter
 | 
					
						
							|  |  |  |     if (str.charCodeAt(i++) !== 59/* ';' */) | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Consume whitespace
 | 
					
						
							|  |  |  |     for (; i < str.length; ++i) { | 
					
						
							|  |  |  |       const code = str.charCodeAt(i); | 
					
						
							|  |  |  |       if (code !== 32/* ' ' */ && code !== 9/* '\t' */) | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Ended on whitespace (malformed)
 | 
					
						
							|  |  |  |     if (i === str.length) | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let name; | 
					
						
							|  |  |  |     const nameStart = i; | 
					
						
							|  |  |  |     // Parse parameter name
 | 
					
						
							|  |  |  |     for (; i < str.length; ++i) { | 
					
						
							|  |  |  |       const code = str.charCodeAt(i); | 
					
						
							|  |  |  |       if (TOKEN[code] !== 1) { | 
					
						
							|  |  |  |         if (code !== 61/* '=' */) | 
					
						
							|  |  |  |           return; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // No value (malformed)
 | 
					
						
							|  |  |  |     if (i === str.length) | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     name = str.slice(nameStart, i); | 
					
						
							|  |  |  |     ++i; // Skip over '='
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // No value (malformed)
 | 
					
						
							|  |  |  |     if (i === str.length) | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let value = ''; | 
					
						
							|  |  |  |     let valueStart; | 
					
						
							|  |  |  |     if (str.charCodeAt(i) === 34/* '"' */) { | 
					
						
							|  |  |  |       valueStart = ++i; | 
					
						
							|  |  |  |       let escaping = false; | 
					
						
							|  |  |  |       // Parse quoted value
 | 
					
						
							|  |  |  |       for (; i < str.length; ++i) { | 
					
						
							|  |  |  |         const code = str.charCodeAt(i); | 
					
						
							|  |  |  |         if (code === 92/* '\\' */) { | 
					
						
							|  |  |  |           if (escaping) { | 
					
						
							|  |  |  |             valueStart = i; | 
					
						
							|  |  |  |             escaping = false; | 
					
						
							|  |  |  |           } else { | 
					
						
							|  |  |  |             value += str.slice(valueStart, i); | 
					
						
							|  |  |  |             escaping = true; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           continue; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (code === 34/* '"' */) { | 
					
						
							|  |  |  |           if (escaping) { | 
					
						
							|  |  |  |             valueStart = i; | 
					
						
							|  |  |  |             escaping = false; | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           value += str.slice(valueStart, i); | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (escaping) { | 
					
						
							|  |  |  |           valueStart = i - 1; | 
					
						
							|  |  |  |           escaping = false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // Invalid unescaped quoted character (malformed)
 | 
					
						
							|  |  |  |         if (QDTEXT[code] !== 1) | 
					
						
							|  |  |  |           return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // No end quote (malformed)
 | 
					
						
							|  |  |  |       if (i === str.length) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ++i; // Skip over double quote
 | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       valueStart = i; | 
					
						
							|  |  |  |       // Parse unquoted value
 | 
					
						
							|  |  |  |       for (; i < str.length; ++i) { | 
					
						
							|  |  |  |         const code = str.charCodeAt(i); | 
					
						
							|  |  |  |         if (TOKEN[code] !== 1) { | 
					
						
							|  |  |  |           // No value (malformed)
 | 
					
						
							|  |  |  |           if (i === valueStart) | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       value = str.slice(valueStart, i); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     name = name.toLowerCase(); | 
					
						
							|  |  |  |     if (params[name] === undefined) | 
					
						
							|  |  |  |       params[name] = value; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return params; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function parseDisposition(str, defDecoder) { | 
					
						
							|  |  |  |   if (str.length === 0) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const params = Object.create(null); | 
					
						
							|  |  |  |   let i = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (; i < str.length; ++i) { | 
					
						
							|  |  |  |     const code = str.charCodeAt(i); | 
					
						
							|  |  |  |     if (TOKEN[code] !== 1) { | 
					
						
							|  |  |  |       if (parseDispositionParams(str, i, params, defDecoder) === undefined) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const type = str.slice(0, i).toLowerCase(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { type, params }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function parseDispositionParams(str, i, params, defDecoder) { | 
					
						
							|  |  |  |   while (i < str.length) { | 
					
						
							|  |  |  |     // Consume whitespace
 | 
					
						
							|  |  |  |     for (; i < str.length; ++i) { | 
					
						
							|  |  |  |       const code = str.charCodeAt(i); | 
					
						
							|  |  |  |       if (code !== 32/* ' ' */ && code !== 9/* '\t' */) | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Ended on whitespace
 | 
					
						
							|  |  |  |     if (i === str.length) | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Check for malformed parameter
 | 
					
						
							|  |  |  |     if (str.charCodeAt(i++) !== 59/* ';' */) | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Consume whitespace
 | 
					
						
							|  |  |  |     for (; i < str.length; ++i) { | 
					
						
							|  |  |  |       const code = str.charCodeAt(i); | 
					
						
							|  |  |  |       if (code !== 32/* ' ' */ && code !== 9/* '\t' */) | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Ended on whitespace (malformed)
 | 
					
						
							|  |  |  |     if (i === str.length) | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let name; | 
					
						
							|  |  |  |     const nameStart = i; | 
					
						
							|  |  |  |     // Parse parameter name
 | 
					
						
							|  |  |  |     for (; i < str.length; ++i) { | 
					
						
							|  |  |  |       const code = str.charCodeAt(i); | 
					
						
							|  |  |  |       if (TOKEN[code] !== 1) { | 
					
						
							|  |  |  |         if (code === 61/* '=' */) | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // No value (malformed)
 | 
					
						
							|  |  |  |     if (i === str.length) | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let value = ''; | 
					
						
							|  |  |  |     let valueStart; | 
					
						
							|  |  |  |     let charset; | 
					
						
							|  |  |  |     //~ let lang;
 | 
					
						
							|  |  |  |     name = str.slice(nameStart, i); | 
					
						
							|  |  |  |     if (name.charCodeAt(name.length - 1) === 42/* '*' */) { | 
					
						
							|  |  |  |       // Extended value
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const charsetStart = ++i; | 
					
						
							|  |  |  |       // Parse charset name
 | 
					
						
							|  |  |  |       for (; i < str.length; ++i) { | 
					
						
							|  |  |  |         const code = str.charCodeAt(i); | 
					
						
							|  |  |  |         if (CHARSET[code] !== 1) { | 
					
						
							|  |  |  |           if (code !== 39/* '\'' */) | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Incomplete charset (malformed)
 | 
					
						
							|  |  |  |       if (i === str.length) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       charset = str.slice(charsetStart, i); | 
					
						
							|  |  |  |       ++i; // Skip over the '\''
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       //~ const langStart = ++i;
 | 
					
						
							|  |  |  |       // Parse language name
 | 
					
						
							|  |  |  |       for (; i < str.length; ++i) { | 
					
						
							|  |  |  |         const code = str.charCodeAt(i); | 
					
						
							|  |  |  |         if (code === 39/* '\'' */) | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Incomplete language (malformed)
 | 
					
						
							|  |  |  |       if (i === str.length) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       //~ lang = str.slice(langStart, i);
 | 
					
						
							|  |  |  |       ++i; // Skip over the '\''
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // No value (malformed)
 | 
					
						
							|  |  |  |       if (i === str.length) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       valueStart = i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       let encode = 0; | 
					
						
							|  |  |  |       // Parse value
 | 
					
						
							|  |  |  |       for (; i < str.length; ++i) { | 
					
						
							|  |  |  |         const code = str.charCodeAt(i); | 
					
						
							|  |  |  |         if (EXTENDED_VALUE[code] !== 1) { | 
					
						
							|  |  |  |           if (code === 37/* '%' */) { | 
					
						
							|  |  |  |             let hexUpper; | 
					
						
							|  |  |  |             let hexLower; | 
					
						
							|  |  |  |             if (i + 2 < str.length | 
					
						
							|  |  |  |                 && (hexUpper = HEX_VALUES[str.charCodeAt(i + 1)]) !== -1 | 
					
						
							|  |  |  |                 && (hexLower = HEX_VALUES[str.charCodeAt(i + 2)]) !== -1) { | 
					
						
							|  |  |  |               const byteVal = (hexUpper << 4) + hexLower; | 
					
						
							|  |  |  |               value += str.slice(valueStart, i); | 
					
						
							|  |  |  |               value += String.fromCharCode(byteVal); | 
					
						
							|  |  |  |               i += 2; | 
					
						
							|  |  |  |               valueStart = i + 1; | 
					
						
							|  |  |  |               if (byteVal >= 128) | 
					
						
							|  |  |  |                 encode = 2; | 
					
						
							|  |  |  |               else if (encode === 0) | 
					
						
							|  |  |  |                 encode = 1; | 
					
						
							|  |  |  |               continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             // '%' disallowed in non-percent encoded contexts (malformed)
 | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       value += str.slice(valueStart, i); | 
					
						
							|  |  |  |       value = convertToUTF8(value, charset, encode); | 
					
						
							|  |  |  |       if (value === undefined) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       // Non-extended value
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ++i; // Skip over '='
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // No value (malformed)
 | 
					
						
							|  |  |  |       if (i === str.length) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (str.charCodeAt(i) === 34/* '"' */) { | 
					
						
							|  |  |  |         valueStart = ++i; | 
					
						
							|  |  |  |         let escaping = false; | 
					
						
							|  |  |  |         // Parse quoted value
 | 
					
						
							|  |  |  |         for (; i < str.length; ++i) { | 
					
						
							|  |  |  |           const code = str.charCodeAt(i); | 
					
						
							|  |  |  |           if (code === 92/* '\\' */) { | 
					
						
							|  |  |  |             if (escaping) { | 
					
						
							|  |  |  |               valueStart = i; | 
					
						
							|  |  |  |               escaping = false; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |               value += str.slice(valueStart, i); | 
					
						
							|  |  |  |               escaping = true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           if (code === 34/* '"' */) { | 
					
						
							|  |  |  |             if (escaping) { | 
					
						
							|  |  |  |               valueStart = i; | 
					
						
							|  |  |  |               escaping = false; | 
					
						
							|  |  |  |               continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             value += str.slice(valueStart, i); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           if (escaping) { | 
					
						
							|  |  |  |             valueStart = i - 1; | 
					
						
							|  |  |  |             escaping = false; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           // Invalid unescaped quoted character (malformed)
 | 
					
						
							|  |  |  |           if (QDTEXT[code] !== 1) | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // No end quote (malformed)
 | 
					
						
							|  |  |  |         if (i === str.length) | 
					
						
							|  |  |  |           return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ++i; // Skip over double quote
 | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         valueStart = i; | 
					
						
							|  |  |  |         // Parse unquoted value
 | 
					
						
							|  |  |  |         for (; i < str.length; ++i) { | 
					
						
							|  |  |  |           const code = str.charCodeAt(i); | 
					
						
							|  |  |  |           if (TOKEN[code] !== 1) { | 
					
						
							|  |  |  |             // No value (malformed)
 | 
					
						
							|  |  |  |             if (i === valueStart) | 
					
						
							|  |  |  |               return; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         value = str.slice(valueStart, i); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       value = defDecoder(value, 2); | 
					
						
							|  |  |  |       if (value === undefined) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     name = name.toLowerCase(); | 
					
						
							|  |  |  |     if (params[name] === undefined) | 
					
						
							|  |  |  |       params[name] = value; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return params; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getDecoder(charset) { | 
					
						
							|  |  |  |   let lc; | 
					
						
							|  |  |  |   while (true) { | 
					
						
							|  |  |  |     switch (charset) { | 
					
						
							|  |  |  |       case 'utf-8': | 
					
						
							|  |  |  |       case 'utf8': | 
					
						
							|  |  |  |         return decoders.utf8; | 
					
						
							|  |  |  |       case 'latin1': | 
					
						
							|  |  |  |       case 'ascii': // TODO: Make these a separate, strict decoder?
 | 
					
						
							|  |  |  |       case 'us-ascii': | 
					
						
							|  |  |  |       case 'iso-8859-1': | 
					
						
							|  |  |  |       case 'iso8859-1': | 
					
						
							|  |  |  |       case 'iso88591': | 
					
						
							|  |  |  |       case 'iso_8859-1': | 
					
						
							|  |  |  |       case 'windows-1252': | 
					
						
							|  |  |  |       case 'iso_8859-1:1987': | 
					
						
							|  |  |  |       case 'cp1252': | 
					
						
							|  |  |  |       case 'x-cp1252': | 
					
						
							|  |  |  |         return decoders.latin1; | 
					
						
							|  |  |  |       case 'utf16le': | 
					
						
							|  |  |  |       case 'utf-16le': | 
					
						
							|  |  |  |       case 'ucs2': | 
					
						
							|  |  |  |       case 'ucs-2': | 
					
						
							|  |  |  |         return decoders.utf16le; | 
					
						
							|  |  |  |       case 'base64': | 
					
						
							|  |  |  |         return decoders.base64; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         if (lc === undefined) { | 
					
						
							|  |  |  |           lc = true; | 
					
						
							|  |  |  |           charset = charset.toLowerCase(); | 
					
						
							|  |  |  |           continue; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return decoders.other.bind(charset); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const decoders = { | 
					
						
							|  |  |  |   utf8: (data, hint) => { | 
					
						
							|  |  |  |     if (data.length === 0) | 
					
						
							|  |  |  |       return ''; | 
					
						
							|  |  |  |     if (typeof data === 'string') { | 
					
						
							|  |  |  |       // If `data` never had any percent-encoded bytes or never had any that
 | 
					
						
							|  |  |  |       // were outside of the ASCII range, then we can safely just return the
 | 
					
						
							|  |  |  |       // input since UTF-8 is ASCII compatible
 | 
					
						
							|  |  |  |       if (hint < 2) | 
					
						
							|  |  |  |         return data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       data = Buffer.from(data, 'latin1'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return data.utf8Slice(0, data.length); | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   latin1: (data, hint) => { | 
					
						
							|  |  |  |     if (data.length === 0) | 
					
						
							|  |  |  |       return ''; | 
					
						
							|  |  |  |     if (typeof data === 'string') | 
					
						
							|  |  |  |       return data; | 
					
						
							|  |  |  |     return data.latin1Slice(0, data.length); | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   utf16le: (data, hint) => { | 
					
						
							|  |  |  |     if (data.length === 0) | 
					
						
							|  |  |  |       return ''; | 
					
						
							|  |  |  |     if (typeof data === 'string') | 
					
						
							|  |  |  |       data = Buffer.from(data, 'latin1'); | 
					
						
							|  |  |  |     return data.ucs2Slice(0, data.length); | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   base64: (data, hint) => { | 
					
						
							|  |  |  |     if (data.length === 0) | 
					
						
							|  |  |  |       return ''; | 
					
						
							|  |  |  |     if (typeof data === 'string') | 
					
						
							|  |  |  |       data = Buffer.from(data, 'latin1'); | 
					
						
							|  |  |  |     return data.base64Slice(0, data.length); | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   other: (data, hint) => { | 
					
						
							|  |  |  |     if (data.length === 0) | 
					
						
							|  |  |  |       return ''; | 
					
						
							|  |  |  |     if (typeof data === 'string') | 
					
						
							|  |  |  |       data = Buffer.from(data, 'latin1'); | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       const decoder = new TextDecoder(this); | 
					
						
							|  |  |  |       return decoder.decode(data); | 
					
						
							|  |  |  |     } catch {} | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function convertToUTF8(data, charset, hint) { | 
					
						
							|  |  |  |   const decode = getDecoder(charset); | 
					
						
							|  |  |  |   if (decode) | 
					
						
							|  |  |  |     return decode(data, hint); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function basename(path) { | 
					
						
							|  |  |  |   if (typeof path !== 'string') | 
					
						
							|  |  |  |     return ''; | 
					
						
							|  |  |  |   for (let i = path.length - 1; i >= 0; --i) { | 
					
						
							|  |  |  |     switch (path.charCodeAt(i)) { | 
					
						
							|  |  |  |       case 0x2F: // '/'
 | 
					
						
							|  |  |  |       case 0x5C: // '\'
 | 
					
						
							|  |  |  |         path = path.slice(i + 1); | 
					
						
							|  |  |  |         return (path === '..' || path === '.' ? '' : path); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return (path === '..' || path === '.' ? '' : path); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const TOKEN = [ | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  | ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QDTEXT = [ | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  | ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const CHARSET = [ | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  | ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const EXTENDED_VALUE = [ | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
					
						
							|  |  |  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
					
						
							|  |  |  | ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* eslint-disable no-multi-spaces */ | 
					
						
							|  |  |  | const HEX_VALUES = [ | 
					
						
							|  |  |  |   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  |   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 
					
						
							|  |  |  | ]; | 
					
						
							|  |  |  | /* eslint-enable no-multi-spaces */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = { | 
					
						
							|  |  |  |   basename, | 
					
						
							|  |  |  |   convertToUTF8, | 
					
						
							|  |  |  |   getDecoder, | 
					
						
							|  |  |  |   parseContentType, | 
					
						
							|  |  |  |   parseDisposition, | 
					
						
							|  |  |  | }; |