Submission f7310269...
pragma solidity ^0.4.23;
contract HexDecoder {
/**
* @dev Decodes a hex-encoded input string, returning it in binary.
*
* Input strings may be of any length, but will always be a multiple of two
* bytes long, and will not contain any non-hexadecimal characters.
*
* @param input The hex-encoded input.
* @return The decoded output.
*/
function decode(string input) external view returns(bytes output) {
assembly {
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0xEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF
0x9000000000000000000000000000000000000000000000000000000000000000
0x0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F
2 0x24 calldataload div
dup1 iszero no_bytes jumpi
0x44
0x40
dup3 4 eq four_byte jumpi
dup3 0x80 eq four_words jumpi
loop_start:
dup2 calldataload // w m c
dup1 0x6666666666666666666666666666666666666666666666666666666666666666 eq iszero not_zero jumpi // w m c
0x00 0x00 revert
0x00 dup3 mstore pop // m c
0x10 add // m' c
dup2 0x20 add // c' m' c
swap2 calldatasize gt iszero // (s !< c?) m' c'
loop_end jumpi
loop_start jump
not_zero:
dup8
dup2 dup9 or not
dup8 mulmod add
dup5 and
16 dup2 div or
0x20 mstore
4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
33 mload dup2 mstore
dup2 0x20 add calldataload
dup8
dup2 dup9 or not
dup8 mulmod add
dup5 and
16 dup2 div or
0x20 mstore
4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
33 mload dup2 0x10 add mstore
0x20 add
dup2 0x40 add
swap2 calldatasize gt
loop_start jumpi
loop_end:
pop pop
0x20 0x00 mstore
dup1 0x20 mstore
0x40 add 0x0
dup2 mstore
dup1 0x1f and iszero
skip jumpi
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 and 0x20 add
skip:
0
return
pop pop pop
no_bytes:
0x40 0x00 return
four_byte:
dup2 calldataload
dup8
dup2 dup9 or not
dup8 mulmod add
dup5 and
16 dup2 div or
0x20 mstore
4 mload 6 mload 8 mload
36 mstore8 35 mstore8 34 mstore8
33 mload dup2 mstore
0x20 0x00 mstore
4 0x20 mstore
0x0 0x44 mstore
0x60
0
return
four_words:
0x124 calldataload
dup8
dup2 dup9 or not
dup8 mulmod add
dup5 and
16 dup2 div or
0x20 mstore
4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
33 mload
0x104 calldataload
dup9
dup2 dup10 or not
dup9 mulmod add
dup6 and
16 dup2 div or
0x20 mstore
4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
33 mload
0xe4 calldataload
dup10
dup2 dup11 or not
dup10 mulmod add
dup7 and
16 dup2 div or
0x20 mstore
4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
33 mload
0xc4 calldataload
dup11
dup2 dup12 or not
dup11 mulmod add
dup8 and
16 dup2 div or
0x20 mstore
4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
33 mload
0xa4 calldataload
dup12
dup2 dup13 or not
dup12 mulmod add
dup9 and
16 dup2 div or
0x20 mstore
4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
33 mload
0x84 calldataload
dup13
dup2 dup14 or not
dup13 mulmod add
dup10 and
16 dup2 div or
0x20 mstore
4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
33 mload
0x64 calldataload
dup14
dup2 dup15 or not
dup14 mulmod add
dup11 and
16 dup2 div or
0x20 mstore
4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
33 mload
0x44 calldataload
dup15
dup2 dup16 or not
dup15 mulmod add
dup12 and
16 dup2 div or
0x20 mstore
4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
33 mload
0x40 mstore
0x50 mstore
0x60 mstore
0x70 mstore
0x80 mstore
0x90 mstore
0xa0 mstore
0xb0 mstore
0x00 dup2 0xb0 add mstore
0x20 0x00 mstore
dup3 0x20 mstore
0xc0 0 return
}
}
}