const b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' ; const b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/ ; window . atob = function ( string ) { string = String ( string ) . replace ( /[\t\n\f\r ]+/g , '' ) ; if ( ! b64re . test ( string ) ) throw new TypeError ( "Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded." ) ; string += '==' . slice ( 2 - ( string . length & 3 ) ) ; var bitmap , result = '' , r1 , r2 , i = 0 ; for ( ; i < string . length ; ) { bitmap = ( b64 . indexOf ( string . charAt ( i ++ ) ) << 18 ) | ( b64 . indexOf ( string . charAt ( i ++ ) ) << 12 ) | ( ( r1 = b64 . indexOf ( string . charAt ( i ++ ) ) ) << 6 ) | ( r2 = b64 . indexOf ( string . charAt ( i ++ ) ) ) ; result += r1 === 64 ? String . fromCharCode ( ( bitmap >> 16 ) & 255 ) : r2 === 64 ? String . fromCharCode ( ( bitmap >> 16 ) & 255 , ( bitmap >> 8 ) & 255 ) : String . fromCharCode ( ( bitmap >> 16 ) & 255 , ( bitmap >> 8 ) & 255 , bitmap & 255 ) ; } return result ; } ; window . btoa = function ( string ) { string = String ( string ) ; var bitmap , a , b , c , result = '' , i = 0 , rest = string . length % 3 ; for ( ; i < string . length ; ) { if ( ( a = string . charCodeAt ( i ++ ) ) > 255 || ( b = string . charCodeAt ( i ++ ) ) > 255 || ( c = string . charCodeAt ( i ++ ) ) > 255 ) throw new TypeError ( "Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range." ) ; bitmap = ( a << 16 ) | ( b << 8 ) | c ; result += b64 . charAt ( ( bitmap >> 18 ) & 63 ) + b64 . charAt ( ( bitmap >> 12 ) & 63 ) + b64 . charAt ( ( bitmap >> 6 ) & 63 ) + b64 . charAt ( bitmap & 63 ) ; } return rest ? result . slice ( 0 , rest - 3 ) + '===' . substring ( rest ) : result ; } ;