Address Details
contract

0x6cCEf0D7eC1E2530Af733a00b800e5cf41cB3D62

Contract Name
SVGRenderer
Creator
0x8b2f36–66963a at 0x09c06d–bba56d
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
16166677
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
SVGRenderer




Optimization enabled
false
Compiler version
v0.8.6+commit.11564f7e




EVM Version
berlin




Verified at
2022-12-10T07:30:37.069940Z

contracts/SVGRenderer.sol

// SPDX-License-Identifier: GPL-3.0

/// @title A contract used to convert multi-part RLE compressed images to SVG

/*********************************
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 * ░░░░░░█████████░░█████████░░░ *
 * ░░░░░░██░░░████░░██░░░████░░░ *
 * ░░██████░░░████████░░░████░░░ *
 * ░░██░░██░░░████░░██░░░████░░░ *
 * ░░██░░██░░░████░░██░░░████░░░ *
 * ░░░░░░█████████░░█████████░░░ *
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 *********************************/

pragma solidity ^0.8.6;

import { ISVGRenderer } from './interfaces/ISVGRenderer.sol';

contract SVGRenderer is ISVGRenderer {
    bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef';
    uint256 private constant _INDEX_TO_BYTES3_FACTOR = 3;

    // prettier-ignore
    string private constant _SVG_START_TAG = '<svg width="320" height="320" viewBox="0 0 320 320" xmlns="http://www.w3.org/2000/svg" shape-rendering="crispEdges">';
    string private constant _SVG_END_TAG = '</svg>';

    struct ContentBounds {
        uint8 top;
        uint8 right;
        uint8 bottom;
        uint8 left;
    }

    struct Draw {
        uint8 length;
        uint8 colorIndex;
    }

    struct DecodedImage {
        ContentBounds bounds;
        Draw[] draws;
    }

    /**
     * @notice Given RLE image data and color palette pointers, merge to generate a single SVG image.
     */
    function generateSVG(SVGParams calldata params) external pure override returns (string memory svg) {
        if (bytes(params.background).length != 0) {
            // prettier-ignore
            return string(
                abi.encodePacked(
                    _SVG_START_TAG,
                    '<rect width="100%" height="100%" fill="#', params.background, '" />',
                    _generateSVGRects(params),
                    _SVG_END_TAG
                )
            );
        }
        return string(abi.encodePacked(_SVG_START_TAG, _generateSVGRects(params), _SVG_END_TAG));
    }

    /**
     * @notice Given RLE image data and a color palette pointer, merge to generate a partial SVG image.
     */
    function generateSVGPart(Part calldata part) external pure override returns (string memory partialSVG) {
        Part[] memory parts = new Part[](1);
        parts[0] = part;

        return _generateSVGRects(SVGParams({ parts: parts, background: '' }));
    }

    /**
     * @notice Given RLE image data and color palette pointers, merge to generate a partial SVG image.
     */
    function generateSVGParts(Part[] calldata parts) external pure override returns (string memory partialSVG) {
        return _generateSVGRects(SVGParams({ parts: parts, background: '' }));
    }

    /**
     * @notice Given RLE image parts and color palettes, generate SVG rects.
     */
    // prettier-ignore
    function _generateSVGRects(SVGParams memory params)
        private
        pure
        returns (string memory svg)
    {
        string[33] memory lookup = [
            '0', '10', '20', '30', '40', '50', '60', '70', 
            '80', '90', '100', '110', '120', '130', '140', '150', 
            '160', '170', '180', '190', '200', '210', '220', '230', 
            '240', '250', '260', '270', '280', '290', '300', '310',
            '320'
        ];
        string memory rects;
        string[] memory cache;
        for (uint8 p = 0; p < params.parts.length; p++) {
            cache = new string[](256); // Initialize color cache

            DecodedImage memory image = _decodeRLEImage(params.parts[p].image);
            bytes memory palette = params.parts[p].palette;
            uint256 currentX = image.bounds.left;
            uint256 currentY = image.bounds.top;
            uint256 cursor;
            string[16] memory buffer;

            string memory part;
            for (uint256 i = 0; i < image.draws.length; i++) {
                Draw memory draw = image.draws[i];

                uint8 length = _getRectLength(currentX, draw.length, image.bounds.right);
                while (length > 0) {
                    if (draw.colorIndex != 0) {
                        buffer[cursor] = lookup[length];                                 // width
                        buffer[cursor + 1] = lookup[currentX];                           // x
                        buffer[cursor + 2] = lookup[currentY];                           // y
                        buffer[cursor + 3] = _getColor(palette, draw.colorIndex, cache); // color

                        cursor += 4;

                        if (cursor >= 16) {
                            part = string(abi.encodePacked(part, _getChunk(cursor, buffer)));
                            cursor = 0;
                        }
                    }

                    currentX += length;
                    if (currentX == image.bounds.right) {
                        currentX = image.bounds.left;
                        currentY++;
                    }

                    draw.length -= length;
                    length = _getRectLength(currentX, draw.length, image.bounds.right);
                }
            }

            if (cursor != 0) {
                part = string(abi.encodePacked(part, _getChunk(cursor, buffer)));
            }
            rects = string(abi.encodePacked(rects, part));
        }
        return rects;
    }

    /**
     * @notice Given an x-coordinate, draw length, and right bound, return the draw
     * length for a single SVG rectangle.
     */
    function _getRectLength(
        uint256 currentX,
        uint8 drawLength,
        uint8 rightBound
    ) private pure returns (uint8) {
        uint8 remainingPixelsInLine = rightBound - uint8(currentX);
        return drawLength <= remainingPixelsInLine ? drawLength : remainingPixelsInLine;
    }

    /**
     * @notice Return a string that consists of all rects in the provided `buffer`.
     */
    // prettier-ignore
    function _getChunk(uint256 cursor, string[16] memory buffer) private pure returns (string memory) {
        string memory chunk;
        for (uint256 i = 0; i < cursor; i += 4) {
            chunk = string(
                abi.encodePacked(
                    chunk,
                    '<rect width="', buffer[i], '" height="10" x="', buffer[i + 1], '" y="', buffer[i + 2], '" fill="#', buffer[i + 3], '" />'
                )
            );
        }
        return chunk;
    }

    /**
     * @notice Decode a single RLE compressed image into a `DecodedImage`.
     */
    function _decodeRLEImage(bytes memory image) private pure returns (DecodedImage memory) {
        ContentBounds memory bounds = ContentBounds({
            top: uint8(image[1]),
            right: uint8(image[2]),
            bottom: uint8(image[3]),
            left: uint8(image[4])
        });

        uint256 cursor;
        Draw[] memory draws = new Draw[]((image.length - 5) / 2);
        for (uint256 i = 5; i < image.length; i += 2) {
            draws[cursor] = Draw({ length: uint8(image[i]), colorIndex: uint8(image[i + 1]) });
            cursor++;
        }
        return DecodedImage({ bounds: bounds, draws: draws });
    }

    /**
     * @notice Get the target hex color code from the cache. Populate the cache if
     * the color code does not yet exist.
     */
    function _getColor(
        bytes memory palette,
        uint256 index,
        string[] memory cache
    ) private pure returns (string memory) {
        if (bytes(cache[index]).length == 0) {
            uint256 i = index * _INDEX_TO_BYTES3_FACTOR;
            cache[index] = _toHexString(abi.encodePacked(palette[i], palette[i + 1], palette[i + 2]));
        }
        return cache[index];
    }

    /**
     * @dev Convert `bytes` to a 6 character ASCII `string` hexadecimal representation.
     */
    function _toHexString(bytes memory b) private pure returns (string memory) {
        uint24 value = uint24(bytes3(b));

        bytes memory buffer = new bytes(6);
        buffer[5] = _HEX_SYMBOLS[value & 0xf];
        buffer[4] = _HEX_SYMBOLS[(value >> 4) & 0xf];
        buffer[3] = _HEX_SYMBOLS[(value >> 8) & 0xf];
        buffer[2] = _HEX_SYMBOLS[(value >> 12) & 0xf];
        buffer[1] = _HEX_SYMBOLS[(value >> 16) & 0xf];
        buffer[0] = _HEX_SYMBOLS[(value >> 20) & 0xf];
        return string(buffer);
    }
}
        

/contracts/interfaces/ISVGRenderer.sol

// SPDX-License-Identifier: GPL-3.0

/// @title Interface for SVGRenderer

/*********************************
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 * ░░░░░░█████████░░█████████░░░ *
 * ░░░░░░██░░░████░░██░░░████░░░ *
 * ░░██████░░░████████░░░████░░░ *
 * ░░██░░██░░░████░░██░░░████░░░ *
 * ░░██░░██░░░████░░██░░░████░░░ *
 * ░░░░░░█████████░░█████████░░░ *
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 *********************************/

pragma solidity ^0.8.6;

interface ISVGRenderer {
    struct Part {
        bytes image;
        bytes palette;
    }

    struct SVGParams {
        Part[] parts;
        string background;
    }

    function generateSVG(SVGParams memory params) external view returns (string memory svg);

    function generateSVGPart(Part memory part) external view returns (string memory partialSVG);

    function generateSVGParts(Part[] memory parts) external view returns (string memory partialSVG);
}
          

Contract ABI

[{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"svg","internalType":"string"}],"name":"generateSVG","inputs":[{"type":"tuple","name":"params","internalType":"struct ISVGRenderer.SVGParams","components":[{"type":"tuple[]","name":"parts","internalType":"struct ISVGRenderer.Part[]","components":[{"type":"bytes","name":"image","internalType":"bytes"},{"type":"bytes","name":"palette","internalType":"bytes"}]},{"type":"string","name":"background","internalType":"string"}]}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"partialSVG","internalType":"string"}],"name":"generateSVGPart","inputs":[{"type":"tuple","name":"part","internalType":"struct ISVGRenderer.Part","components":[{"type":"bytes","name":"image","internalType":"bytes"},{"type":"bytes","name":"palette","internalType":"bytes"}]}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"partialSVG","internalType":"string"}],"name":"generateSVGParts","inputs":[{"type":"tuple[]","name":"parts","internalType":"struct ISVGRenderer.Part[]","components":[{"type":"bytes","name":"image","internalType":"bytes"},{"type":"bytes","name":"palette","internalType":"bytes"}]}]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b5061259a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80635ea01e63146100465780636146ec8e14610076578063ead0ae84146100a6575b600080fd5b610060600480360381019061005b9190611aba565b6100d6565b60405161006d9190611de5565b60405180910390f35b610090600480360381019061008b9190611a71565b610216565b60405161009d9190611de5565b60405180910390f35b6100c060048036038101906100bb9190611a24565b6102ce565b6040516100cd9190611de5565b60405180910390f35b606060008280602001906100ea9190611e07565b90501461018c576040518060a00160405280607481526020016124f16074913982806020019061011a9190611e07565b61012c85610127906121a6565b610310565b6040518060400160405280600681526020017f3c2f7376673e0000000000000000000000000000000000000000000000000000815250604051602001610176959493929190611d0d565b6040516020818303038152906040529050610211565b6040518060a00160405280607481526020016124f1607491396101b7836101b2906121a6565b610310565b6040518060400160405280600681526020017f3c2f7376673e00000000000000000000000000000000000000000000000000008152506040516020016101ff93929190611cdc565b60405160208183030381529060405290505b919050565b60606000600167ffffffffffffffff81111561023557610234612336565b5b60405190808252806020026020018201604052801561026e57816020015b61025b61162e565b8152602001906001900390816102535790505b5090508261027b90612193565b8160008151811061028f5761028e612307565b5b60200260200101819052506102c6604051806040016040528083815260200160405180602001604052806000815250815250610310565b915050919050565b606061030860405180604001604052808585906102eb9190612117565b815260200160405180602001604052806000815250815250610310565b905092915050565b606060006040518061042001604052806040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f313000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f323000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f333000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f343000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f353000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f363000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f373000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f383000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f393000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313230000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313330000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313430000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313530000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313730000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313930000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323230000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323330000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323430000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323530000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323730000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323930000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f333030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f333130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f3332300000000000000000000000000000000000000000000000000000000000815250815250905060608060005b8560000151518160ff161015610e565761010067ffffffffffffffff811115610aed57610aec612336565b5b604051908082528060200260200182016040528015610b2057816020015b6060815260200190600190039081610b0b5790505b5091506000610b5387600001518360ff1681518110610b4257610b41612307565b5b602002602001015160000151610e62565b9050600087600001518360ff1681518110610b7157610b70612307565b5b6020026020010151602001519050600082600001516060015160ff169050600083600001516000015160ff1690506000610ba9611648565b606060005b876020015151811015610de157600088602001518281518110610bd457610bd3612307565b5b602002602001015190506000610bf78883600001518c6000015160200151611068565b90505b60008160ff161115610dcc576000826020015160ff1614610d4c578d8160ff1660218110610c2b57610c2a612307565b5b6020020151858760108110610c4357610c42612307565b5b60200201819052508d8860218110610c5e57610c5d612307565b5b602002015185600188610c719190611f5f565b60108110610c8257610c81612307565b5b60200201819052508d8760218110610c9d57610c9c612307565b5b602002015185600288610cb09190611f5f565b60108110610cc157610cc0612307565b5b6020020181905250610cdb89836020015160ff168e611099565b85600388610ce99190611f5f565b60108110610cfa57610cf9612307565b5b6020020181905250600486610d0f9190611f5f565b955060108610610d4b5783610d2487876111af565b604051602001610d35929190611cb8565b6040516020818303038152906040529350600095505b5b8060ff1688610d5b9190611f5f565b975089600001516020015160ff16881415610d8d5789600001516060015160ff1697508680610d899061222c565b9750505b8082600001818151610d9f9190612074565b91509060ff16908160ff1681525050610dc58883600001518c6000015160200151611068565b9050610bfa565b50508080610dd99061222c565b915050610bae565b5060008314610e185780610df584846111af565b604051602001610e06929190611cb8565b60405160208183030381529060405290505b8981604051602001610e2b929190611cb8565b6040516020818303038152906040529950505050505050508080610e4e90612275565b915050610ac1565b50819350505050919050565b610e6a611670565b6000604051806080016040528084600181518110610e8b57610e8a612307565b5b602001015160f81c60f81b60f81c60ff16815260200184600281518110610eb557610eb4612307565b5b602001015160f81c60f81b60f81c60ff16815260200184600381518110610edf57610ede612307565b5b602001015160f81c60f81b60f81c60ff16815260200184600481518110610f0957610f08612307565b5b602001015160f81c60f81b60f81c60ff168152509050600080600260058651610f329190612040565b610f3c9190611fb5565b67ffffffffffffffff811115610f5557610f54612336565b5b604051908082528060200260200182016040528015610f8e57816020015b610f7b611690565b815260200190600190039081610f735790505b5090506000600590505b8551811015611048576040518060400160405280878381518110610fbf57610fbe612307565b5b602001015160f81c60f81b60f81c60ff16815260200187600184610fe39190611f5f565b81518110610ff457610ff3612307565b5b602001015160f81c60f81b60f81c60ff1681525082848151811061101b5761101a612307565b5b602002602001018190525082806110319061222c565b9350506002816110419190611f5f565b9050610f98565b506040518060400160405280848152602001828152509350505050919050565b60008084836110779190612074565b90508060ff168460ff16111561108d578061108f565b835b9150509392505050565b606060008284815181106110b0576110af612307565b5b602002602001015151141561118b5760006003846110ce9190611fe6565b905061116b8582815181106110e6576110e5612307565b5b602001015160f81c60f81b866001846110ff9190611f5f565b815181106111105761110f612307565b5b602001015160f81c60f81b876002856111299190611f5f565b8151811061113a57611139612307565b5b602001015160f81c60f81b60405160200161115793929190611c7b565b604051602081830303815290604052611286565b83858151811061117e5761117d612307565b5b6020026020010181905250505b81838151811061119e5761119d612307565b5b602002602001015190509392505050565b60608060005b8481101561127b57818482601081106111d1576111d0612307565b5b6020020151856001846111e49190611f5f565b601081106111f5576111f4612307565b5b6020020151866002856112089190611f5f565b6010811061121957611218612307565b5b60200201518760038661122c9190611f5f565b6010811061123d5761123c612307565b5b6020020151604051602001611256959493929190611d63565b60405160208183030381529060405291506004816112749190611f5f565b90506111b5565b508091505092915050565b60606000826112949061212c565b60e81c90506000600667ffffffffffffffff8111156112b6576112b5612336565b5b6040519080825280601f01601f1916602001820160405280156112e85781602001600182028036833780820191505090505b5090507f3031323334353637383961626364656600000000000000000000000000000000600f831662ffffff166010811061132657611325612307565b5b1a60f81b8160058151811061133e5761133d612307565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3031323334353637383961626364656600000000000000000000000000000000600f60048462ffffff16901c1662ffffff16601081106113b1576113b0612307565b5b1a60f81b816004815181106113c9576113c8612307565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3031323334353637383961626364656600000000000000000000000000000000600f60088462ffffff16901c1662ffffff166010811061143c5761143b612307565b5b1a60f81b8160038151811061145457611453612307565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3031323334353637383961626364656600000000000000000000000000000000600f600c8462ffffff16901c1662ffffff16601081106114c7576114c6612307565b5b1a60f81b816002815181106114df576114de612307565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3031323334353637383961626364656600000000000000000000000000000000600f60108462ffffff16901c1662ffffff166010811061155257611551612307565b5b1a60f81b8160018151811061156a57611569612307565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3031323334353637383961626364656600000000000000000000000000000000600f60148462ffffff16901c1662ffffff16601081106115dd576115dc612307565b5b1a60f81b816000815181106115f5576115f4612307565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508092505050919050565b604051806040016040528060608152602001606081525090565b6040518061020001604052806010905b60608152602001906001900390816116585790505090565b60405180604001604052806116836116b0565b8152602001606081525090565b6040518060400160405280600060ff168152602001600060ff1681525090565b6040518060800160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b60006116f76116f284611e8f565b611e6a565b9050808382526020820190508285602086028201111561171a5761171961239d565b5b60005b8581101561176857813567ffffffffffffffff8111156117405761173f61237f565b5b80860161174d89826118f5565b8552602085019450602084019350505060018101905061171d565b5050509392505050565b600061178561178084611ebb565b611e6a565b9050828152602081018484840111156117a1576117a06123a7565b5b6117ac8482856121b9565b509392505050565b60006117c76117c284611eec565b611e6a565b9050828152602081018484840111156117e3576117e26123a7565b5b6117ee8482856121b9565b509392505050565b60008083601f84011261180c5761180b61237f565b5b8235905067ffffffffffffffff8111156118295761182861237a565b5b6020830191508360208202830111156118455761184461239d565b5b9250929050565b600082601f8301126118615761186061237f565b5b81356118718482602086016116e4565b91505092915050565b600082601f83011261188f5761188e61237f565b5b813561189f848260208601611772565b91505092915050565b600082601f8301126118bd576118bc61237f565b5b81356118cd8482602086016117b4565b91505092915050565b6000604082840312156118ec576118eb612389565b5b81905092915050565b60006040828403121561190b5761190a61238e565b5b6119156040611e6a565b9050600082013567ffffffffffffffff81111561193557611934612398565b5b6119418482850161187a565b600083015250602082013567ffffffffffffffff81111561196557611964612398565b5b6119718482850161187a565b60208301525092915050565b60006040828403121561199357611992612389565b5b81905092915050565b6000604082840312156119b2576119b161238e565b5b6119bc6040611e6a565b9050600082013567ffffffffffffffff8111156119dc576119db612398565b5b6119e88482850161184c565b600083015250602082013567ffffffffffffffff811115611a0c57611a0b612398565b5b611a18848285016118a8565b60208301525092915050565b60008060208385031215611a3b57611a3a6123b1565b5b600083013567ffffffffffffffff811115611a5957611a586123ac565b5b611a65858286016117f6565b92509250509250929050565b600060208284031215611a8757611a866123b1565b5b600082013567ffffffffffffffff811115611aa557611aa46123ac565b5b611ab1848285016118d6565b91505092915050565b600060208284031215611ad057611acf6123b1565b5b600082013567ffffffffffffffff811115611aee57611aed6123ac565b5b611afa8482850161197d565b91505092915050565b611b14611b0f826120a8565b61229f565b82525050565b6000611b268385611f54565b9350611b338385846121b9565b82840190509392505050565b6000611b4a82611f38565b611b548185611f43565b9350611b648185602086016121c8565b611b6d816123b6565b840191505092915050565b6000611b8382611f38565b611b8d8185611f54565b9350611b9d8185602086016121c8565b80840191505092915050565b6000611bb6600983611f54565b9150611bc1826123d4565b600982019050919050565b6000611bd9600483611f54565b9150611be4826123fd565b600482019050919050565b6000611bfc602883611f54565b9150611c0782612426565b602882019050919050565b6000611c1f600583611f54565b9150611c2a82612475565b600582019050919050565b6000611c42601183611f54565b9150611c4d8261249e565b601182019050919050565b6000611c65600d83611f54565b9150611c70826124c7565b600d82019050919050565b6000611c878286611b03565b600182019150611c978285611b03565b600182019150611ca78284611b03565b600182019150819050949350505050565b6000611cc48285611b78565b9150611cd08284611b78565b91508190509392505050565b6000611ce88286611b78565b9150611cf48285611b78565b9150611d008284611b78565b9150819050949350505050565b6000611d198288611b78565b9150611d2482611bef565b9150611d31828688611b1a565b9150611d3c82611bcc565b9150611d488285611b78565b9150611d548284611b78565b91508190509695505050505050565b6000611d6f8288611b78565b9150611d7a82611c58565b9150611d868287611b78565b9150611d9182611c35565b9150611d9d8286611b78565b9150611da882611c12565b9150611db48285611b78565b9150611dbf82611ba9565b9150611dcb8284611b78565b9150611dd682611bcc565b91508190509695505050505050565b60006020820190508181036000830152611dff8184611b3f565b905092915050565b60008083356001602003843603038112611e2457611e23612393565b5b80840192508235915067ffffffffffffffff821115611e4657611e45612384565b5b602083019250600182023603831315611e6257611e616123a2565b5b509250929050565b6000611e74611e85565b9050611e8082826121fb565b919050565b6000604051905090565b600067ffffffffffffffff821115611eaa57611ea9612336565b5b602082029050602081019050919050565b600067ffffffffffffffff821115611ed657611ed5612336565b5b611edf826123b6565b9050602081019050919050565b600067ffffffffffffffff821115611f0757611f06612336565b5b611f10826123b6565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000611f6a82612100565b9150611f7583612100565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611faa57611fa96122a9565b5b828201905092915050565b6000611fc082612100565b9150611fcb83612100565b925082611fdb57611fda6122d8565b5b828204905092915050565b6000611ff182612100565b9150611ffc83612100565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612035576120346122a9565b5b828202905092915050565b600061204b82612100565b915061205683612100565b925082821015612069576120686122a9565b5b828203905092915050565b600061207f8261210a565b915061208a8361210a565b92508282101561209d5761209c6122a9565b5b828203905092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffff000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600060ff82169050919050565b60006121243684846116e4565b905092915050565b600061213782611f2d565b8261214184611f1d565b905061214c81612365565b9250600382101561218c576121877fffffff0000000000000000000000000000000000000000000000000000000000836003036008026123c7565b831692505b5050919050565b600061219f36836118f5565b9050919050565b60006121b2368361199c565b9050919050565b82818337600083830152505050565b60005b838110156121e65780820151818401526020810190506121cb565b838111156121f5576000848401525b50505050565b612204826123b6565b810181811067ffffffffffffffff8211171561222357612222612336565b5b80604052505050565b600061223782612100565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561226a576122696122a9565b5b600182019050919050565b60006122808261210a565b915060ff821415612294576122936122a9565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061237182516120d4565b80915050919050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b600082821b905092915050565b7f222066696c6c3d22230000000000000000000000000000000000000000000000600082015250565b7f22202f3e00000000000000000000000000000000000000000000000000000000600082015250565b7f3c726563742077696474683d223130302522206865696768743d22313030252260008201527f2066696c6c3d2223000000000000000000000000000000000000000000000000602082015250565b7f2220793d22000000000000000000000000000000000000000000000000000000600082015250565b7f22206865696768743d2231302220783d22000000000000000000000000000000600082015250565b7f3c726563742077696474683d220000000000000000000000000000000000000060008201525056fe3c7376672077696474683d2233323022206865696768743d22333230222076696577426f783d2230203020333230203332302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222073686170652d72656e646572696e673d2263726973704564676573223ea2646970667358221220a80377f6024c3905539b92cc902c991b48d05e8383ec0d3a9fc704a7839f9c4864736f6c63430008060033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100415760003560e01c80635ea01e63146100465780636146ec8e14610076578063ead0ae84146100a6575b600080fd5b610060600480360381019061005b9190611aba565b6100d6565b60405161006d9190611de5565b60405180910390f35b610090600480360381019061008b9190611a71565b610216565b60405161009d9190611de5565b60405180910390f35b6100c060048036038101906100bb9190611a24565b6102ce565b6040516100cd9190611de5565b60405180910390f35b606060008280602001906100ea9190611e07565b90501461018c576040518060a00160405280607481526020016124f16074913982806020019061011a9190611e07565b61012c85610127906121a6565b610310565b6040518060400160405280600681526020017f3c2f7376673e0000000000000000000000000000000000000000000000000000815250604051602001610176959493929190611d0d565b6040516020818303038152906040529050610211565b6040518060a00160405280607481526020016124f1607491396101b7836101b2906121a6565b610310565b6040518060400160405280600681526020017f3c2f7376673e00000000000000000000000000000000000000000000000000008152506040516020016101ff93929190611cdc565b60405160208183030381529060405290505b919050565b60606000600167ffffffffffffffff81111561023557610234612336565b5b60405190808252806020026020018201604052801561026e57816020015b61025b61162e565b8152602001906001900390816102535790505b5090508261027b90612193565b8160008151811061028f5761028e612307565b5b60200260200101819052506102c6604051806040016040528083815260200160405180602001604052806000815250815250610310565b915050919050565b606061030860405180604001604052808585906102eb9190612117565b815260200160405180602001604052806000815250815250610310565b905092915050565b606060006040518061042001604052806040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f313000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f323000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f333000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f343000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f353000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f363000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f373000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f383000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f393000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313230000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313330000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313430000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313530000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313730000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313930000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323230000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323330000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323430000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323530000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323730000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323930000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f333030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f333130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f3332300000000000000000000000000000000000000000000000000000000000815250815250905060608060005b8560000151518160ff161015610e565761010067ffffffffffffffff811115610aed57610aec612336565b5b604051908082528060200260200182016040528015610b2057816020015b6060815260200190600190039081610b0b5790505b5091506000610b5387600001518360ff1681518110610b4257610b41612307565b5b602002602001015160000151610e62565b9050600087600001518360ff1681518110610b7157610b70612307565b5b6020026020010151602001519050600082600001516060015160ff169050600083600001516000015160ff1690506000610ba9611648565b606060005b876020015151811015610de157600088602001518281518110610bd457610bd3612307565b5b602002602001015190506000610bf78883600001518c6000015160200151611068565b90505b60008160ff161115610dcc576000826020015160ff1614610d4c578d8160ff1660218110610c2b57610c2a612307565b5b6020020151858760108110610c4357610c42612307565b5b60200201819052508d8860218110610c5e57610c5d612307565b5b602002015185600188610c719190611f5f565b60108110610c8257610c81612307565b5b60200201819052508d8760218110610c9d57610c9c612307565b5b602002015185600288610cb09190611f5f565b60108110610cc157610cc0612307565b5b6020020181905250610cdb89836020015160ff168e611099565b85600388610ce99190611f5f565b60108110610cfa57610cf9612307565b5b6020020181905250600486610d0f9190611f5f565b955060108610610d4b5783610d2487876111af565b604051602001610d35929190611cb8565b6040516020818303038152906040529350600095505b5b8060ff1688610d5b9190611f5f565b975089600001516020015160ff16881415610d8d5789600001516060015160ff1697508680610d899061222c565b9750505b8082600001818151610d9f9190612074565b91509060ff16908160ff1681525050610dc58883600001518c6000015160200151611068565b9050610bfa565b50508080610dd99061222c565b915050610bae565b5060008314610e185780610df584846111af565b604051602001610e06929190611cb8565b60405160208183030381529060405290505b8981604051602001610e2b929190611cb8565b6040516020818303038152906040529950505050505050508080610e4e90612275565b915050610ac1565b50819350505050919050565b610e6a611670565b6000604051806080016040528084600181518110610e8b57610e8a612307565b5b602001015160f81c60f81b60f81c60ff16815260200184600281518110610eb557610eb4612307565b5b602001015160f81c60f81b60f81c60ff16815260200184600381518110610edf57610ede612307565b5b602001015160f81c60f81b60f81c60ff16815260200184600481518110610f0957610f08612307565b5b602001015160f81c60f81b60f81c60ff168152509050600080600260058651610f329190612040565b610f3c9190611fb5565b67ffffffffffffffff811115610f5557610f54612336565b5b604051908082528060200260200182016040528015610f8e57816020015b610f7b611690565b815260200190600190039081610f735790505b5090506000600590505b8551811015611048576040518060400160405280878381518110610fbf57610fbe612307565b5b602001015160f81c60f81b60f81c60ff16815260200187600184610fe39190611f5f565b81518110610ff457610ff3612307565b5b602001015160f81c60f81b60f81c60ff1681525082848151811061101b5761101a612307565b5b602002602001018190525082806110319061222c565b9350506002816110419190611f5f565b9050610f98565b506040518060400160405280848152602001828152509350505050919050565b60008084836110779190612074565b90508060ff168460ff16111561108d578061108f565b835b9150509392505050565b606060008284815181106110b0576110af612307565b5b602002602001015151141561118b5760006003846110ce9190611fe6565b905061116b8582815181106110e6576110e5612307565b5b602001015160f81c60f81b866001846110ff9190611f5f565b815181106111105761110f612307565b5b602001015160f81c60f81b876002856111299190611f5f565b8151811061113a57611139612307565b5b602001015160f81c60f81b60405160200161115793929190611c7b565b604051602081830303815290604052611286565b83858151811061117e5761117d612307565b5b6020026020010181905250505b81838151811061119e5761119d612307565b5b602002602001015190509392505050565b60608060005b8481101561127b57818482601081106111d1576111d0612307565b5b6020020151856001846111e49190611f5f565b601081106111f5576111f4612307565b5b6020020151866002856112089190611f5f565b6010811061121957611218612307565b5b60200201518760038661122c9190611f5f565b6010811061123d5761123c612307565b5b6020020151604051602001611256959493929190611d63565b60405160208183030381529060405291506004816112749190611f5f565b90506111b5565b508091505092915050565b60606000826112949061212c565b60e81c90506000600667ffffffffffffffff8111156112b6576112b5612336565b5b6040519080825280601f01601f1916602001820160405280156112e85781602001600182028036833780820191505090505b5090507f3031323334353637383961626364656600000000000000000000000000000000600f831662ffffff166010811061132657611325612307565b5b1a60f81b8160058151811061133e5761133d612307565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3031323334353637383961626364656600000000000000000000000000000000600f60048462ffffff16901c1662ffffff16601081106113b1576113b0612307565b5b1a60f81b816004815181106113c9576113c8612307565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3031323334353637383961626364656600000000000000000000000000000000600f60088462ffffff16901c1662ffffff166010811061143c5761143b612307565b5b1a60f81b8160038151811061145457611453612307565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3031323334353637383961626364656600000000000000000000000000000000600f600c8462ffffff16901c1662ffffff16601081106114c7576114c6612307565b5b1a60f81b816002815181106114df576114de612307565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3031323334353637383961626364656600000000000000000000000000000000600f60108462ffffff16901c1662ffffff166010811061155257611551612307565b5b1a60f81b8160018151811061156a57611569612307565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3031323334353637383961626364656600000000000000000000000000000000600f60148462ffffff16901c1662ffffff16601081106115dd576115dc612307565b5b1a60f81b816000815181106115f5576115f4612307565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508092505050919050565b604051806040016040528060608152602001606081525090565b6040518061020001604052806010905b60608152602001906001900390816116585790505090565b60405180604001604052806116836116b0565b8152602001606081525090565b6040518060400160405280600060ff168152602001600060ff1681525090565b6040518060800160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b60006116f76116f284611e8f565b611e6a565b9050808382526020820190508285602086028201111561171a5761171961239d565b5b60005b8581101561176857813567ffffffffffffffff8111156117405761173f61237f565b5b80860161174d89826118f5565b8552602085019450602084019350505060018101905061171d565b5050509392505050565b600061178561178084611ebb565b611e6a565b9050828152602081018484840111156117a1576117a06123a7565b5b6117ac8482856121b9565b509392505050565b60006117c76117c284611eec565b611e6a565b9050828152602081018484840111156117e3576117e26123a7565b5b6117ee8482856121b9565b509392505050565b60008083601f84011261180c5761180b61237f565b5b8235905067ffffffffffffffff8111156118295761182861237a565b5b6020830191508360208202830111156118455761184461239d565b5b9250929050565b600082601f8301126118615761186061237f565b5b81356118718482602086016116e4565b91505092915050565b600082601f83011261188f5761188e61237f565b5b813561189f848260208601611772565b91505092915050565b600082601f8301126118bd576118bc61237f565b5b81356118cd8482602086016117b4565b91505092915050565b6000604082840312156118ec576118eb612389565b5b81905092915050565b60006040828403121561190b5761190a61238e565b5b6119156040611e6a565b9050600082013567ffffffffffffffff81111561193557611934612398565b5b6119418482850161187a565b600083015250602082013567ffffffffffffffff81111561196557611964612398565b5b6119718482850161187a565b60208301525092915050565b60006040828403121561199357611992612389565b5b81905092915050565b6000604082840312156119b2576119b161238e565b5b6119bc6040611e6a565b9050600082013567ffffffffffffffff8111156119dc576119db612398565b5b6119e88482850161184c565b600083015250602082013567ffffffffffffffff811115611a0c57611a0b612398565b5b611a18848285016118a8565b60208301525092915050565b60008060208385031215611a3b57611a3a6123b1565b5b600083013567ffffffffffffffff811115611a5957611a586123ac565b5b611a65858286016117f6565b92509250509250929050565b600060208284031215611a8757611a866123b1565b5b600082013567ffffffffffffffff811115611aa557611aa46123ac565b5b611ab1848285016118d6565b91505092915050565b600060208284031215611ad057611acf6123b1565b5b600082013567ffffffffffffffff811115611aee57611aed6123ac565b5b611afa8482850161197d565b91505092915050565b611b14611b0f826120a8565b61229f565b82525050565b6000611b268385611f54565b9350611b338385846121b9565b82840190509392505050565b6000611b4a82611f38565b611b548185611f43565b9350611b648185602086016121c8565b611b6d816123b6565b840191505092915050565b6000611b8382611f38565b611b8d8185611f54565b9350611b9d8185602086016121c8565b80840191505092915050565b6000611bb6600983611f54565b9150611bc1826123d4565b600982019050919050565b6000611bd9600483611f54565b9150611be4826123fd565b600482019050919050565b6000611bfc602883611f54565b9150611c0782612426565b602882019050919050565b6000611c1f600583611f54565b9150611c2a82612475565b600582019050919050565b6000611c42601183611f54565b9150611c4d8261249e565b601182019050919050565b6000611c65600d83611f54565b9150611c70826124c7565b600d82019050919050565b6000611c878286611b03565b600182019150611c978285611b03565b600182019150611ca78284611b03565b600182019150819050949350505050565b6000611cc48285611b78565b9150611cd08284611b78565b91508190509392505050565b6000611ce88286611b78565b9150611cf48285611b78565b9150611d008284611b78565b9150819050949350505050565b6000611d198288611b78565b9150611d2482611bef565b9150611d31828688611b1a565b9150611d3c82611bcc565b9150611d488285611b78565b9150611d548284611b78565b91508190509695505050505050565b6000611d6f8288611b78565b9150611d7a82611c58565b9150611d868287611b78565b9150611d9182611c35565b9150611d9d8286611b78565b9150611da882611c12565b9150611db48285611b78565b9150611dbf82611ba9565b9150611dcb8284611b78565b9150611dd682611bcc565b91508190509695505050505050565b60006020820190508181036000830152611dff8184611b3f565b905092915050565b60008083356001602003843603038112611e2457611e23612393565b5b80840192508235915067ffffffffffffffff821115611e4657611e45612384565b5b602083019250600182023603831315611e6257611e616123a2565b5b509250929050565b6000611e74611e85565b9050611e8082826121fb565b919050565b6000604051905090565b600067ffffffffffffffff821115611eaa57611ea9612336565b5b602082029050602081019050919050565b600067ffffffffffffffff821115611ed657611ed5612336565b5b611edf826123b6565b9050602081019050919050565b600067ffffffffffffffff821115611f0757611f06612336565b5b611f10826123b6565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000611f6a82612100565b9150611f7583612100565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611faa57611fa96122a9565b5b828201905092915050565b6000611fc082612100565b9150611fcb83612100565b925082611fdb57611fda6122d8565b5b828204905092915050565b6000611ff182612100565b9150611ffc83612100565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612035576120346122a9565b5b828202905092915050565b600061204b82612100565b915061205683612100565b925082821015612069576120686122a9565b5b828203905092915050565b600061207f8261210a565b915061208a8361210a565b92508282101561209d5761209c6122a9565b5b828203905092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffff000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600060ff82169050919050565b60006121243684846116e4565b905092915050565b600061213782611f2d565b8261214184611f1d565b905061214c81612365565b9250600382101561218c576121877fffffff0000000000000000000000000000000000000000000000000000000000836003036008026123c7565b831692505b5050919050565b600061219f36836118f5565b9050919050565b60006121b2368361199c565b9050919050565b82818337600083830152505050565b60005b838110156121e65780820151818401526020810190506121cb565b838111156121f5576000848401525b50505050565b612204826123b6565b810181811067ffffffffffffffff8211171561222357612222612336565b5b80604052505050565b600061223782612100565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561226a576122696122a9565b5b600182019050919050565b60006122808261210a565b915060ff821415612294576122936122a9565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061237182516120d4565b80915050919050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b600082821b905092915050565b7f222066696c6c3d22230000000000000000000000000000000000000000000000600082015250565b7f22202f3e00000000000000000000000000000000000000000000000000000000600082015250565b7f3c726563742077696474683d223130302522206865696768743d22313030252260008201527f2066696c6c3d2223000000000000000000000000000000000000000000000000602082015250565b7f2220793d22000000000000000000000000000000000000000000000000000000600082015250565b7f22206865696768743d2231302220783d22000000000000000000000000000000600082015250565b7f3c726563742077696474683d220000000000000000000000000000000000000060008201525056fe3c7376672077696474683d2233323022206865696768743d22333230222076696577426f783d2230203020333230203332302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222073686170652d72656e646572696e673d2263726973704564676573223ea2646970667358221220a80377f6024c3905539b92cc902c991b48d05e8383ec0d3a9fc704a7839f9c4864736f6c63430008060033