false
true
0

Contract Address Details

0x729D19f657BD0614b4985Cf1D82531c67569197B

Contract Name
Medianizer
Creator
0x00daa9–1d403f at 0xc4addc–4851c8
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
7,791 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26350877
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
Medianizer




Optimization enabled
true
Compiler version
v0.4.10+commit.f0d539ae




Optimization runs
200
Verified at
2026-04-22T16:12:36.081176Z

Medianizer.sol

/// return median value of feeds

// Copyright (C) 2017  DappHub, LLC

// Licensed under the Apache License, Version 2.0 (the "License").
// You may not use this file except in compliance with the License.

// 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 (express or implied).

pragma solidity ^0.4.8;

contract DSAuthority {
    function canCall(
        address src, address dst, bytes4 sig
    ) constant returns (bool);
}

contract DSAuthEvents {
    event LogSetAuthority (address indexed authority);
    event LogSetOwner     (address indexed owner);
}

contract DSAuth is DSAuthEvents {
    DSAuthority  public  authority;
    address      public  owner;

    function DSAuth() {
        owner = msg.sender;
        LogSetOwner(msg.sender);
    }

    function setOwner(address owner_)
        auth
    {
        owner = owner_;
        LogSetOwner(owner);
    }

    function setAuthority(DSAuthority authority_)
        auth
    {
        authority = authority_;
        LogSetAuthority(authority);
    }

    modifier auth {
        assert(isAuthorized(msg.sender, msg.sig));
        _;
    }

    modifier authorized(bytes4 sig) {
        assert(isAuthorized(msg.sender, sig));
        _;
    }

    function isAuthorized(address src, bytes4 sig) internal returns (bool) {
        if (src == address(this)) {
            return true;
        } else if (src == owner) {
            return true;
        } else if (authority == DSAuthority(0)) {
            return false;
        } else {
            return authority.canCall(src, this, sig);
        }
    }

    function assert(bool x) internal {
        if (!x) throw;
    }
}

contract DSNote {
    event LogNote(
        bytes4   indexed  sig,
        address  indexed  guy,
        bytes32  indexed  foo,
        bytes32  indexed  bar,
	uint	 	  wad,
        bytes             fax
    ) anonymous;

    modifier note {
        bytes32 foo;
        bytes32 bar;

        assembly {
            foo := calldataload(4)
            bar := calldataload(36)
        }

        LogNote(msg.sig, msg.sender, foo, bar, msg.value, msg.data);

        _;
    }
}

contract DSMath {
    
    /*
    standard uint256 functions
     */

    function add(uint256 x, uint256 y) constant internal returns (uint256 z) {
        assert((z = x + y) >= x);
    }

    function sub(uint256 x, uint256 y) constant internal returns (uint256 z) {
        assert((z = x - y) <= x);
    }

    function mul(uint256 x, uint256 y) constant internal returns (uint256 z) {
        assert((z = x * y) >= x);
    }

    function div(uint256 x, uint256 y) constant internal returns (uint256 z) {
        z = x / y;
    }

    function min(uint256 x, uint256 y) constant internal returns (uint256 z) {
        return x <= y ? x : y;
    }
    function max(uint256 x, uint256 y) constant internal returns (uint256 z) {
        return x >= y ? x : y;
    }

    /*
    uint128 functions (h is for half)
     */


    function hadd(uint128 x, uint128 y) constant internal returns (uint128 z) {
        assert((z = x + y) >= x);
    }

    function hsub(uint128 x, uint128 y) constant internal returns (uint128 z) {
        assert((z = x - y) <= x);
    }

    function hmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
        assert((z = x * y) >= x);
    }

    function hdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = x / y;
    }

    function hmin(uint128 x, uint128 y) constant internal returns (uint128 z) {
        return x <= y ? x : y;
    }
    function hmax(uint128 x, uint128 y) constant internal returns (uint128 z) {
        return x >= y ? x : y;
    }


    /*
    int256 functions
     */

    function imin(int256 x, int256 y) constant internal returns (int256 z) {
        return x <= y ? x : y;
    }
    function imax(int256 x, int256 y) constant internal returns (int256 z) {
        return x >= y ? x : y;
    }

    /*
    WAD math
     */

    uint128 constant WAD = 10 ** 18;

    function wadd(uint128 x, uint128 y) constant internal returns (uint128) {
        return hadd(x, y);
    }

    function wsub(uint128 x, uint128 y) constant internal returns (uint128) {
        return hsub(x, y);
    }

    function wmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * y + WAD / 2) / WAD);
    }

    function wdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * WAD + y / 2) / y);
    }

    function wmin(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmin(x, y);
    }
    function wmax(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmax(x, y);
    }

    /*
    RAY math
     */

    uint128 constant RAY = 10 ** 27;

    function radd(uint128 x, uint128 y) constant internal returns (uint128) {
        return hadd(x, y);
    }

    function rsub(uint128 x, uint128 y) constant internal returns (uint128) {
        return hsub(x, y);
    }

    function rmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * y + RAY / 2) / RAY);
    }

    function rdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * RAY + y / 2) / y);
    }

    function rpow(uint128 x, uint64 n) constant internal returns (uint128 z) {
        // This famous algorithm is called "exponentiation by squaring"
        // and calculates x^n with x as fixed-point and n as regular unsigned.
        //
        // It's O(log n), instead of O(n) for naive repeated multiplication.
        //
        // These facts are why it works:
        //
        //  If n is even, then x^n = (x^2)^(n/2).
        //  If n is odd,  then x^n = x * x^(n-1),
        //   and applying the equation for even x gives
        //    x^n = x * (x^2)^((n-1) / 2).
        //
        //  Also, EVM division is flooring and
        //    floor[(n-1) / 2] = floor[n / 2].

        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }

    function rmin(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmin(x, y);
    }
    function rmax(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmax(x, y);
    }

    function cast(uint256 x) constant internal returns (uint128 z) {
        assert((z = uint128(x)) == x);
    }

}

contract DSThing is DSAuth, DSNote, DSMath {
}

contract DSValue is DSThing {
    bool    has;
    bytes32 val;
    function peek() constant returns (bytes32, bool) {
        return (val,has);
    }
    function read() constant returns (bytes32) {
        var (wut, has) = peek();
        assert(has);
        return wut;
    }
    function poke(bytes32 wut) note auth {
        val = wut;
        has = true;
    }
    function void() note auth { // unset the value
        has = false;
    }
}

contract Medianizer is DSValue {
    mapping (bytes12 => address) public values;
    mapping (address => bytes12) public indexes;
    bytes12 public next = 0x1;

    uint96 public min = 0x1;

    function set(address wat) auth {
        bytes12 nextId = bytes12(uint96(next) + 1);
        assert(nextId != 0x0);
        set(next, wat);
        next = nextId;
    }

    function set(bytes12 pos, address wat) note auth {
        if (pos == 0x0) throw;

        if (wat != 0 && indexes[wat] != 0) throw;

        indexes[values[pos]] = 0; // Making sure to remove a possible existing address in that position

        if (wat != 0) {
            indexes[wat] = pos;
        }

        values[pos] = wat;
    }

    function setMin(uint96 min_) note auth {
        if (min_ == 0x0) throw;
        min = min_;
    }

    function setNext(bytes12 next_) note auth {
        if (next_ == 0x0) throw;
        next = next_;
    }

    function unset(bytes12 pos) {
        set(pos, 0);
    }

    function unset(address wat) {
        set(indexes[wat], 0);
    }

    function poke() {
        poke(0);
    }

    function poke(bytes32) note {
        (val, has) = compute();
    }

    function compute() constant returns (bytes32, bool) {
        bytes32[] memory wuts = new bytes32[](uint96(next) - 1);
        uint96 ctr = 0;
        for (uint96 i = 1; i < uint96(next); i++) {
            if (values[bytes12(i)] != 0) {
                var (wut, wuz) = DSValue(values[bytes12(i)]).peek();
                if (wuz) {
                    if (ctr == 0 || wut >= wuts[ctr - 1]) {
                        wuts[ctr] = wut;
                    } else {
                        uint96 j = 0;
                        while (wut >= wuts[j]) {
                            j++;
                        }
                        for (uint96 k = ctr; k > j; k--) {
                            wuts[k] = wuts[k - 1];
                        }
                        wuts[j] = wut;
                    }
                    ctr++;
                }
            }
        }

        if (ctr < min) return (val, false);

        bytes32 value;
        if (ctr % 2 == 0) {
            uint128 val1 = uint128(wuts[(ctr / 2) - 1]);
            uint128 val2 = uint128(wuts[ctr / 2]);
            value = bytes32(wdiv(hadd(val1, val2), 2 ether));
        } else {
            value = wuts[(ctr - 1) / 2];
        }

        return (value, true);
    }

}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":200,"enabled":true},"libraries":{},"compilationTarget":{"Medianizer.sol":"Medianizer"}}
              

Contract ABI

[{"type":"function","payable":false,"outputs":[],"name":"setOwner","inputs":[{"type":"address","name":"owner_"}],"constant":false},{"type":"function","payable":false,"outputs":[],"name":"poke","inputs":[{"type":"bytes32","name":""}],"constant":false},{"type":"function","payable":false,"outputs":[],"name":"poke","inputs":[],"constant":false},{"type":"function","payable":false,"outputs":[{"type":"bytes32","name":""},{"type":"bool","name":""}],"name":"compute","inputs":[],"constant":true},{"type":"function","payable":false,"outputs":[],"name":"set","inputs":[{"type":"address","name":"wat"}],"constant":false},{"type":"function","payable":false,"outputs":[],"name":"unset","inputs":[{"type":"address","name":"wat"}],"constant":false},{"type":"function","payable":false,"outputs":[{"type":"bytes12","name":""}],"name":"indexes","inputs":[{"type":"address","name":""}],"constant":true},{"type":"function","payable":false,"outputs":[{"type":"bytes12","name":""}],"name":"next","inputs":[],"constant":true},{"type":"function","payable":false,"outputs":[{"type":"bytes32","name":""}],"name":"read","inputs":[],"constant":true},{"type":"function","payable":false,"outputs":[{"type":"bytes32","name":""},{"type":"bool","name":""}],"name":"peek","inputs":[],"constant":true},{"type":"function","payable":false,"outputs":[{"type":"address","name":""}],"name":"values","inputs":[{"type":"bytes12","name":""}],"constant":true},{"type":"function","payable":false,"outputs":[],"name":"setMin","inputs":[{"type":"uint96","name":"min_"}],"constant":false},{"type":"function","payable":false,"outputs":[],"name":"setAuthority","inputs":[{"type":"address","name":"authority_"}],"constant":false},{"type":"function","payable":false,"outputs":[{"type":"address","name":""}],"name":"owner","inputs":[],"constant":true},{"type":"function","payable":false,"outputs":[],"name":"void","inputs":[],"constant":false},{"type":"function","payable":false,"outputs":[],"name":"set","inputs":[{"type":"bytes12","name":"pos"},{"type":"address","name":"wat"}],"constant":false},{"type":"function","payable":false,"outputs":[{"type":"address","name":""}],"name":"authority","inputs":[],"constant":true},{"type":"function","payable":false,"outputs":[],"name":"unset","inputs":[{"type":"bytes12","name":"pos"}],"constant":false},{"type":"function","payable":false,"outputs":[],"name":"setNext","inputs":[{"type":"bytes12","name":"next_"}],"constant":false},{"type":"function","payable":false,"outputs":[{"type":"uint96","name":""}],"name":"min","inputs":[],"constant":true},{"type":"event","name":"LogNote","inputs":[{"type":"bytes4","name":"sig","indexed":true},{"type":"address","name":"guy","indexed":true},{"type":"bytes32","name":"foo","indexed":true},{"type":"bytes32","name":"bar","indexed":true},{"type":"uint256","name":"wad","indexed":false},{"type":"bytes","name":"fax","indexed":false}],"anonymous":true},{"type":"event","name":"LogSetAuthority","inputs":[{"type":"address","name":"authority","indexed":true}],"anonymous":false},{"type":"event","name":"LogSetOwner","inputs":[{"type":"address","name":"owner","indexed":true}],"anonymous":false}]
              

Contract Creation Code

Verify & Publish
0x606060405260058054606060020a60c060020a03196001606060020a0319909116600117166c010000000000000000000000001790555b60018054600160a060020a03191633600160a060020a03169081179091556040517fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a25b5b610fff8061008e6000396000f300606060405236156100f65763ffffffff60e060020a60003504166313af403581146100f85780631504460f14610116578063181783581461012b5780631a43c3381461013d5780632801617e146101665780632966d1b9146101845780632db78d93146101a25780634c8fe526146101db57806357de26a41461020857806359e02dd71461022a578063651dd0de146102535780636ba5ef0d1461028c5780637a9e5e4b146102aa5780638da5cb5b146102c8578063ac4c25b2146102f4578063beb38b4314610306578063bf7e214f14610331578063e0a1fdad1461035d578063f2c5925d1461037c578063f88979451461039b575bfe5b341561010057fe5b610114600160a060020a03600435166103c7565b005b341561011e57fe5b610114600435610437565b005b341561013357fe5b6101146104d0565b005b341561014557fe5b61014d6104dd565b6040805192835290151560208301528051918290030190f35b341561016e57fe5b610114600160a060020a03600435166108a4565b005b341561018c57fe5b610114600160a060020a0360043516610922565b005b34156101aa57fe5b6101be600160a060020a0360043516610951565b60408051600160a060020a03199092168252519081900360200190f35b34156101e357fe5b6101be610969565b60408051600160a060020a03199092168252519081900360200190f35b341561021057fe5b610218610975565b60408051918252519081900360200190f35b341561023257fe5b61014d610999565b6040805192835290151560208301528051918290030190f35b341561025b57fe5b610270600160a060020a0319600435166109ae565b60408051600160a060020a039092168252519081900360200190f35b341561029457fe5b6101146001606060020a03600435166109c9565b005b34156102b257fe5b610114600160a060020a0360043516610a91565b005b34156102d057fe5b610270610afd565b60408051600160a060020a039092168252519081900360200190f35b34156102fc57fe5b610114610b0c565b005b341561030e57fe5b610114600160a060020a031960043516602435600160a060020a0316610ba9565b005b341561033957fe5b610270610d37565b60408051600160a060020a039092168252519081900360200190f35b341561036557fe5b610114600160a060020a031960043516610d46565b005b341561038457fe5b610114600160a060020a031960043516610d55565b005b34156103a357fe5b6103ab610e09565b604080516001606060020a039092168252519081900360200190f35b6103e56103e033600035600160e060020a031916610e1f565b610f24565b60018054600160a060020a031916600160a060020a0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a25b5b50565b6040805134808252602082018381523693830184905260043593602435938493869333600160a060020a03169360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a46104996104dd565b6001805491151560a060020a0274ff0000000000000000000000000000000000000000199092169190911790556002555b5b505050565b6104da6000610437565b5b565b600060006104e9610fc1565b6000600060006000600060006000600060006001600560009054906101000a900460a060020a0260a060020a9004036001606060020a031660405180591061052e5750595b908082528060200260200182016040525b50995060009850600197505b60055460a060020a908102046001606060020a03908116908916101561078057600160a060020a031960a060020a890216600090815260036020526040902054600160a060020a0316156107735760a060020a8802600160a060020a031916600090815260036020526040808220548151820183905281517f59e02dd70000000000000000000000000000000000000000000000000000000081528251600160a060020a03909216936359e02dd79360048084019491939192918390030190829087803b151561061757fe5b60325a03f1151561062457fe5b505060405180516020909101519098509650508515610773576001606060020a038916158061067657508960018a036001606060020a031681518110151561066857fe5b602090810290910101518710155b156106a257868a8a6001606060020a031681518110151561069357fe5b6020908102909101015261076c565b600094505b89856001606060020a03168151811015156106be57fe5b6020908102909101015187106106d9576001909401936106a7565b8893505b846001606060020a0316846001606060020a031611156107495789600185036001606060020a031681518110151561071157fe5b906020019060200201518a856001606060020a031681518110151561073257fe5b602090810290910101525b600019909301926106dd565b868a866001606060020a031681518110151561076157fe5b602090810290910101525b6001909801975b5b5b60019097019661054b565b6005546001606060020a03606060020a9091048116908a1610156107ac5760025460009b509b50610896565b60026001606060020a038a165b066001606060020a0316600014156108595789600160026001606060020a038c165b04036001606060020a03168151811015156107f257fe5b6020908102909101015191508960026001606060020a038b165b046001606060020a031681518110151561082257fe5b60209081029091010151905061084961083b8383610f35565b671bc16d674ec80000610f55565b6001608060020a0316925061088e565b8960026001606060020a036000198c01165b046001606060020a031681518110151561088157fe5b9060200190602002015192505b8260019b509b505b505050505050505050509091565b60006108c46103e033600035600160e060020a031916610e1f565b610f24565b5060055460a060020a908102819004600101026108ec600160a060020a031982161515610f24565b6005546108ff9060a060020a0283610ba9565b600580546bffffffffffffffffffffffff191660a060020a83041790555b5b5050565b600160a060020a0381166000908152600460205260408120546104339160a060020a90910290610ba9565b5b50565b60046020526000908152604090205460a060020a0281565b60055460a060020a0281565b600060006000610983610999565b9150915061099081610f24565b8192505b505090565b60025460015460a060020a900460ff165b9091565b600360205260009081526040902054600160a060020a031681565b6040805134808252602082018381523693830184905260043593602435938493869333600160a060020a03169360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610a416103e033600035600160e060020a031916610e1f565b610f24565b6001606060020a0383161515610a575760006000fd5b6005805477ffffffffffffffffffffffff0000000000000000000000001916606060020a6001606060020a038616021790555b5b5b505050565b610aaf6103e033600035600160e060020a031916610e1f565b610f24565b60008054600160a060020a031916600160a060020a03838116919091178083556040519116917f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada491a25b5b50565b600154600160a060020a031681565b6040805134808252602082018381523693830184905260043593602435938493869333600160a060020a03169360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610b846103e033600035600160e060020a031916610e1f565b610f24565b6001805474ff0000000000000000000000000000000000000000191690555b5b5b5050565b6040805134808252602082018381523693830184905260043593602435938493869333600160a060020a03169360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610c216103e033600035600160e060020a031916610e1f565b610f24565b600160a060020a031984161515610c385760006000fd5b600160a060020a03831615801590610c775750600160a060020a03831660009081526004602052604090205460a060020a02600160a060020a03191615155b15610c825760006000fd5b600160a060020a03198416600090815260036020908152604080832054600160a060020a039081168452600490925290912080546bffffffffffffffffffffffff19169055831615610d0257600160a060020a038316600090815260046020526040902080546bffffffffffffffffffffffff191660a060020a86041790555b600160a060020a031984811660009081526003602052604090208054909116600160a060020a0385161790555b5b5b50505050565b600054600160a060020a031681565b610433816000610ba9565b5b50565b6040805134808252602082018381523693830184905260043593602435938493869333600160a060020a03169360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610dcd6103e033600035600160e060020a031916610e1f565b610f24565b600160a060020a031983161515610de45760006000fd5b600580546bffffffffffffffffffffffff191660a060020a85041790555b5b5b505050565b600554606060020a90046001606060020a031681565b600030600160a060020a031683600160a060020a03161415610e4357506001610f1b565b600154600160a060020a0384811691161415610e6157506001610f1b565b600054600160a060020a03161515610e7b57506000610f1b565b6000805460408051602090810184905281517fb7009613000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301523081166024830152600160e060020a0319881660448301529251929093169363b70096139360648082019492918390030190829087803b1515610eff57fe5b60325a03f11515610f0c57fe5b5050604051519150610f1b9050565b5b5b5b92915050565b8015156104335760006000fd5b5b50565b8082016001608060020a038084169082161015610f1b57fe5b5b92915050565b6000610f9f6001608060020a0383166002815b046001608060020a0316670de0b6b3a76400006001608060020a0316866001608060020a03160201811515610f9957fe5b04610fa8565b90505b92915050565b806001608060020a0381168114610fbb57fe5b5b919050565b604080516020810190915260008152905600a165627a7a7230582061003742bb06deee80a56182105f9e38e91c997582675c5891203042dcfea2c70029

Deployed ByteCode

0x606060405236156100f65763ffffffff60e060020a60003504166313af403581146100f85780631504460f14610116578063181783581461012b5780631a43c3381461013d5780632801617e146101665780632966d1b9146101845780632db78d93146101a25780634c8fe526146101db57806357de26a41461020857806359e02dd71461022a578063651dd0de146102535780636ba5ef0d1461028c5780637a9e5e4b146102aa5780638da5cb5b146102c8578063ac4c25b2146102f4578063beb38b4314610306578063bf7e214f14610331578063e0a1fdad1461035d578063f2c5925d1461037c578063f88979451461039b575bfe5b341561010057fe5b610114600160a060020a03600435166103c7565b005b341561011e57fe5b610114600435610437565b005b341561013357fe5b6101146104d0565b005b341561014557fe5b61014d6104dd565b6040805192835290151560208301528051918290030190f35b341561016e57fe5b610114600160a060020a03600435166108a4565b005b341561018c57fe5b610114600160a060020a0360043516610922565b005b34156101aa57fe5b6101be600160a060020a0360043516610951565b60408051600160a060020a03199092168252519081900360200190f35b34156101e357fe5b6101be610969565b60408051600160a060020a03199092168252519081900360200190f35b341561021057fe5b610218610975565b60408051918252519081900360200190f35b341561023257fe5b61014d610999565b6040805192835290151560208301528051918290030190f35b341561025b57fe5b610270600160a060020a0319600435166109ae565b60408051600160a060020a039092168252519081900360200190f35b341561029457fe5b6101146001606060020a03600435166109c9565b005b34156102b257fe5b610114600160a060020a0360043516610a91565b005b34156102d057fe5b610270610afd565b60408051600160a060020a039092168252519081900360200190f35b34156102fc57fe5b610114610b0c565b005b341561030e57fe5b610114600160a060020a031960043516602435600160a060020a0316610ba9565b005b341561033957fe5b610270610d37565b60408051600160a060020a039092168252519081900360200190f35b341561036557fe5b610114600160a060020a031960043516610d46565b005b341561038457fe5b610114600160a060020a031960043516610d55565b005b34156103a357fe5b6103ab610e09565b604080516001606060020a039092168252519081900360200190f35b6103e56103e033600035600160e060020a031916610e1f565b610f24565b60018054600160a060020a031916600160a060020a0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a25b5b50565b6040805134808252602082018381523693830184905260043593602435938493869333600160a060020a03169360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a46104996104dd565b6001805491151560a060020a0274ff0000000000000000000000000000000000000000199092169190911790556002555b5b505050565b6104da6000610437565b5b565b600060006104e9610fc1565b6000600060006000600060006000600060006001600560009054906101000a900460a060020a0260a060020a9004036001606060020a031660405180591061052e5750595b908082528060200260200182016040525b50995060009850600197505b60055460a060020a908102046001606060020a03908116908916101561078057600160a060020a031960a060020a890216600090815260036020526040902054600160a060020a0316156107735760a060020a8802600160a060020a031916600090815260036020526040808220548151820183905281517f59e02dd70000000000000000000000000000000000000000000000000000000081528251600160a060020a03909216936359e02dd79360048084019491939192918390030190829087803b151561061757fe5b60325a03f1151561062457fe5b505060405180516020909101519098509650508515610773576001606060020a038916158061067657508960018a036001606060020a031681518110151561066857fe5b602090810290910101518710155b156106a257868a8a6001606060020a031681518110151561069357fe5b6020908102909101015261076c565b600094505b89856001606060020a03168151811015156106be57fe5b6020908102909101015187106106d9576001909401936106a7565b8893505b846001606060020a0316846001606060020a031611156107495789600185036001606060020a031681518110151561071157fe5b906020019060200201518a856001606060020a031681518110151561073257fe5b602090810290910101525b600019909301926106dd565b868a866001606060020a031681518110151561076157fe5b602090810290910101525b6001909801975b5b5b60019097019661054b565b6005546001606060020a03606060020a9091048116908a1610156107ac5760025460009b509b50610896565b60026001606060020a038a165b066001606060020a0316600014156108595789600160026001606060020a038c165b04036001606060020a03168151811015156107f257fe5b6020908102909101015191508960026001606060020a038b165b046001606060020a031681518110151561082257fe5b60209081029091010151905061084961083b8383610f35565b671bc16d674ec80000610f55565b6001608060020a0316925061088e565b8960026001606060020a036000198c01165b046001606060020a031681518110151561088157fe5b9060200190602002015192505b8260019b509b505b505050505050505050509091565b60006108c46103e033600035600160e060020a031916610e1f565b610f24565b5060055460a060020a908102819004600101026108ec600160a060020a031982161515610f24565b6005546108ff9060a060020a0283610ba9565b600580546bffffffffffffffffffffffff191660a060020a83041790555b5b5050565b600160a060020a0381166000908152600460205260408120546104339160a060020a90910290610ba9565b5b50565b60046020526000908152604090205460a060020a0281565b60055460a060020a0281565b600060006000610983610999565b9150915061099081610f24565b8192505b505090565b60025460015460a060020a900460ff165b9091565b600360205260009081526040902054600160a060020a031681565b6040805134808252602082018381523693830184905260043593602435938493869333600160a060020a03169360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610a416103e033600035600160e060020a031916610e1f565b610f24565b6001606060020a0383161515610a575760006000fd5b6005805477ffffffffffffffffffffffff0000000000000000000000001916606060020a6001606060020a038616021790555b5b5b505050565b610aaf6103e033600035600160e060020a031916610e1f565b610f24565b60008054600160a060020a031916600160a060020a03838116919091178083556040519116917f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada491a25b5b50565b600154600160a060020a031681565b6040805134808252602082018381523693830184905260043593602435938493869333600160a060020a03169360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610b846103e033600035600160e060020a031916610e1f565b610f24565b6001805474ff0000000000000000000000000000000000000000191690555b5b5b5050565b6040805134808252602082018381523693830184905260043593602435938493869333600160a060020a03169360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610c216103e033600035600160e060020a031916610e1f565b610f24565b600160a060020a031984161515610c385760006000fd5b600160a060020a03831615801590610c775750600160a060020a03831660009081526004602052604090205460a060020a02600160a060020a03191615155b15610c825760006000fd5b600160a060020a03198416600090815260036020908152604080832054600160a060020a039081168452600490925290912080546bffffffffffffffffffffffff19169055831615610d0257600160a060020a038316600090815260046020526040902080546bffffffffffffffffffffffff191660a060020a86041790555b600160a060020a031984811660009081526003602052604090208054909116600160a060020a0385161790555b5b5b50505050565b600054600160a060020a031681565b610433816000610ba9565b5b50565b6040805134808252602082018381523693830184905260043593602435938493869333600160a060020a03169360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610dcd6103e033600035600160e060020a031916610e1f565b610f24565b600160a060020a031983161515610de45760006000fd5b600580546bffffffffffffffffffffffff191660a060020a85041790555b5b5b505050565b600554606060020a90046001606060020a031681565b600030600160a060020a031683600160a060020a03161415610e4357506001610f1b565b600154600160a060020a0384811691161415610e6157506001610f1b565b600054600160a060020a03161515610e7b57506000610f1b565b6000805460408051602090810184905281517fb7009613000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301523081166024830152600160e060020a0319881660448301529251929093169363b70096139360648082019492918390030190829087803b1515610eff57fe5b60325a03f11515610f0c57fe5b5050604051519150610f1b9050565b5b5b5b92915050565b8015156104335760006000fd5b5b50565b8082016001608060020a038084169082161015610f1b57fe5b5b92915050565b6000610f9f6001608060020a0383166002815b046001608060020a0316670de0b6b3a76400006001608060020a0316866001608060020a03160201811515610f9957fe5b04610fa8565b90505b92915050565b806001608060020a0381168114610fbb57fe5b5b919050565b604080516020810190915260008152905600a165627a7a7230582061003742bb06deee80a56182105f9e38e91c997582675c5891203042dcfea2c70029