false
false
5713000

Contract Address Details

0xc928c8e48647c8b0ce550C2352087B1cF5c6111e

Contract Name
TokenManagerProxy
Creator
0xdb1388–e98779 at 0x2d61d8–bfd11b
Implementation
TokenManagerDelegateV2 | 0xea0c753d391761bbdb090ac93102a4d1bdcbee2b
Balance
0 PUNDIAI
Tokens
Fetching tokens...
Transactions
11 Transactions
Transfers
0 Transfers
Gas Used
1,834,289
Last Balance Update
22424960
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
TokenManagerProxy




Optimization enabled
true
Compiler version
v0.4.26+commit.4563c3fc




Optimization runs
200
EVM Version
byzantium




Verified at
2023-04-19T10:23:54.953677Z

Contract source code

// File: contracts/components/Proxy.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity ^0.4.24;

/**
 * Math operations with safety checks
 */


contract Proxy {

    event Upgraded(address indexed implementation);

    address internal _implementation;

    function implementation() public view returns (address) {
        return _implementation;
    }

    function () external payable {
        address _impl = _implementation;
        require(_impl != address(0), "implementation contract not set");

        assembly {
            let ptr := mload(0x40)
            calldatacopy(ptr, 0, calldatasize)
            let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0)
            let size := returndatasize
            returndatacopy(ptr, 0, size)

            switch result
            case 0 { revert(ptr, size) }
            default { return(ptr, size) }
        }
    }
}
// File: contracts/lib/BasicStorageLib.sol

pragma solidity ^0.4.24;

library BasicStorageLib {

    struct UintData {
        mapping(bytes => mapping(bytes => uint))           _storage;
    }

    struct BoolData {
        mapping(bytes => mapping(bytes => bool))           _storage;
    }

    struct AddressData {
        mapping(bytes => mapping(bytes => address))        _storage;
    }

    struct BytesData {
        mapping(bytes => mapping(bytes => bytes))          _storage;
    }

    struct StringData {
        mapping(bytes => mapping(bytes => string))         _storage;
    }

    /* uintStorage */

    function setStorage(UintData storage self, bytes memory key, bytes memory innerKey, uint value) internal {
        self._storage[key][innerKey] = value;
    }

    function getStorage(UintData storage self, bytes memory key, bytes memory innerKey) internal view returns (uint) {
        return self._storage[key][innerKey];
    }

    function delStorage(UintData storage self, bytes memory key, bytes memory innerKey) internal {
        delete self._storage[key][innerKey];
    }

    /* boolStorage */

    function setStorage(BoolData storage self, bytes memory key, bytes memory innerKey, bool value) internal {
        self._storage[key][innerKey] = value;
    }

    function getStorage(BoolData storage self, bytes memory key, bytes memory innerKey) internal view returns (bool) {
        return self._storage[key][innerKey];
    }

    function delStorage(BoolData storage self, bytes memory key, bytes memory innerKey) internal {
        delete self._storage[key][innerKey];
    }

    /* addressStorage */

    function setStorage(AddressData storage self, bytes memory key, bytes memory innerKey, address value) internal {
        self._storage[key][innerKey] = value;
    }

    function getStorage(AddressData storage self, bytes memory key, bytes memory innerKey) internal view returns (address) {
        return self._storage[key][innerKey];
    }

    function delStorage(AddressData storage self, bytes memory key, bytes memory innerKey) internal {
        delete self._storage[key][innerKey];
    }

    /* bytesStorage */

    function setStorage(BytesData storage self, bytes memory key, bytes memory innerKey, bytes memory value) internal {
        self._storage[key][innerKey] = value;
    }

    function getStorage(BytesData storage self, bytes memory key, bytes memory innerKey) internal view returns (bytes memory) {
        return self._storage[key][innerKey];
    }

    function delStorage(BytesData storage self, bytes memory key, bytes memory innerKey) internal {
        delete self._storage[key][innerKey];
    }

    /* stringStorage */

    function setStorage(StringData storage self, bytes memory key, bytes memory innerKey, string memory value) internal {
        self._storage[key][innerKey] = value;
    }

    function getStorage(StringData storage self, bytes memory key, bytes memory innerKey) internal view returns (string memory) {
        return self._storage[key][innerKey];
    }

    function delStorage(StringData storage self, bytes memory key, bytes memory innerKey) internal {
        delete self._storage[key][innerKey];
    }

}
// File: contracts/components/BasicStorage.sol

pragma solidity ^0.4.24;


contract BasicStorage {
    /************************************************************
     **
     ** VARIABLES
     **
     ************************************************************/

    //// basic variables
    using BasicStorageLib for BasicStorageLib.UintData;
    using BasicStorageLib for BasicStorageLib.BoolData;
    using BasicStorageLib for BasicStorageLib.AddressData;
    using BasicStorageLib for BasicStorageLib.BytesData;
    using BasicStorageLib for BasicStorageLib.StringData;

    BasicStorageLib.UintData    internal uintData;
    BasicStorageLib.BoolData    internal boolData;
    BasicStorageLib.AddressData internal addressData;
    BasicStorageLib.BytesData   internal bytesData;
    BasicStorageLib.StringData  internal stringData;
}
// File: contracts/tokenManager/TokenManagerStorage.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity 0.4.26;


contract TokenManagerStorage is BasicStorage {
    /************************************************************
     **
     ** STRUCTURE DEFINATIONS
     **
     ************************************************************/

    struct AncestorInfo {
      bytes   account;
      string  name;
      string  symbol;
      uint8   decimals;
      uint    chainID;
    }

    struct TokenPairInfo {
      AncestorInfo aInfo;               /// TODO:
      uint      fromChainID;            /// index in coinType.txt; e.g. eth=60, etc=61, wan=5718350
      bytes     fromAccount;            /// from address
      uint      toChainID;              ///
      bytes     toAccount;              /// to token address
    }
    
    struct TokenPairInfoFull {
      uint      id;
      AncestorInfo aInfo;
      uint      fromChainID;
      bytes     fromAccount;
      uint      toChainID;
      bytes     toAccount;
    }


    /************************************************************
     **
     ** VARIABLES
     **
     ************************************************************/

    /// total amount of TokenPair instance
    uint public totalTokenPairs = 0;

    /// a map from a sequence ID to token pair
    mapping(uint => TokenPairInfo) public mapTokenPairInfo;
    // index -> tokenPairId
    mapping(uint => uint) public mapTokenPairIndex;
}
// File: contracts/components/Owned.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity ^0.4.24;

/// @dev `Owned` is a base level contract that assigns an `owner` that can be
///  later changed
contract Owned {

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /// @dev `owner` is the only address that can call a function with this
    /// modifier
    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }

    address public owner;

    /// @notice The Constructor assigns the message sender to be `owner`
    constructor() public {
        owner = msg.sender;
    }

    address public newOwner;

    function transferOwner(address _newOwner) public onlyOwner {
        require(_newOwner != address(0), "New owner is the zero address");
        emit OwnershipTransferred(owner, _newOwner);
        owner = _newOwner;
    }

    /// @notice `owner` can step down and assign some other address to this role
    /// @param _newOwner The address of the new owner. 0x0 can be used to create
    ///  an unowned neutral vault, however that cannot be undone
    function changeOwner(address _newOwner) public onlyOwner {
        newOwner = _newOwner;
    }

    function acceptOwnership() public {
        if (msg.sender == newOwner) {
            owner = newOwner;
        }
    }

    function renounceOwnership() public onlyOwner {
        owner = address(0);
    }
}

// File: contracts/components/Admin.sol

pragma solidity 0.4.26;


contract Admin is Owned {
    mapping(address => bool) public mapAdmin;

    event AddAdmin(address admin);
    event RemoveAdmin(address admin);

    modifier onlyAdmin() {
        require(mapAdmin[msg.sender], "not admin");
        _;
    }

    function addAdmin(
        address admin
    )
        external
        onlyOwner
    {
        mapAdmin[admin] = true;

        emit AddAdmin(admin);
    }

    function removeAdmin(
        address admin
    )
        external
        onlyOwner
    {
        delete mapAdmin[admin];

        emit RemoveAdmin(admin);
    }
}
// File: contracts/tokenManager/TokenManagerProxy.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity 0.4.26;

/**
 * Math operations with safety checks
 */




contract TokenManagerProxy is TokenManagerStorage, Admin, Proxy {
    /**
    *
    * MANIPULATIONS
    *
    */

    /// @notice                           function for setting or upgrading TokenManagerDelegate address by owner
    /// @param impl                       TokenManagerDelegate contract address
    function upgradeTo(address impl) public onlyOwner {
        require(impl != address(0), "Cannot upgrade to invalid address");
        require(impl != _implementation, "Cannot upgrade to the same implementation");
        _implementation = impl;
        emit Upgraded(impl);
    }
}
        

Contract ABI

[{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"removeAdmin","inputs":[{"type":"address","name":"admin"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"upgradeTo","inputs":[{"type":"address","name":"impl"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferOwner","inputs":[{"type":"address","name":"_newOwner"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"mapTokenPairIndex","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"implementation","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"tuple","name":"aInfo","components":[{"type":"bytes","name":"account"},{"type":"string","name":"name"},{"type":"string","name":"symbol"},{"type":"uint8","name":"decimals"},{"type":"uint256","name":"chainID"}]},{"type":"uint256","name":"fromChainID"},{"type":"bytes","name":"fromAccount"},{"type":"uint256","name":"toChainID"},{"type":"bytes","name":"toAccount"}],"name":"mapTokenPairInfo","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"addAdmin","inputs":[{"type":"address","name":"admin"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"renounceOwnership","inputs":[],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"acceptOwnership","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"changeOwner","inputs":[{"type":"address","name":"_newOwner"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"totalTokenPairs","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"newOwner","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"mapAdmin","inputs":[{"type":"address","name":""}],"constant":true},{"type":"fallback","stateMutability":"payable","payable":true},{"type":"event","name":"Upgraded","inputs":[{"type":"address","name":"implementation","indexed":true}],"anonymous":false},{"type":"event","name":"AddAdmin","inputs":[{"type":"address","name":"admin","indexed":false}],"anonymous":false},{"type":"event","name":"RemoveAdmin","inputs":[{"type":"address","name":"admin","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false}]
              

Contract Creation Code

0x6080604052600060055560088054600160a060020a03191633179055610d2c8061002a6000396000f3006080604052600436106100cf5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631785f53c81146101575780633659cfe61461017a5780634fb2e45d1461019b57806358a007fb146101bc5780635c60da1b146101e65780635d2e9ead146102175780637048027514610322578063715018a61461034357806379ba5097146103585780638da5cb5b1461036d578063a6f9dae114610382578063d0ad718d146103a3578063d4ee1d90146103b8578063d51dddd7146103cd575b600b54600160a060020a0316801515610132576040805160e560020a62461bcd02815260206004820152601f60248201527f696d706c656d656e746174696f6e20636f6e7472616374206e6f742073657400604482015290519081900360640190fd5b60405136600082376000803683855af43d806000843e818015610153578184f35b8184fd5b34801561016357600080fd5b50610178600160a060020a0360043516610402565b005b34801561018657600080fd5b50610178600160a060020a03600435166104aa565b3480156101a757600080fd5b50610178600160a060020a0360043516610663565b3480156101c857600080fd5b506101d460043561077c565b60408051918252519081900360200190f35b3480156101f257600080fd5b506101fb61078e565b60408051600160a060020a039092168252519081900360200190f35b34801561022357600080fd5b5061022f60043561079d565b604051808681526020018581526020018060200184815260200180602001838103835286818151815260200191508051906020019080838360005b8381101561028257818101518382015260200161026a565b50505050905090810190601f1680156102af5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156102e25781810151838201526020016102ca565b50505050905090810190601f16801561030f5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b34801561032e57600080fd5b50610178600160a060020a0360043516610ac9565b34801561034f57600080fd5b50610178610b74565b34801561036457600080fd5b50610178610be3565b34801561037957600080fd5b506101fb610c28565b34801561038e57600080fd5b50610178600160a060020a0360043516610c37565b3480156103af57600080fd5b506101d4610cb6565b3480156103c457600080fd5b506101fb610cbc565b3480156103d957600080fd5b506103ee600160a060020a0360043516610ccb565b604080519115158252519081900360200190f35b600854600160a060020a03163314610452576040805160e560020a62461bcd0281526020600482015260096024820152600080516020610ce1833981519152604482015290519081900360640190fd5b600160a060020a0381166000818152600a6020908152604091829020805460ff19169055815192835290517f753f40ca3312b2408759a67875b367955e7baa221daf08aa3d643d96202ac12b9281900390910190a150565b600854600160a060020a031633146104fa576040805160e560020a62461bcd0281526020600482015260096024820152600080516020610ce1833981519152604482015290519081900360640190fd5b600160a060020a0381161515610580576040805160e560020a62461bcd02815260206004820152602160248201527f43616e6e6f74207570677261646520746f20696e76616c69642061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b54600160a060020a038281169116141561060c576040805160e560020a62461bcd02815260206004820152602960248201527f43616e6e6f74207570677261646520746f207468652073616d6520696d706c6560448201527f6d656e746174696f6e0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b600854600160a060020a031633146106b3576040805160e560020a62461bcd0281526020600482015260096024820152600080516020610ce1833981519152604482015290519081900360640190fd5b600160a060020a0381161515610713576040805160e560020a62461bcd02815260206004820152601d60248201527f4e6577206f776e657220697320746865207a65726f2061646472657373000000604482015290519081900360640190fd5b600854604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60076020526000908152604090205481565b600b54600160a060020a031690565b6006602090815260009182526040918290208251815460026001821615610100026000190190911604601f8101849004909302810160c090810190945260a0810183815291939092849284929091849184018282801561083e5780601f106108135761010080835404028352916020019161083e565b820191906000526020600020905b81548152906001019060200180831161082157829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108e05780601f106108b5576101008083540402835291602001916108e0565b820191906000526020600020905b8154815290600101906020018083116108c357829003601f168201915b5050509183525050600282810180546040805160206001841615610100026000190190931694909404601f810183900483028501830190915280845293810193908301828280156109725780601f1061094757610100808354040283529160200191610972565b820191906000526020600020905b81548152906001019060200180831161095557829003601f168201915b5050509183525050600382015460ff1660208083019190915260049092015460409182015260058401546006850180548351601f60026000196001851615610100020190931692909204918201869004860281018601909452808452949591949193909190830182828015610a285780601f106109fd57610100808354040283529160200191610a28565b820191906000526020600020905b815481529060010190602001808311610a0b57829003601f168201915b50505050600783015460088401805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529596939593945090830182828015610abf5780601f10610a9457610100808354040283529160200191610abf565b820191906000526020600020905b815481529060010190602001808311610aa257829003601f168201915b5050505050905085565b600854600160a060020a03163314610b19576040805160e560020a62461bcd0281526020600482015260096024820152600080516020610ce1833981519152604482015290519081900360640190fd5b600160a060020a0381166000818152600a6020908152604091829020805460ff19166001179055815192835290517fad6de4452a631e641cb59902236607946ce9272b9b981f2f80e8d129cb9084ba9281900390910190a150565b600854600160a060020a03163314610bc4576040805160e560020a62461bcd0281526020600482015260096024820152600080516020610ce1833981519152604482015290519081900360640190fd5b6008805473ffffffffffffffffffffffffffffffffffffffff19169055565b600954600160a060020a0316331415610c26576009546008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555b565b600854600160a060020a031681565b600854600160a060020a03163314610c87576040805160e560020a62461bcd0281526020600482015260096024820152600080516020610ce1833981519152604482015290519081900360640190fd5b6009805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60055481565b600954600160a060020a031681565b600a6020526000908152604090205460ff168156004e6f74206f776e65720000000000000000000000000000000000000000000000a165627a7a72305820899b28e36043132f46d6a341638b21cee3f2c434aebcd414d516be63cdb11ca30029

Deployed ByteCode

0x6080604052600436106100cf5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631785f53c81146101575780633659cfe61461017a5780634fb2e45d1461019b57806358a007fb146101bc5780635c60da1b146101e65780635d2e9ead146102175780637048027514610322578063715018a61461034357806379ba5097146103585780638da5cb5b1461036d578063a6f9dae114610382578063d0ad718d146103a3578063d4ee1d90146103b8578063d51dddd7146103cd575b600b54600160a060020a0316801515610132576040805160e560020a62461bcd02815260206004820152601f60248201527f696d706c656d656e746174696f6e20636f6e7472616374206e6f742073657400604482015290519081900360640190fd5b60405136600082376000803683855af43d806000843e818015610153578184f35b8184fd5b34801561016357600080fd5b50610178600160a060020a0360043516610402565b005b34801561018657600080fd5b50610178600160a060020a03600435166104aa565b3480156101a757600080fd5b50610178600160a060020a0360043516610663565b3480156101c857600080fd5b506101d460043561077c565b60408051918252519081900360200190f35b3480156101f257600080fd5b506101fb61078e565b60408051600160a060020a039092168252519081900360200190f35b34801561022357600080fd5b5061022f60043561079d565b604051808681526020018581526020018060200184815260200180602001838103835286818151815260200191508051906020019080838360005b8381101561028257818101518382015260200161026a565b50505050905090810190601f1680156102af5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156102e25781810151838201526020016102ca565b50505050905090810190601f16801561030f5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b34801561032e57600080fd5b50610178600160a060020a0360043516610ac9565b34801561034f57600080fd5b50610178610b74565b34801561036457600080fd5b50610178610be3565b34801561037957600080fd5b506101fb610c28565b34801561038e57600080fd5b50610178600160a060020a0360043516610c37565b3480156103af57600080fd5b506101d4610cb6565b3480156103c457600080fd5b506101fb610cbc565b3480156103d957600080fd5b506103ee600160a060020a0360043516610ccb565b604080519115158252519081900360200190f35b600854600160a060020a03163314610452576040805160e560020a62461bcd0281526020600482015260096024820152600080516020610ce1833981519152604482015290519081900360640190fd5b600160a060020a0381166000818152600a6020908152604091829020805460ff19169055815192835290517f753f40ca3312b2408759a67875b367955e7baa221daf08aa3d643d96202ac12b9281900390910190a150565b600854600160a060020a031633146104fa576040805160e560020a62461bcd0281526020600482015260096024820152600080516020610ce1833981519152604482015290519081900360640190fd5b600160a060020a0381161515610580576040805160e560020a62461bcd02815260206004820152602160248201527f43616e6e6f74207570677261646520746f20696e76616c69642061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b54600160a060020a038281169116141561060c576040805160e560020a62461bcd02815260206004820152602960248201527f43616e6e6f74207570677261646520746f207468652073616d6520696d706c6560448201527f6d656e746174696f6e0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b600854600160a060020a031633146106b3576040805160e560020a62461bcd0281526020600482015260096024820152600080516020610ce1833981519152604482015290519081900360640190fd5b600160a060020a0381161515610713576040805160e560020a62461bcd02815260206004820152601d60248201527f4e6577206f776e657220697320746865207a65726f2061646472657373000000604482015290519081900360640190fd5b600854604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60076020526000908152604090205481565b600b54600160a060020a031690565b6006602090815260009182526040918290208251815460026001821615610100026000190190911604601f8101849004909302810160c090810190945260a0810183815291939092849284929091849184018282801561083e5780601f106108135761010080835404028352916020019161083e565b820191906000526020600020905b81548152906001019060200180831161082157829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108e05780601f106108b5576101008083540402835291602001916108e0565b820191906000526020600020905b8154815290600101906020018083116108c357829003601f168201915b5050509183525050600282810180546040805160206001841615610100026000190190931694909404601f810183900483028501830190915280845293810193908301828280156109725780601f1061094757610100808354040283529160200191610972565b820191906000526020600020905b81548152906001019060200180831161095557829003601f168201915b5050509183525050600382015460ff1660208083019190915260049092015460409182015260058401546006850180548351601f60026000196001851615610100020190931692909204918201869004860281018601909452808452949591949193909190830182828015610a285780601f106109fd57610100808354040283529160200191610a28565b820191906000526020600020905b815481529060010190602001808311610a0b57829003601f168201915b50505050600783015460088401805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529596939593945090830182828015610abf5780601f10610a9457610100808354040283529160200191610abf565b820191906000526020600020905b815481529060010190602001808311610aa257829003601f168201915b5050505050905085565b600854600160a060020a03163314610b19576040805160e560020a62461bcd0281526020600482015260096024820152600080516020610ce1833981519152604482015290519081900360640190fd5b600160a060020a0381166000818152600a6020908152604091829020805460ff19166001179055815192835290517fad6de4452a631e641cb59902236607946ce9272b9b981f2f80e8d129cb9084ba9281900390910190a150565b600854600160a060020a03163314610bc4576040805160e560020a62461bcd0281526020600482015260096024820152600080516020610ce1833981519152604482015290519081900360640190fd5b6008805473ffffffffffffffffffffffffffffffffffffffff19169055565b600954600160a060020a0316331415610c26576009546008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555b565b600854600160a060020a031681565b600854600160a060020a03163314610c87576040805160e560020a62461bcd0281526020600482015260096024820152600080516020610ce1833981519152604482015290519081900360640190fd5b6009805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60055481565b600954600160a060020a031681565b600a6020526000908152604090205460ff168156004e6f74206f776e65720000000000000000000000000000000000000000000000a165627a7a72305820899b28e36043132f46d6a341638b21cee3f2c434aebcd414d516be63cdb11ca30029