false
false
0
The new Blockscout UI is now open source! Learn how to deploy it here

Contract Address Details

0xbb6ECE56E46dd88237f8146B1dC24e99222F0366

Contract Name
Copyright
Creator
0x9d71fb–e005bc at 0x95320f–5cdd99
Balance
0 ETH
Tokens
Fetching tokens...
Transactions
2 Transactions
Transfers
0 Transfers
Gas Used
894,682
Last Balance Update
4963725
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Copyright




Optimization enabled
true
Compiler version
v0.8.9+commit.e5eed63a




Optimization runs
200
Verified at
2023-04-22T09:48:21.270233Z

contracts/Copyright.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./CopyrightType.sol";

contract Copyright {
    address public immutable owner;

    mapping(bytes32 => License) public license; // licenseUriHash - License
    mapping(address => bytes32[]) public licensorLicenseList; // licensorAddress - licenseUriHash list

    mapping(bytes32 => SingleTrackInfo) public singleTrackInfo; // musicUriHash - SingleTrackInfo
    mapping(address => bytes32[]) public singerTrackList; // singerAddress - musicUriHash list

    mapping(bytes32 => bytes32) public trackLicenseMapping; // musicUriHash - licenseUriHash

    mapping(bytes32 => bool) public trackValidation; // musicUriHash - isValid boolean

    event RegisterTrack(bytes32 musicUriHash, bytes32 licenseUriHash);
    event TrackValidationUpdate(bytes32 musicUriHash, bool isValid);

    constructor() {
        owner = msg.sender;
    }

    modifier singerOnly(address[] memory singerList) {
        bool isAuthorized = false;
        for (uint256 i = 0; i < singerList.length; i++) {
            if (singerList[i] == msg.sender) {
                isAuthorized = true;
                break;
            }
        }
        require(isAuthorized, "Caller not singer");
        _;
    }

    modifier ownerOnly() {
        require(msg.sender == owner, "Caller not owner");
        _;
    }

    function registerTrack(
        License memory _license,
        SingleTrackInfo memory _trackInfo
    ) external singerOnly(_trackInfo.singerWalletAddressList) {
        // generate musicUriHash
        bytes32 musicUriHash = keccak256(abi.encodePacked(_trackInfo.musicUri));

        // generate licenseUriHash
        bytes32 licenseUriHash = keccak256(
            abi.encodePacked(_license.licenseUri)
        );

        // check track info is not registered yet
        require(
            bytes(singleTrackInfo[musicUriHash].musicUri).length == 0,
            "musicUriHash registered"
        );

        // check license is not registered yet
        require(
            bytes(license[licenseUriHash].licenseUri).length == 0,
            "licenseUriHash registered"
        );

        singleTrackInfo[musicUriHash] = _trackInfo;
        license[licenseUriHash] = _license;
        trackLicenseMapping[musicUriHash] = licenseUriHash;

        trackValidation[musicUriHash] = true;

        addSingerTrackList(musicUriHash, _trackInfo.singerWalletAddressList);
        addLicensorLicenseList(licenseUriHash, _license.licensorWalletAddress);

        emit RegisterTrack(musicUriHash, licenseUriHash);
    }

    function addSingerTrackList(
        bytes32 musicUriHash,
        address[] memory singerList
    ) private {
        for (uint256 i = 0; i < singerList.length; i++) {
            singerTrackList[singerList[i]].push(musicUriHash);
        }
    }

    function addLicensorLicenseList(bytes32 licenseUriHash, address licensor)
        private
    {
        licensorLicenseList[licensor].push(licenseUriHash);
    }

    function getSingerTrackListLength(address singerWalletAddress)
        external
        view
        returns (uint256)
    {
        return singerTrackList[singerWalletAddress].length;
    }

    function getLicensorLicenseListLength(address licensorWalletAddress)
        external
        view
        returns (uint256)
    {
        return licensorLicenseList[licensorWalletAddress].length;
    }

    function manageTrackValidation(bytes32 musicUriHash, bool isValid)
        external
        ownerOnly
    {
        trackValidation[musicUriHash] = isValid;

        emit TrackValidationUpdate(musicUriHash, isValid);
    }

    function isTrackValidAndNotExpired(bytes32 musicUriHash)
        external
        view
        returns (bool)
    {
        bytes32 licenseUriHash = trackLicenseMapping[musicUriHash];
        require(licenseUriHash != bytes32(0), "license not found");

        bool isLicenseExpiredResult = isLicenseExpired(licenseUriHash);

        return trackValidation[musicUriHash] && !isLicenseExpiredResult;
    }

    function isLicenseExpired(bytes32 licenseUriHash)
        public
        view
        returns (bool)
    {
        require(
            bytes(license[licenseUriHash].licenseUri).length != 0,
            "license not found"
        );

        uint256 licenseExpirationTimestamp = license[licenseUriHash]
            .startTimeStamp + license[licenseUriHash].durationInSecond;

        return block.timestamp > licenseExpirationTimestamp;
    }
}
        

contracts/CopyrightType.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

struct License {
    string licenseUri;
    uint256 startTimeStamp;
    uint256 durationInSecond;
    address licensorWalletAddress;
}

struct SingleTrackInfo {
    string musicUri;
    string coverUri;
    address[] singerWalletAddressList;
    string title;
    TrackGenre genre;
    uint16 bpm;
}

enum TrackGenre {
  POPULAR_MUSCI,
  HIP_HOP_MUSIC,
  BULES,
  SOUL_MUSIC,
  REGGAE,
  ELECTRONIC_MUSIC,
  ROCK,
  JAZZ,
  CLASSICAL_MUSIC,
  FUNK,
  DISCO,
  HOUSE_MUSIC,
  OPERA,
  ELECTRO,
  OTHERS
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"RegisterTrack","inputs":[{"type":"bytes32","name":"musicUriHash","internalType":"bytes32","indexed":false},{"type":"bytes32","name":"licenseUriHash","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"TrackValidationUpdate","inputs":[{"type":"bytes32","name":"musicUriHash","internalType":"bytes32","indexed":false},{"type":"bool","name":"isValid","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getLicensorLicenseListLength","inputs":[{"type":"address","name":"licensorWalletAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getSingerTrackListLength","inputs":[{"type":"address","name":"singerWalletAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isLicenseExpired","inputs":[{"type":"bytes32","name":"licenseUriHash","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isTrackValidAndNotExpired","inputs":[{"type":"bytes32","name":"musicUriHash","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"licenseUri","internalType":"string"},{"type":"uint256","name":"startTimeStamp","internalType":"uint256"},{"type":"uint256","name":"durationInSecond","internalType":"uint256"},{"type":"address","name":"licensorWalletAddress","internalType":"address"}],"name":"license","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"licensorLicenseList","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manageTrackValidation","inputs":[{"type":"bytes32","name":"musicUriHash","internalType":"bytes32"},{"type":"bool","name":"isValid","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerTrack","inputs":[{"type":"tuple","name":"_license","internalType":"struct License","components":[{"type":"string","name":"licenseUri","internalType":"string"},{"type":"uint256","name":"startTimeStamp","internalType":"uint256"},{"type":"uint256","name":"durationInSecond","internalType":"uint256"},{"type":"address","name":"licensorWalletAddress","internalType":"address"}]},{"type":"tuple","name":"_trackInfo","internalType":"struct SingleTrackInfo","components":[{"type":"string","name":"musicUri","internalType":"string"},{"type":"string","name":"coverUri","internalType":"string"},{"type":"address[]","name":"singerWalletAddressList","internalType":"address[]"},{"type":"string","name":"title","internalType":"string"},{"type":"uint8","name":"genre","internalType":"enum TrackGenre"},{"type":"uint16","name":"bpm","internalType":"uint16"}]}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"singerTrackList","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"musicUri","internalType":"string"},{"type":"string","name":"coverUri","internalType":"string"},{"type":"string","name":"title","internalType":"string"},{"type":"uint8","name":"genre","internalType":"enum TrackGenre"},{"type":"uint16","name":"bpm","internalType":"uint16"}],"name":"singleTrackInfo","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"trackLicenseMapping","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"trackValidation","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]}]
              

Contract Creation Code

0x60a060405234801561001057600080fd5b503360805260805161122761003760003960008181610215015261079e01526112276000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806358bdf27f1161008c57806381cfa3b91161006657806381cfa3b9146101e75780638da5cb5b14610210578063a8ab9fc41461024f578063ea7a23a31461026257600080fd5b806358bdf27f1461019857806371689ed1146101c1578063742b7741146101d457600080fd5b80630444e110146100d457806306e3844d146100fc57806313d8f6191461012a5780633d0bcfa91461013f5780634024db80146101625780634c88662a14610185575b600080fd5b6100e76100e2366004610c2a565b610286565b60405190151581526020015b60405180910390f35b61011c61010a366004610c2a565b60046020526000908152604090205481565b6040519081526020016100f3565b61013d610138366004610ee5565b61030d565b005b6100e761014d366004610c2a565b60056020526000908152604090205460ff1681565b610175610170366004610c2a565b6106a7565b6040516100f39493929190610ff8565b61011c610193366004611030565b610762565b61011c6101a636600461105a565b6001600160a01b031660009081526003602052604090205490565b61013d6101cf36600461107c565b610793565b6100e76101e2366004610c2a565b610857565b61011c6101f536600461105a565b6001600160a01b031660009081526001602052604090205490565b6102377f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100f3565b61011c61025d366004611030565b6108e0565b610275610270366004610c2a565b6108fc565b6040516100f39594939291906110c7565b600081815260046020526040812054806102db5760405162461bcd60e51b81526020600482015260116024820152701b1a58d95b9cd9481b9bdd08199bdd5b99607a1b60448201526064015b60405180910390fd5b60006102e682610857565b60008581526005602052604090205490915060ff168015610305575080155b949350505050565b80604001516000805b825181101561036d57336001600160a01b031683828151811061033b5761033b61113b565b60200260200101516001600160a01b0316141561035b576001915061036d565b8061036581611167565b915050610316565b50806103af5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9103737ba1039b4b733b2b960791b60448201526064016102d2565b82516040516000916103c391602001611182565b60408051601f1981840301815290829052805160209182012087519093506000926103ee9201611182565b60408051601f1981840301815291815281516020928301206000858152600290935291208054919250906104219061119e565b1590506104705760405162461bcd60e51b815260206004820152601760248201527f6d7573696355726948617368207265676973746572656400000000000000000060448201526064016102d2565b600081815260208190526040902080546104899061119e565b1590506104d85760405162461bcd60e51b815260206004820152601960248201527f6c6963656e73655572694861736820726567697374657265640000000000000060448201526064016102d2565b60008281526002602090815260409091208651805188936104fd928492910190610b3c565b5060208281015180516105169260018501920190610b3c565b5060408201518051610532916002840191602090910190610bc0565b506060820151805161054e916003840191602090910190610b3c565b50608082015160048201805460ff1916600183600e811115610572576105726110b1565b021790555060a091909101516004909101805461ffff9092166101000262ffff00199092169190911790556000818152602081815260409091208751805189936105c0928492910190610b3c565b506020828101516001838101919091556040808501516002850155606090940151600390930180546001600160a01b0319166001600160a01b03909416939093179092556000858152600482528381208590556005909152829020805460ff19169091179055850151610634908390610acb565b6106668187606001516001600160a01b0316600090815260016020818152604083208054928301815583529091200155565b60408051838152602081018390527fb67d8104e28f72b24d5e1f1b3412956f7c2ad9942d467b2cb9df21e6f412a13c910160405180910390a1505050505050565b6000602081905290815260409020805481906106c29061119e565b80601f01602080910402602001604051908101604052809291908181526020018280546106ee9061119e565b801561073b5780601f106107105761010080835404028352916020019161073b565b820191906000526020600020905b81548152906001019060200180831161071e57829003601f168201915b5050505060018301546002840154600390940154929390929091506001600160a01b031684565b6001602052816000526040600020818154811061077e57600080fd5b90600052602060002001600091509150505481565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107fe5760405162461bcd60e51b815260206004820152601060248201526f21b0b63632b9103737ba1037bbb732b960811b60448201526064016102d2565b600082815260056020908152604091829020805460ff19168415159081179091558251858152918201527fca7e640d2d483c720a548e3a630ccd7ca04b55ec7ddcd0b5fea6493c52f89b67910160405180910390a15050565b600081815260208190526040812080546108709061119e565b151590506108b45760405162461bcd60e51b81526020600482015260116024820152701b1a58d95b9cd9481b9bdd08199bdd5b99607a1b60448201526064016102d2565b600082815260208190526040812060028101546001909101546108d791906111d9565b42119392505050565b6003602052816000526040600020818154811061077e57600080fd5b6002602052600090815260409020805481906109179061119e565b80601f01602080910402602001604051908101604052809291908181526020018280546109439061119e565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b5050505050908060010180546109a59061119e565b80601f01602080910402602001604051908101604052809291908181526020018280546109d19061119e565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505090806003018054610a339061119e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f9061119e565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050506004909301549192505060ff81169061ffff6101009091041685565b60005b8151811015610b375760036000838381518110610aed57610aed61113b565b6020908102919091018101516001600160a01b0316825281810192909252604001600090812080546001810182559082529190200183905580610b2f81611167565b915050610ace565b505050565b828054610b489061119e565b90600052602060002090601f016020900481019282610b6a5760008555610bb0565b82601f10610b8357805160ff1916838001178555610bb0565b82800160010185558215610bb0579182015b82811115610bb0578251825591602001919060010190610b95565b50610bbc929150610c15565b5090565b828054828255906000526020600020908101928215610bb0579160200282015b82811115610bb057825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190610be0565b5b80821115610bbc5760008155600101610c16565b600060208284031215610c3c57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715610c7c57610c7c610c43565b60405290565b6040516080810167ffffffffffffffff81118282101715610c7c57610c7c610c43565b604051601f8201601f1916810167ffffffffffffffff81118282101715610cce57610cce610c43565b604052919050565b600082601f830112610ce757600080fd5b813567ffffffffffffffff811115610d0157610d01610c43565b610d14601f8201601f1916602001610ca5565b818152846020838601011115610d2957600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160a01b0381168114610d5d57600080fd5b919050565b600082601f830112610d7357600080fd5b8135602067ffffffffffffffff821115610d8f57610d8f610c43565b8160051b610d9e828201610ca5565b9283528481018201928281019087851115610db857600080fd5b83870192505b84831015610dde57610dcf83610d46565b82529183019190830190610dbe565b979650505050505050565b8035600f8110610d5d57600080fd5b803561ffff81168114610d5d57600080fd5b600060c08284031215610e1c57600080fd5b610e24610c59565b9050813567ffffffffffffffff80821115610e3e57600080fd5b610e4a85838601610cd6565b83526020840135915080821115610e6057600080fd5b610e6c85838601610cd6565b60208401526040840135915080821115610e8557600080fd5b610e9185838601610d62565b60408401526060840135915080821115610eaa57600080fd5b50610eb784828501610cd6565b606083015250610ec960808301610de9565b6080820152610eda60a08301610df8565b60a082015292915050565b60008060408385031215610ef857600080fd5b823567ffffffffffffffff80821115610f1057600080fd5b9084019060808287031215610f2457600080fd5b610f2c610c82565b823582811115610f3b57600080fd5b610f4788828601610cd6565b8252506020830135602082015260408301356040820152610f6a60608401610d46565b606082015293506020850135915080821115610f8557600080fd5b50610f9285828601610e0a565b9150509250929050565b60005b83811015610fb7578181015183820152602001610f9f565b83811115610fc6576000848401525b50505050565b60008151808452610fe4816020860160208601610f9c565b601f01601f19169290920160200192915050565b60808152600061100b6080830187610fcc565b60208301959095525060408101929092526001600160a01b0316606090910152919050565b6000806040838503121561104357600080fd5b61104c83610d46565b946020939093013593505050565b60006020828403121561106c57600080fd5b61107582610d46565b9392505050565b6000806040838503121561108f57600080fd5b82359150602083013580151581146110a657600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60a0815260006110da60a0830188610fcc565b82810360208401526110ec8188610fcc565b905082810360408401526111008187610fcc565b915050600f841061112157634e487b7160e01b600052602160045260246000fd5b83606083015261ffff831660808301529695505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561117b5761117b611151565b5060010190565b60008251611194818460208701610f9c565b9190910192915050565b600181811c908216806111b257607f821691505b602082108114156111d357634e487b7160e01b600052602260045260246000fd5b50919050565b600082198211156111ec576111ec611151565b50019056fea2646970667358221220fbbf3ee3532c3fcf98f8143431755d6d5209e74207120ce6810a48e78c91b78364736f6c63430008090033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c806358bdf27f1161008c57806381cfa3b91161006657806381cfa3b9146101e75780638da5cb5b14610210578063a8ab9fc41461024f578063ea7a23a31461026257600080fd5b806358bdf27f1461019857806371689ed1146101c1578063742b7741146101d457600080fd5b80630444e110146100d457806306e3844d146100fc57806313d8f6191461012a5780633d0bcfa91461013f5780634024db80146101625780634c88662a14610185575b600080fd5b6100e76100e2366004610c2a565b610286565b60405190151581526020015b60405180910390f35b61011c61010a366004610c2a565b60046020526000908152604090205481565b6040519081526020016100f3565b61013d610138366004610ee5565b61030d565b005b6100e761014d366004610c2a565b60056020526000908152604090205460ff1681565b610175610170366004610c2a565b6106a7565b6040516100f39493929190610ff8565b61011c610193366004611030565b610762565b61011c6101a636600461105a565b6001600160a01b031660009081526003602052604090205490565b61013d6101cf36600461107c565b610793565b6100e76101e2366004610c2a565b610857565b61011c6101f536600461105a565b6001600160a01b031660009081526001602052604090205490565b6102377f0000000000000000000000009d71fb2d4bbc6522f6faf8126405a34084e005bc81565b6040516001600160a01b0390911681526020016100f3565b61011c61025d366004611030565b6108e0565b610275610270366004610c2a565b6108fc565b6040516100f39594939291906110c7565b600081815260046020526040812054806102db5760405162461bcd60e51b81526020600482015260116024820152701b1a58d95b9cd9481b9bdd08199bdd5b99607a1b60448201526064015b60405180910390fd5b60006102e682610857565b60008581526005602052604090205490915060ff168015610305575080155b949350505050565b80604001516000805b825181101561036d57336001600160a01b031683828151811061033b5761033b61113b565b60200260200101516001600160a01b0316141561035b576001915061036d565b8061036581611167565b915050610316565b50806103af5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9103737ba1039b4b733b2b960791b60448201526064016102d2565b82516040516000916103c391602001611182565b60408051601f1981840301815290829052805160209182012087519093506000926103ee9201611182565b60408051601f1981840301815291815281516020928301206000858152600290935291208054919250906104219061119e565b1590506104705760405162461bcd60e51b815260206004820152601760248201527f6d7573696355726948617368207265676973746572656400000000000000000060448201526064016102d2565b600081815260208190526040902080546104899061119e565b1590506104d85760405162461bcd60e51b815260206004820152601960248201527f6c6963656e73655572694861736820726567697374657265640000000000000060448201526064016102d2565b60008281526002602090815260409091208651805188936104fd928492910190610b3c565b5060208281015180516105169260018501920190610b3c565b5060408201518051610532916002840191602090910190610bc0565b506060820151805161054e916003840191602090910190610b3c565b50608082015160048201805460ff1916600183600e811115610572576105726110b1565b021790555060a091909101516004909101805461ffff9092166101000262ffff00199092169190911790556000818152602081815260409091208751805189936105c0928492910190610b3c565b506020828101516001838101919091556040808501516002850155606090940151600390930180546001600160a01b0319166001600160a01b03909416939093179092556000858152600482528381208590556005909152829020805460ff19169091179055850151610634908390610acb565b6106668187606001516001600160a01b0316600090815260016020818152604083208054928301815583529091200155565b60408051838152602081018390527fb67d8104e28f72b24d5e1f1b3412956f7c2ad9942d467b2cb9df21e6f412a13c910160405180910390a1505050505050565b6000602081905290815260409020805481906106c29061119e565b80601f01602080910402602001604051908101604052809291908181526020018280546106ee9061119e565b801561073b5780601f106107105761010080835404028352916020019161073b565b820191906000526020600020905b81548152906001019060200180831161071e57829003601f168201915b5050505060018301546002840154600390940154929390929091506001600160a01b031684565b6001602052816000526040600020818154811061077e57600080fd5b90600052602060002001600091509150505481565b336001600160a01b037f0000000000000000000000009d71fb2d4bbc6522f6faf8126405a34084e005bc16146107fe5760405162461bcd60e51b815260206004820152601060248201526f21b0b63632b9103737ba1037bbb732b960811b60448201526064016102d2565b600082815260056020908152604091829020805460ff19168415159081179091558251858152918201527fca7e640d2d483c720a548e3a630ccd7ca04b55ec7ddcd0b5fea6493c52f89b67910160405180910390a15050565b600081815260208190526040812080546108709061119e565b151590506108b45760405162461bcd60e51b81526020600482015260116024820152701b1a58d95b9cd9481b9bdd08199bdd5b99607a1b60448201526064016102d2565b600082815260208190526040812060028101546001909101546108d791906111d9565b42119392505050565b6003602052816000526040600020818154811061077e57600080fd5b6002602052600090815260409020805481906109179061119e565b80601f01602080910402602001604051908101604052809291908181526020018280546109439061119e565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b5050505050908060010180546109a59061119e565b80601f01602080910402602001604051908101604052809291908181526020018280546109d19061119e565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505090806003018054610a339061119e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f9061119e565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050506004909301549192505060ff81169061ffff6101009091041685565b60005b8151811015610b375760036000838381518110610aed57610aed61113b565b6020908102919091018101516001600160a01b0316825281810192909252604001600090812080546001810182559082529190200183905580610b2f81611167565b915050610ace565b505050565b828054610b489061119e565b90600052602060002090601f016020900481019282610b6a5760008555610bb0565b82601f10610b8357805160ff1916838001178555610bb0565b82800160010185558215610bb0579182015b82811115610bb0578251825591602001919060010190610b95565b50610bbc929150610c15565b5090565b828054828255906000526020600020908101928215610bb0579160200282015b82811115610bb057825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190610be0565b5b80821115610bbc5760008155600101610c16565b600060208284031215610c3c57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715610c7c57610c7c610c43565b60405290565b6040516080810167ffffffffffffffff81118282101715610c7c57610c7c610c43565b604051601f8201601f1916810167ffffffffffffffff81118282101715610cce57610cce610c43565b604052919050565b600082601f830112610ce757600080fd5b813567ffffffffffffffff811115610d0157610d01610c43565b610d14601f8201601f1916602001610ca5565b818152846020838601011115610d2957600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160a01b0381168114610d5d57600080fd5b919050565b600082601f830112610d7357600080fd5b8135602067ffffffffffffffff821115610d8f57610d8f610c43565b8160051b610d9e828201610ca5565b9283528481018201928281019087851115610db857600080fd5b83870192505b84831015610dde57610dcf83610d46565b82529183019190830190610dbe565b979650505050505050565b8035600f8110610d5d57600080fd5b803561ffff81168114610d5d57600080fd5b600060c08284031215610e1c57600080fd5b610e24610c59565b9050813567ffffffffffffffff80821115610e3e57600080fd5b610e4a85838601610cd6565b83526020840135915080821115610e6057600080fd5b610e6c85838601610cd6565b60208401526040840135915080821115610e8557600080fd5b610e9185838601610d62565b60408401526060840135915080821115610eaa57600080fd5b50610eb784828501610cd6565b606083015250610ec960808301610de9565b6080820152610eda60a08301610df8565b60a082015292915050565b60008060408385031215610ef857600080fd5b823567ffffffffffffffff80821115610f1057600080fd5b9084019060808287031215610f2457600080fd5b610f2c610c82565b823582811115610f3b57600080fd5b610f4788828601610cd6565b8252506020830135602082015260408301356040820152610f6a60608401610d46565b606082015293506020850135915080821115610f8557600080fd5b50610f9285828601610e0a565b9150509250929050565b60005b83811015610fb7578181015183820152602001610f9f565b83811115610fc6576000848401525b50505050565b60008151808452610fe4816020860160208601610f9c565b601f01601f19169290920160200192915050565b60808152600061100b6080830187610fcc565b60208301959095525060408101929092526001600160a01b0316606090910152919050565b6000806040838503121561104357600080fd5b61104c83610d46565b946020939093013593505050565b60006020828403121561106c57600080fd5b61107582610d46565b9392505050565b6000806040838503121561108f57600080fd5b82359150602083013580151581146110a657600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60a0815260006110da60a0830188610fcc565b82810360208401526110ec8188610fcc565b905082810360408401526111008187610fcc565b915050600f841061112157634e487b7160e01b600052602160045260246000fd5b83606083015261ffff831660808301529695505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561117b5761117b611151565b5060010190565b60008251611194818460208701610f9c565b9190910192915050565b600181811c908216806111b257607f821691505b602082108114156111d357634e487b7160e01b600052602260045260246000fd5b50919050565b600082198211156111ec576111ec611151565b50019056fea2646970667358221220fbbf3ee3532c3fcf98f8143431755d6d5209e74207120ce6810a48e78c91b78364736f6c63430008090033