Contract 0x00f0feed50DcDF57b4f1B532E8f5e7f291E0C84b 2

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
Ad
Ad
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x89560a8fd69a1aff646a37458a7bc27610164632c3fbb56ee062f8b736335746Submit Feed181480792021-08-19 6:33:4960 days 19 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.0024642
0x8a824687cb4956e6aca4d2e47f640040b1e23e00d43c3a7ac60b418069d5e59bSubmit Feed181464572021-08-19 5:32:5160 days 20 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.01
0x9def266f566bdcc9170c2df5e6be97480220e976182cb2f4917c27d5c9364bddSubmit Feed181449162021-08-19 4:33:2860 days 21 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.002
0x24311093e1dfe2cdddd40f3d6053c2a6d79f087bd69e7574a4c4c4fe817567bfSubmit Feed181433532021-08-19 3:32:4860 days 22 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.00888
0x1cea4652f1b0abeb4dc2451da417bd42fe6b350d16fab9a9a5beb8060a0f67d1Submit Feed181420352021-08-19 2:33:0060 days 23 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.002
0xcfea5523947602d441c8aa9bda1a4f61b948c11d3a2a92bc6a250cacc244e037Submit Feed181405812021-08-19 1:32:2061 days 17 mins ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.002
0x552740485d15be258ecf87592c4dd8399858ed185f8a2ec9d189e8ac8641489eSubmit Feed181390852021-08-19 0:32:2361 days 1 hr ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.002
0xfce1f355cb2808621b6a6c07998f5b2152e0e6891e7d3a97b5d79005ca206aa8Submit Feed181376742021-08-18 23:33:1361 days 2 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.00444
0xdd7cb5774dac1ea72df93587f5f8bb36655e25fd33cf97f7a97b09ffd6013dadSubmit Feed181360512021-08-18 22:33:0761 days 3 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.002
0x3778aa3aa9d172e9b265ceec32e5d96ad4b35e3b1c48ec1522ec382a5b990756Submit Feed181344872021-08-18 21:37:1561 days 4 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.002
0x79125b7c7a9e14c8367d40dad2f268f037d816554cfede56902f7f4bb1af99dbSubmit Feed181327292021-08-18 20:32:3161 days 5 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.00222
0x320415d005e055dc95bb412458118c44b995e0f0ace688c944ef4344e344a9d3Submit Feed181313552021-08-18 19:41:5461 days 6 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.02
0xcebc94d8f7863206d8321dff687df58aa511e146540cfcc5b79e95f81667399eSubmit Feed181295822021-08-18 18:32:2461 days 7 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.002
0x9c4c4ecc8a1083e95f026225dd109cf56524d95588ac22474a04a17f2d79ae4bSubmit Feed181279732021-08-18 17:32:4661 days 8 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.002
0x439ae3683a9b8ce1350223fda86f54d13b011a862e5824c4234b98ef527e9834Submit Feed181262792021-08-18 16:32:2561 days 9 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.002
0x302940bc0faeb8ab6f9f892b20b9c4d3f01f7bcb138d589ae9d252bfbf4d5733Submit Feed181246012021-08-18 15:32:1861 days 10 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.004
0xc7e3ced5483aa0f10213ddff3d6b9602abf52c27bd7d0a7c502560984f44f76bSubmit Feed181230832021-08-18 14:32:5061 days 11 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.01
0x10b402a9e97c270b4488a6d5cdea0b15e28cd8c23b2c9eb1883369cfbdb402a0Submit Feed181171392021-08-18 10:32:2061 days 15 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.0022000022
0x091a6cbf6e127e201ce2cb0f1e4c60b585c243eaf34ae5e9217a084123238a93Submit Feed181155242021-08-18 9:32:2361 days 16 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.00202
0x4a06bdc50d82d7f32615dade51ba18e9ac602619138830de61a685cb91b2d0c6Submit Feed181138812021-08-18 8:33:3561 days 17 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.0022
0xe6af9086fbe99178ac7c58ba9576325c017dfbb6c0c9806461ce967eaa35119cSubmit Feed181122062021-08-18 7:33:2761 days 18 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.004000000004
0xb7952eaa249cdb8f6533c8a65e1485ff567911f6742381e60312ca52a41db65dSubmit Feed181106342021-08-18 6:32:1761 days 19 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.004199999998
0xdfa55e26e856bca3fbe79181ea666773f0f472997a41e71eb2c6e7f75effdc95Submit Feed181090612021-08-18 5:32:3361 days 20 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.006133004458
0x44c94fbe31b3c1be342f6a43728d423f0432a31778e4d6d6700085b2172aa52eSubmit Feed181075122021-08-18 4:32:2561 days 21 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.004
0x835903d9036cd7fea54f4f9ee679c606a8518ba9b6c1a6fde5f1507397b3b52cSubmit Feed181060012021-08-18 3:33:1161 days 22 hrs ago0xbeef7c1f5f5180fd2a2b3d77323fe608834f2b1a IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 MATIC0.0022
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OpenOracleFramework

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 5 : OpenOracleFramework.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;

import {Address} from "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "./interfaces/IConjureFactory.sol";
import "./interfaces/IConjureRouter.sol";

contract OpenOracleFramework {

    // using Openzeppelin contracts for SafeMath and Address
    using SafeMath for uint256;
    using Address for address;

    // the address of the collateral contract factory
    address public factoryContract;

    // address used for pay out
    address payable public payoutAddress;

    // number of signers
    uint256 public signerLength;

    // addresses of the signers
    address[] public signers;

    // threshold which has to be reached
    uint256 public signerThreshold;

    // struct to keep the values for each individual round
    struct feedRoundStruct {
        uint256 value;
        uint256 timestamp;
    }

    // stores historical values of feeds
    mapping(uint256 => mapping(uint256 => uint256)) private historicalFeeds;

    // indicates if sender is a signer
    mapping(address => bool) private isSigner;

    // mapping to store the actual submitted values per FeedId, per round number
    mapping(uint256 => mapping(uint256 => mapping(address => feedRoundStruct))) private feedRoundNumberToStructMapping;

    // indicates support of feeds
    mapping(uint256 => uint256) public feedSupport;

    // indicates if address si subscribed to a feed
    mapping(address => mapping(uint256 => uint256)) private subscribedTo;

    struct oracleStruct {
        string feedName;
        uint256 feedDecimals;
        uint256 feedTimeslot;
        uint256 latestPrice;
        uint256 latestPriceUpdate;
        // 0... donation, 1... subscription
        uint256 revenueMode;
        uint256 feedCost;
    }

    oracleStruct[] private feedList;

    // indicates if oracle subscription is turned on. 0 indicates no pass
    uint256 public subscriptionPassPrice;

    mapping(address => uint256) private hasPass;

    struct proposalStruct {
        uint256 uintValue;
        address addressValue;
        address proposer;
        // 0 ... pricePass
        // 1 ... threshold
        // 2 ... add signer
        // 3 ... remove signer
        // 4 ... payoutAddress
        // 5 ... revenueMode
        // 6 ... feedCost
        uint256 proposalType;
        uint256 proposalFeedId;
        uint256 proposalActive;
    }

    proposalStruct[] public proposalList;

    mapping(uint256 => mapping(address => bool)) private hasSignedProposal;

    event contractSetup(address[] signers, uint256 signerThreshold, address payout);
    event feedAdded(string name, string description, uint256 decimal, uint256 timelsot, uint256 feedId, uint256 mode, uint256 price);
    event feedSigned(uint256 feedId, uint256 roundId, uint256 value, uint256 timestamp, address signer);
    event routerFeeTaken(uint256 value, address sender);
    event feedSupported(uint256 feedId, uint256 supportvalue);
    event newProposal(uint256 proposalId, uint256 uintValue, address addressValue, uint256 oracleType, address proposer);
    event proposalSigned(uint256 proposalId, address signer);
    event newFee(uint256 value);
    event newThreshold(uint256 value);
    event newSigner(address signer);
    event signerRemoved(address signer);
    event newPayoutAddress(address payout);
    event newRevenueMode(uint256 mode, uint256 feed);
    event newFeedCost(uint256 cost, uint256 feed);
    event subscriptionPassPriceUpdated(uint256 newPass);

    // only Signer modifier
    modifier onlySigner {
        _onlySigner();
        _;
    }

    // only Signer view
    function _onlySigner() private view {
        require(isSigner[msg.sender], "Only a signer can perform this action");
    }

    constructor() {
        // Don't allow implementation to be initialized.
        //factoryContract = address(1);
    }

    function initialize(
        address[] memory signers_,
        uint256 signerThreshold_,
        address payable payoutAddress_,
        uint256 subscriptionPassPrice_,
        address factoryContract_
    ) external
    {
        require(factoryContract == address(0), "already initialized");
        require(factoryContract_ != address(0), "factory can not be null");
        require(signerThreshold_ != 0, "Threshold cant be 0");
        require(signerThreshold_ <= signers_.length, "Threshold cant be more then signer count");

        factoryContract = factoryContract_;
        signerThreshold = signerThreshold_;
        signers = signers_;

        for(uint i=0; i< signers.length; i++) {
            require(signers[i] != address(0), "Not zero address");
            isSigner[signers[i]] = true;
        }

        signerLength = signers_.length;
        payoutAddress = payoutAddress_;
        subscriptionPassPrice = subscriptionPassPrice_;

        emit contractSetup(signers_, signerThreshold, payoutAddress);
    }

    //---------------------------helper functions---------------------------

    /**
    * @dev implementation of a quicksort algorithm
    *
    * @param arr the array to be sorted
    * @param left the left outer bound element to start the sort
    * @param right the right outer bound element to stop the sort
    */
    function quickSort(uint[] memory arr, int left, int right) private pure {
        int i = left;
        int j = right;
        if (i == j) return;
        uint pivot = arr[uint(left + (right - left) / 2)];
        while (i <= j) {
            while (arr[uint(i)] < pivot) i++;
            while (pivot < arr[uint(j)]) j--;
            if (i <= j) {
                (arr[uint(i)], arr[uint(j)]) = (arr[uint(j)], arr[uint(i)]);
                i++;
                j--;
            }
        }
        if (left < j)
            quickSort(arr, left, j);
        if (i < right)
            quickSort(arr, i, right);
    }

    /**
    * @dev sort implementation which calls the quickSort function
    *
    * @param data the array to be sorted
    * @return the sorted array
    */
    function sort(uint[] memory data) private pure returns (uint[] memory) {
        quickSort(data, int(0), int(data.length - 1));
        return data;
    }

    //---------------------------view functions ---------------------------

    function getHistoricalFeeds(uint256[] memory feedIDs, uint256[] memory timestamps) external view returns (uint256[] memory) {

        uint256 feedLen = feedIDs.length;
        uint256[] memory returnPrices = new uint256[](feedLen);
        require(feedIDs.length == timestamps.length, "Feeds and Timestamps must match");

        for (uint i = 0; i < feedIDs.length; i++) {

            if (subscriptionPassPrice > 0) {
                if (hasPass[msg.sender] <= block.timestamp) {
                    if (feedList[feedIDs[i]].revenueMode == 1 && subscribedTo[msg.sender][feedIDs[i]] < block.timestamp) {
                        revert("No subscription to feed");
                    }
                }
            } else {
                if (feedList[feedIDs[i]].revenueMode == 1 && subscribedTo[msg.sender][feedIDs[i]] < block.timestamp) {
                    revert("No subscription to feed");
                }
            }

            uint256 roundNumber = timestamps[i] / feedList[feedIDs[i]].feedTimeslot;
            returnPrices[i] =  historicalFeeds[feedIDs[i]][roundNumber];
        }

        return (returnPrices);
    }


    /**
    * @dev getFeeds function lets anyone call the oracle to receive data (maybe pay an optional fee)
    *
    * @param feedIDs the array of feedIds
    */
    function getFeeds(uint256[] memory feedIDs) external view returns (uint256[] memory, uint256[] memory, uint256[] memory) {

        uint256 feedLen = feedIDs.length;
        uint256[] memory returnPrices = new uint256[](feedLen);
        uint256[] memory returnTimestamps = new uint256[](feedLen);
        uint256[] memory returnDecimals = new uint256[](feedLen);

        for (uint i = 0; i < feedIDs.length; i++) {
            (returnPrices[i] ,returnTimestamps[i], returnDecimals[i]) = getFeed(feedIDs[i]);
        }

        return (returnPrices, returnTimestamps, returnDecimals);
    }

    /**
    * @dev getFeed function lets anyone call the oracle to receive data (maybe pay an optional fee)
    *
    * @param feedID the array of feedId
    */
    function getFeed(uint256 feedID) public view returns (uint256, uint256, uint256) {

        uint256 returnPrice;
        uint256 returnTimestamp;
        uint256 returnDecimals;

        if (subscriptionPassPrice > 0) {
            if (hasPass[msg.sender] <= block.timestamp) {
                if (feedList[feedID].revenueMode == 1 && subscribedTo[msg.sender][feedID] < block.timestamp) {
                    revert("No subscription to feed");
                }
            }
        } else {
            if (feedList[feedID].revenueMode == 1 && subscribedTo[msg.sender][feedID] < block.timestamp) {
                revert("No subscription to feed");
            }
        }

        returnPrice = feedList[feedID].latestPrice;
        returnTimestamp = feedList[feedID].latestPriceUpdate;
        returnDecimals = feedList[feedID].feedDecimals;

        return (returnPrice, returnTimestamp, returnDecimals);
    }

    function getFeedLength() external view returns(uint256){
        return feedList.length;
    }

    function getFeedList(uint256[] memory feedIDs) external view returns(string[] memory, uint256[] memory, uint256[] memory, uint256[] memory, uint256[] memory) {

        uint256 feedLen = feedIDs.length;
        string[] memory returnNames = new string[](feedLen);
        uint256[] memory returnDecimals = new uint256[](feedLen);
        uint256[] memory returnTimeslot = new uint256[](feedLen);
        uint256[] memory returnRevenueMode = new uint256[](feedLen);
        uint256[] memory returnCost = new uint256[](feedLen);

        for (uint i = 0; i < feedIDs.length; i++) {
            returnNames[i] = feedList[feedIDs[i]].feedName;
            returnDecimals[i] = feedList[feedIDs[i]].feedDecimals;
            returnTimeslot[i] = feedList[feedIDs[i]].feedTimeslot;
            returnRevenueMode[i] = feedList[feedIDs[i]].revenueMode;
            returnCost[i] = feedList[feedIDs[i]].feedCost;
        }

        return (returnNames, returnDecimals, returnTimeslot, returnRevenueMode, returnCost);
    }

    //---------------------------oracle management functions ---------------------------

    // function to withdraw funds
    function withdrawFunds() external {

        if (payoutAddress == address(0)) {
            for (uint n = 0; n < signers.length; n++){
                payable(signers[n]).transfer(address(this).balance/signers.length);
            }
        } else {
            payoutAddress.transfer(address(this).balance);
        }
    }

    function createNewFeeds(string[] memory names, string[] memory descriptions, uint256[] memory decimals, uint256[] memory timeslots, uint256[] memory feedCosts, uint256[] memory revenueModes) onlySigner external {
        require(names.length == descriptions.length, "Length mismatch");
        require(descriptions.length == decimals.length, "Length mismatch");
        require(decimals.length == timeslots.length, "Length mismatch");
        require(timeslots.length == feedCosts.length, "Length mismatch");
        require(feedCosts.length == revenueModes.length, "Length mismatch");

        for(uint i = 0; i < names.length; i++) {
            require(decimals[i] <= 18, "Decimal places too high");
            require(timeslots[i] > 0, "Timeslot cannot be 0");
            require(revenueModes[i] <= 1, "Wrong revenueMode parameter");

            feedList.push(oracleStruct({
            feedName: names[i],
            feedDecimals: decimals[i],
            feedTimeslot: timeslots[i],
            latestPrice: 0,
            latestPriceUpdate: 0,
            revenueMode: revenueModes[i],
            feedCost: feedCosts[i]
            }));

            emit feedAdded(names[i], descriptions[i], decimals[i], timeslots[i], feedList.length - 1, revenueModes[i], feedCosts[i]);
        }
    }

    /**
    * @dev submitFeed function lets a signer submit as many feeds as they want to
    *
    * @param values the array of values
    * @param feedIDs the array of feedIds
    */
    function submitFeed(uint256[] memory feedIDs, uint256[] memory values) onlySigner external {
        require(values.length == feedIDs.length, "Value length and feedID length do not match");

        // process feeds
        for (uint i = 0; i < values.length; i++) {
            // get current round number for feed
            uint256 roundNumber = block.timestamp / feedList[feedIDs[i]].feedTimeslot;

            // check if the signer already pushed an update for the given period
            if (feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][msg.sender].timestamp != 0) {
                delete feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][msg.sender];
            }

            // feed - number and push value
            feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][msg.sender] = feedRoundStruct({
            value: values[i],
            timestamp: block.timestamp
            });

            emit feedSigned(feedIDs[i], roundNumber, values[i], block.timestamp, msg.sender);

            // check if threshold was met
            uint256 signedFeedsLen;
            uint256[] memory prices = new uint256[](signers.length);
            uint256 k;

            for (uint j = 0; j < signers.length; j++) {
                if (feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][signers[j]].timestamp != 0) {
                    signedFeedsLen++;
                    prices[k++] = feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][signers[j]].value;
                }
            }

            // Change the list size of the array in place
            assembly {
                mstore(prices, k)
            }

            // if threshold is met process price
            if (signedFeedsLen >= signerThreshold) {

                uint[] memory sorted = sort(prices);
                uint returnPrice;

                // uneven so we can take the middle
                if (sorted.length % 2 == 1) {
                    uint sizer = (sorted.length + 1) / 2;
                    returnPrice = sorted[sizer-1];
                    // take average of the 2 most inner numbers
                } else {
                    uint size1 = (sorted.length) / 2;
                    returnPrice =  (sorted[size1-1]+sorted[size1])/2;
                }

                // process the struct for storing
                if (block.timestamp / feedList[feedIDs[i]].feedTimeslot > feedList[feedIDs[i]].latestPriceUpdate / feedList[feedIDs[i]].feedTimeslot) {
                    historicalFeeds[feedIDs[i]][feedList[feedIDs[i]].latestPriceUpdate / feedList[feedIDs[i]].feedTimeslot] = feedList[feedIDs[i]].latestPrice;
                }
                feedList[feedIDs[i]].latestPriceUpdate = block.timestamp;
                feedList[feedIDs[i]].latestPrice = returnPrice;
            }
        }
    }

    function signProposal(uint256 proposalId) onlySigner external {
        require(proposalList[proposalId].proposalActive != 0, "Proposal not active");

        hasSignedProposal[proposalId][msg.sender] = true;
        emit proposalSigned(proposalId, msg.sender);

        uint256 signedProposalLen;

        for(uint i = 0; i < signers.length; i++) {
            if (hasSignedProposal[proposalId][signers[i]]) {
                signedProposalLen++;
            }
        }

        // execute proposal
        if (signedProposalLen >= signerThreshold) {
            if (proposalList[proposalId].proposalType == 0) {
                updatePricePass(proposalList[proposalId].uintValue);
            } else if (proposalList[proposalId].proposalType == 1) {
                updateThreshold(proposalList[proposalId].uintValue);
            } else if (proposalList[proposalId].proposalType == 2) {
                addSigners(proposalList[proposalId].addressValue);
            } else if (proposalList[proposalId].proposalType == 3) {
                removeSigner(proposalList[proposalId].addressValue);
            } else if (proposalList[proposalId].proposalType == 4) {
                updatePayoutAddress(proposalList[proposalId].addressValue);
            } else if (proposalList[proposalId].proposalType == 5) {
                updateRevenueMode(proposalList[proposalId].uintValue, proposalList[proposalId].proposalFeedId);
            } else {
                updateFeedCost(proposalList[proposalId].uintValue, proposalList[proposalId].proposalFeedId);
            }

            // lock proposal
            proposalList[proposalId].proposalActive = 0;
        }
    }

    function createProposal(uint256 uintValue, address addressValue, uint256 proposalType, uint256 feedId) onlySigner external {

        uint256 proposalArrayLen = proposalList.length;

        // fee or threshold
        if (proposalType == 0 || proposalType == 1 || proposalType == 7) {
            proposalList.push(proposalStruct({
            uintValue: uintValue,
            addressValue: address(0),
            proposer: msg.sender,
            proposalType: proposalType,
            proposalFeedId: 0,
            proposalActive: 1
            }));
        } else if (proposalType == 5 || proposalType == 6) {
            proposalList.push(proposalStruct({
            uintValue: uintValue,
            addressValue: address(0),
            proposer: msg.sender,
            proposalType: proposalType,
            proposalFeedId : feedId,
            proposalActive: 1
            }));
        } else {
            proposalList.push(proposalStruct({
            uintValue: 0,
            addressValue: addressValue,
            proposer: msg.sender,
            proposalType: proposalType,
            proposalFeedId : 0,
            proposalActive: 1
            }));
        }

        hasSignedProposal[proposalArrayLen][msg.sender] = true;

        emit newProposal(proposalArrayLen, uintValue, addressValue, proposalType, msg.sender);
        emit proposalSigned(proposalArrayLen, msg.sender);
    }

    function updatePricePass(uint256 newPricePass) private {
        subscriptionPassPrice = newPricePass;

        emit subscriptionPassPriceUpdated(newPricePass);
    }

    function updateRevenueMode(uint256 newRevenueModeValue, uint256 feedId ) private {
        require(newRevenueModeValue <= 1, "Invalid argument for revenue Mode");
        feedList[feedId].revenueMode = newRevenueModeValue;
        emit newRevenueMode(newRevenueModeValue, feedId);
    }

    function updateFeedCost(uint256 feedCost, uint256 feedId) private {
        require(feedCost > 0, "Feed price cant be 0");
        feedList[feedId].feedCost = feedCost;
        emit newFeedCost(feedCost, feedId);
    }

    function updateThreshold(uint256 newThresholdValue) private {
        require(newThresholdValue != 0, "Threshold cant be 0");
        require(newThresholdValue <= signerLength, "Threshold cant be bigger then length of signers");

        signerThreshold = newThresholdValue;
        emit newThreshold(newThresholdValue);
    }

    function addSigners(address newSignerValue) private {

        // check for duplicate signer
        for (uint i=0; i < signers.length; i++) {
            if (signers[i] == newSignerValue) {
                revert("Signer already exists");
            }
        }

        signers.push(newSignerValue);
        signerLength++;
        isSigner[newSignerValue] = true;
        emit newSigner(newSignerValue);
    }

    function updatePayoutAddress(address newPayoutAddressValue) private {
        payoutAddress = payable(newPayoutAddressValue);
        emit newPayoutAddress(newPayoutAddressValue);
    }

    function removeSigner(address toRemove) internal {
        require(isSigner[toRemove], "Address to remove has to be a signer");
        require(signers.length -1 >= signerThreshold, "Less signers than threshold");

        for (uint i = 0; i < signers.length; i++) {
            if (signers[i] == toRemove) {
                delete signers[i];
                signerLength --;
                isSigner[toRemove] = false;
                emit signerRemoved(toRemove);
            }
        }
    }

    //---------------------------subscription functions---------------------------

    function subscribeToFeed(uint256[] memory feedIDs, uint256[] memory durations, address buyer) payable external {
        require(feedIDs.length == durations.length, "Length mismatch");

        uint256 total;
        for (uint i = 0; i < feedIDs.length; i++) {
            require(feedList[feedIDs[i]].revenueMode == 1, "Donation mode turned on");
            require(durations[i] >= 3600, "Minimum subscription is 1h");

            if (subscribedTo[buyer][feedIDs[i]] <=block.timestamp) {
                subscribedTo[buyer][feedIDs[i]] = block.timestamp.add(durations[i]);
            } else {
                subscribedTo[buyer][feedIDs[i]] = subscribedTo[buyer][feedIDs[i]].add(durations[i]);
            }

            total += feedList[feedIDs[i]].feedCost * durations[i] / 3600;
        }

        // check if enough payment was sent
        require(msg.value >= total, "Not enough funds sent to cover oracle fees");

        // send feeds to router
        address payable conjureRouter = IConjureFactory(factoryContract).getConjureRouter();
        IConjureRouter(conjureRouter).deposit{value:msg.value/50}();
        emit routerFeeTaken(msg.value/50, msg.sender);
    }

    function buyPass(address buyer, uint256 duration) payable external {
        require(subscriptionPassPrice != 0, "Subscription Pass turned off");
        require(duration >= 3600, "Minimum subscription is 1h");
        require(msg.value >= subscriptionPassPrice * duration / 86400, "Not enough payment");

        if (hasPass[buyer] <=block.timestamp) {
            hasPass[buyer] = block.timestamp.add(duration);
        } else {
            hasPass[buyer] = hasPass[buyer].add(duration);
        }

        address payable conjureRouter = IConjureFactory(factoryContract).getConjureRouter();
        IConjureRouter(conjureRouter).deposit{value:msg.value/50}();
        emit routerFeeTaken(msg.value/50, msg.sender);
    }

    function supportFeeds(uint256[] memory feedIds, uint256[] memory values) payable external {
        require(feedIds.length == values.length, "Length mismatch");

        uint256 total;
        for (uint i = 0; i < feedIds.length; i++) {
            require(feedList[feedIds[i]].revenueMode == 0, "Subscription mode turned on");
            feedSupport[feedIds[i]] = feedSupport[feedIds[i]].add(values[i]);
            total += values[i];

            emit feedSupported(feedIds[i], values[i]);
        }

        require(msg.value >= total, "Msg.value does not meet support values");

        address payable conjureRouter = IConjureFactory(factoryContract).getConjureRouter();
        IConjureRouter(conjureRouter).deposit{value:total/100}();
        emit routerFeeTaken(total/100, msg.sender);
    }
}

File 2 of 5 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 5 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 4 of 5 : IConjureFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;

/// @author Conjure Finance Team
/// @title IConjureFactory
/// @notice Interface for interacting with the ConjureFactory Contract
interface IConjureFactory {

    /**
     * @dev gets the current conjure router
     *
     * @return the current conjure router
    */
    function getConjureRouter() external returns (address payable);
}

File 5 of 5 : IConjureRouter.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;

/// @author Conjure Finance Team
/// @title IConjureRouter
/// @notice Interface for interacting with the ConjureRouter Contract
interface IConjureRouter {

    /**
     * @dev calls the deposit function
    */
    function deposit() external payable;
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"signers","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"signerThreshold","type":"uint256"},{"indexed":false,"internalType":"address","name":"payout","type":"address"}],"name":"contractSetup","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"uint256","name":"decimal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timelsot","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feedId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mode","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"feedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feedId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"feedSigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feedId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supportvalue","type":"uint256"}],"name":"feedSupported","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"newFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feed","type":"uint256"}],"name":"newFeedCost","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payout","type":"address"}],"name":"newPayoutAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"uintValue","type":"uint256"},{"indexed":false,"internalType":"address","name":"addressValue","type":"address"},{"indexed":false,"internalType":"uint256","name":"oracleType","type":"uint256"},{"indexed":false,"internalType":"address","name":"proposer","type":"address"}],"name":"newProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mode","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feed","type":"uint256"}],"name":"newRevenueMode","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"newSigner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"newThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"proposalSigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"routerFeeTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"signerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPass","type":"uint256"}],"name":"subscriptionPassPriceUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"buyPass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string[]","name":"names","type":"string[]"},{"internalType":"string[]","name":"descriptions","type":"string[]"},{"internalType":"uint256[]","name":"decimals","type":"uint256[]"},{"internalType":"uint256[]","name":"timeslots","type":"uint256[]"},{"internalType":"uint256[]","name":"feedCosts","type":"uint256[]"},{"internalType":"uint256[]","name":"revenueModes","type":"uint256[]"}],"name":"createNewFeeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"uintValue","type":"uint256"},{"internalType":"address","name":"addressValue","type":"address"},{"internalType":"uint256","name":"proposalType","type":"uint256"},{"internalType":"uint256","name":"feedId","type":"uint256"}],"name":"createProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factoryContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feedSupport","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"feedID","type":"uint256"}],"name":"getFeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeedLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"}],"name":"getFeedList","outputs":[{"internalType":"string[]","name":"","type":"string[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"}],"name":"getFeeds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"}],"name":"getHistoricalFeeds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers_","type":"address[]"},{"internalType":"uint256","name":"signerThreshold_","type":"uint256"},{"internalType":"address payable","name":"payoutAddress_","type":"address"},{"internalType":"uint256","name":"subscriptionPassPrice_","type":"uint256"},{"internalType":"address","name":"factoryContract_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"payoutAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalList","outputs":[{"internalType":"uint256","name":"uintValue","type":"uint256"},{"internalType":"address","name":"addressValue","type":"address"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint256","name":"proposalType","type":"uint256"},{"internalType":"uint256","name":"proposalFeedId","type":"uint256"},{"internalType":"uint256","name":"proposalActive","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"signProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signerThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"signers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"submitFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"durations","type":"uint256[]"},{"internalType":"address","name":"buyer","type":"address"}],"name":"subscribeToFeed","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"subscriptionPassPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIds","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"supportFeeds","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50615d1d80620000216000396000f3fe6080604052600436106101355760003560e01c80638c604296116100ab578063c37219ba1161006f578063c37219ba146103eb578063c4c1d0bf14610414578063c6311e3f1461043f578063d69d117c14610481578063de11c94a146104c2578063ecb76d90146104ed57610135565b80638c604296146103135780638e486eec1461032f5780639da6553b1461035a578063a4a4f39014610397578063ab273016146103c257610135565b80634a45ea5c116100fd5780634a45ea5c1461020b5780635b8d02d71461024a57806368238181146102755780637f5090041461029157806384f3c585146102ba578063882fd782146102f757610135565b80630f3c80b21461013a5780632079fb9a1461016357806324600fc3146101a057806330c942e0146101b7578063442a33df146101e2575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061459b565b61052c565b005b34801561016f57600080fd5b5061018a6004803603810190610185919061486f565b61091b565b604051610197919061532c565b60405180910390f35b3480156101ac57600080fd5b506101b561095a565b005b3480156101c357600080fd5b506101cc610acc565b6040516101d99190615861565b60405180910390f35b3480156101ee57600080fd5b506102096004803603810190610204919061462a565b610ad2565b005b34801561021757600080fd5b50610232600480360381019061022d9190614743565b610f2b565b60405161024193929190615438565b60405180910390f35b34801561025657600080fd5b5061025f6110a9565b60405161026c9190615347565b60405180910390f35b61028f600480360381019061028a91906147f0565b6110cf565b005b34801561029d57600080fd5b506102b860048036038101906102b39190614784565b6115de565b005b3480156102c657600080fd5b506102e160048036038101906102dc9190614784565b611d4a565b6040516102ee9190615416565b60405180910390f35b610311600480360381019061030c9190614784565b6120c7565b005b61032d6004803603810190610328919061455f565b612427565b005b34801561033b57600080fd5b50610344612794565b6040516103519190615861565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c919061486f565b61279a565b60405161038e9190615861565b60405180910390f35b3480156103a357600080fd5b506103ac6127b2565b6040516103b99190615861565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e4919061486f565b6127b8565b005b3480156103f757600080fd5b50610412600480360381019061040d9190614898565b612c79565b005b34801561042057600080fd5b5061042961316e565b6040516104369190615861565b60405180910390f35b34801561044b57600080fd5b506104666004803603810190610461919061486f565b61317b565b604051610478969594939291906158a5565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190614743565b613207565b6040516104b99594939291906153a0565b60405180910390f35b3480156104ce57600080fd5b506104d76135d2565b6040516104e4919061532c565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f919061486f565b6135f6565b60405161052393929190615982565b60405180910390f35b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b2906156e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561062b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610622906155a1565b60405180910390fd5b600084141561066f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066690615581565b60405180910390fd5b84518411156106b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106aa90615621565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836004819055508460039080519060200190610710929190614192565b5060005b60038054905081101561086457600073ffffffffffffffffffffffffffffffffffffffff166003828154811061074657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156107c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bf90615701565b60405180910390fd5b600160066000600384815481106107db57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050610714565b50845160028190555082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b819055507ff4955da0e7ea6f8c9297d8046c39168f24abc71dd60d47c7e4e2172f28f0c93385600454600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405161090c93929190615362565b60405180910390a15050505050565b6003818154811061092b57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a605760005b600380549050811015610a5a57600381815481106109ce57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6003805490504781610a2057fe5b049081150290604051600060405180830381858888f19350505050158015610a4c573d6000803e3d6000fd5b5080806001019150506109b4565b50610aca565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ac8573d6000803e3d6000fd5b505b565b60025481565b610ada613847565b8451865114610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906157c1565b60405180910390fd5b8351855114610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b59906157c1565b60405180910390fd5b8251845114610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d906157c1565b60405180910390fd5b8151835114610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be1906157c1565b60405180910390fd5b8051825114610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c25906157c1565b60405180910390fd5b60005b8651811015610f22576012858281518110610c4857fe5b60200260200101511115610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906157a1565b60405180910390fd5b6000848281518110610c9f57fe5b602002602001015111610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cde90615721565b60405180910390fd5b6001828281518110610cf557fe5b60200260200101511115610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d35906156c1565b60405180910390fd5b600a6040518060e00160405280898481518110610d5757fe5b60200260200101518152602001878481518110610d7057fe5b60200260200101518152602001868481518110610d8957fe5b602002602001015181526020016000815260200160008152602001848481518110610db057fe5b60200260200101518152602001858481518110610dc957fe5b602002602001015181525090806001815401808255809150506001900390600052602060002090600702016000909190919091506000820151816000019080519060200190610e1992919061421c565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015550507f7987e4b97b6de28ab6f19d4724c233a6f4fe564ba5413dc5d74b4c2c7841651a878281518110610e8557fe5b6020026020010151878381518110610e9957fe5b6020026020010151878481518110610ead57fe5b6020026020010151878581518110610ec157fe5b60200260200101516001600a8054905003878781518110610ede57fe5b6020026020010151898881518110610ef257fe5b6020026020010151604051610f0d9796959493929190615484565b60405180910390a18080600101915050610c31565b50505050505050565b606080606060008451905060008167ffffffffffffffff81118015610f4f57600080fd5b50604051908082528060200260200182016040528015610f7e5781602001602082028036833780820191505090505b50905060008267ffffffffffffffff81118015610f9a57600080fd5b50604051908082528060200260200182016040528015610fc95781602001602082028036833780820191505090505b50905060008367ffffffffffffffff81118015610fe557600080fd5b506040519080825280602002602001820160405280156110145781602001602082028036833780820191505090505b50905060005b88518110156110945761103f89828151811061103257fe5b60200260200101516135f6565b86848151811061104b57fe5b6020026020010186858151811061105e57fe5b6020026020010186868151811061107157fe5b60200260200101838152508381525083815250505050808060010191505061101a565b50828282965096509650505050509193909250565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8151835114611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a906157c1565b60405180910390fd5b600080600090505b8451811015611440576001600a86838151811061113457fe5b60200260200101518154811061114657fe5b90600052602060002090600702016005015414611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90615501565b60405180910390fd5b610e108482815181106111a757fe5b602002602001015110156111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790615541565b60405180910390fd5b42600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087848151811061123e57fe5b6020026020010151815260200190815260200160002054116112ec5761128084828151811061126957fe5b6020026020010151426138d590919063ffffffff16565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008784815181106112cd57fe5b60200260200101518152602001908152602001600020819055506113dd565b6113758482815181106112fb57fe5b6020026020010151600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088858151811061135057fe5b60200260200101518152602001908152602001600020546138d590919063ffffffff16565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008784815181106113c257fe5b60200260200101518152602001908152602001600020819055505b610e108482815181106113ec57fe5b6020026020010151600a87848151811061140257fe5b60200260200101518154811061141457fe5b906000526020600020906007020160060154028161142e57fe5b0482019150808060010191505061111b565b5080341015611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b90615641565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c216844a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114ef57600080fd5b505af1158015611503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115279190614536565b90508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db06032348161154f57fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561157b57600080fd5b505af115801561158f573d6000803e3d6000fd5b50505050507f103515a9d6bc0233f6381d5e58df739f3078b58635e20d5dd204e558769ddc42603234816115bf57fe5b04336040516115cf92919061587c565b60405180910390a15050505050565b6115e6613847565b815181511461162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190615561565b60405180910390fd5b60005b8151811015611d45576000600a84838151811061164657fe5b60200260200101518154811061165857fe5b906000526020600020906007020160020154428161167257fe5b04905060006007600086858151811061168757fe5b60200260200101518152602001908152602001600020600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541461177c576007600085848151811061170457fe5b60200260200101518152602001908152602001600020600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905550505b604051806040016040528084848151811061179357fe5b6020026020010151815260200142815250600760008685815181106117b457fe5b60200260200101518152602001908152602001600020600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fba4832b2bf8c9586edd5026f5bf3a5b8a69b0b29dea651d15bfda0cddf0e954884838151811061185c57fe5b60200260200101518285858151811061187157fe5b6020026020010151423360405161188c9594939291906159b9565b60405180910390a160008060038054905067ffffffffffffffff811180156118b357600080fd5b506040519080825280602002602001820160405280156118e25781602001602082028036833780820191505090505b509050600080600090505b600380549050811015611a93576000600760008a898151811061190c57fe5b60200260200101518152602001908152602001600020600087815260200190815260200160002060006003848154811061194257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015414611a86578380600101945050600760008988815181106119c857fe5b6020026020010151815260200190815260200160002060008681526020019081526020016000206000600383815481106119fe57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154838380600101945081518110611a7957fe5b6020026020010181815250505b80806001019150506118ed565b508082526004548310611d34576000611aab8361395d565b9050600060016002835181611abc57fe5b061415611af55760006002600184510181611ad357fe5b049050826001820381518110611ae557fe5b6020026020010151915050611b3f565b60006002835181611b0257fe5b0490506002838281518110611b1357fe5b6020026020010151846001840381518110611b2a57fe5b60200260200101510181611b3a57fe5b049150505b600a898881518110611b4d57fe5b602002602001015181548110611b5f57fe5b906000526020600020906007020160020154600a8a8981518110611b7f57fe5b602002602001015181548110611b9157fe5b90600052602060002090600702016004015481611baa57fe5b04600a8a8981518110611bb957fe5b602002602001015181548110611bcb57fe5b9060005260206000209060070201600201544281611be557fe5b041115611cc557600a898881518110611bfa57fe5b602002602001015181548110611c0c57fe5b906000526020600020906007020160030154600560008b8a81518110611c2e57fe5b602002602001015181526020019081526020016000206000600a8c8b81518110611c5457fe5b602002602001015181548110611c6657fe5b906000526020600020906007020160020154600a8d8c81518110611c8657fe5b602002602001015181548110611c9857fe5b90600052602060002090600702016004015481611cb157fe5b048152602001908152602001600020819055505b42600a8a8981518110611cd457fe5b602002602001015181548110611ce657fe5b90600052602060002090600702016004018190555080600a8a8981518110611d0a57fe5b602002602001015181548110611d1c57fe5b90600052602060002090600702016003018190555050505b50505050808060010191505061162d565b505050565b606060008351905060008167ffffffffffffffff81118015611d6b57600080fd5b50604051908082528060200260200182016040528015611d9a5781602001602082028036833780820191505090505b5090508351855114611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890615801565b60405180910390fd5b60005b85518110156120bb576000600b541115611f275742600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611f22576001600a878381518110611e4e57fe5b602002602001015181548110611e6057fe5b906000526020600020906007020160050154148015611ee1575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888481518110611ec857fe5b6020026020010151815260200190815260200160002054105b15611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1890615681565b60405180910390fd5b5b61200b565b6001600a878381518110611f3757fe5b602002602001015181548110611f4957fe5b906000526020600020906007020160050154148015611fca575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888481518110611fb157fe5b6020026020010151815260200190815260200160002054105b1561200a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200190615681565b60405180910390fd5b5b6000600a87838151811061201b57fe5b60200260200101518154811061202d57fe5b90600052602060002090600702016002015486838151811061204b57fe5b60200260200101518161205a57fe5b0490506005600088848151811061206d57fe5b602002602001015181526020019081526020016000206000828152602001908152602001600020548383815181106120a157fe5b602002602001018181525050508080600101915050611de4565b50809250505092915050565b805182511461210b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612102906157c1565b60405180910390fd5b600080600090505b835181101561228a576000600a85838151811061212c57fe5b60200260200101518154811061213e57fe5b90600052602060002090600702016005015414612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218790615521565b60405180910390fd5b6121dc83828151811061219f57fe5b6020026020010151600860008785815181106121b757fe5b60200260200101518152602001908152602001600020546138d590919063ffffffff16565b600860008684815181106121ec57fe5b602002602001015181526020019081526020016000208190555082818151811061221257fe5b6020026020010151820191507f3444f0007ac07416465c167c0d7657d48e9d410b498f8849035fc9cf9523976d84828151811061224b57fe5b602002602001015184838151811061225f57fe5b6020026020010151604051612275929190615906565b60405180910390a18080600101915050612113565b50803410156122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c590615661565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c216844a6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561233957600080fd5b505af115801561234d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123719190614536565b90508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db06064848161239957fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123c557600080fd5b505af11580156123d9573d6000803e3d6000fd5b50505050507f103515a9d6bc0233f6381d5e58df739f3078b58635e20d5dd204e558769ddc426064838161240957fe5b043360405161241992919061587c565b60405180910390a150505050565b6000600b54141561246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490615821565b60405180910390fd5b610e108110156124b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a990615541565b60405180910390fd5b6201518081600b5402816124c257fe5b04341015612505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fc906157e1565b60405180910390fd5b42600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116125a65761255e81426138d590919063ffffffff16565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061263c565b6125f881600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138d590919063ffffffff16565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c216844a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156126a757600080fd5b505af11580156126bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126df9190614536565b90508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db06032348161270757fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561273357600080fd5b505af1158015612747573d6000803e3d6000fd5b50505050507f103515a9d6bc0233f6381d5e58df739f3078b58635e20d5dd204e558769ddc426032348161277757fe5b043360405161278792919061587c565b60405180910390a1505050565b600b5481565b60086020528060005260406000206000915090505481565b60045481565b6127c0613847565b6000600d82815481106127cf57fe5b9060005260206000209060060201600501541415612822576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612819906155e1565b60405180910390fd5b6001600e600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f163fd1b723c0447962b4aca81cc014e8103ab3753a07542f4edbed3e59444d6781336040516128bc92919061587c565b60405180910390a1600080600090505b60038054905081101561298957600e60008481526020019081526020016000206000600383815481106128fb57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561297c5781806001019250505b80806001019150506128cc565b506004548110612c75576000600d83815481106129a257fe5b90600052602060002090600602016003015414156129e6576129e1600d83815481106129ca57fe5b906000526020600020906006020160000154613977565b612c50565b6001600d83815481106129f557fe5b9060005260206000209060060201600301541415612a3957612a34600d8381548110612a1d57fe5b9060005260206000209060060201600001546139b8565b612c4f565b6002600d8381548110612a4857fe5b9060005260206000209060060201600301541415612aac57612aa7600d8381548110612a7057fe5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613a82565b612c4e565b6003600d8381548110612abb57fe5b9060005260206000209060060201600301541415612b1f57612b1a600d8381548110612ae357fe5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613c4d565b612c4d565b6004600d8381548110612b2e57fe5b9060005260206000209060060201600301541415612b9257612b8d600d8381548110612b5657fe5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613e8f565b612c4c565b6005600d8381548110612ba157fe5b9060005260206000209060060201600301541415612c0457612bff600d8381548110612bc957fe5b906000526020600020906006020160000154600d8481548110612be857fe5b906000526020600020906006020160040154613f0a565b612c4b565b612c4a600d8381548110612c1457fe5b906000526020600020906006020160000154600d8481548110612c3357fe5b906000526020600020906006020160040154613fae565b5b5b5b5b5b5b6000600d8381548110612c5f57fe5b9060005260206000209060060201600501819055505b5050565b612c81613847565b6000600d8054905090506000831480612c9a5750600183145b80612ca55750600783145b15612dee57600d6040518060c00160405280878152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200160008152602001600181525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a082015181600501555050613086565b6005831480612dfd5750600683145b15612f4557600d6040518060c00160405280878152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001600181525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a082015181600501555050613085565b600d6040518060c00160405280600081526020018673ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200160008152602001600181525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015550505b5b6001600e600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fa7105ed77601732b2ee4362ad1a2ca325d1983be801d553d907e0aa29dcdb79a818686863360405161312695949392919061592f565b60405180910390a17f163fd1b723c0447962b4aca81cc014e8103ab3753a07542f4edbed3e59444d67813360405161315f92919061587c565b60405180910390a15050505050565b6000600a80549050905090565b600d818154811061318b57600080fd5b90600052602060002090600602016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154905086565b606080606080606060008651905060008167ffffffffffffffff8111801561322e57600080fd5b5060405190808252806020026020018201604052801561326257816020015b606081526020019060019003908161324d5790505b50905060008267ffffffffffffffff8111801561327e57600080fd5b506040519080825280602002602001820160405280156132ad5781602001602082028036833780820191505090505b50905060008367ffffffffffffffff811180156132c957600080fd5b506040519080825280602002602001820160405280156132f85781602001602082028036833780820191505090505b50905060008467ffffffffffffffff8111801561331457600080fd5b506040519080825280602002602001820160405280156133435781602001602082028036833780820191505090505b50905060008567ffffffffffffffff8111801561335f57600080fd5b5060405190808252806020026020018201604052801561338e5781602001602082028036833780820191505090505b50905060005b8c518110156135b357600a8d82815181106133ab57fe5b6020026020010151815481106133bd57fe5b90600052602060002090600702016000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156134625780601f1061343757610100808354040283529160200191613462565b820191906000526020600020905b81548152906001019060200180831161344557829003601f168201915b505050505086828151811061347357fe5b6020026020010181905250600a8d828151811061348c57fe5b60200260200101518154811061349e57fe5b9060005260206000209060070201600101548582815181106134bc57fe5b602002602001018181525050600a8d82815181106134d657fe5b6020026020010151815481106134e857fe5b90600052602060002090600702016002015484828151811061350657fe5b602002602001018181525050600a8d828151811061352057fe5b60200260200101518154811061353257fe5b90600052602060002090600702016005015483828151811061355057fe5b602002602001018181525050600a8d828151811061356a57fe5b60200260200101518154811061357c57fe5b90600052602060002090600702016006015482828151811061359a57fe5b6020026020010181815250508080600101915050613394565b5084848484849a509a509a509a509a5050505050505091939590929450565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000600b5411156137135742600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161370e576001600a888154811061365f57fe5b9060005260206000209060070201600501541480156136cd575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002054105b1561370d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370490615681565b60405180910390fd5b5b6137d1565b6001600a888154811061372257fe5b906000526020600020906007020160050154148015613790575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002054105b156137d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c790615681565b60405180910390fd5b5b600a87815481106137de57fe5b9060005260206000209060070201600301549250600a87815481106137ff57fe5b9060005260206000209060070201600401549150600a878154811061382057fe5b90600052602060002090600702016001015490508282829550955095505050509193909250565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166138d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ca906155c1565b60405180910390fd5b565b600080828401905083811015613953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b606061396f8260006001855103614051565b819050919050565b80600b819055507f35a14b8b09dda49419beccb57b8ab7a2333bfeb9634690a2fdd9e62ca2b73dea816040516139ad9190615861565b60405180910390a150565b60008114156139fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f390615581565b60405180910390fd5b600254811115613a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3890615741565b60405180910390fd5b806004819055507fd88532aad776d079efe3ac298f9e21dc4ef893e240d8c13107298e7c4f6eb8b881604051613a779190615861565b60405180910390a150565b60005b600380549050811015613b45578173ffffffffffffffffffffffffffffffffffffffff1660038281548110613ab657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2f90615761565b60405180910390fd5b8080600101915050613a85565b506003819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002600081548092919060010191905055506001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f3dc2a8437aef0e8d2839b5e75d0d93e6c7f43b3acf5d2ef2db79beb54cb47b3d81604051613c42919061532c565b60405180910390a150565b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cd090615841565b60405180910390fd5b6004546001600380549050031015613d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d1d906156a1565b60405180910390fd5b60005b600380549050811015613e8b578173ffffffffffffffffffffffffffffffffffffffff1660038281548110613d5a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613e7e5760038181548110613dae57fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260008154809291906001900391905055506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ffa15964370ccf7acface74df78a85aa4857e703226c446d3e24a69663dc302e782604051613e75919061532c565b60405180910390a15b8080600101915050613d29565b5050565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4bc0293774d2baff337ab66d049d9fb89b31c492a1c82fd1b53d43ac85e8da5181604051613eff919061532c565b60405180910390a150565b6001821115613f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f4590615781565b60405180910390fd5b81600a8281548110613f5c57fe5b9060005260206000209060070201600501819055507fe7fdf61d93ca682755140eb73628f48cfc090ca0f669e547790b227980e1a22c8282604051613fa2929190615906565b60405180910390a15050565b60008211613ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe890615601565b60405180910390fd5b81600a8281548110613fff57fe5b9060005260206000209060070201600601819055507f66317a45088a6e6e10f3831e0347d9fbaa68b04f54503eaf4e8683512a69077a8282604051614045929190615906565b60405180910390a15050565b600082905060008290508082141561406a57505061418d565b60008560028686038161407957fe5b0586018151811061408657fe5b602002602001015190505b818313614161575b808684815181106140a657fe5b602002602001015110156140c1578280600101935050614099565b5b8582815181106140ce57fe5b60200260200101518110156140eb578180600190039250506140c2565b81831361415c578582815181106140fe57fe5b602002602001015186848151811061411257fe5b602002602001015187858151811061412657fe5b6020026020010188858151811061413957fe5b602002602001018281525082815250505082806001019350508180600190039250505b614091565b8185121561417557614174868684614051565b5b8383121561418957614188868486614051565b5b5050505b505050565b82805482825590600052602060002090810192821561420b579160200282015b8281111561420a5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906141b2565b5b50905061421891906142aa565b5090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826142525760008555614299565b82601f1061426b57805160ff1916838001178555614299565b82800160010185558215614299579182015b8281111561429857825182559160200191906001019061427d565b5b5090506142a691906142aa565b5090565b5b808211156142c35760008160009055506001016142ab565b5090565b60006142da6142d584615a3d565b615a0c565b905080838252602082019050828560208602820111156142f957600080fd5b60005b85811015614329578161430f888261443a565b8452602084019350602083019250506001810190506142fc565b5050509392505050565b600061434661434184615a69565b615a0c565b9050808382526020820190508260005b85811015614386578135850161436c88826144f7565b845260208401935060208301925050600181019050614356565b5050509392505050565b60006143a361439e84615a95565b615a0c565b905080838252602082019050828560208602820111156143c257600080fd5b60005b858110156143f257816143d88882614521565b8452602084019350602083019250506001810190506143c5565b5050509392505050565b600061440f61440a84615ac1565b615a0c565b90508281526020810184848401111561442757600080fd5b614432848285615c4d565b509392505050565b60008135905061444981615ca2565b92915050565b60008135905061445e81615cb9565b92915050565b60008151905061447381615cb9565b92915050565b600082601f83011261448a57600080fd5b813561449a8482602086016142c7565b91505092915050565b600082601f8301126144b457600080fd5b81356144c4848260208601614333565b91505092915050565b600082601f8301126144de57600080fd5b81356144ee848260208601614390565b91505092915050565b600082601f83011261450857600080fd5b81356145188482602086016143fc565b91505092915050565b60008135905061453081615cd0565b92915050565b60006020828403121561454857600080fd5b600061455684828501614464565b91505092915050565b6000806040838503121561457257600080fd5b60006145808582860161443a565b925050602061459185828601614521565b9150509250929050565b600080600080600060a086880312156145b357600080fd5b600086013567ffffffffffffffff8111156145cd57600080fd5b6145d988828901614479565b95505060206145ea88828901614521565b94505060406145fb8882890161444f565b935050606061460c88828901614521565b925050608061461d8882890161443a565b9150509295509295909350565b60008060008060008060c0878903121561464357600080fd5b600087013567ffffffffffffffff81111561465d57600080fd5b61466989828a016144a3565b965050602087013567ffffffffffffffff81111561468657600080fd5b61469289828a016144a3565b955050604087013567ffffffffffffffff8111156146af57600080fd5b6146bb89828a016144cd565b945050606087013567ffffffffffffffff8111156146d857600080fd5b6146e489828a016144cd565b935050608087013567ffffffffffffffff81111561470157600080fd5b61470d89828a016144cd565b92505060a087013567ffffffffffffffff81111561472a57600080fd5b61473689828a016144cd565b9150509295509295509295565b60006020828403121561475557600080fd5b600082013567ffffffffffffffff81111561476f57600080fd5b61477b848285016144cd565b91505092915050565b6000806040838503121561479757600080fd5b600083013567ffffffffffffffff8111156147b157600080fd5b6147bd858286016144cd565b925050602083013567ffffffffffffffff8111156147da57600080fd5b6147e6858286016144cd565b9150509250929050565b60008060006060848603121561480557600080fd5b600084013567ffffffffffffffff81111561481f57600080fd5b61482b868287016144cd565b935050602084013567ffffffffffffffff81111561484857600080fd5b614854868287016144cd565b92505060406148658682870161443a565b9150509250925092565b60006020828403121561488157600080fd5b600061488f84828501614521565b91505092915050565b600080600080608085870312156148ae57600080fd5b60006148bc87828801614521565b94505060206148cd8782880161443a565b93505060406148de87828801614521565b92505060606148ef87828801614521565b91505092959194509250565b6000614907838361495d565b60208301905092915050565b600061491f8383614aac565b905092915050565b6000614933838361530e565b60208301905092915050565b61494881615c17565b82525050565b61495781615bdb565b82525050565b61496681615bc9565b82525050565b61497581615bc9565b82525050565b600061498682615b21565b6149908185615b74565b935061499b83615af1565b8060005b838110156149cc5781516149b388826148fb565b97506149be83615b4d565b92505060018101905061499f565b5085935050505092915050565b60006149e482615b2c565b6149ee8185615b85565b935083602082028501614a0085615b01565b8060005b85811015614a3c5784840389528151614a1d8582614913565b9450614a2883615b5a565b925060208a01995050600181019050614a04565b50829750879550505050505092915050565b6000614a5982615b37565b614a638185615b96565b9350614a6e83615b11565b8060005b83811015614a9f578151614a868882614927565b9750614a9183615b67565b925050600181019050614a72565b5085935050505092915050565b6000614ab782615b42565b614ac18185615ba7565b9350614ad1818560208601615c5c565b614ada81615c91565b840191505092915050565b6000614af082615b42565b614afa8185615bb8565b9350614b0a818560208601615c5c565b614b1381615c91565b840191505092915050565b6000614b2b601783615bb8565b91507f446f6e6174696f6e206d6f6465207475726e6564206f6e0000000000000000006000830152602082019050919050565b6000614b6b601b83615bb8565b91507f537562736372697074696f6e206d6f6465207475726e6564206f6e00000000006000830152602082019050919050565b6000614bab601a83615bb8565b91507f4d696e696d756d20737562736372697074696f6e2069732031680000000000006000830152602082019050919050565b6000614beb602b83615bb8565b91507f56616c7565206c656e67746820616e6420666565644944206c656e677468206460008301527f6f206e6f74206d617463680000000000000000000000000000000000000000006020830152604082019050919050565b6000614c51601383615bb8565b91507f5468726573686f6c642063616e742062652030000000000000000000000000006000830152602082019050919050565b6000614c91601783615bb8565b91507f666163746f72792063616e206e6f74206265206e756c6c0000000000000000006000830152602082019050919050565b6000614cd1602583615bb8565b91507f4f6e6c792061207369676e65722063616e20706572666f726d2074686973206160008301527f6374696f6e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d37601383615bb8565b91507f50726f706f73616c206e6f7420616374697665000000000000000000000000006000830152602082019050919050565b6000614d77601483615bb8565b91507f466565642070726963652063616e7420626520300000000000000000000000006000830152602082019050919050565b6000614db7602883615bb8565b91507f5468726573686f6c642063616e74206265206d6f7265207468656e207369676e60008301527f657220636f756e740000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e1d602a83615bb8565b91507f4e6f7420656e6f7567682066756e64732073656e7420746f20636f766572206f60008301527f7261636c652066656573000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e83602683615bb8565b91507f4d73672e76616c756520646f6573206e6f74206d65657420737570706f72742060008301527f76616c75657300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ee9601783615bb8565b91507f4e6f20737562736372697074696f6e20746f20666565640000000000000000006000830152602082019050919050565b6000614f29601b83615bb8565b91507f4c657373207369676e657273207468616e207468726573686f6c6400000000006000830152602082019050919050565b6000614f69601b83615bb8565b91507f57726f6e6720726576656e75654d6f646520706172616d6574657200000000006000830152602082019050919050565b6000614fa9601383615bb8565b91507f616c726561647920696e697469616c697a6564000000000000000000000000006000830152602082019050919050565b6000614fe9601083615bb8565b91507f4e6f74207a65726f2061646472657373000000000000000000000000000000006000830152602082019050919050565b6000615029601483615bb8565b91507f54696d65736c6f742063616e6e6f7420626520300000000000000000000000006000830152602082019050919050565b6000615069602f83615bb8565b91507f5468726573686f6c642063616e7420626520626967676572207468656e206c6560008301527f6e677468206f66207369676e65727300000000000000000000000000000000006020830152604082019050919050565b60006150cf601583615bb8565b91507f5369676e657220616c72656164792065786973747300000000000000000000006000830152602082019050919050565b600061510f602183615bb8565b91507f496e76616c696420617267756d656e7420666f7220726576656e7565204d6f6460008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615175601783615bb8565b91507f446563696d616c20706c6163657320746f6f20686967680000000000000000006000830152602082019050919050565b60006151b5600f83615bb8565b91507f4c656e677468206d69736d6174636800000000000000000000000000000000006000830152602082019050919050565b60006151f5601283615bb8565b91507f4e6f7420656e6f756768207061796d656e7400000000000000000000000000006000830152602082019050919050565b6000615235601f83615bb8565b91507f466565647320616e642054696d657374616d7073206d757374206d61746368006000830152602082019050919050565b6000615275601c83615bb8565b91507f537562736372697074696f6e2050617373207475726e6564206f6666000000006000830152602082019050919050565b60006152b5602483615bb8565b91507f4164647265737320746f2072656d6f76652068617320746f206265206120736960008301527f676e6572000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61531781615c0d565b82525050565b61532681615c0d565b82525050565b6000602082019050615341600083018461496c565b92915050565b600060208201905061535c600083018461494e565b92915050565b6000606082019050818103600083015261537c818661497b565b905061538b602083018561531d565b615398604083018461493f565b949350505050565b600060a08201905081810360008301526153ba81886149d9565b905081810360208301526153ce8187614a4e565b905081810360408301526153e28186614a4e565b905081810360608301526153f68185614a4e565b9050818103608083015261540a8184614a4e565b90509695505050505050565b600060208201905081810360008301526154308184614a4e565b905092915050565b600060608201905081810360008301526154528186614a4e565b905081810360208301526154668185614a4e565b9050818103604083015261547a8184614a4e565b9050949350505050565b600060e082019050818103600083015261549e818a614ae5565b905081810360208301526154b28189614ae5565b90506154c1604083018861531d565b6154ce606083018761531d565b6154db608083018661531d565b6154e860a083018561531d565b6154f560c083018461531d565b98975050505050505050565b6000602082019050818103600083015261551a81614b1e565b9050919050565b6000602082019050818103600083015261553a81614b5e565b9050919050565b6000602082019050818103600083015261555a81614b9e565b9050919050565b6000602082019050818103600083015261557a81614bde565b9050919050565b6000602082019050818103600083015261559a81614c44565b9050919050565b600060208201905081810360008301526155ba81614c84565b9050919050565b600060208201905081810360008301526155da81614cc4565b9050919050565b600060208201905081810360008301526155fa81614d2a565b9050919050565b6000602082019050818103600083015261561a81614d6a565b9050919050565b6000602082019050818103600083015261563a81614daa565b9050919050565b6000602082019050818103600083015261565a81614e10565b9050919050565b6000602082019050818103600083015261567a81614e76565b9050919050565b6000602082019050818103600083015261569a81614edc565b9050919050565b600060208201905081810360008301526156ba81614f1c565b9050919050565b600060208201905081810360008301526156da81614f5c565b9050919050565b600060208201905081810360008301526156fa81614f9c565b9050919050565b6000602082019050818103600083015261571a81614fdc565b9050919050565b6000602082019050818103600083015261573a8161501c565b9050919050565b6000602082019050818103600083015261575a8161505c565b9050919050565b6000602082019050818103600083015261577a816150c2565b9050919050565b6000602082019050818103600083015261579a81615102565b9050919050565b600060208201905081810360008301526157ba81615168565b9050919050565b600060208201905081810360008301526157da816151a8565b9050919050565b600060208201905081810360008301526157fa816151e8565b9050919050565b6000602082019050818103600083015261581a81615228565b9050919050565b6000602082019050818103600083015261583a81615268565b9050919050565b6000602082019050818103600083015261585a816152a8565b9050919050565b6000602082019050615876600083018461531d565b92915050565b6000604082019050615891600083018561531d565b61589e602083018461493f565b9392505050565b600060c0820190506158ba600083018961531d565b6158c7602083018861496c565b6158d4604083018761496c565b6158e1606083018661531d565b6158ee608083018561531d565b6158fb60a083018461531d565b979650505050505050565b600060408201905061591b600083018561531d565b615928602083018461531d565b9392505050565b600060a082019050615944600083018861531d565b615951602083018761531d565b61595e604083018661496c565b61596b606083018561531d565b615978608083018461493f565b9695505050505050565b6000606082019050615997600083018661531d565b6159a4602083018561531d565b6159b1604083018461531d565b949350505050565b600060a0820190506159ce600083018861531d565b6159db602083018761531d565b6159e8604083018661531d565b6159f5606083018561531d565b615a02608083018461493f565b9695505050505050565b6000604051905081810181811067ffffffffffffffff82111715615a3357615a32615c8f565b5b8060405250919050565b600067ffffffffffffffff821115615a5857615a57615c8f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615a8457615a83615c8f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615ab057615aaf615c8f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615adc57615adb615c8f565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615bd482615bed565b9050919050565b6000615be682615bed565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000615c2282615c29565b9050919050565b6000615c3482615c3b565b9050919050565b6000615c4682615bed565b9050919050565b82818337600083830152505050565b60005b83811015615c7a578082015181840152602081019050615c5f565b83811115615c89576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b615cab81615bc9565b8114615cb657600080fd5b50565b615cc281615bdb565b8114615ccd57600080fd5b50565b615cd981615c0d565b8114615ce457600080fd5b5056fea26469706673582212208d1d8b02c8fc53e8e644aa81802a751b33f0ffa46a82b2bde8ca609beb1a2e2864736f6c63430007060033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.