{
  "_format": "hh-sol-artifact-1",
  "contractName": "RewardDistributor",
  "sourceName": "contracts/RewardDistributor.sol",
  "abi": [
    {
      "inputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "rewardType",
          "type": "uint8"
        },
        {
          "indexed": true,
          "internalType": "contract JToken",
          "name": "jToken",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "borrower",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "rewardDelta",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "rewardBorrowIndex",
          "type": "uint256"
        }
      ],
      "name": "DistributedBorrowerReward",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "rewardType",
          "type": "uint8"
        },
        {
          "indexed": true,
          "internalType": "contract JToken",
          "name": "jToken",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "supplier",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "rewardDelta",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "rewardSupplyIndex",
          "type": "uint256"
        }
      ],
      "name": "DistributedSupplierReward",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "rewardType",
          "type": "uint8"
        },
        {
          "indexed": true,
          "internalType": "contract JToken",
          "name": "jToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newSpeed",
          "type": "uint256"
        }
      ],
      "name": "RewardBorrowSpeedUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "rewardType",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "RewardGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "rewardType",
          "type": "uint8"
        },
        {
          "indexed": true,
          "internalType": "contract JToken",
          "name": "jToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newSpeed",
          "type": "uint256"
        }
      ],
      "name": "RewardSupplySpeedUpdated",
      "type": "event"
    },
    {
      "payable": true,
      "stateMutability": "payable",
      "type": "fallback"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint8",
          "name": "rewardType",
          "type": "uint8"
        },
        {
          "internalType": "address payable",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "_grantReward",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint8",
          "name": "rewardType",
          "type": "uint8"
        },
        {
          "internalType": "contract JToken",
          "name": "jToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "rewardSupplySpeed",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "rewardBorrowSpeed",
          "type": "uint256"
        }
      ],
      "name": "_setRewardSpeed",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "admin",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint8",
          "name": "rewardType",
          "type": "uint8"
        },
        {
          "internalType": "address payable",
          "name": "holder",
          "type": "address"
        }
      ],
      "name": "claimReward",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint8",
          "name": "rewardType",
          "type": "uint8"
        },
        {
          "internalType": "address payable",
          "name": "holder",
          "type": "address"
        },
        {
          "internalType": "contract JToken[]",
          "name": "jTokens",
          "type": "address[]"
        }
      ],
      "name": "claimReward",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint8",
          "name": "rewardType",
          "type": "uint8"
        },
        {
          "internalType": "address payable[]",
          "name": "holders",
          "type": "address[]"
        },
        {
          "internalType": "contract JToken[]",
          "name": "jTokens",
          "type": "address[]"
        },
        {
          "internalType": "bool",
          "name": "borrowers",
          "type": "bool"
        },
        {
          "internalType": "bool",
          "name": "suppliers",
          "type": "bool"
        }
      ],
      "name": "claimReward",
      "outputs": [],
      "payable": true,
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "getBlockTimestamp",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "initialize",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "joeAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "joetroller",
      "outputs": [
        {
          "internalType": "contract Joetroller",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "rewardAccrued",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "rewardBorrowSpeeds",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "rewardBorrowState",
      "outputs": [
        {
          "internalType": "uint224",
          "name": "index",
          "type": "uint224"
        },
        {
          "internalType": "uint32",
          "name": "timestamp",
          "type": "uint32"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "rewardBorrowerIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "rewardInitialIndex",
      "outputs": [
        {
          "internalType": "uint224",
          "name": "",
          "type": "uint224"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "rewardSupplierIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "rewardSupplySpeeds",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "rewardSupplyState",
      "outputs": [
        {
          "internalType": "uint224",
          "name": "index",
          "type": "uint224"
        },
        {
          "internalType": "uint32",
          "name": "timestamp",
          "type": "uint32"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "_newAdmin",
          "type": "address"
        }
      ],
      "name": "setAdmin",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "newJoeAddress",
          "type": "address"
        }
      ],
      "name": "setJoeAddress",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "_joetroller",
          "type": "address"
        }
      ],
      "name": "setJoetroller",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "jToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "borrower",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "mantissa",
              "type": "uint256"
            }
          ],
          "internalType": "struct Exponential.Exp",
          "name": "marketBorrowIndex",
          "type": "tuple"
        }
      ],
      "name": "updateAndDistributeBorrowerRewardsForToken",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "jToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "supplier",
          "type": "address"
        }
      ],
      "name": "updateAndDistributeSupplierRewardsForToken",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03191633179055612ca7806100326000396000f3fe6080604052600436106101405760003560e01c8063744532ae116100b65780639c39e2931161006f5780639c39e29314610367578063bf09595514610387578063cb15d8e2146103a7578063d81c5e45146103c9578063f851a440146103e9578063fcc4cfd1146103fe57610140565b8063744532ae146102ca5780637937969d146102ea578063796b89b91461030a5780638129fc1c1461031f5780638805714b1461033457806388e972b81461034757610140565b80632f32b11f116101085780632f32b11f146101f85780634b3a0a74146102185780636330533c1461024657806366f91a2414610268578063670e8afd1461028a578063704b6c02146102aa57610140565b8063030ce6381461014257806305b9783d146101785780630952c563146101985780631d94cb94146101b85780631f9f3511146101d8575b005b34801561014e57600080fd5b5061016261015d36600461242e565b61041e565b60405161016f9190612acf565b60405180910390f35b34801561018457600080fd5b5061016261019336600461242e565b61043b565b3480156101a457600080fd5b506101406101b336600461242e565b610458565b3480156101c457600080fd5b506101406101d33660046125d3565b6104eb565b3480156101e457600080fd5b506101406101f33660046122f2565b61054e565b34801561020457600080fd5b506101406102133660046124a8565b61059a565b34801561022457600080fd5b5061023861023336600461242e565b61062c565b60405161016f929190612ab4565b34801561025257600080fd5b5061025b610661565b60405161016f91906129c7565b34801561027457600080fd5b5061027d610670565b60405161016f9190612aa6565b34801561029657600080fd5b506101406102a5366004612318565b610683565b3480156102b657600080fd5b506101406102c53660046122f2565b6106d7565b3480156102d657600080fd5b506101406102e536600461244d565b610723565b3480156102f657600080fd5b506101626103053660046124eb565b610781565b34801561031657600080fd5b506101626107a4565b34801561032b57600080fd5b506101406107a8565b61014061034236600461252e565b6107f9565b34801561035357600080fd5b506101626103623660046124eb565b610b47565b34801561037357600080fd5b50610140610382366004612352565b610b6a565b34801561039357600080fd5b506101626103a236600461242e565b610bd7565b3480156103b357600080fd5b506103bc610bf4565b60405161016f9190612990565b3480156103d557600080fd5b506102386103e436600461242e565b610c03565b3480156103f557600080fd5b506103bc610c38565b34801561040a57600080fd5b506101406104193660046122f2565b610c47565b600260209081526000928352604080842090915290825290205481565b600860209081526000928352604080842090915290825290205481565b6104e78282600160009054906101000a90046001600160a01b03166001600160a01b031663b0772d0b6040518163ffffffff1660e01b815260040160006040518083038186803b1580156104ab57600080fd5b505afa1580156104bf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102e5919081019061239f565b5050565b60018460ff1611156105185760405162461bcd60e51b815260040161050f90612a56565b60405180910390fd5b610520610c93565b61053c5760405162461bcd60e51b815260040161050f90612a96565b61054884848484610cbc565b50505050565b6000546001600160a01b031633146105785760405162461bcd60e51b815260040161050f906129e6565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6105a2610c93565b6105be5760405162461bcd60e51b815260040161050f90612a36565b60006105cb848484611224565b905080156105eb5760405162461bcd60e51b815260040161050f90612a66565b7fc6d3bad890aa15362e90611f8643bfafcf5b09a9d4781295bd7ba8adffa0371184848460405161061e93929190612add565b60405180910390a150505050565b60056020908152600092835260408084209091529082529020546001600160e01b03811690600160e01b900463ffffffff1682565b6001546001600160a01b031681565b6ec097ce7bc90715b34b9f100000000081565b61068b610c93565b6106a75760405162461bcd60e51b815260040161050f90612a46565b60005b60018160ff16116106d2576106bf81846113cb565b6106ca81848461169c565b6001016106aa565b505050565b6000546001600160a01b031633146107015760405162461bcd60e51b815260040161050f90612a86565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60408051600180825281830190925260609160208083019080388339019050509050828160008151811061075357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506105488482846001806107f9565b600760209081526000938452604080852082529284528284209052825290205481565b4290565b600954600160a01b900460ff16156107d25760405162461bcd60e51b815260040161050f90612a76565b600180546001600160a01b031916331790556009805460ff60a01b1916600160a01b179055565b60018560ff16111561081d5760405162461bcd60e51b815260040161050f90612a56565b60005b8351811015610b3f57600084828151811061083757fe5b6020908102919091010151600154604051633d98a1e560e01b81529192506001600160a01b031690633d98a1e590610873908490600401612990565b60206040518083038186803b15801561088b57600080fd5b505afa15801561089f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108c391908101906123d4565b6108df5760405162461bcd60e51b815260040161050f90612a26565b60018415151415610a67576108f26120dd565b6040518060200160405280836001600160a01b031663aa5af0fd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561093657600080fd5b505afa15801561094a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061096e9190810190612410565b9052905061097d8883836118d6565b60005b8751811015610a64576109a889848a848151811061099a57fe5b602002602001015185611be8565b610a15898983815181106109b857fe5b6020026020010151600860008d60ff1660ff16815260200190815260200160002060008c86815181106109e757fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054611224565b60ff8a1660009081526008602052604081208a519091908b9085908110610a3857fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055600101610980565b50505b60018315151415610b3657610a7c87826113cb565b60005b8651811015610b3457610aa68883898481518110610a9957fe5b602002602001015161169c565b610ae588888381518110610ab657fe5b6020026020010151600860008c60ff1660ff16815260200190815260200160002060008b86815181106109e757fe5b60ff8916600090815260086020526040812089519091908a9085908110610b0857fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055600101610a7f565b505b50600101610820565b505050505050565b600660209081526000938452604080852082529284528284209052825290205481565b610b72610c93565b610b8e5760405162461bcd60e51b815260040161050f90612a06565b60005b60018160ff161161054857610bb58185610bb0368690038601866123f2565b6118d6565b610bcf818585610bca368790038701876123f2565b611be8565b600101610b91565b600360209081526000928352604080842090915290825290205481565b6009546001600160a01b031681565b60046020908152600092835260408084209091529082529020546001600160e01b03811690600160e01b900463ffffffff1682565b6000546001600160a01b031681565b6000546001600160a01b03163314610c715760405162461bcd60e51b815260040161050f906129f6565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b0316331480610cb757506001546001600160a01b031633145b905090565b60ff841660009081526002602090815260408083206001600160a01b03871684529091529020548015610cf857610cf385856113cb565b610ed0565b8215610ed057600154604051633d98a1e560e01b81526001600160a01b0390911690633d98a1e590610d2e908790600401612990565b60206040518083038186803b158015610d4657600080fd5b505afa158015610d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d7e91908101906123d4565b610d9a5760405162461bcd60e51b815260040161050f90612a16565b60ff851660009081526004602090815260408083206001600160a01b03881684529091529020546001600160e01b0316158015610e08575060ff851660009081526004602090815260408083206001600160a01b0388168452909152902054600160e01b900463ffffffff16155b15610ed05760405180604001604052806ec097ce7bc90715b34b9f10000000006001600160e01b03168152602001610e6a610e416107a4565b6040518060400160405280601f8152602001600080516020612c45833981519152815250611df1565b63ffffffff90811690915260ff871660009081526004602090815260408083206001600160a01b038a1684528252909120835181549490920151909216600160e01b026001600160e01b039182166001600160e01b031990941693909317169190911790555b828114610f3c5760ff851660009081526002602090815260408083206001600160a01b03881680855292529182902085905590517f71975117d0c353e131b030f9cf69eecfded777f5ba2a036b066b90da4c89ab4290610f339088908790612b05565b60405180910390a25b60ff851660009081526003602090815260408083206001600160a01b0388168452909152902054801561100257610f716120dd565b6040518060200160405280876001600160a01b031663aa5af0fd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fb557600080fd5b505afa158015610fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fed9190810190612410565b90529050610ffc8787836118d6565b506111b1565b82156111b157600154604051633d98a1e560e01b81526001600160a01b0390911690633d98a1e590611038908890600401612990565b60206040518083038186803b15801561105057600080fd5b505afa158015611064573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061108891908101906123d4565b6110a45760405162461bcd60e51b815260040161050f90612a16565b60ff861660009081526005602090815260408083206001600160a01b03891684529091529020546001600160e01b0316158015611112575060ff861660009081526005602090815260408083206001600160a01b0389168452909152902054600160e01b900463ffffffff16155b156111b15760405180604001604052806ec097ce7bc90715b34b9f10000000006001600160e01b0316815260200161114b610e416107a4565b63ffffffff90811690915260ff881660009081526005602090815260408083206001600160a01b038b1684528252909120835181549490920151909216600160e01b026001600160e01b039182166001600160e01b031990941693909317169190911790555b828114610b3f5760ff861660009081526003602090815260408083206001600160a01b03891680855292529182902085905590517ffc4f93ddd4a06ca99d4cd58e8f2a3eaec8f2f3795f127d83e0c203e08f8997e1906112149089908790612b05565b60405180910390a2505050505050565b600060ff841661135d576009546040516370a0823160e01b81526001600160a01b039091169060009082906370a082319061126390309060040161299e565b60206040518083038186803b15801561127b57600080fd5b505afa15801561128f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112b39190810190612410565b90506000841180156112c55750808411155b156113565760405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906112f890889088906004016129ac565b602060405180830381600087803b15801561131257600080fd5b505af1158015611326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061134a91908101906123d4565b506000925050506113c4565b50506113c1565b8360ff16600114156113c1574782158015906113795750808311155b156113bf576040516001600160a01b0385169084156108fc029085906000818181858888f193505050501580156113b4573d6000803e3d6000fd5b5060009150506113c4565b505b50805b9392505050565b60018260ff1611156113ef5760405162461bcd60e51b815260040161050f90612a56565b60ff821660008181526004602090815260408083206001600160a01b03861680855290835281842094845260028352818420908452909152812054906114336107a4565b8354909150600090611453908390600160e01b900463ffffffff16611e24565b90506000811180156114655750600083115b15611642576000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114a557600080fd5b505afa1580156114b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114dd9190810190612410565b905060006114eb8386611e5e565b90506114f56120dd565b60008311611512576040518060200160405280600081525061151c565b61151c8284611ea0565b90506115266120dd565b604080516020810190915288546001600160e01b031681526115489083611ede565b9050604051806040016040528061159883600001516040518060400160405280601a81526020017f6e657720696e6465782065786365656473203232342062697473000000000000815250611f03565b6001600160e01b031681526020016115d3886040518060400160405280601f8152602001600080516020612c45833981519152815250611df1565b63ffffffff90811690915260ff8c1660009081526004602090815260408083206001600160a01b038f1684528252909120835181549490920151909216600160e01b026001600160e01b039182166001600160e01b0319909416939093171691909117905550610b3f92505050565b8015610b3f57611675826040518060400160405280601f8152602001600080516020612c45833981519152815250611df1565b845463ffffffff91909116600160e01b026001600160e01b03909116178455505050505050565b60018360ff1611156116c05760405162461bcd60e51b815260040161050f90612a56565b60ff831660009081526004602090815260408083206001600160a01b038616845290915290206116ee6120dd565b50604080516020810190915281546001600160e01b0316815261170f6120dd565b50604080516020808201835260ff88166000908152600682528381206001600160a01b03808a1683529083528482209088168083528184529482208054855286519590925290915291909155805115801561176a5750815115155b15611782576ec097ce7bc90715b34b9f100000000081525b61178a6120dd565b6117948383611f2a565b90506000866001600160a01b03166370a08231876040518263ffffffff1660e01b81526004016117c49190612990565b60206040518083038186803b1580156117dc57600080fd5b505afa1580156117f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118149190810190612410565b905060006118228284611f4f565b60ff8a1660009081526008602090815260408083206001600160a01b038c168452909152812054919250906118579083611f7e565b60ff8b1660009081526008602090815260408083206001600160a01b03808e168086529190935292819020849055895190519394509192908c16917faccd035d02c456be35306aecd5a5fe62320713dde09ccd68b0a5e8ed93039999916118c2918f91889190612b13565b60405180910390a350505050505050505050565b60018360ff1611156118fa5760405162461bcd60e51b815260040161050f90612a56565b60ff831660008181526005602090815260408083206001600160a01b038716808552908352818420948452600383528184209084529091528120549061193e6107a4565b835490915060009061195e908390600160e01b900463ffffffff16611e24565b90506000811180156119705750600083115b15611b8c5760006119f1876001600160a01b03166347bd37186040518163ffffffff1660e01b815260040160206040518083038186803b1580156119b357600080fd5b505afa1580156119c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119eb9190810190612410565b87611fb4565b905060006119ff8386611e5e565b9050611a096120dd565b60008311611a265760405180602001604052806000815250611a30565b611a308284611ea0565b9050611a3a6120dd565b604080516020810190915288546001600160e01b03168152611a5c9083611ede565b90506040518060400160405280611aac83600001516040518060400160405280601a81526020017f6e657720696e6465782065786365656473203232342062697473000000000000815250611f03565b6001600160e01b03168152602001611ae7886040518060400160405280601f8152602001600080516020612c45833981519152815250611df1565b63ffffffff16815250600560008d60ff1660ff16815260200190815260200160002060008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160e01b0302191690836001600160e01b03160217905550602082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555090505050505050611bdf565b8015611bdf57611bbf826040518060400160405280601f8152602001600080516020612c45833981519152815250611df1565b845463ffffffff91909116600160e01b026001600160e01b039091161784555b50505050505050565b60018460ff161115611c0c5760405162461bcd60e51b815260040161050f90612a56565b60ff841660009081526005602090815260408083206001600160a01b03871684529091529020611c3a6120dd565b50604080516020810190915281546001600160e01b03168152611c5b6120dd565b50604080516020808201835260ff89166000908152600782528381206001600160a01b03808b1683529083528482209089168083528184529482208054855286519590925290915291909155805115611bdf57611cb66120dd565b611cc08383611f2a565b90506000611d0b886001600160a01b03166395dd9193896040518263ffffffff1660e01b8152600401611cf39190612990565b60206040518083038186803b1580156119b357600080fd5b90506000611d198284611f4f565b60ff8b1660009081526008602090815260408083206001600160a01b038d16845290915281205491925090611d4e9083611f7e565b905080600860008d60ff1660ff16815260200190815260200160002060008b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550886001600160a01b03168a6001600160a01b03167fa1b6a046664a0ecf068059f26de56878f8d0e799907ca2e42d9148ccbdc717a78d858a60000151604051611ddc93929190612b13565b60405180910390a35050505050505050505050565b6000816401000000008410611e195760405162461bcd60e51b815260040161050f91906129d5565b508290505b92915050565b60006113c48383604051806040016040528060158152602001747375627472616374696f6e20756e646572666c6f7760581b815250611fd2565b60006113c483836040518060400160405280601781526020017f6d756c7469706c69636174696f6e206f766572666c6f77000000000000000000815250611ffe565b611ea86120dd565b6040518060200160405280611ed5611ecf866ec097ce7bc90715b34b9f1000000000611e5e565b8561204f565b90529392505050565b611ee66120dd565b6040518060200160405280611ed585600001518560000151611f7e565b600081600160e01b8410611e195760405162461bcd60e51b815260040161050f91906129d5565b611f326120dd565b6040518060200160405280611ed585600001518560000151611e24565b60006ec097ce7bc90715b34b9f1000000000611f6f848460000151611e5e565b81611f7657fe5b049392505050565b60006113c48383604051806040016040528060118152602001706164646974696f6e206f766572666c6f7760781b815250612082565b60006113c4611fcb84670de0b6b3a7640000611e5e565b835161204f565b60008184841115611ff65760405162461bcd60e51b815260040161050f91906129d5565b505050900390565b600083158061200b575082155b15612018575060006113c4565b8383028385828161202557fe5b041483906120465760405162461bcd60e51b815260040161050f91906129d5565b50949350505050565b60006113c483836040518060400160405280600e81526020016d646976696465206279207a65726f60901b8152506120a9565b600083830182858210156120465760405162461bcd60e51b815260040161050f91906129d5565b600081836120ca5760405162461bcd60e51b815260040161050f91906129d5565b508284816120d457fe5b04949350505050565b6040518060200160405280600081525090565b8035611e1e81612c09565b600082601f83011261210c57600080fd5b813561211f61211a82612b55565b612b2e565b9150818183526020840193506020810190508385602084028201111561214457600080fd5b60005b83811015612170578161215a88826120f0565b8452506020928301929190910190600101612147565b5050505092915050565b600082601f83011261218b57600080fd5b813561219961211a82612b55565b915081818352602084019350602081019050838560208402820111156121be57600080fd5b60005b8381101561217057816121d48882612270565b84525060209283019291909101906001016121c1565b600082601f8301126121fb57600080fd5b815161220961211a82612b55565b9150818183526020840193506020810190508385602084028201111561222e57600080fd5b60005b838110156121705781612244888261227b565b8452506020928301929190910190600101612231565b8035611e1e81612c20565b8051611e1e81612c20565b8035611e1e81612c29565b8051611e1e81612c29565b60006020828403121561229857600080fd5b50919050565b6000602082840312156122b057600080fd5b6122ba6020612b2e565b905060006122c884846122d1565b82525092915050565b8035611e1e81612c32565b8051611e1e81612c32565b8035611e1e81612c3b565b60006020828403121561230457600080fd5b600061231084846120f0565b949350505050565b6000806040838503121561232b57600080fd5b600061233785856120f0565b9250506020612348858286016120f0565b9150509250929050565b60008060006060848603121561236757600080fd5b600061237386866120f0565b9350506020612384868287016120f0565b925050604061239586828701612286565b9150509250925092565b6000602082840312156123b157600080fd5b815167ffffffffffffffff8111156123c857600080fd5b612310848285016121ea565b6000602082840312156123e657600080fd5b60006123108484612265565b60006020828403121561240457600080fd5b6000612310848461229e565b60006020828403121561242257600080fd5b600061231084846122dc565b6000806040838503121561244157600080fd5b600061233785856122e7565b60008060006060848603121561246257600080fd5b600061246e86866122e7565b935050602061247f868287016120f0565b925050604084013567ffffffffffffffff81111561249c57600080fd5b6123958682870161217a565b6000806000606084860312156124bd57600080fd5b60006124c986866122e7565b93505060206124da868287016120f0565b9250506040612395868287016122d1565b60008060006060848603121561250057600080fd5b600061250c86866122e7565b935050602061251d868287016120f0565b9250506040612395868287016120f0565b600080600080600060a0868803121561254657600080fd5b600061255288886122e7565b955050602086013567ffffffffffffffff81111561256f57600080fd5b61257b888289016120fb565b945050604086013567ffffffffffffffff81111561259857600080fd5b6125a48882890161217a565b93505060606125b58882890161225a565b92505060806125c68882890161225a565b9150509295509295909350565b600080600080608085870312156125e957600080fd5b60006125f587876122e7565b945050602061260687828801612270565b9350506040612617878288016122d1565b9250506060612628878288016122d1565b91505092959194509250565b61263d81612bc8565b82525050565b61263d81612b83565b61263d81612b93565b600061266082612b76565b61266a8185612b7a565b935061267a818560208601612bd3565b61268381612bff565b9093019392505050565b600061269a601d83612b7a565b7f6f6e6c792061646d696e2063616e20736574204a6f6574726f6c6c6572000000815260200192915050565b60006126d3601683612b7a565b756f6e6c792061646d696e2063616e20736574204a4f4560501b815260200192915050565b6000612705603583612b7a565b7f6f6e6c792061646d696e2063616e2075706461746520616e64206469737472698152746275746520626f72726f776572207265776172647360581b602082015260400192915050565b600061275c601b83612b7a565b7f726577617264206d61726b6574206973206e6f74206c69737465640000000000815260200192915050565b6000612795601583612b7a565b741b585c9ad95d081b5d5cdd081899481b1a5cdd1959605a1b815260200192915050565b60006127c6601883612b7a565b7f6f6e6c792061646d696e2063616e206772616e74206a6f650000000000000000815260200192915050565b60006127ff603583612b7a565b7f6f6e6c792061646d696e2063616e2075706461746520616e64206469737472698152746275746520737570706c696572207265776172647360581b602082015260400192915050565b6000612856601583612b7a565b741c995dd85c99151e5c19481a5cc81a5b9d985b1a59605a1b815260200192915050565b6000612887601a83612b7a565b7f696e73756666696369656e74206a6f6520666f72206772616e74000000000000815260200192915050565b60006128c0602583612b7a565b7f5265776172644469737472696275746f7220616c726561647920696e697469618152641b1a5e995960da1b602082015260400192915050565b6000612907601883612b7a565b7f6f6e6c792061646d696e2063616e207365742061646d696e0000000000000000815260200192915050565b6000612940601f83612b7a565b7f6f6e6c792061646d696e2063616e207365742072657761726420737065656400815260200192915050565b61263d81612baa565b61263d81612bb6565b61263d81612bb9565b61263d81612bc2565b60208101611e1e8284612643565b60208101611e1e8284612634565b604081016129ba8285612634565b6113c46020830184612975565b60208101611e1e828461264c565b602080825281016113c48184612655565b60208082528101611e1e8161268d565b60208082528101611e1e816126c6565b60208082528101611e1e816126f8565b60208082528101611e1e8161274f565b60208082528101611e1e81612788565b60208082528101611e1e816127b9565b60208082528101611e1e816127f2565b60208082528101611e1e81612849565b60208082528101611e1e8161287a565b60208082528101611e1e816128b3565b60208082528101611e1e816128fa565b60208082528101611e1e81612933565b60208101611e1e828461296c565b60408101612ac2828561296c565b6113c4602083018461297e565b60208101611e1e8284612975565b60608101612aeb8286612987565b612af86020830185612634565b6123106040830184612975565b604081016129ba8285612987565b60608101612b218286612987565b612af86020830185612975565b60405181810167ffffffffffffffff81118282101715612b4d57600080fd5b604052919050565b600067ffffffffffffffff821115612b6c57600080fd5b5060209081020190565b5190565b90815260200190565b6000611e1e82612b9e565b151590565b6000611e1e82612b83565b6001600160a01b031690565b6001600160e01b031690565b90565b63ffffffff1690565b60ff1690565b6000611e1e82612b93565b60005b83811015612bee578181015183820152602001612bd6565b838111156105485750506000910152565b601f01601f191690565b612c1281612b83565b8114612c1d57600080fd5b50565b612c1281612b8e565b612c1281612b93565b612c1281612bb6565b612c1281612bc256fe626c6f636b2074696d657374616d702065786365656473203332206269747300a365627a7a72315820dc4b10f9ef3011be4c84bb0dd68509239d557c6c17a0ede63642e0e11116c3256c6578706572696d656e74616cf564736f6c63430005100040",
  "deployedBytecode": "0x6080604052600436106101405760003560e01c8063744532ae116100b65780639c39e2931161006f5780639c39e29314610367578063bf09595514610387578063cb15d8e2146103a7578063d81c5e45146103c9578063f851a440146103e9578063fcc4cfd1146103fe57610140565b8063744532ae146102ca5780637937969d146102ea578063796b89b91461030a5780638129fc1c1461031f5780638805714b1461033457806388e972b81461034757610140565b80632f32b11f116101085780632f32b11f146101f85780634b3a0a74146102185780636330533c1461024657806366f91a2414610268578063670e8afd1461028a578063704b6c02146102aa57610140565b8063030ce6381461014257806305b9783d146101785780630952c563146101985780631d94cb94146101b85780631f9f3511146101d8575b005b34801561014e57600080fd5b5061016261015d36600461242e565b61041e565b60405161016f9190612acf565b60405180910390f35b34801561018457600080fd5b5061016261019336600461242e565b61043b565b3480156101a457600080fd5b506101406101b336600461242e565b610458565b3480156101c457600080fd5b506101406101d33660046125d3565b6104eb565b3480156101e457600080fd5b506101406101f33660046122f2565b61054e565b34801561020457600080fd5b506101406102133660046124a8565b61059a565b34801561022457600080fd5b5061023861023336600461242e565b61062c565b60405161016f929190612ab4565b34801561025257600080fd5b5061025b610661565b60405161016f91906129c7565b34801561027457600080fd5b5061027d610670565b60405161016f9190612aa6565b34801561029657600080fd5b506101406102a5366004612318565b610683565b3480156102b657600080fd5b506101406102c53660046122f2565b6106d7565b3480156102d657600080fd5b506101406102e536600461244d565b610723565b3480156102f657600080fd5b506101626103053660046124eb565b610781565b34801561031657600080fd5b506101626107a4565b34801561032b57600080fd5b506101406107a8565b61014061034236600461252e565b6107f9565b34801561035357600080fd5b506101626103623660046124eb565b610b47565b34801561037357600080fd5b50610140610382366004612352565b610b6a565b34801561039357600080fd5b506101626103a236600461242e565b610bd7565b3480156103b357600080fd5b506103bc610bf4565b60405161016f9190612990565b3480156103d557600080fd5b506102386103e436600461242e565b610c03565b3480156103f557600080fd5b506103bc610c38565b34801561040a57600080fd5b506101406104193660046122f2565b610c47565b600260209081526000928352604080842090915290825290205481565b600860209081526000928352604080842090915290825290205481565b6104e78282600160009054906101000a90046001600160a01b03166001600160a01b031663b0772d0b6040518163ffffffff1660e01b815260040160006040518083038186803b1580156104ab57600080fd5b505afa1580156104bf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102e5919081019061239f565b5050565b60018460ff1611156105185760405162461bcd60e51b815260040161050f90612a56565b60405180910390fd5b610520610c93565b61053c5760405162461bcd60e51b815260040161050f90612a96565b61054884848484610cbc565b50505050565b6000546001600160a01b031633146105785760405162461bcd60e51b815260040161050f906129e6565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6105a2610c93565b6105be5760405162461bcd60e51b815260040161050f90612a36565b60006105cb848484611224565b905080156105eb5760405162461bcd60e51b815260040161050f90612a66565b7fc6d3bad890aa15362e90611f8643bfafcf5b09a9d4781295bd7ba8adffa0371184848460405161061e93929190612add565b60405180910390a150505050565b60056020908152600092835260408084209091529082529020546001600160e01b03811690600160e01b900463ffffffff1682565b6001546001600160a01b031681565b6ec097ce7bc90715b34b9f100000000081565b61068b610c93565b6106a75760405162461bcd60e51b815260040161050f90612a46565b60005b60018160ff16116106d2576106bf81846113cb565b6106ca81848461169c565b6001016106aa565b505050565b6000546001600160a01b031633146107015760405162461bcd60e51b815260040161050f90612a86565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60408051600180825281830190925260609160208083019080388339019050509050828160008151811061075357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506105488482846001806107f9565b600760209081526000938452604080852082529284528284209052825290205481565b4290565b600954600160a01b900460ff16156107d25760405162461bcd60e51b815260040161050f90612a76565b600180546001600160a01b031916331790556009805460ff60a01b1916600160a01b179055565b60018560ff16111561081d5760405162461bcd60e51b815260040161050f90612a56565b60005b8351811015610b3f57600084828151811061083757fe5b6020908102919091010151600154604051633d98a1e560e01b81529192506001600160a01b031690633d98a1e590610873908490600401612990565b60206040518083038186803b15801561088b57600080fd5b505afa15801561089f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108c391908101906123d4565b6108df5760405162461bcd60e51b815260040161050f90612a26565b60018415151415610a67576108f26120dd565b6040518060200160405280836001600160a01b031663aa5af0fd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561093657600080fd5b505afa15801561094a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061096e9190810190612410565b9052905061097d8883836118d6565b60005b8751811015610a64576109a889848a848151811061099a57fe5b602002602001015185611be8565b610a15898983815181106109b857fe5b6020026020010151600860008d60ff1660ff16815260200190815260200160002060008c86815181106109e757fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054611224565b60ff8a1660009081526008602052604081208a519091908b9085908110610a3857fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055600101610980565b50505b60018315151415610b3657610a7c87826113cb565b60005b8651811015610b3457610aa68883898481518110610a9957fe5b602002602001015161169c565b610ae588888381518110610ab657fe5b6020026020010151600860008c60ff1660ff16815260200190815260200160002060008b86815181106109e757fe5b60ff8916600090815260086020526040812089519091908a9085908110610b0857fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055600101610a7f565b505b50600101610820565b505050505050565b600660209081526000938452604080852082529284528284209052825290205481565b610b72610c93565b610b8e5760405162461bcd60e51b815260040161050f90612a06565b60005b60018160ff161161054857610bb58185610bb0368690038601866123f2565b6118d6565b610bcf818585610bca368790038701876123f2565b611be8565b600101610b91565b600360209081526000928352604080842090915290825290205481565b6009546001600160a01b031681565b60046020908152600092835260408084209091529082529020546001600160e01b03811690600160e01b900463ffffffff1682565b6000546001600160a01b031681565b6000546001600160a01b03163314610c715760405162461bcd60e51b815260040161050f906129f6565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b0316331480610cb757506001546001600160a01b031633145b905090565b60ff841660009081526002602090815260408083206001600160a01b03871684529091529020548015610cf857610cf385856113cb565b610ed0565b8215610ed057600154604051633d98a1e560e01b81526001600160a01b0390911690633d98a1e590610d2e908790600401612990565b60206040518083038186803b158015610d4657600080fd5b505afa158015610d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d7e91908101906123d4565b610d9a5760405162461bcd60e51b815260040161050f90612a16565b60ff851660009081526004602090815260408083206001600160a01b03881684529091529020546001600160e01b0316158015610e08575060ff851660009081526004602090815260408083206001600160a01b0388168452909152902054600160e01b900463ffffffff16155b15610ed05760405180604001604052806ec097ce7bc90715b34b9f10000000006001600160e01b03168152602001610e6a610e416107a4565b6040518060400160405280601f8152602001600080516020612c45833981519152815250611df1565b63ffffffff90811690915260ff871660009081526004602090815260408083206001600160a01b038a1684528252909120835181549490920151909216600160e01b026001600160e01b039182166001600160e01b031990941693909317169190911790555b828114610f3c5760ff851660009081526002602090815260408083206001600160a01b03881680855292529182902085905590517f71975117d0c353e131b030f9cf69eecfded777f5ba2a036b066b90da4c89ab4290610f339088908790612b05565b60405180910390a25b60ff851660009081526003602090815260408083206001600160a01b0388168452909152902054801561100257610f716120dd565b6040518060200160405280876001600160a01b031663aa5af0fd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fb557600080fd5b505afa158015610fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fed9190810190612410565b90529050610ffc8787836118d6565b506111b1565b82156111b157600154604051633d98a1e560e01b81526001600160a01b0390911690633d98a1e590611038908890600401612990565b60206040518083038186803b15801561105057600080fd5b505afa158015611064573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061108891908101906123d4565b6110a45760405162461bcd60e51b815260040161050f90612a16565b60ff861660009081526005602090815260408083206001600160a01b03891684529091529020546001600160e01b0316158015611112575060ff861660009081526005602090815260408083206001600160a01b0389168452909152902054600160e01b900463ffffffff16155b156111b15760405180604001604052806ec097ce7bc90715b34b9f10000000006001600160e01b0316815260200161114b610e416107a4565b63ffffffff90811690915260ff881660009081526005602090815260408083206001600160a01b038b1684528252909120835181549490920151909216600160e01b026001600160e01b039182166001600160e01b031990941693909317169190911790555b828114610b3f5760ff861660009081526003602090815260408083206001600160a01b03891680855292529182902085905590517ffc4f93ddd4a06ca99d4cd58e8f2a3eaec8f2f3795f127d83e0c203e08f8997e1906112149089908790612b05565b60405180910390a2505050505050565b600060ff841661135d576009546040516370a0823160e01b81526001600160a01b039091169060009082906370a082319061126390309060040161299e565b60206040518083038186803b15801561127b57600080fd5b505afa15801561128f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112b39190810190612410565b90506000841180156112c55750808411155b156113565760405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906112f890889088906004016129ac565b602060405180830381600087803b15801561131257600080fd5b505af1158015611326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061134a91908101906123d4565b506000925050506113c4565b50506113c1565b8360ff16600114156113c1574782158015906113795750808311155b156113bf576040516001600160a01b0385169084156108fc029085906000818181858888f193505050501580156113b4573d6000803e3d6000fd5b5060009150506113c4565b505b50805b9392505050565b60018260ff1611156113ef5760405162461bcd60e51b815260040161050f90612a56565b60ff821660008181526004602090815260408083206001600160a01b03861680855290835281842094845260028352818420908452909152812054906114336107a4565b8354909150600090611453908390600160e01b900463ffffffff16611e24565b90506000811180156114655750600083115b15611642576000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114a557600080fd5b505afa1580156114b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114dd9190810190612410565b905060006114eb8386611e5e565b90506114f56120dd565b60008311611512576040518060200160405280600081525061151c565b61151c8284611ea0565b90506115266120dd565b604080516020810190915288546001600160e01b031681526115489083611ede565b9050604051806040016040528061159883600001516040518060400160405280601a81526020017f6e657720696e6465782065786365656473203232342062697473000000000000815250611f03565b6001600160e01b031681526020016115d3886040518060400160405280601f8152602001600080516020612c45833981519152815250611df1565b63ffffffff90811690915260ff8c1660009081526004602090815260408083206001600160a01b038f1684528252909120835181549490920151909216600160e01b026001600160e01b039182166001600160e01b0319909416939093171691909117905550610b3f92505050565b8015610b3f57611675826040518060400160405280601f8152602001600080516020612c45833981519152815250611df1565b845463ffffffff91909116600160e01b026001600160e01b03909116178455505050505050565b60018360ff1611156116c05760405162461bcd60e51b815260040161050f90612a56565b60ff831660009081526004602090815260408083206001600160a01b038616845290915290206116ee6120dd565b50604080516020810190915281546001600160e01b0316815261170f6120dd565b50604080516020808201835260ff88166000908152600682528381206001600160a01b03808a1683529083528482209088168083528184529482208054855286519590925290915291909155805115801561176a5750815115155b15611782576ec097ce7bc90715b34b9f100000000081525b61178a6120dd565b6117948383611f2a565b90506000866001600160a01b03166370a08231876040518263ffffffff1660e01b81526004016117c49190612990565b60206040518083038186803b1580156117dc57600080fd5b505afa1580156117f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118149190810190612410565b905060006118228284611f4f565b60ff8a1660009081526008602090815260408083206001600160a01b038c168452909152812054919250906118579083611f7e565b60ff8b1660009081526008602090815260408083206001600160a01b03808e168086529190935292819020849055895190519394509192908c16917faccd035d02c456be35306aecd5a5fe62320713dde09ccd68b0a5e8ed93039999916118c2918f91889190612b13565b60405180910390a350505050505050505050565b60018360ff1611156118fa5760405162461bcd60e51b815260040161050f90612a56565b60ff831660008181526005602090815260408083206001600160a01b038716808552908352818420948452600383528184209084529091528120549061193e6107a4565b835490915060009061195e908390600160e01b900463ffffffff16611e24565b90506000811180156119705750600083115b15611b8c5760006119f1876001600160a01b03166347bd37186040518163ffffffff1660e01b815260040160206040518083038186803b1580156119b357600080fd5b505afa1580156119c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119eb9190810190612410565b87611fb4565b905060006119ff8386611e5e565b9050611a096120dd565b60008311611a265760405180602001604052806000815250611a30565b611a308284611ea0565b9050611a3a6120dd565b604080516020810190915288546001600160e01b03168152611a5c9083611ede565b90506040518060400160405280611aac83600001516040518060400160405280601a81526020017f6e657720696e6465782065786365656473203232342062697473000000000000815250611f03565b6001600160e01b03168152602001611ae7886040518060400160405280601f8152602001600080516020612c45833981519152815250611df1565b63ffffffff16815250600560008d60ff1660ff16815260200190815260200160002060008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160e01b0302191690836001600160e01b03160217905550602082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555090505050505050611bdf565b8015611bdf57611bbf826040518060400160405280601f8152602001600080516020612c45833981519152815250611df1565b845463ffffffff91909116600160e01b026001600160e01b039091161784555b50505050505050565b60018460ff161115611c0c5760405162461bcd60e51b815260040161050f90612a56565b60ff841660009081526005602090815260408083206001600160a01b03871684529091529020611c3a6120dd565b50604080516020810190915281546001600160e01b03168152611c5b6120dd565b50604080516020808201835260ff89166000908152600782528381206001600160a01b03808b1683529083528482209089168083528184529482208054855286519590925290915291909155805115611bdf57611cb66120dd565b611cc08383611f2a565b90506000611d0b886001600160a01b03166395dd9193896040518263ffffffff1660e01b8152600401611cf39190612990565b60206040518083038186803b1580156119b357600080fd5b90506000611d198284611f4f565b60ff8b1660009081526008602090815260408083206001600160a01b038d16845290915281205491925090611d4e9083611f7e565b905080600860008d60ff1660ff16815260200190815260200160002060008b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550886001600160a01b03168a6001600160a01b03167fa1b6a046664a0ecf068059f26de56878f8d0e799907ca2e42d9148ccbdc717a78d858a60000151604051611ddc93929190612b13565b60405180910390a35050505050505050505050565b6000816401000000008410611e195760405162461bcd60e51b815260040161050f91906129d5565b508290505b92915050565b60006113c48383604051806040016040528060158152602001747375627472616374696f6e20756e646572666c6f7760581b815250611fd2565b60006113c483836040518060400160405280601781526020017f6d756c7469706c69636174696f6e206f766572666c6f77000000000000000000815250611ffe565b611ea86120dd565b6040518060200160405280611ed5611ecf866ec097ce7bc90715b34b9f1000000000611e5e565b8561204f565b90529392505050565b611ee66120dd565b6040518060200160405280611ed585600001518560000151611f7e565b600081600160e01b8410611e195760405162461bcd60e51b815260040161050f91906129d5565b611f326120dd565b6040518060200160405280611ed585600001518560000151611e24565b60006ec097ce7bc90715b34b9f1000000000611f6f848460000151611e5e565b81611f7657fe5b049392505050565b60006113c48383604051806040016040528060118152602001706164646974696f6e206f766572666c6f7760781b815250612082565b60006113c4611fcb84670de0b6b3a7640000611e5e565b835161204f565b60008184841115611ff65760405162461bcd60e51b815260040161050f91906129d5565b505050900390565b600083158061200b575082155b15612018575060006113c4565b8383028385828161202557fe5b041483906120465760405162461bcd60e51b815260040161050f91906129d5565b50949350505050565b60006113c483836040518060400160405280600e81526020016d646976696465206279207a65726f60901b8152506120a9565b600083830182858210156120465760405162461bcd60e51b815260040161050f91906129d5565b600081836120ca5760405162461bcd60e51b815260040161050f91906129d5565b508284816120d457fe5b04949350505050565b6040518060200160405280600081525090565b8035611e1e81612c09565b600082601f83011261210c57600080fd5b813561211f61211a82612b55565b612b2e565b9150818183526020840193506020810190508385602084028201111561214457600080fd5b60005b83811015612170578161215a88826120f0565b8452506020928301929190910190600101612147565b5050505092915050565b600082601f83011261218b57600080fd5b813561219961211a82612b55565b915081818352602084019350602081019050838560208402820111156121be57600080fd5b60005b8381101561217057816121d48882612270565b84525060209283019291909101906001016121c1565b600082601f8301126121fb57600080fd5b815161220961211a82612b55565b9150818183526020840193506020810190508385602084028201111561222e57600080fd5b60005b838110156121705781612244888261227b565b8452506020928301929190910190600101612231565b8035611e1e81612c20565b8051611e1e81612c20565b8035611e1e81612c29565b8051611e1e81612c29565b60006020828403121561229857600080fd5b50919050565b6000602082840312156122b057600080fd5b6122ba6020612b2e565b905060006122c884846122d1565b82525092915050565b8035611e1e81612c32565b8051611e1e81612c32565b8035611e1e81612c3b565b60006020828403121561230457600080fd5b600061231084846120f0565b949350505050565b6000806040838503121561232b57600080fd5b600061233785856120f0565b9250506020612348858286016120f0565b9150509250929050565b60008060006060848603121561236757600080fd5b600061237386866120f0565b9350506020612384868287016120f0565b925050604061239586828701612286565b9150509250925092565b6000602082840312156123b157600080fd5b815167ffffffffffffffff8111156123c857600080fd5b612310848285016121ea565b6000602082840312156123e657600080fd5b60006123108484612265565b60006020828403121561240457600080fd5b6000612310848461229e565b60006020828403121561242257600080fd5b600061231084846122dc565b6000806040838503121561244157600080fd5b600061233785856122e7565b60008060006060848603121561246257600080fd5b600061246e86866122e7565b935050602061247f868287016120f0565b925050604084013567ffffffffffffffff81111561249c57600080fd5b6123958682870161217a565b6000806000606084860312156124bd57600080fd5b60006124c986866122e7565b93505060206124da868287016120f0565b9250506040612395868287016122d1565b60008060006060848603121561250057600080fd5b600061250c86866122e7565b935050602061251d868287016120f0565b9250506040612395868287016120f0565b600080600080600060a0868803121561254657600080fd5b600061255288886122e7565b955050602086013567ffffffffffffffff81111561256f57600080fd5b61257b888289016120fb565b945050604086013567ffffffffffffffff81111561259857600080fd5b6125a48882890161217a565b93505060606125b58882890161225a565b92505060806125c68882890161225a565b9150509295509295909350565b600080600080608085870312156125e957600080fd5b60006125f587876122e7565b945050602061260687828801612270565b9350506040612617878288016122d1565b9250506060612628878288016122d1565b91505092959194509250565b61263d81612bc8565b82525050565b61263d81612b83565b61263d81612b93565b600061266082612b76565b61266a8185612b7a565b935061267a818560208601612bd3565b61268381612bff565b9093019392505050565b600061269a601d83612b7a565b7f6f6e6c792061646d696e2063616e20736574204a6f6574726f6c6c6572000000815260200192915050565b60006126d3601683612b7a565b756f6e6c792061646d696e2063616e20736574204a4f4560501b815260200192915050565b6000612705603583612b7a565b7f6f6e6c792061646d696e2063616e2075706461746520616e64206469737472698152746275746520626f72726f776572207265776172647360581b602082015260400192915050565b600061275c601b83612b7a565b7f726577617264206d61726b6574206973206e6f74206c69737465640000000000815260200192915050565b6000612795601583612b7a565b741b585c9ad95d081b5d5cdd081899481b1a5cdd1959605a1b815260200192915050565b60006127c6601883612b7a565b7f6f6e6c792061646d696e2063616e206772616e74206a6f650000000000000000815260200192915050565b60006127ff603583612b7a565b7f6f6e6c792061646d696e2063616e2075706461746520616e64206469737472698152746275746520737570706c696572207265776172647360581b602082015260400192915050565b6000612856601583612b7a565b741c995dd85c99151e5c19481a5cc81a5b9d985b1a59605a1b815260200192915050565b6000612887601a83612b7a565b7f696e73756666696369656e74206a6f6520666f72206772616e74000000000000815260200192915050565b60006128c0602583612b7a565b7f5265776172644469737472696275746f7220616c726561647920696e697469618152641b1a5e995960da1b602082015260400192915050565b6000612907601883612b7a565b7f6f6e6c792061646d696e2063616e207365742061646d696e0000000000000000815260200192915050565b6000612940601f83612b7a565b7f6f6e6c792061646d696e2063616e207365742072657761726420737065656400815260200192915050565b61263d81612baa565b61263d81612bb6565b61263d81612bb9565b61263d81612bc2565b60208101611e1e8284612643565b60208101611e1e8284612634565b604081016129ba8285612634565b6113c46020830184612975565b60208101611e1e828461264c565b602080825281016113c48184612655565b60208082528101611e1e8161268d565b60208082528101611e1e816126c6565b60208082528101611e1e816126f8565b60208082528101611e1e8161274f565b60208082528101611e1e81612788565b60208082528101611e1e816127b9565b60208082528101611e1e816127f2565b60208082528101611e1e81612849565b60208082528101611e1e8161287a565b60208082528101611e1e816128b3565b60208082528101611e1e816128fa565b60208082528101611e1e81612933565b60208101611e1e828461296c565b60408101612ac2828561296c565b6113c4602083018461297e565b60208101611e1e8284612975565b60608101612aeb8286612987565b612af86020830185612634565b6123106040830184612975565b604081016129ba8285612987565b60608101612b218286612987565b612af86020830185612975565b60405181810167ffffffffffffffff81118282101715612b4d57600080fd5b604052919050565b600067ffffffffffffffff821115612b6c57600080fd5b5060209081020190565b5190565b90815260200190565b6000611e1e82612b9e565b151590565b6000611e1e82612b83565b6001600160a01b031690565b6001600160e01b031690565b90565b63ffffffff1690565b60ff1690565b6000611e1e82612b93565b60005b83811015612bee578181015183820152602001612bd6565b838111156105485750506000910152565b601f01601f191690565b612c1281612b83565b8114612c1d57600080fd5b50565b612c1281612b8e565b612c1281612b93565b612c1281612bb6565b612c1281612bc256fe626c6f636b2074696d657374616d702065786365656473203332206269747300a365627a7a72315820dc4b10f9ef3011be4c84bb0dd68509239d557c6c17a0ede63642e0e11116c3256c6578706572696d656e74616cf564736f6c63430005100040",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
