diff --git a/ext/standard/base64.c b/ext/standard/base64.c index 4257a76ce5b6b..9ea3e4717c5da 100644 --- a/ext/standard/base64.c +++ b/ext/standard/base64.c @@ -120,7 +120,7 @@ static zend_always_inline unsigned char *neon_base64_encode(const unsigned char } #endif /* defined(__aarch64__) || defined(_M_ARM64) */ -static zend_always_inline unsigned char *php_base64_encode_impl(const unsigned char *in, size_t inl, unsigned char *out) /* {{{ */ +static zend_always_inline unsigned char *php_base64_encode_impl(const unsigned char *in, size_t inl, unsigned char *out, zend_long flags) /* {{{ */ { #if defined(__aarch64__) || defined(_M_ARM64) if (inl >= 16 * 3) { @@ -147,11 +147,15 @@ static zend_always_inline unsigned char *php_base64_encode_impl(const unsigned c if (inl > 1) { *out++ = base64_table[((in[0] & 0x03) << 4) + (in[1] >> 4)]; *out++ = base64_table[(in[1] & 0x0f) << 2]; - *out++ = base64_pad; + if ((flags & PHP_BASE64_NO_PADDING) == 0) { + *out++ = base64_pad; + } } else { *out++ = base64_table[(in[0] & 0x03) << 4]; - *out++ = base64_pad; - *out++ = base64_pad; + if ((flags & PHP_BASE64_NO_PADDING) == 0) { + *out++ = base64_pad; + *out++ = base64_pad; + } } } @@ -381,32 +385,32 @@ static zend_always_inline int php_base64_decode_impl(const unsigned char *in, si # include "Zend/zend_cpuinfo.h" # if BASE64_INTRIN_AVX512_FUNC_PROTO || BASE64_INTRIN_AVX512_FUNC_PTR -ZEND_INTRIN_AVX512_FUNC_DECL(zend_string *php_base64_encode_avx512(const unsigned char *str, size_t length)); +ZEND_INTRIN_AVX512_FUNC_DECL(zend_string *php_base64_encode_avx512(const unsigned char *str, size_t length, zend_long flags)); ZEND_INTRIN_AVX512_FUNC_DECL(zend_string *php_base64_decode_ex_avx512(const unsigned char *str, size_t length, bool strict)); # endif # if BASE64_INTRIN_AVX512_VBMI_FUNC_PROTO || BASE64_INTRIN_AVX512_VBMI_FUNC_PTR -ZEND_INTRIN_AVX512_VBMI_FUNC_DECL(zend_string *php_base64_encode_avx512_vbmi(const unsigned char *str, size_t length)); +ZEND_INTRIN_AVX512_VBMI_FUNC_DECL(zend_string *php_base64_encode_avx512_vbmi(const unsigned char *str, size_t length, zend_long flags)); ZEND_INTRIN_AVX512_VBMI_FUNC_DECL(zend_string *php_base64_decode_ex_avx512_vbmi(const unsigned char *str, size_t length, bool strict)); # endif # if ZEND_INTRIN_AVX2_RESOLVER -ZEND_INTRIN_AVX2_FUNC_DECL(zend_string *php_base64_encode_avx2(const unsigned char *str, size_t length)); +ZEND_INTRIN_AVX2_FUNC_DECL(zend_string *php_base64_encode_avx2(const unsigned char *str, size_t length, zend_long flags)); ZEND_INTRIN_AVX2_FUNC_DECL(zend_string *php_base64_decode_ex_avx2(const unsigned char *str, size_t length, bool strict)); # endif # if ZEND_INTRIN_SSSE3_RESOLVER -ZEND_INTRIN_SSSE3_FUNC_DECL(zend_string *php_base64_encode_ssse3(const unsigned char *str, size_t length)); +ZEND_INTRIN_SSSE3_FUNC_DECL(zend_string *php_base64_encode_ssse3(const unsigned char *str, size_t length, zend_long flags)); ZEND_INTRIN_SSSE3_FUNC_DECL(zend_string *php_base64_decode_ex_ssse3(const unsigned char *str, size_t length, bool strict)); # endif -zend_string *php_base64_encode_default(const unsigned char *str, size_t length); +zend_string *php_base64_encode_default(const unsigned char *str, size_t length, zend_long flags); zend_string *php_base64_decode_ex_default(const unsigned char *str, size_t length, bool strict); # if (ZEND_INTRIN_AVX2_FUNC_PROTO || ZEND_INTRIN_SSSE3_FUNC_PROTO || BASE64_INTRIN_AVX512_FUNC_PROTO || BASE64_INTRIN_AVX512_VBMI_FUNC_PROTO) -PHPAPI zend_string *php_base64_encode(const unsigned char *str, size_t length) __attribute__((ifunc("resolve_base64_encode"))); +PHPAPI zend_string *php_base64_encode_ex(const unsigned char *str, size_t length, zend_long flags) __attribute__((ifunc("resolve_base64_encode"))); PHPAPI zend_string *php_base64_decode_ex(const unsigned char *str, size_t length, bool strict) __attribute__((ifunc("resolve_base64_decode"))); -typedef zend_string *(*base64_encode_func_t)(const unsigned char *, size_t); +typedef zend_string *(*base64_encode_func_t)(const unsigned char *, size_t, zend_long flags); typedef zend_string *(*base64_decode_func_t)(const unsigned char *, size_t, bool); ZEND_NO_SANITIZE_ADDRESS @@ -462,11 +466,11 @@ static base64_decode_func_t resolve_base64_decode(void) { } # else /* (ZEND_INTRIN_AVX2_FUNC_PROTO || ZEND_INTRIN_SSSE3_FUNC_PROTO) */ -PHPAPI zend_string *(*php_base64_encode_ptr)(const unsigned char *str, size_t length) = NULL; +PHPAPI zend_string *(*php_base64_encode_ptr)(const unsigned char *str, size_t length, zend_long flags) = NULL; PHPAPI zend_string *(*php_base64_decode_ex_ptr)(const unsigned char *str, size_t length, bool strict) = NULL; -PHPAPI zend_string *php_base64_encode(const unsigned char *str, size_t length) { - return php_base64_encode_ptr(str, length); +PHPAPI zend_string *php_base64_encode_ex(const unsigned char *str, size_t length, zend_long flags) { + return php_base64_encode_ptr(str, length, flags); } PHPAPI zend_string *php_base64_decode_ex(const unsigned char *str, size_t length, bool strict) { return php_base64_decode_ex_ptr(str, length, strict); @@ -508,7 +512,7 @@ PHP_MINIT_FUNCTION(base64_intrin) #endif /* ZEND_INTRIN_AVX2_NATIVE */ #if BASE64_INTRIN_AVX512_VBMI_FUNC_PROTO || BASE64_INTRIN_AVX512_VBMI_FUNC_PTR -zend_string *php_base64_encode_avx512_vbmi(const unsigned char *str, size_t length) +zend_string *php_base64_encode_avx512_vbmi(const unsigned char *str, size_t length, zend_long flags) { const unsigned char *c = str; unsigned char *o; @@ -545,7 +549,7 @@ zend_string *php_base64_encode_avx512_vbmi(const unsigned char *str, size_t leng length -= 48; } - o = php_base64_encode_impl(c, length, o); + o = php_base64_encode_impl(c, length, o, flags); ZSTR_LEN(result) = (o - (unsigned char *)ZSTR_VAL(result)); @@ -618,7 +622,7 @@ zend_string *php_base64_decode_ex_avx512_vbmi(const unsigned char *str, size_t l #endif #if BASE64_INTRIN_AVX512_FUNC_PROTO || BASE64_INTRIN_AVX512_FUNC_PTR -zend_string *php_base64_encode_avx512(const unsigned char *str, size_t length) +zend_string *php_base64_encode_avx512(const unsigned char *str, size_t length, zend_long flags) { const unsigned char *c = str; unsigned char *o; @@ -665,7 +669,7 @@ zend_string *php_base64_encode_avx512(const unsigned char *str, size_t length) length -= 48; } - o = php_base64_encode_impl(c, length, o); + o = php_base64_encode_impl(c, length, o, flags); ZSTR_LEN(result) = (o - (unsigned char *)ZSTR_VAL(result)); @@ -900,11 +904,11 @@ static __m128i php_base64_encode_ssse3_translate(__m128i in) #if ZEND_INTRIN_AVX2_NATIVE || ZEND_INTRIN_AVX2_RESOLVER || ZEND_INTRIN_SSSE3_NATIVE || ZEND_INTRIN_SSSE3_RESOLVER # if ZEND_INTRIN_AVX2_NATIVE || ZEND_INTRIN_SSSE3_NATIVE -PHPAPI zend_string *php_base64_encode(const unsigned char *str, size_t length) +PHPAPI zend_string *php_base64_encode_ex(const unsigned char *str, size_t length, zend_long flags) # elif ZEND_INTRIN_AVX2_RESOLVER -zend_string *php_base64_encode_avx2(const unsigned char *str, size_t length) +zend_string *php_base64_encode_avx2(const unsigned char *str, size_t length, zend_long flags) # else /* ZEND_INTRIN_SSSE3_RESOLVER */ -zend_string *php_base64_encode_ssse3(const unsigned char *str, size_t length) +zend_string *php_base64_encode_ssse3(const unsigned char *str, size_t length, zend_long flags) # endif { const unsigned char *c = str; @@ -938,7 +942,7 @@ zend_string *php_base64_encode_ssse3(const unsigned char *str, size_t length) PHP_BASE64_ENCODE_SSSE3_LOOP; # endif - o = php_base64_encode_impl(c, length, o); + o = php_base64_encode_impl(c, length, o, flags); ZSTR_LEN(result) = (o - (unsigned char *)ZSTR_VAL(result)); @@ -946,7 +950,7 @@ zend_string *php_base64_encode_ssse3(const unsigned char *str, size_t length) } # if ZEND_INTRIN_SSSE3_RESOLVER && ZEND_INTRIN_AVX2_RESOLVER -zend_string *php_base64_encode_ssse3(const unsigned char *str, size_t length) +zend_string *php_base64_encode_ssse3(const unsigned char *str, size_t length, zend_long flags) { const unsigned char *c = str; unsigned char *o; @@ -957,7 +961,7 @@ zend_string *php_base64_encode_ssse3(const unsigned char *str, size_t length) PHP_BASE64_ENCODE_SSSE3_LOOP; - o = php_base64_encode_impl(c, length, o); + o = php_base64_encode_impl(c, length, o, flags); ZSTR_LEN(result) = (o - (unsigned char *)ZSTR_VAL(result)); @@ -1180,9 +1184,9 @@ zend_string *php_base64_decode_ex_ssse3(const unsigned char *str, size_t length, #if !ZEND_INTRIN_AVX2_NATIVE && !ZEND_INTRIN_SSSE3_NATIVE #if ZEND_INTRIN_AVX2_RESOLVER || ZEND_INTRIN_SSSE3_RESOLVER -zend_string *php_base64_encode_default(const unsigned char *str, size_t length) +zend_string *php_base64_encode_default(const unsigned char *str, size_t length, zend_long flags) #else -PHPAPI zend_string *php_base64_encode(const unsigned char *str, size_t length) +PHPAPI zend_string *php_base64_encode_ex(const unsigned char *str, size_t length, zend_long flags) #endif { unsigned char *p; @@ -1191,7 +1195,7 @@ PHPAPI zend_string *php_base64_encode(const unsigned char *str, size_t length) result = zend_string_safe_alloc(((length + 2) / 3), 4 * sizeof(char), 0, 0); p = (unsigned char *)ZSTR_VAL(result); - p = php_base64_encode_impl(str, length, p); + p = php_base64_encode_impl(str, length, p, flags); ZSTR_LEN(result) = (p - (unsigned char *)ZSTR_VAL(result)); @@ -1229,12 +1233,15 @@ PHP_FUNCTION(base64_encode) char *str; size_t str_len; zend_string *result; + bool padding = true; - ZEND_PARSE_PARAMETERS_START(1, 1) + ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_STRING(str, str_len) + Z_PARAM_OPTIONAL + Z_PARAM_BOOL(padding) ZEND_PARSE_PARAMETERS_END(); - result = php_base64_encode((unsigned char*)str, str_len); + result = php_base64_encode_ex((unsigned char*)str, str_len, (padding ? 0 : PHP_BASE64_NO_PADDING)); RETURN_STR(result); } /* }}} */ diff --git a/ext/standard/base64.h b/ext/standard/base64.h index 5e1c6f195cc24..c5a24f8e1f501 100644 --- a/ext/standard/base64.h +++ b/ext/standard/base64.h @@ -61,9 +61,15 @@ PHP_MINIT_FUNCTION(base64_intrin); #endif -PHPAPI extern zend_string *php_base64_encode(const unsigned char *, size_t); +/* php_base64_encode_ex flags */ +#define PHP_BASE64_NO_PADDING 1 + +PHPAPI extern zend_string *php_base64_encode_ex(const unsigned char *, size_t, zend_long flags); PHPAPI extern zend_string *php_base64_decode_ex(const unsigned char *, size_t, bool); +static inline zend_string *php_base64_encode(const unsigned char *str, size_t len) { + return php_base64_encode_ex(str, len, 0); +} static inline zend_string *php_base64_encode_str(const zend_string *str) { return php_base64_encode((const unsigned char*)(ZSTR_VAL(str)), ZSTR_LEN(str)); } diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index c3adaceff4390..21a829267c726 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -1930,7 +1930,7 @@ function array_is_list(array $array): bool {} * @compile-time-eval * @refcount 1 */ -function base64_encode(string $string): string {} +function base64_encode(string $string, bool $padding = true): string {} /** * @compile-time-eval diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index c420e5c29e0f7..c316cda685ee8 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 954bf48ac1f24a14fd7508c8bf4b781883398499 */ + * Stub hash: 8ae13d072715cee48915fdfd1c47fc3a9027d21a */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -366,6 +366,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_base64_encode, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, padding, _IS_BOOL, 0, "true") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_base64_decode, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) @@ -798,7 +799,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_assert_options, 0, 1, IS_MIXED, ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() -#define arginfo_bin2hex arginfo_base64_encode +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bin2hex, 0, 1, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) +ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_hex2bin, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) @@ -860,13 +863,13 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strtok, 0, 1, MAY_BE_STRING|MAY_ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, token, IS_STRING, 1, "null") ZEND_END_ARG_INFO() -#define arginfo_strtoupper arginfo_base64_encode +#define arginfo_strtoupper arginfo_bin2hex -#define arginfo_strtolower arginfo_base64_encode +#define arginfo_strtolower arginfo_bin2hex -#define arginfo_str_increment arginfo_base64_encode +#define arginfo_str_increment arginfo_bin2hex -#define arginfo_str_decrement arginfo_base64_encode +#define arginfo_str_decrement arginfo_bin2hex ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_basename, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0) @@ -935,7 +938,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_substr_replace, 0, 3, MAY_BE_STR ZEND_ARG_TYPE_MASK(0, length, MAY_BE_ARRAY|MAY_BE_LONG|MAY_BE_NULL, "null") ZEND_END_ARG_INFO() -#define arginfo_quotemeta arginfo_base64_encode +#define arginfo_quotemeta arginfo_bin2hex ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ord, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, character, IS_STRING, 0) @@ -945,9 +948,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_chr, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, codepoint, IS_LONG, 0) ZEND_END_ARG_INFO() -#define arginfo_ucfirst arginfo_base64_encode +#define arginfo_ucfirst arginfo_bin2hex -#define arginfo_lcfirst arginfo_base64_encode +#define arginfo_lcfirst arginfo_bin2hex ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ucwords, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) @@ -960,7 +963,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_strtr, 0, 2, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, to, IS_STRING, 1, "null") ZEND_END_ARG_INFO() -#define arginfo_strrev arginfo_base64_encode +#define arginfo_strrev arginfo_bin2hex ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_similar_text, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, string1, IS_STRING, 0) @@ -973,11 +976,11 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_addcslashes, 0, 2, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, characters, IS_STRING, 0) ZEND_END_ARG_INFO() -#define arginfo_addslashes arginfo_base64_encode +#define arginfo_addslashes arginfo_bin2hex -#define arginfo_stripcslashes arginfo_base64_encode +#define arginfo_stripcslashes arginfo_bin2hex -#define arginfo_stripslashes arginfo_base64_encode +#define arginfo_stripslashes arginfo_bin2hex ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_str_replace, 0, 3, MAY_BE_STRING|MAY_BE_ARRAY) ZEND_ARG_TYPE_MASK(0, search, MAY_BE_ARRAY|MAY_BE_STRING, NULL) @@ -1057,9 +1060,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_sscanf, 0, 2, MAY_BE_ARRAY|MAY_B ZEND_ARG_VARIADIC_TYPE_INFO(1, vars, IS_MIXED, 0) ZEND_END_ARG_INFO() -#define arginfo_str_rot13 arginfo_base64_encode +#define arginfo_str_rot13 arginfo_bin2hex -#define arginfo_str_shuffle arginfo_base64_encode +#define arginfo_str_shuffle arginfo_bin2hex ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_str_word_count, 0, 1, MAY_BE_ARRAY|MAY_BE_LONG) ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) @@ -1085,9 +1088,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_substr_compare, 0, 3, IS_LONG, 0 ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, case_insensitive, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() -#define arginfo_utf8_encode arginfo_base64_encode +#define arginfo_utf8_encode arginfo_bin2hex -#define arginfo_utf8_decode arginfo_base64_encode +#define arginfo_utf8_decode arginfo_bin2hex ZEND_BEGIN_ARG_INFO_EX(arginfo_opendir, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0) @@ -1811,11 +1814,11 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_proc_get_status, 0, 1, IS_ARRAY, ZEND_END_ARG_INFO() #endif -#define arginfo_quoted_printable_decode arginfo_base64_encode +#define arginfo_quoted_printable_decode arginfo_bin2hex -#define arginfo_quoted_printable_encode arginfo_base64_encode +#define arginfo_quoted_printable_encode arginfo_bin2hex -#define arginfo_soundex arginfo_base64_encode +#define arginfo_soundex arginfo_bin2hex ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_select, 0, 4, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(1, read, IS_ARRAY, 1) @@ -2090,13 +2093,13 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_parse_url, 0, 1, MAY_BE_LONG|MAY ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, component, IS_LONG, 0, "-1") ZEND_END_ARG_INFO() -#define arginfo_urlencode arginfo_base64_encode +#define arginfo_urlencode arginfo_bin2hex -#define arginfo_urldecode arginfo_base64_encode +#define arginfo_urldecode arginfo_bin2hex -#define arginfo_rawurlencode arginfo_base64_encode +#define arginfo_rawurlencode arginfo_bin2hex -#define arginfo_rawurldecode arginfo_base64_encode +#define arginfo_rawurldecode arginfo_bin2hex ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_get_headers, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, url, IS_STRING, 0) @@ -2127,7 +2130,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_filter_register, 0, 2, _I ZEND_ARG_TYPE_INFO(0, class, IS_STRING, 0) ZEND_END_ARG_INFO() -#define arginfo_convert_uuencode arginfo_base64_encode +#define arginfo_convert_uuencode arginfo_bin2hex #define arginfo_convert_uudecode arginfo_hex2bin diff --git a/ext/standard/tests/url/base64_encode_basic_001.phpt b/ext/standard/tests/url/base64_encode_basic_001.phpt index 7d74696eb80da..cb555c2ebcd5a 100644 --- a/ext/standard/tests/url/base64_encode_basic_001.phpt +++ b/ext/standard/tests/url/base64_encode_basic_001.phpt @@ -29,6 +29,8 @@ $values = array( foreach($values as $str) { $enc = base64_encode($str); printf("%s\n", $enc); + $enc = base64_encode($str, padding: false); + printf("%s\n", $enc); } echo "Done\n"; @@ -292,12 +294,21 @@ echo "Done\n"; 0xFE: /g== 0xFF: /w== SGVsbG8gV29ybGQ= +SGVsbG8gV29ybGQ QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3ODkwISVeJiooKXt9W10= +QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3ODkwISVeJiooKXt9W10 +CgkgTGluZSB3aXRoIGNvbnRyb2wgY2hhcmFjdGVycw0K CgkgTGluZSB3aXRoIGNvbnRyb2wgY2hhcmFjdGVycw0K wcLDxMXG +wcLDxMXG PT4/BzgHOVw4MA== +PT4/BzgHOVw4MA QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODklIQ== +QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODklIQ QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODklIT0+Pwc4BzlcODA= +QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODklIT0+Pwc4BzlcODA QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODklIUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JSE= +QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODklIUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JSE +QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODklIUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JSE9Pj8HOAc5XDgw QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODklIUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JSE9Pj8HOAc5XDgw Done