'a'
mh-two-thousand-and-two
2024-04-12 44d2c92345cd156a59fc327b3060292a282d2893
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
'use strict';
var $ = require('../internals/export');
var global = require('../internals/global');
var uncurryThis = require('../internals/function-uncurry-this');
var anObjectOrUndefined = require('../internals/an-object-or-undefined');
var aString = require('../internals/a-string');
var hasOwn = require('../internals/has-own-property');
var arrayFromConstructorAndList = require('../internals/array-from-constructor-and-list');
var base64Map = require('../internals/base64-map');
var getAlphabetOption = require('../internals/get-alphabet-option');
 
var base64Alphabet = base64Map.c2i;
var base64UrlAlphabet = base64Map.c2iUrl;
 
var Uint8Array = global.Uint8Array;
var SyntaxError = global.SyntaxError;
var charAt = uncurryThis(''.charAt);
var replace = uncurryThis(''.replace);
var stringSlice = uncurryThis(''.slice);
var push = uncurryThis([].push);
var SPACES = /[\t\n\f\r ]/g;
var EXTRA_BITS = 'Extra bits';
 
// `Uint8Array.fromBase64` method
// https://github.com/tc39/proposal-arraybuffer-base64
if (Uint8Array) $({ target: 'Uint8Array', stat: true, forced: true }, {
  fromBase64: function fromBase64(string /* , options */) {
    aString(string);
    var options = arguments.length > 1 ? anObjectOrUndefined(arguments[1]) : undefined;
    var alphabet = getAlphabetOption(options) === 'base64' ? base64Alphabet : base64UrlAlphabet;
    var strict = options ? !!options.strict : false;
 
    var input = strict ? string : replace(string, SPACES, '');
 
    if (input.length % 4 === 0) {
      if (stringSlice(input, -2) === '==') input = stringSlice(input, 0, -2);
      else if (stringSlice(input, -1) === '=') input = stringSlice(input, 0, -1);
    } else if (strict) throw new SyntaxError('Input is not correctly padded');
 
    var lastChunkSize = input.length % 4;
 
    switch (lastChunkSize) {
      case 1: throw new SyntaxError('Bad input length');
      case 2: input += 'AA'; break;
      case 3: input += 'A';
    }
 
    var bytes = [];
    var i = 0;
    var inputLength = input.length;
 
    var at = function (shift) {
      var chr = charAt(input, i + shift);
      if (!hasOwn(alphabet, chr)) throw new SyntaxError('Bad char in input: "' + chr + '"');
      return alphabet[chr] << (18 - 6 * shift);
    };
 
    for (; i < inputLength; i += 4) {
      var triplet = at(0) + at(1) + at(2) + at(3);
      push(bytes, (triplet >> 16) & 255, (triplet >> 8) & 255, triplet & 255);
    }
 
    var byteLength = bytes.length;
 
    if (lastChunkSize === 2) {
      if (strict && bytes[byteLength - 2] !== 0) throw new SyntaxError(EXTRA_BITS);
      byteLength -= 2;
    } else if (lastChunkSize === 3) {
      if (strict && bytes[byteLength - 1] !== 0) throw new SyntaxError(EXTRA_BITS);
      byteLength--;
    }
 
    return arrayFromConstructorAndList(Uint8Array, bytes, byteLength);
  }
});