diff --git a/README.md b/README.md index 69e40f9..95832a6 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,7 @@ Clone this repository to a directory on your machine 1. Run the daemon - node index.js + node src/index.js ### Hardhat diff --git a/backend/.env.example b/backend/.env.example index f261488..b1a3df1 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -1,4 +1,5 @@ PORT=3000 DATA_DIR="./data" SEMANTIC_SCHOLAR_API_KEY= -NETWORK="localhost" \ No newline at end of file +ETH_NETWORK="localhost" +ETH_PRIVATE_KEY= \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile index 1c5acb2..7e32835 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -2,8 +2,8 @@ FROM node WORKDIR /app -ADD package.json package-lock.json index.js /app/ +ADD package.json package-lock.json src/ /app/ RUN npm ci -ENTRYPOINT ["node", "index.js"] +ENTRYPOINT ["node", "src/index.js"] diff --git a/frontend/src/assets/DAO.json b/backend/contractArtifacts/DAO.json similarity index 100% rename from frontend/src/assets/DAO.json rename to backend/contractArtifacts/DAO.json diff --git a/frontend/src/assets/Onboarding.json b/backend/contractArtifacts/Onboarding.json similarity index 100% rename from frontend/src/assets/Onboarding.json rename to backend/contractArtifacts/Onboarding.json diff --git a/frontend/src/assets/Proposals.json b/backend/contractArtifacts/Proposals.json similarity index 100% rename from frontend/src/assets/Proposals.json rename to backend/contractArtifacts/Proposals.json diff --git a/frontend/src/assets/Work1.json b/backend/contractArtifacts/Work1.json similarity index 100% rename from frontend/src/assets/Work1.json rename to backend/contractArtifacts/Work1.json diff --git a/backend/package-lock.json b/backend/package-lock.json index acecb08..bd0e2e7 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@metamask/eth-sig-util": "^7.0.1", "axios": "^1.6.8", + "bluebird": "^3.7.2", "dotenv": "^16.4.5", "ethers": "^6.12.0", "express": "^4.18.2", @@ -764,6 +765,11 @@ } ] }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", diff --git a/backend/package.json b/backend/package.json index 70c9b3d..c4bbd5f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -2,7 +2,7 @@ "name": "backend", "version": "1.0.0", "description": "", - "main": "index.js", + "main": "src/index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, @@ -11,6 +11,7 @@ "dependencies": { "@metamask/eth-sig-util": "^7.0.1", "axios": "^1.6.8", + "bluebird": "^3.7.2", "dotenv": "^16.4.5", "ethers": "^6.12.0", "express": "^4.18.2", diff --git a/backend/src/import-from-ss.js b/backend/src/import-from-ss.js index bb0fa07..0cc0e1f 100644 --- a/backend/src/import-from-ss.js +++ b/backend/src/import-from-ss.js @@ -2,53 +2,97 @@ const axios = require('axios'); const ethers = require('ethers'); const crypto = require('crypto'); const objectHash = require('object-hash'); +const Promise = require('bluebird'); +require('dotenv').config(); + +const verifySignature = require('./verify-signature'); const { getContractAddressByNetworkName } = require('./contract-config'); const { authorAddresses, authorPrivKeys, forum } = require('./db'); +const DAOArtifact = require('../contractArtifacts/DAO.json'); -const getContract = (name) => ethers.getContractAt( - name, - getContractAddressByNetworkName(process.env.NETWORK, name), +const network = process.env.ETH_NETWORK; +console.log('network:', network); +const getProvider = () => { + switch (network) { + case 'localhost': + return ethers.getDefaultProvider('http://localhost:8545'); + default: + throw new Error('Unknown network'); + } +}; +const signer = new ethers.Wallet(process.env.ETH_PRIVATE_KEY, getProvider()); +const getContract = (name) => new ethers.Contract( + getContractAddressByNetworkName(process.env.ETH_NETWORK, name), + DAOArtifact.abi, + signer, ); -const fetchPaperInfo = async (paperId) => { - const paper = await axios.get(`https://api.semanticscholar.org/graph/v1/paper/${paperId}`, { +const fetchPaperInfo = async (paperId, retryDelay = 5000) => { + const url = `https://api.semanticscholar.org/graph/v1/paper/${paperId}?fields=title,url,authors,references`; + console.log('url:', url); + let retry = false; + let paper; + const response = await axios.get(url, { headers: { 'api-key': process.env.SEMANTIC_SCHOLAR_API_KEY, }, + }).catch(async (error) => { + if (error.response?.status === 429) { + // Rate limit + retry = true; + return; + } + // Some other error occurred + throw new Error(error); }); + if (retry) { + console.log('retry delay (sec):', retryDelay / 1000); + await new Promise((resolve) => { + setTimeout(resolve, retryDelay); + }); + paper = await fetchPaperInfo(paperId, retryDelay * 2); + } else { + paper = response.data; + } return paper; }; -const getAuthorsInfo = async (paper) => Promise.all(paper.authors.map(async ({ authorId }) => { +const getAuthorsInfo = async (paper) => Promise.mapSeries( + paper.authors.filter((x) => !!x.authorId), + async ({ authorId }) => { // Check if we already have an account for each author - let authorAddress; - let authorPrivKey; - try { - authorAddress = await authorAddresses.get(authorId); - } catch (e) { + let authorAddress; + let authorPrivKey; + try { + authorAddress = await authorAddresses.get(authorId); + } catch (e) { // Probably not found - } - if (authorAddress) { + } + if (authorAddress) { // This should always succeed, so we don't use try/catch here - authorPrivKey = await authorPrivKeys.get(authorAddress); - } else { + authorPrivKey = await authorPrivKeys.get(authorAddress); + } else { // Generate and store a new account - const id = crypto.randomBytes(32).toString('hex'); - authorPrivKey = `0x${id}`; - const wallet = new ethers.Wallet(authorPrivKey); - authorAddress = wallet.address; - await authorAddress.put(authorId, authorAddress); - await authorPrivKeys.put(authorAddress, authorPrivKey); - } - return { - authorAddress, - authorPrivKey, - }; -})); + const id = crypto.randomBytes(32).toString('hex'); + authorPrivKey = `0x${id}`; + const wallet = new ethers.Wallet(authorPrivKey); + authorAddress = wallet.address; + await authorAddresses.put(authorId, authorAddress); + await authorPrivKeys.put(authorAddress, authorPrivKey); + } + return { + authorAddress, + authorPrivKey, + }; + }, +); const generatePost = async (paper) => { - const authorsInfo = getAuthorsInfo(paper); + const authorsInfo = await getAuthorsInfo(paper); + if (!authorsInfo.length) { + throw new Error('Paper has no authors with id'); + } const firstAuthorWallet = new ethers.Wallet(authorsInfo[0].authorPrivKey); const eachAuthorWeightPercent = Math.floor(100 / authorsInfo.length); const authors = authorsInfo.map(({ authorAddress }) => ({ @@ -56,20 +100,30 @@ const generatePost = async (paper) => { authorAddress, })); // Make sure author weights sum to 100 - const totalAuthorsWeight = authors.reduce((t, { weightPercent }) => t + weightPercent); + const totalAuthorsWeight = authors.reduce((t, { weightPercent }) => t + weightPercent, 0); authors[0].weightPercent += 100 - totalAuthorsWeight; const content = `Semantic Scholar paper ${paper.paperId} ${paper.title} HREF ${paper.url}`; - // Note that for now we leave embedded data empty, but the stub is here in case we want to use it - const embeddedData = {}; + const embeddedData = { + semanticScholarPaperId: paper.paperId, + }; let contentToSign = content; if (embeddedData && Object.entries(embeddedData).length) { - contentToSign += `\n\nDATA\n${JSON.stringify(embeddedData, null, 2)}`; + contentToSign += `\n\n${JSON.stringify(embeddedData, null, 2)}`; } const signature = firstAuthorWallet.signMessageSync(contentToSign); + console.log({ + authors, content, signature, embeddedData, + }); + const verified = verifySignature({ + authors, content, signature, embeddedData, + }); + if (!verified) { + throw new Error('Signature verification failed'); + } const hash = objectHash({ authors, content, signature, embeddedData, }); @@ -90,33 +144,37 @@ module.exports = async (req, res) => { // Read the paper info from SS const paper = await fetchPaperInfo(paperId); + console.log('references count:', paper.references.length); - const citations = []; - - if (paper.references) { - const eachCitationWeightPercent = Math.floor(30 / paper.references.length); - paper.references.forEach(async ({ paperId: citedPaperId }) => { - // We need to fetch this paper so we can - // We need to generate the post we would add to the forum, sign, and hash it. + const eachCitationWeightPercent = Math.floor(30 / paper.references.length); + const citations = await Promise.mapSeries( + paper.references.filter((x) => !!x.paperId), + async ({ paperId: citedPaperId }) => { + // We need to fetch this paper so we can generate the post we WOULD add to the forum. + // That way, if we later add the cited paper to the blockchain it will have the correct hash. // The forum allows dangling citations to support this use case. const citedPaper = await fetchPaperInfo(citedPaperId); - const citedPaperInfo = await generatePost(citedPaper); - - citations.push({ + const citedPost = await generatePost(citedPaper); + return { weightPercent: eachCitationWeightPercent, - targetPostId: citedPaperInfo.hash, - }); - }); - // Make sure citation weights sum to 100 - const totalCitationWeight = citations.reduce((t, { weightPercent }) => t + weightPercent); - citations[0].weightPercent += 100 - totalCitationWeight; - } + targetPostId: citedPost.hash, + }; + }, + ); + + // Make sure citation weights sum to 100 + const totalCitationWeight = citations.reduce((t, { weightPercent }) => t + weightPercent, 0); + citations[0].weightPercent += 100 - totalCitationWeight; // Create a post for this paper const { hash, authors, content, signature, embeddedData, } = await generatePost(paper); + console.log({ + hash, authors, content, signature, embeddedData, citations, + }); + // Write the new post to our database await forum.put(hash, { authors, content, signature, embeddedData, citations, @@ -125,9 +183,7 @@ module.exports = async (req, res) => { // Add the post to the form (on-chain) await dao.addPost(authors, hash, citations); - console.log({ - authors, content, signature, embeddedData, citations, - }); + console.log(`Added post to blockchain for paper ${paperId}`); res.end(); }; diff --git a/backend/index.js b/backend/src/index.js similarity index 78% rename from backend/index.js rename to backend/src/index.js index 6b3d1c9..6c38449 100644 --- a/backend/index.js +++ b/backend/src/index.js @@ -1,8 +1,8 @@ const express = require('express'); -const read = require('./src/read'); -const write = require('./src/write'); -const importFromSS = require('./src/import-from-ss'); +const read = require('./read'); +const write = require('./write'); +const importFromSS = require('./import-from-ss'); require('dotenv').config(); diff --git a/backend/src/verify-signature.js b/backend/src/verify-signature.js index 31b0698..5a33053 100644 --- a/backend/src/verify-signature.js +++ b/backend/src/verify-signature.js @@ -5,12 +5,13 @@ const verifySignature = ({ }) => { let contentToVerify = content; if (embeddedData && Object.entries(embeddedData).length) { - contentToVerify += `\n\nDATA\n${JSON.stringify(embeddedData, null, 2)}`; + contentToVerify += `\n\n${JSON.stringify(embeddedData, null, 2)}`; } try { const account = recoverPersonalSignature({ data: contentToVerify, signature }); - const authorAddresses = authors.map((author) => author.authorAddress); - if (!authorAddresses.includes(account)) { + console.log(`recovered account: ${account}`); + const authorAddresses = authors.map((author) => author.authorAddress.toLowerCase()); + if (!authorAddresses.includes(account.toLowerCase())) { console.log('error: signer is not among the authors'); return false; } diff --git a/ethereum/scripts/util/deploy-contract.js b/ethereum/scripts/util/deploy-contract.js index 9662833..9923e45 100644 --- a/ethereum/scripts/util/deploy-contract.js +++ b/ethereum/scripts/util/deploy-contract.js @@ -15,9 +15,12 @@ const deployContract = async (name, args = [], isCore = false) => { contractAddresses[network][name] = contract.target; const from = `./artifacts/contracts/${isCore ? 'core/' : ''}${name}.sol/${name}.json`; - const to = `../frontend/src/assets/${name}.json`; - fs.copyFileSync(from, to); - console.log(`Copied ${fs.realpathSync(from)} to ${fs.realpathSync(to)}`); + const toFrontend = `../frontend/contractArtifacts/${name}.json`; + const toBackend = `../backend/contractArtifacts/${name}.json`; + fs.copyFileSync(from, toFrontend); + console.log(`Copied ${fs.realpathSync(from)} to ${fs.realpathSync(toFrontend)}`); + fs.copyFileSync(from, toBackend); + console.log(`Copied ${fs.realpathSync(from)} to ${fs.realpathSync(toBackend)}`); writeContractAddresses(contractAddresses); }; diff --git a/frontend/contractArtifacts/DAO.json b/frontend/contractArtifacts/DAO.json new file mode 100644 index 0000000..2b858c4 --- /dev/null +++ b/frontend/contractArtifacts/DAO.json @@ -0,0 +1,827 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "DAO", + "sourceName": "contracts/core/DAO.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "id", + "type": "string" + } + ], + "name": "PostAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "poolIndex", + "type": "uint256" + } + ], + "name": "ValidationPoolInitiated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "poolIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "votePasses", + "type": "bool" + }, + { + "indexed": false, + "internalType": "bool", + "name": "quorumMet", + "type": "bool" + } + ], + "name": "ValidationPoolResolved", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "weightPercent", + "type": "uint256" + }, + { + "internalType": "address", + "name": "authorAddress", + "type": "address" + } + ], + "internalType": "struct Author[]", + "name": "authors", + "type": "tuple[]" + }, + { + "internalType": "string", + "name": "contentId", + "type": "string" + }, + { + "components": [ + { + "internalType": "int256", + "name": "weightPercent", + "type": "int256" + }, + { + "internalType": "string", + "name": "targetPostId", + "type": "string" + } + ], + "internalType": "struct Citation[]", + "name": "citations", + "type": "tuple[]" + } + ], + "name": "addPost", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolIndex", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "inFavor", + "type": "bool" + } + ], + "name": "delegatedStakeOnValidationPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolIndex", + "type": "uint256" + } + ], + "name": "evaluateOutcome", + "outputs": [ + { + "internalType": "bool", + "name": "votePasses", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "postId", + "type": "string" + } + ], + "name": "getPostAuthors", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "weightPercent", + "type": "uint256" + }, + { + "internalType": "address", + "name": "authorAddress", + "type": "address" + } + ], + "internalType": "struct Author[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "postId", + "type": "string" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256[2]", + "name": "quorum", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2]", + "name": "winRatio", + "type": "uint256[2]" + }, + { + "internalType": "uint256", + "name": "bindingPercent", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "redistributeLosingStakes", + "type": "bool" + }, + { + "internalType": "bool", + "name": "callbackOnValidate", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + } + ], + "name": "initiateValidationPool", + "outputs": [ + { + "internalType": "uint256", + "name": "poolIndex", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isMember", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "memberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "members", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "postCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "postIds", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "posts", + "outputs": [ + { + "internalType": "string", + "name": "id", + "type": "string" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reputation", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "stakeAvailability", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "inFavor", + "type": "bool" + } + ], + "name": "stakeOnValidationPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "validationPoolCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "validationPools", + "outputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "string", + "name": "postId", + "type": "string" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minted", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeCount", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256[2]", + "name": "quorum", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2]", + "name": "winRatio", + "type": "uint256[2]" + }, + { + "internalType": "uint256", + "name": "bindingPercent", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "redistributeLosingStakes", + "type": "bool" + } + ], + "internalType": "struct ValidationPoolParams", + "name": "params", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "resolved", + "type": "bool" + }, + { + "internalType": "bool", + "name": "outcome", + "type": "bool" + }, + { + "internalType": "bool", + "name": "callbackOnValidate", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405260036009556040518060400160405280600160ff168152602001600a60ff16815250600f90600262000038929190620000df565b503480156200004657600080fd5b506040518060400160405280600a81526020017f52657075746174696f6e000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f52455000000000000000000000000000000000000000000000000000000000008152508160039081620000c49190620003c2565b508060049081620000d69190620003c2565b505050620004a9565b826002810192821562000116579160200282015b8281111562000115578251829060ff16905591602001919060010190620000f3565b5b50905062000125919062000129565b5090565b5b80821115620001445760008160009055506001016200012a565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001ca57607f821691505b602082108103620001e057620001df62000182565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200024a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200020b565b6200025686836200020b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002a36200029d62000297846200026e565b62000278565b6200026e565b9050919050565b6000819050919050565b620002bf8362000282565b620002d7620002ce82620002aa565b84845462000218565b825550505050565b600090565b620002ee620002df565b620002fb818484620002b4565b505050565b5b81811015620003235762000317600082620002e4565b60018101905062000301565b5050565b601f82111562000372576200033c81620001e6565b6200034784620001fb565b8101602085101562000357578190505b6200036f6200036685620001fb565b83018262000300565b50505b505050565b600082821c905092915050565b6000620003976000198460080262000377565b1980831691505092915050565b6000620003b2838362000384565b9150826002028217905092915050565b620003cd8262000148565b67ffffffffffffffff811115620003e957620003e862000153565b5b620003f58254620001b1565b6200040282828562000327565b600060209050601f8311600181146200043a576000841562000425578287015190505b620004318582620003a4565b865550620004a1565b601f1984166200044a86620001e6565b60005b8281101562000474578489015182556001820191506020850194506020810190506200044d565b8683101562000494578489015162000490601f89168262000384565b8355505b6001600288020188555050505b505050505050565b615ee880620004b96000396000f3fe60806040526004361061014b5760003560e01c806370a08231116100b6578063a23362791161006f578063a2336279146104e7578063a9059cbb1461052f578063da66863a1461056c578063dd62ed3e146105a9578063e5b4d827146105e6578063f8300fca1461060f5761014b565b806370a08231146103ac57806388380274146103e957806395d89b4114610426578063975762b3146104515780639fbe7c731461047a578063a230c524146104aa5761014b565b806323b872dd1161010857806323b872dd146102765780632d17c062146102b3578063313ce567146102dc57806350cde8ef146103075780635daf08ca14610344578063642b5bfb146103815761014b565b806306fdde0314610150578063095ea7b31461017b57806311aee380146101b857806317906c2e146101e357806317c182171461020e57806318160ddd1461024b575b600080fd5b34801561015c57600080fd5b5061016561064e565b6040516101729190613a99565b60405180910390f35b34801561018757600080fd5b506101a2600480360381019061019d9190613b63565b6106e0565b6040516101af9190613bbe565b60405180910390f35b3480156101c457600080fd5b506101cd610703565b6040516101da9190613be8565b60405180910390f35b3480156101ef57600080fd5b506101f8610709565b6040516102059190613be8565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190613c03565b61070f565b6040516102429190613bbe565b60405180910390f35b34801561025757600080fd5b5061026061129a565b60405161026d9190613be8565b60405180910390f35b34801561028257600080fd5b5061029d60048036038101906102989190613c30565b6112a4565b6040516102aa9190613bbe565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613caf565b6112e1565b005b3480156102e857600080fd5b506102f161130a565b6040516102fe9190613d1e565b60405180910390f35b34801561031357600080fd5b5061032e60048036038101906103299190613c03565b611313565b60405161033b9190613a99565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190613c03565b6113bf565b6040516103789190613d48565b60405180910390f35b34801561038d57600080fd5b506103966113f2565b6040516103a39190613be8565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190613d63565b6113f8565b6040516103e09190613be8565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b9190613d90565b611440565b60405161041d9190613bbe565b60405180910390f35b34801561043257600080fd5b5061043b6114c7565b6040516104489190613a99565b60405180910390f35b34801561045d57600080fd5b5061047860048036038101906104739190613de3565b611559565b005b610494600480360381019061048f9190613f27565b61158e565b6040516104a19190613be8565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190613d63565b611a48565b6040516104de9190613bbe565b60405180910390f35b3480156104f357600080fd5b5061050e60048036038101906105099190613c03565b611a68565b6040516105269c9b9a99989796959493929190614197565b60405180910390f35b34801561053b57600080fd5b5061055660048036038101906105519190613b63565b611ce2565b6040516105639190613bbe565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e9190614261565b611d1f565b6040516105a0919061439b565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb91906143bd565b611e08565b6040516105dd9190613be8565b60405180910390f35b3480156105f257600080fd5b5061060d600480360381019061060891906144a9565b611e8f565b005b34801561061b57600080fd5b506106366004803603810190610631919061468d565b61235c565b604051610645939291906146d6565b60405180910390f35b60606003805461065d90614743565b80601f016020809104026020016040519081016040528092919081815260200182805461068990614743565b80156106d65780601f106106ab576101008083540402835291602001916106d6565b820191906000526020600020905b8154815290600101906020018083116106b957829003601f168201915b5050505050905090565b6000806106eb612444565b90506106f881858561244c565b600191505092915050565b600d5481565b60075481565b600080600a60008481526020019081526020016000209050600060058260010160405161073c9190614817565b908152602001604051809103902090506000151582600f0160009054906101000a900460ff161515146107a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079b9061487a565b60405180910390fd5b600080600080600090505b85600501548110156108205785600401600082815260200190815260200160002091508160010160009054906101000a900460ff1615610800578160020154846107f991906148c9565b9350610813565b81600201548361081091906148c9565b92505b80806001019150506107af565b5060028560030154610832919061492c565b8361083d91906148c9565b925060028560030154610850919061492c565b8261085b91906148c9565b9150600060028660030154610870919061495d565b146108855760018361088291906148c9565b92505b84600e01544211806108a8575061089a61129a565b82846108a691906148c9565b145b6108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de90614a00565b60405180910390fd5b8460060160010160006002811061090157610900614a20565b5b015461090b61129a565b6109159190614a4f565b828461092191906148c9565b8660060160010160016002811061093b5761093a614a20565b5b01546109479190614a4f565b11610a7857600185600f0160006101000a81548160ff0219169083151502179055507fae8941f3b4d152118273444f36b8b5642e5602102b789968bd4b7cf8b250de818760008060405161099d93929190614a91565b60405180910390a184600f0160029054906101000a900460ff1615610a6a578460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b4e6a1d587600086868a6010016040518663ffffffff1660e01b8152600401610a25959493929190614b61565b6020604051808303816000875af1158015610a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a689190614bd0565b505b600095505050505050611295565b84600601600301600060028110610a9257610a91614a20565b5b01548284610aa091906148c9565b610aaa9190614a4f565b85600601600301600160028110610ac457610ac3614a20565b5b015484610ad19190614a4f565b101595508515610c5b5760005b8460020180549050811015610c59576000856002018281548110610b0557610b04614a20565b5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600e60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610c4b5780600c6000600d6000815480929190610ba290614bfd565b91905055815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b508080600101915050610ade565b505b600185600f0160006101000a81548160ff0219169083151502179055508585600f0160016101000a81548160ff0219169083151502179055507fae8941f3b4d152118273444f36b8b5642e5602102b789968bd4b7cf8b250de8187876001604051610cc893929190614a91565b60405180910390a1600086610cdd5782610cdf565b835b905060008060005b8860050154811015610de75788600401600082815260200190815260200160002094508460010160009054906101000a900460ff1615158a151514610dda57600060648a600601600501548760020154610d419190614a4f565b610d4b919061492c565b90508960060160060160009054906101000a900460ff1615610da957610d968660030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16308361245e565b8084610da291906148c9565b9350610dd8565b610dd78660030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612683565b5b505b8080600101915050610ce7565b508815610fe55760028860030154610dff919061492c565b82610e0a91906148c9565b915060005b8860050154811015610ef55788600401600082815260200190815260200160002094508860060160060160009054906101000a900460ff168015610e6757508460010160009054906101000a900460ff1615158a1515145b15610ee857600060648a6006016005015486886002015487610e899190614a4f565b610e93919061492c565b610e9d9190614a4f565b610ea7919061492c565b90508083610eb591906148c9565b9250610ee6308760030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361245e565b505b8080600101915050610e0f565b5060008183610f049190614c45565b9050600060028a60030154610f19919061495d565b14610f2e57600181610f2b91906148c9565b90505b610fdf896001018054610f4090614743565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6c90614743565b8015610fb95780601f10610f8e57610100808354040283529160200191610fb9565b820191906000526020600020905b815481529060010190602001808311610f9c57829003601f168201915b50505050508260028c60030154610fd0919061492c565b610fda91906148c9565b612705565b506110fd565b876003015482610ff591906148c9565b915060005b88600501548110156110fb5788600401600082815260200190815260200160002094508860060160060160009054906101000a900460ff16801561105257508460010160009054906101000a900460ff1615158a1515145b156110ee57600060648a6006016005015460028c60030154611074919061492c565b8761107f9190614c45565b88600201548761108f9190614a4f565b611099919061492c565b6110a39190614a4f565b6110ad919061492c565b905080836110bb91906148c9565b92506110ec308760030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361245e565b505b8080600101915050610ffa565b505b60005b600d548110156111c6576000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061114c61129a565b611155836113f8565b8c600d01546111649190614a4f565b61116e919061492c565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111b6573d6000803e3d6000fd5b5050508080600101915050611100565b5087600f0160029054906101000a900460ff161561128c578760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b4e6a1d58a600189898d6010016040518663ffffffff1660e01b8152600401611247959493929190614b61565b6020604051808303816000875af1158015611266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128a9190614bd0565b505b50505050505050505b919050565b6000600254905090565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890614cc5565b60405180910390fd5b6000600a6000858152602001908152602001600020905061130481338585612717565b50505050565b60006009905090565b6006818154811061132357600080fd5b90600052602060002001600091509050805461133e90614743565b80601f016020809104026020016040519081016040528092919081815260200182805461136a90614743565b80156113b75780601f1061138c576101008083540402835291602001916113b7565b820191906000526020600020905b81548152906001019060200180831161139a57829003601f168201915b505050505081565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061144d33858561244c565b8373ffffffffffffffffffffffffffffffffffffffff1663216ed6ad3385856040518463ffffffff1660e01b815260040161148a93929190614ce5565b600060405180830381600087803b1580156114a457600080fd5b505af11580156114b8573d6000803e3d6000fd5b50505050600190509392505050565b6060600480546114d690614743565b80601f016020809104026020016040519081016040528092919081815260200182805461150290614743565b801561154f5780601f106115245761010080835404028352916020019161154f565b820191906000526020600020905b81548152906001019060200180831161153257829003601f168201915b5050505050905090565b6000600a6000868152602001908152602001600020905061157b84338561280d565b61158781858585612717565b5050505050565b60008034116115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990614d8e565b60405180910390fd5b6001891015611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d90614dfa565b60405180910390fd5b651cae8c13e00089111561165f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165690614e66565b60405180910390fd5b8760016002811061167357611672614a20565b5b6020020135600f60006002811061168d5761168c614a20565b5b01546116999190614a4f565b886000600281106116ad576116ac614a20565b5b6020020135600f6001600281106116c7576116c6614a20565b5b01546116d39190614a4f565b1015611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b90614ed2565b60405180910390fd5b8760016002811061172857611727614a20565b5b60200201358860006002811061174157611740614a20565b5b60200201351115611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e90614f3e565b60405180910390fd5b8660016002811061179b5761179a614a20565b5b6020020135876000600281106117b4576117b3614a20565b5b602002013511156117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190614faa565b60405180910390fd5b606486111561183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590615016565b60405180910390fd5b600060058c8c60405161185292919061505b565b9081526020016040518091039020905060008160020180549050036118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a3906150c0565b60405180910390fd5b600b60008154809291906118bf90614bfd565b9190505591506000600a60008481526020019081526020016000209050338160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508c8c826001019182611932929190615282565b503481600d018190555089816006016001019060026119529291906139ac565b5088816006016003019060026119699291906139ac565b50878160060160050181905550868160060160060160006101000a81548160ff0219169083151502179055508a81600601600001819055508a426119ad91906148c9565b81600e01819055508281600001819055508581600f0160026101000a81548160ff02191690831515021790555084848260100191826119ed9291906153a3565b506119f830346128a1565b3481600301819055507f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a83604051611a309190613be8565b60405180910390a150509a9950505050505050505050565b600e6020528060005260406000206000915054906101000a900460ff1681565b600a602052806000526040600020600091509050806000015490806001018054611a9190614743565b80601f0160208091040260200160405190810160405280929190818152602001828054611abd90614743565b8015611b0a5780601f10611adf57610100808354040283529160200191611b0a565b820191906000526020600020905b815481529060010190602001808311611aed57829003601f168201915b5050505050908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806003015490806005015490806006016040518060a00160405290816000820154815260200160018201600280602002604051908101604052809291908260028015611b97576020028201915b815481526020019060010190808311611b83575b5050505050815260200160038201600280602002604051908101604052809291908260028015611bdc576020028201915b815481526020019060010190808311611bc8575b50505050508152602001600582015481526020016006820160009054906101000a900460ff1615151515815250509080600d01549080600e01549080600f0160009054906101000a900460ff169080600f0160019054906101000a900460ff169080600f0160029054906101000a900460ff1690806010018054611c5f90614743565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8b90614743565b8015611cd85780601f10611cad57610100808354040283529160200191611cd8565b820191906000526020600020905b815481529060010190602001808311611cbb57829003601f168201915b505050505090508c565b60006040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1690614cc5565b60405180910390fd5b6060600060058484604051611d3592919061505b565b9081526020016040518091039020905080600201805480602002602001604051908101604052809291908181526020016000905b82821015611dfb5783829060005260206000209060020201604051806040016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611d69565b5050505091505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008686905011611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc906154e5565b60405180910390fd5b60076000815480929190611ee890614bfd565b91905055506006848490918060018154018082558091505060019003906000526020600020016000909192909192909192909192509182611f2a929190615282565b50600060058585604051611f3f92919061505b565b908152602001604051809103902090506000816002018054905014611f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9090615577565b60405180910390fd5b338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508484826000019182611fef929190615282565b50600080600090505b8888905081101561208e5788888281811061201657612015614a20565b5b905060400201600001358261202b91906148c9565b91508260020189898381811061204457612043614a20565b5b9050604002019080600181540180825580915050600190039060005260206000209060020201600090919091909150818161207f9190615724565b50508080600101915050611ff8565b50606481146120d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c99061577e565b60405180910390fd5b60005b8484905081101561214d57826003018585838181106120f7576120f6614a20565b5b905060200281019061210991906157ad565b9080600181540180825580915050600190039060005260206000209060020201600090919091909150818161213e9190615914565b505080806001019150506120d5565b5060008060005b846003018054905081101561226f57600085600301828154811061217b5761217a614a20565b5b90600052602060002090600202016000015490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c8112156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e990615994565b60405180910390fd5b6064811315612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d90615a26565b60405180910390fd5b600081131561225257808461224b9190615a46565b9350612261565b808361225e9190615a46565b92505b508080600101915050612154565b5060648213156122b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ab90615afc565b60405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c811215612317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230e90615b8e565b60405180910390fd5b7fbd6277baf8ced6ab6543a1aef164635fc2bde1ba962d39d8a0fd81a5af2497278888604051612348929190615bdb565b60405180910390a150505050505050505050565b60058180516020810182018051848252602083016020850120818352809550505050505060009150905080600001805461239590614743565b80601f01602080910402602001604051908101604052809291908181526020018280546123c190614743565b801561240e5780601f106123e35761010080835404028352916020019161240e565b820191906000526020600020905b8154815290600101906020018083116123f157829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154905083565b600033905090565b6124598383836001612923565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124b05780600260008282546124a491906148c9565b92505081905550612583565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561253c578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161253393929190614ce5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125cc5780600260008282540392505081905550612619565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126769190613be8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126f55760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016126ec9190613d48565b60405180910390fd5b6127018260008361245e565b5050565b6127128282600080612afa565b505050565b83600e015442111561275e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275590615c4b565b60405180910390fd5b600084600501600081548092919061277590614bfd565b91905055905060008560040160008381526020019081526020016000209050848160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828160010160006101000a81548160ff021916908315150217905550838160020181905550818160000181905550505050505050565b60006128198484611e08565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461289b578181101561288b578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161288293929190614ce5565b60405180910390fd5b61289a84848484036000612923565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129135760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161290a9190613d48565b60405180910390fd5b61291f6000838361245e565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129955760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161298c9190613d48565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a075760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016129fe9190613d48565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015612af4578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612aeb9190613be8565b60405180910390a35b50505050565b60006009548210612b0d5783905061369a565b6000600586604051612b1f9190615c9c565b908152602001604051809103902090506000816002018054905003612b47578491505061369a565b60005b8160030180549050811015612c7b576000826003018281548110612b7157612b70614a20565b5b9060005260206000209060020201600001541215612c6e57612c6087836003018381548110612ba357612ba2614a20565b5b906000526020600020906002020160405180604001604052908160008201548152602001600182018054612bd690614743565b80601f0160208091040260200160405190810160405280929190818152602001828054612c0290614743565b8015612c4f5780601f10612c2457610100808354040283529160200191612c4f565b820191906000526020600020905b815481529060010190602001808311612c3257829003601f168201915b5050505050815250508888886136a2565b86612c6b9190615cb3565b95505b8080600101915050612b4a565b5060005b8160030180549050811015612db0576000826003018281548110612ca657612ca5614a20565b5b9060005260206000209060020201600001541315612da357612d9587836003018381548110612cd857612cd7614a20565b5b906000526020600020906002020160405180604001604052908160008201548152602001600182018054612d0b90614743565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3790614743565b8015612d845780601f10612d5957610100808354040283529160200191612d84565b820191906000526020600020905b815481529060010190602001808311612d6757829003601f168201915b5050505050815250508888886136a2565b86612da09190615cb3565b95505b8080600101915050612c7f565b50600085131561309c5761307b816040518060a0016040529081600082018054612dd990614743565b80601f0160208091040260200160405190810160405280929190818152602001828054612e0590614743565b8015612e525780601f10612e2757610100808354040283529160200191612e52565b820191906000526020600020905b815481529060010190602001808311612e3557829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015612f685783829060005260206000209060020201604051806040016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190612ed6565b50505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b82821015613063578382906000526020600020906002020160405180604001604052908160008201548152602001600182018054612fd290614743565b80601f0160208091040260200160405190810160405280929190818152602001828054612ffe90614743565b801561304b5780601f106130205761010080835404028352916020019161304b565b820191906000526020600020905b81548152906001019060200180831161302e57829003601f168201915b50505050508152505081526020019060010190612f95565b5050505081526020016004820154815250508661386b565b508481600401600082825461309091906148c9565b92505081905550613698565b60008582600401546130ae9190615a46565b1261339f57613374816040518060a00160405290816000820180546130d290614743565b80601f01602080910402602001604051908101604052809291908181526020018280546130fe90614743565b801561314b5780601f106131205761010080835404028352916020019161314b565b820191906000526020600020905b81548152906001019060200180831161312e57829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156132615783829060005260206000209060020201604051806040016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050815260200190600101906131cf565b50505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561335c5783829060005260206000209060020201604051806040016040529081600082015481526020016001820180546132cb90614743565b80601f01602080910402602001604051908101604052809291908181526020018280546132f790614743565b80156133445780601f1061331957610100808354040283529160200191613344565b820191906000526020600020905b81548152906001019060200180831161332757829003601f168201915b5050505050815250508152602001906001019061328e565b5050505081526020016004820154815250508661386b565b91508461338090615cf6565b8160040160008282546133939190614c45565b92505081905550613697565b8481600401546133af9190615a46565b915061367f816040518060a00160405290816000820180546133d090614743565b80601f01602080910402602001604051908101604052809291908181526020018280546133fc90614743565b80156134495780601f1061341e57610100808354040283529160200191613449565b820191906000526020600020905b81548152906001019060200180831161342c57829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805480602002602001604051908101604052809291908181526020016000905b8282101561355f5783829060005260206000209060020201604051806040016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050815260200190600101906134cd565b50505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561365a5783829060005260206000209060020201604051806040016040529081600082015481526020016001820180546135c990614743565b80601f01602080910402602001604051908101604052809291908181526020018280546135f590614743565b80156136425780601f1061361757610100808354040283529160200191613642565b820191906000526020600020905b81548152906001019060200180831161362557829003601f168201915b5050505050815250508152602001906001019061358c565b505050508152602001600482015481525050826004015461367a90615cf6565b61386b565b8261368a9190615a46565b9150600081600401819055505b5b505b949350505050565b600060648560000151856136b69190615d3e565b6136c09190615db6565b9050600085602001515103613722576000811215613713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370a90615e92565b60405180910390fd5b61371d3082612683565b613862565b60006008876040516137349190615c9c565b908152602001604051809103902086602001516040516137549190615c9c565b908152602001604051809103902054905083156137c157600082121561379c578061377e90615cf6565b8213613793578061378e90615cf6565b613795565b815b91506137c0565b806137a690615cf6565b82126137bb57806137b690615cf6565b6137bd565b815b91505b5b60006137fa87602001518487806137e857506000871480156137e7575060008a60000151125b5b6001886137f591906148c9565b612afa565b905080836138089190615cb3565b92508260088960405161381b9190615c9c565b9081526020016040518091039020886020015160405161383b9190615c9c565b908152602001604051809103902060008282546138589190615a46565b9250508190555050505b95945050505050565b60008060005b8460400151518110156139a45760008560400151828151811061389757613896614a20565b5b60200260200101519050600060018760400151516138b59190614c45565b8310156138ed5760648260000151876138ce9190615d3e565b6138d89190615db6565b905080846138e69190615a46565b93506138fc565b83866138f99190615cb3565b90505b6000811315613919576139143083602001518361245e565b613995565b8061392390615cf6565b61393083602001516113f8565b101561397b5761394382602001516113f8565b8161394e9190615a46565b856139599190615a46565b945061397682602001513061397185602001516113f8565b61245e565b613994565b6139938260200151308361398e90615cf6565b61245e565b5b5b50508080600101915050613871565b505092915050565b82600281019282156139db579160200282015b828111156139da5782358255916020019190600101906139bf565b5b5090506139e891906139ec565b5090565b5b80821115613a055760008160009055506001016139ed565b5090565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a43578082015181840152602081019050613a28565b60008484015250505050565b6000601f19601f8301169050919050565b6000613a6b82613a09565b613a758185613a14565b9350613a85818560208601613a25565b613a8e81613a4f565b840191505092915050565b60006020820190508181036000830152613ab38184613a60565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613afa82613acf565b9050919050565b613b0a81613aef565b8114613b1557600080fd5b50565b600081359050613b2781613b01565b92915050565b6000819050919050565b613b4081613b2d565b8114613b4b57600080fd5b50565b600081359050613b5d81613b37565b92915050565b60008060408385031215613b7a57613b79613ac5565b5b6000613b8885828601613b18565b9250506020613b9985828601613b4e565b9150509250929050565b60008115159050919050565b613bb881613ba3565b82525050565b6000602082019050613bd36000830184613baf565b92915050565b613be281613b2d565b82525050565b6000602082019050613bfd6000830184613bd9565b92915050565b600060208284031215613c1957613c18613ac5565b5b6000613c2784828501613b4e565b91505092915050565b600080600060608486031215613c4957613c48613ac5565b5b6000613c5786828701613b18565b9350506020613c6886828701613b18565b9250506040613c7986828701613b4e565b9150509250925092565b613c8c81613ba3565b8114613c9757600080fd5b50565b600081359050613ca981613c83565b92915050565b600080600060608486031215613cc857613cc7613ac5565b5b6000613cd686828701613b4e565b9350506020613ce786828701613b4e565b9250506040613cf886828701613c9a565b9150509250925092565b600060ff82169050919050565b613d1881613d02565b82525050565b6000602082019050613d336000830184613d0f565b92915050565b613d4281613aef565b82525050565b6000602082019050613d5d6000830184613d39565b92915050565b600060208284031215613d7957613d78613ac5565b5b6000613d8784828501613b18565b91505092915050565b600080600060608486031215613da957613da8613ac5565b5b6000613db786828701613b18565b9350506020613dc886828701613b4e565b9250506040613dd986828701613b4e565b9150509250925092565b60008060008060808587031215613dfd57613dfc613ac5565b5b6000613e0b87828801613b4e565b9450506020613e1c87828801613b18565b9350506040613e2d87828801613b4e565b9250506060613e3e87828801613c9a565b91505092959194509250565b600080fd5b600080fd5b600080fd5b60008083601f840112613e6f57613e6e613e4a565b5b8235905067ffffffffffffffff811115613e8c57613e8b613e4f565b5b602083019150836001820283011115613ea857613ea7613e54565b5b9250929050565b600081905082602060020282011115613ecb57613eca613e54565b5b92915050565b60008083601f840112613ee757613ee6613e4a565b5b8235905067ffffffffffffffff811115613f0457613f03613e4f565b5b602083019150836001820283011115613f2057613f1f613e54565b5b9250929050565b6000806000806000806000806000806101408b8d031215613f4b57613f4a613ac5565b5b60008b013567ffffffffffffffff811115613f6957613f68613aca565b5b613f758d828e01613e59565b9a509a50506020613f888d828e01613b4e565b9850506040613f998d828e01613eaf565b9750506080613faa8d828e01613eaf565b96505060c0613fbb8d828e01613b4e565b95505060e0613fcc8d828e01613c9a565b945050610100613fde8d828e01613c9a565b9350506101208b013567ffffffffffffffff81111561400057613fff613aca565b5b61400c8d828e01613ed1565b92509250509295989b9194979a5092959850565b61402981613b2d565b82525050565b600060029050919050565b600081905092915050565b6000819050919050565b600061405b8383614020565b60208301905092915050565b6000602082019050919050565b61407d8161402f565b614087818461403a565b925061409282614045565b8060005b838110156140c35781516140aa878261404f565b96506140b583614067565b925050600181019050614096565b505050505050565b6140d481613ba3565b82525050565b60e0820160008201516140f06000850182614020565b5060208201516141036020850182614074565b5060408201516141166060850182614074565b50606082015161412960a0850182614020565b50608082015161413c60c08501826140cb565b50505050565b600081519050919050565b600082825260208201905092915050565b600061416982614142565b614173818561414d565b9350614183818560208601613a25565b61418c81613a4f565b840191505092915050565b6000610240820190506141ad600083018f613bd9565b81810360208301526141bf818e613a60565b90506141ce604083018d613d39565b6141db606083018c613bd9565b6141e8608083018b613bd9565b6141f560a083018a6140da565b614203610180830189613bd9565b6142116101a0830188613bd9565b61421f6101c0830187613baf565b61422d6101e0830186613baf565b61423b610200830185613baf565b81810361022083015261424e818461415e565b90509d9c50505050505050505050505050565b6000806020838503121561427857614277613ac5565b5b600083013567ffffffffffffffff81111561429657614295613aca565b5b6142a285828601613e59565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6142e381613aef565b82525050565b6040820160008201516142ff6000850182614020565b50602082015161431260208501826142da565b50505050565b600061432483836142e9565b60408301905092915050565b6000602082019050919050565b6000614348826142ae565b61435281856142b9565b935061435d836142ca565b8060005b8381101561438e5781516143758882614318565b975061438083614330565b925050600181019050614361565b5085935050505092915050565b600060208201905081810360008301526143b5818461433d565b905092915050565b600080604083850312156143d4576143d3613ac5565b5b60006143e285828601613b18565b92505060206143f385828601613b18565b9150509250929050565b60008083601f84011261441357614412613e4a565b5b8235905067ffffffffffffffff8111156144305761442f613e4f565b5b60208301915083604082028301111561444c5761444b613e54565b5b9250929050565b60008083601f84011261446957614468613e4a565b5b8235905067ffffffffffffffff81111561448657614485613e4f565b5b6020830191508360208202830111156144a2576144a1613e54565b5b9250929050565b600080600080600080606087890312156144c6576144c5613ac5565b5b600087013567ffffffffffffffff8111156144e4576144e3613aca565b5b6144f089828a016143fd565b9650965050602087013567ffffffffffffffff81111561451357614512613aca565b5b61451f89828a01613e59565b9450945050604087013567ffffffffffffffff81111561454257614541613aca565b5b61454e89828a01614453565b92509250509295509295509295565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61459a82613a4f565b810181811067ffffffffffffffff821117156145b9576145b8614562565b5b80604052505050565b60006145cc613abb565b90506145d88282614591565b919050565b600067ffffffffffffffff8211156145f8576145f7614562565b5b61460182613a4f565b9050602081019050919050565b82818337600083830152505050565b600061463061462b846145dd565b6145c2565b90508281526020810184848401111561464c5761464b61455d565b5b61465784828561460e565b509392505050565b600082601f83011261467457614673613e4a565b5b813561468484826020860161461d565b91505092915050565b6000602082840312156146a3576146a2613ac5565b5b600082013567ffffffffffffffff8111156146c1576146c0613aca565b5b6146cd8482850161465f565b91505092915050565b600060608201905081810360008301526146f08186613a60565b90506146ff6020830185613d39565b61470c6040830184613bd9565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061475b57607f821691505b60208210810361476e5761476d614714565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546147a181614743565b6147ab8186614774565b945060018216600081146147c657600181146147db5761480e565b60ff198316865281151582028601935061480e565b6147e48561477f565b60005b83811015614806578154818901526001820191506020810190506147e7565b838801955050505b50505092915050565b60006148238284614794565b915081905092915050565b7f506f6f6c20697320616c7265616479207265736f6c7665640000000000000000600082015250565b6000614864601883613a14565b915061486f8261482e565b602082019050919050565b6000602082019050818103600083015261489381614857565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148d482613b2d565b91506148df83613b2d565b92508282019050808211156148f7576148f661489a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061493782613b2d565b915061494283613b2d565b925082614952576149516148fd565b5b828204905092915050565b600061496882613b2d565b915061497383613b2d565b925082614983576149826148fd565b5b828206905092915050565b7f506f6f6c20656e642074696d6520686173206e6f74207965742061727269766560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006149ea602183613a14565b91506149f58261498e565b604082019050919050565b60006020820190508181036000830152614a19816149dd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614a5a82613b2d565b9150614a6583613b2d565b9250828202614a7381613b2d565b91508282048414831517614a8a57614a8961489a565b5b5092915050565b6000606082019050614aa66000830186613bd9565b614ab36020830185613baf565b614ac06040830184613baf565b949350505050565b60008190508160005260206000209050919050565b60008154614aea81614743565b614af4818661414d565b94506001821660008114614b0f5760018114614b2557614b58565b60ff198316865281151560200286019350614b58565b614b2e85614ac8565b60005b83811015614b5057815481890152600182019150602081019050614b31565b808801955050505b50505092915050565b600060a082019050614b766000830188613baf565b614b836020830187613baf565b614b906040830186613bd9565b614b9d6060830185613bd9565b8181036080830152614baf8184614add565b90509695505050505050565b600081519050614bca81613b37565b92915050565b600060208284031215614be657614be5613ac5565b5b6000614bf484828501614bbb565b91505092915050565b6000614c0882613b2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c3a57614c3961489a565b5b600182019050919050565b6000614c5082613b2d565b9150614c5b83613b2d565b9250828203905081811115614c7357614c7261489a565b5b92915050565b7f524550207472616e73666572206973206e6f7420616c6c6f7765640000000000600082015250565b6000614caf601b83613a14565b9150614cba82614c79565b602082019050919050565b60006020820190508181036000830152614cde81614ca2565b9050919050565b6000606082019050614cfa6000830186613d39565b614d076020830185613bd9565b614d146040830184613bd9565b949350505050565b7f46656520697320726571756972656420746f20696e6974696174652076616c6960008201527f646174696f6e20706f6f6c000000000000000000000000000000000000000000602082015250565b6000614d78602b83613a14565b9150614d8382614d1c565b604082019050919050565b60006020820190508181036000830152614da781614d6b565b9050919050565b7f4475726174696f6e20697320746f6f2073686f72740000000000000000000000600082015250565b6000614de4601583613a14565b9150614def82614dae565b602082019050919050565b60006020820190508181036000830152614e1381614dd7565b9050919050565b7f4475726174696f6e20697320746f6f206c6f6e67000000000000000000000000600082015250565b6000614e50601483613a14565b9150614e5b82614e1a565b602082019050919050565b60006020820190508181036000830152614e7f81614e43565b9050919050565b7f51756f72756d2069732062656c6f77206d696e696d756d000000000000000000600082015250565b6000614ebc601783613a14565b9150614ec782614e86565b602082019050919050565b60006020820190508181036000830152614eeb81614eaf565b9050919050565b7f51756f72756d2069732067726561746572207468616e206f6e65000000000000600082015250565b6000614f28601a83613a14565b9150614f3382614ef2565b602082019050919050565b60006020820190508181036000830152614f5781614f1b565b9050919050565b7f57696e20726174696f2069732067726561746572207468616e206f6e65000000600082015250565b6000614f94601d83613a14565b9150614f9f82614f5e565b602082019050919050565b60006020820190508181036000830152614fc381614f87565b9050919050565b7f42696e64696e672070657263656e74206d757374206265203c3d203130300000600082015250565b6000615000601e83613a14565b915061500b82614fca565b602082019050919050565b6000602082019050818103600083015261502f81614ff3565b9050919050565b60006150428385614774565b935061504f83858461460e565b82840190509392505050565b6000615068828486615036565b91508190509392505050565b7f54617267657420706f7374206e6f7420666f756e640000000000000000000000600082015250565b60006150aa601583613a14565b91506150b582615074565b602082019050919050565b600060208201905081810360008301526150d98161509d565b9050919050565b600082905092915050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026151387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826150fb565b61514286836150fb565b95508019841693508086168417925050509392505050565b6000819050919050565b600061517f61517a61517584613b2d565b61515a565b613b2d565b9050919050565b6000819050919050565b61519983615164565b6151ad6151a582615186565b848454615108565b825550505050565b600090565b6151c26151b5565b6151cd818484615190565b505050565b5b818110156151f1576151e66000826151ba565b6001810190506151d3565b5050565b601f821115615236576152078161477f565b615210846150eb565b8101602085101561521f578190505b61523361522b856150eb565b8301826151d2565b50505b505050565b600082821c905092915050565b60006152596000198460080261523b565b1980831691505092915050565b60006152728383615248565b9150826002028217905092915050565b61528c83836150e0565b67ffffffffffffffff8111156152a5576152a4614562565b5b6152af8254614743565b6152ba8282856151f5565b6000601f8311600181146152e957600084156152d7578287013590505b6152e18582615266565b865550615349565b601f1984166152f78661477f565b60005b8281101561531f578489013582556001820191506020850194506020810190506152fa565b8683101561533c5784890135615338601f891682615248565b8355505b6001600288020188555050505b50505050505050565b600082905092915050565b601f82111561539e5761536f81614ac8565b615378846150eb565b81016020851015615387578190505b61539b615393856150eb565b8301826151d2565b50505b505050565b6153ad8383615352565b67ffffffffffffffff8111156153c6576153c5614562565b5b6153d08254614743565b6153db82828561535d565b6000601f83116001811461540a57600084156153f8578287013590505b6154028582615266565b86555061546a565b601f19841661541886614ac8565b60005b828110156154405784890135825560018201915060208501945060208101905061541b565b8683101561545d5784890135615459601f891682615248565b8355505b6001600288020188555050505b50505050505050565b7f506f7374206d75737420696e636c756465206174206c65617374206f6e65206160008201527f7574686f72000000000000000000000000000000000000000000000000000000602082015250565b60006154cf602583613a14565b91506154da82615473565b604082019050919050565b600060208201905081810360008301526154fe816154c2565b9050919050565b7f4120706f73742077697468207468697320636f6e74656e74496420616c72656160008201527f6479206578697374730000000000000000000000000000000000000000000000602082015250565b6000615561602983613a14565b915061556c82615505565b604082019050919050565b6000602082019050818103600083015261559081615554565b9050919050565b600081356155a481613b37565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6155e6846155ad565b9350801983169250808416831791505092915050565b61560582615164565b61561861561182615186565b83546155ba565b8255505050565b6000813561562c81613b01565b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff615655846155ad565b9350801983169250808416831791505092915050565b600061568661568161567c84613acf565b61515a565b613acf565b9050919050565b60006156988261566b565b9050919050565b60006156aa8261568d565b9050919050565b6000819050919050565b6156c48261569f565b6156d76156d0826156b1565b8354615635565b8255505050565b6000810160008301806156f081615597565b90506156fc81846155fc565b5050506001810160208301806157118161561f565b905061571d81846156bb565b5050505050565b61572e82826156de565b5050565b7f417574686f722077656967687473206d7573742073756d20746f203130302500600082015250565b6000615768601f83613a14565b915061577382615732565b602082019050919050565b600060208201905081810360008301526157978161575b565b9050919050565b600080fd5b600080fd5b600080fd5b6000823560016040038336030381126157c9576157c861579e565b5b80830191505092915050565b6000819050919050565b6157e8816157d5565b81146157f357600080fd5b50565b60008135615803816157df565b80915050919050565b600061582761582261581d846157d5565b61515a565b6157d5565b9050919050565b6000819050919050565b6158418261580c565b61585461584d8261582e565b83546155ba565b8255505050565b600080833560016020038436030381126158785761587761579e565b5b80840192508235915067ffffffffffffffff82111561589a576158996157a3565b5b6020830192506001820236038313156158b6576158b56157a8565b5b509250929050565b6158c9838383615282565b505050565b6000810160008301806158e0816157f6565b90506158ec8184615838565b5050506001810160208301615901818561585b565b61590c8183866158be565b505050505050565b61591e82826158ce565b5050565b7f45616368206369746174696f6e20776569676874206d757374206265203e3d2060008201527f2d31303000000000000000000000000000000000000000000000000000000000602082015250565b600061597e602483613a14565b915061598982615922565b604082019050919050565b600060208201905081810360008301526159ad81615971565b9050919050565b7f45616368206369746174696f6e20776569676874206d757374206265203c3d2060008201527f3130300000000000000000000000000000000000000000000000000000000000602082015250565b6000615a10602383613a14565b9150615a1b826159b4565b604082019050919050565b60006020820190508181036000830152615a3f81615a03565b9050919050565b6000615a51826157d5565b9150615a5c836157d5565b925082820190508281121560008312168382126000841215161715615a8457615a8361489a565b5b92915050565b7f53756d206f6620706f736974697665206369746174696f6e73206d757374206260008201527f65203c3d20313030000000000000000000000000000000000000000000000000602082015250565b6000615ae6602883613a14565b9150615af182615a8a565b604082019050919050565b60006020820190508181036000830152615b1581615ad9565b9050919050565b7f53756d206f66206e65676174697665206369746174696f6e73206d757374206260008201527f65203e3d202d3130300000000000000000000000000000000000000000000000602082015250565b6000615b78602983613a14565b9150615b8382615b1c565b604082019050919050565b60006020820190508181036000830152615ba781615b6b565b9050919050565b6000615bba8385613a14565b9350615bc783858461460e565b615bd083613a4f565b840190509392505050565b60006020820190508181036000830152615bf6818486615bae565b90509392505050565b7f506f6f6c20656e642074696d6520686173207061737365640000000000000000600082015250565b6000615c35601883613a14565b9150615c4082615bff565b602082019050919050565b60006020820190508181036000830152615c6481615c28565b9050919050565b6000615c7682613a09565b615c808185614774565b9350615c90818560208601613a25565b80840191505092915050565b6000615ca88284615c6b565b915081905092915050565b6000615cbe826157d5565b9150615cc9836157d5565b9250828203905081811260008412168282136000851215161715615cf057615cef61489a565b5b92915050565b6000615d01826157d5565b91507f80000000000000000000000000000000000000000000000000000000000000008203615d3357615d3261489a565b5b816000039050919050565b6000615d49826157d5565b9150615d54836157d5565b9250828202615d62816157d5565b91507f80000000000000000000000000000000000000000000000000000000000000008414600084121615615d9a57615d9961489a565b5b8282058414831517615daf57615dae61489a565b5b5092915050565b6000615dc1826157d5565b9150615dcc836157d5565b925082615ddc57615ddb6148fd565b5b600160000383147f800000000000000000000000000000000000000000000000000000000000000083141615615e1557615e1461489a565b5b828205905092915050565b7f4c65616368696e672066726f6d20696e63696e657261746f7220697320666f7260008201527f62696464656e0000000000000000000000000000000000000000000000000000602082015250565b6000615e7c602683613a14565b9150615e8782615e20565b604082019050919050565b60006020820190508181036000830152615eab81615e6f565b905091905056fea2646970667358221220c308521dc849f12cca79264e32371da691dbeb8c7ce78eb9e19c75a38fa6949964736f6c63430008180033", + "deployedBytecode": "0x60806040526004361061014b5760003560e01c806370a08231116100b6578063a23362791161006f578063a2336279146104e7578063a9059cbb1461052f578063da66863a1461056c578063dd62ed3e146105a9578063e5b4d827146105e6578063f8300fca1461060f5761014b565b806370a08231146103ac57806388380274146103e957806395d89b4114610426578063975762b3146104515780639fbe7c731461047a578063a230c524146104aa5761014b565b806323b872dd1161010857806323b872dd146102765780632d17c062146102b3578063313ce567146102dc57806350cde8ef146103075780635daf08ca14610344578063642b5bfb146103815761014b565b806306fdde0314610150578063095ea7b31461017b57806311aee380146101b857806317906c2e146101e357806317c182171461020e57806318160ddd1461024b575b600080fd5b34801561015c57600080fd5b5061016561064e565b6040516101729190613a99565b60405180910390f35b34801561018757600080fd5b506101a2600480360381019061019d9190613b63565b6106e0565b6040516101af9190613bbe565b60405180910390f35b3480156101c457600080fd5b506101cd610703565b6040516101da9190613be8565b60405180910390f35b3480156101ef57600080fd5b506101f8610709565b6040516102059190613be8565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190613c03565b61070f565b6040516102429190613bbe565b60405180910390f35b34801561025757600080fd5b5061026061129a565b60405161026d9190613be8565b60405180910390f35b34801561028257600080fd5b5061029d60048036038101906102989190613c30565b6112a4565b6040516102aa9190613bbe565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613caf565b6112e1565b005b3480156102e857600080fd5b506102f161130a565b6040516102fe9190613d1e565b60405180910390f35b34801561031357600080fd5b5061032e60048036038101906103299190613c03565b611313565b60405161033b9190613a99565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190613c03565b6113bf565b6040516103789190613d48565b60405180910390f35b34801561038d57600080fd5b506103966113f2565b6040516103a39190613be8565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190613d63565b6113f8565b6040516103e09190613be8565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b9190613d90565b611440565b60405161041d9190613bbe565b60405180910390f35b34801561043257600080fd5b5061043b6114c7565b6040516104489190613a99565b60405180910390f35b34801561045d57600080fd5b5061047860048036038101906104739190613de3565b611559565b005b610494600480360381019061048f9190613f27565b61158e565b6040516104a19190613be8565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190613d63565b611a48565b6040516104de9190613bbe565b60405180910390f35b3480156104f357600080fd5b5061050e60048036038101906105099190613c03565b611a68565b6040516105269c9b9a99989796959493929190614197565b60405180910390f35b34801561053b57600080fd5b5061055660048036038101906105519190613b63565b611ce2565b6040516105639190613bbe565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e9190614261565b611d1f565b6040516105a0919061439b565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb91906143bd565b611e08565b6040516105dd9190613be8565b60405180910390f35b3480156105f257600080fd5b5061060d600480360381019061060891906144a9565b611e8f565b005b34801561061b57600080fd5b506106366004803603810190610631919061468d565b61235c565b604051610645939291906146d6565b60405180910390f35b60606003805461065d90614743565b80601f016020809104026020016040519081016040528092919081815260200182805461068990614743565b80156106d65780601f106106ab576101008083540402835291602001916106d6565b820191906000526020600020905b8154815290600101906020018083116106b957829003601f168201915b5050505050905090565b6000806106eb612444565b90506106f881858561244c565b600191505092915050565b600d5481565b60075481565b600080600a60008481526020019081526020016000209050600060058260010160405161073c9190614817565b908152602001604051809103902090506000151582600f0160009054906101000a900460ff161515146107a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079b9061487a565b60405180910390fd5b600080600080600090505b85600501548110156108205785600401600082815260200190815260200160002091508160010160009054906101000a900460ff1615610800578160020154846107f991906148c9565b9350610813565b81600201548361081091906148c9565b92505b80806001019150506107af565b5060028560030154610832919061492c565b8361083d91906148c9565b925060028560030154610850919061492c565b8261085b91906148c9565b9150600060028660030154610870919061495d565b146108855760018361088291906148c9565b92505b84600e01544211806108a8575061089a61129a565b82846108a691906148c9565b145b6108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de90614a00565b60405180910390fd5b8460060160010160006002811061090157610900614a20565b5b015461090b61129a565b6109159190614a4f565b828461092191906148c9565b8660060160010160016002811061093b5761093a614a20565b5b01546109479190614a4f565b11610a7857600185600f0160006101000a81548160ff0219169083151502179055507fae8941f3b4d152118273444f36b8b5642e5602102b789968bd4b7cf8b250de818760008060405161099d93929190614a91565b60405180910390a184600f0160029054906101000a900460ff1615610a6a578460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b4e6a1d587600086868a6010016040518663ffffffff1660e01b8152600401610a25959493929190614b61565b6020604051808303816000875af1158015610a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a689190614bd0565b505b600095505050505050611295565b84600601600301600060028110610a9257610a91614a20565b5b01548284610aa091906148c9565b610aaa9190614a4f565b85600601600301600160028110610ac457610ac3614a20565b5b015484610ad19190614a4f565b101595508515610c5b5760005b8460020180549050811015610c59576000856002018281548110610b0557610b04614a20565b5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600e60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610c4b5780600c6000600d6000815480929190610ba290614bfd565b91905055815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b508080600101915050610ade565b505b600185600f0160006101000a81548160ff0219169083151502179055508585600f0160016101000a81548160ff0219169083151502179055507fae8941f3b4d152118273444f36b8b5642e5602102b789968bd4b7cf8b250de8187876001604051610cc893929190614a91565b60405180910390a1600086610cdd5782610cdf565b835b905060008060005b8860050154811015610de75788600401600082815260200190815260200160002094508460010160009054906101000a900460ff1615158a151514610dda57600060648a600601600501548760020154610d419190614a4f565b610d4b919061492c565b90508960060160060160009054906101000a900460ff1615610da957610d968660030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16308361245e565b8084610da291906148c9565b9350610dd8565b610dd78660030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612683565b5b505b8080600101915050610ce7565b508815610fe55760028860030154610dff919061492c565b82610e0a91906148c9565b915060005b8860050154811015610ef55788600401600082815260200190815260200160002094508860060160060160009054906101000a900460ff168015610e6757508460010160009054906101000a900460ff1615158a1515145b15610ee857600060648a6006016005015486886002015487610e899190614a4f565b610e93919061492c565b610e9d9190614a4f565b610ea7919061492c565b90508083610eb591906148c9565b9250610ee6308760030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361245e565b505b8080600101915050610e0f565b5060008183610f049190614c45565b9050600060028a60030154610f19919061495d565b14610f2e57600181610f2b91906148c9565b90505b610fdf896001018054610f4090614743565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6c90614743565b8015610fb95780601f10610f8e57610100808354040283529160200191610fb9565b820191906000526020600020905b815481529060010190602001808311610f9c57829003601f168201915b50505050508260028c60030154610fd0919061492c565b610fda91906148c9565b612705565b506110fd565b876003015482610ff591906148c9565b915060005b88600501548110156110fb5788600401600082815260200190815260200160002094508860060160060160009054906101000a900460ff16801561105257508460010160009054906101000a900460ff1615158a1515145b156110ee57600060648a6006016005015460028c60030154611074919061492c565b8761107f9190614c45565b88600201548761108f9190614a4f565b611099919061492c565b6110a39190614a4f565b6110ad919061492c565b905080836110bb91906148c9565b92506110ec308760030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361245e565b505b8080600101915050610ffa565b505b60005b600d548110156111c6576000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061114c61129a565b611155836113f8565b8c600d01546111649190614a4f565b61116e919061492c565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111b6573d6000803e3d6000fd5b5050508080600101915050611100565b5087600f0160029054906101000a900460ff161561128c578760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b4e6a1d58a600189898d6010016040518663ffffffff1660e01b8152600401611247959493929190614b61565b6020604051808303816000875af1158015611266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128a9190614bd0565b505b50505050505050505b919050565b6000600254905090565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890614cc5565b60405180910390fd5b6000600a6000858152602001908152602001600020905061130481338585612717565b50505050565b60006009905090565b6006818154811061132357600080fd5b90600052602060002001600091509050805461133e90614743565b80601f016020809104026020016040519081016040528092919081815260200182805461136a90614743565b80156113b75780601f1061138c576101008083540402835291602001916113b7565b820191906000526020600020905b81548152906001019060200180831161139a57829003601f168201915b505050505081565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061144d33858561244c565b8373ffffffffffffffffffffffffffffffffffffffff1663216ed6ad3385856040518463ffffffff1660e01b815260040161148a93929190614ce5565b600060405180830381600087803b1580156114a457600080fd5b505af11580156114b8573d6000803e3d6000fd5b50505050600190509392505050565b6060600480546114d690614743565b80601f016020809104026020016040519081016040528092919081815260200182805461150290614743565b801561154f5780601f106115245761010080835404028352916020019161154f565b820191906000526020600020905b81548152906001019060200180831161153257829003601f168201915b5050505050905090565b6000600a6000868152602001908152602001600020905061157b84338561280d565b61158781858585612717565b5050505050565b60008034116115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990614d8e565b60405180910390fd5b6001891015611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d90614dfa565b60405180910390fd5b651cae8c13e00089111561165f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165690614e66565b60405180910390fd5b8760016002811061167357611672614a20565b5b6020020135600f60006002811061168d5761168c614a20565b5b01546116999190614a4f565b886000600281106116ad576116ac614a20565b5b6020020135600f6001600281106116c7576116c6614a20565b5b01546116d39190614a4f565b1015611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b90614ed2565b60405180910390fd5b8760016002811061172857611727614a20565b5b60200201358860006002811061174157611740614a20565b5b60200201351115611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e90614f3e565b60405180910390fd5b8660016002811061179b5761179a614a20565b5b6020020135876000600281106117b4576117b3614a20565b5b602002013511156117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190614faa565b60405180910390fd5b606486111561183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590615016565b60405180910390fd5b600060058c8c60405161185292919061505b565b9081526020016040518091039020905060008160020180549050036118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a3906150c0565b60405180910390fd5b600b60008154809291906118bf90614bfd565b9190505591506000600a60008481526020019081526020016000209050338160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508c8c826001019182611932929190615282565b503481600d018190555089816006016001019060026119529291906139ac565b5088816006016003019060026119699291906139ac565b50878160060160050181905550868160060160060160006101000a81548160ff0219169083151502179055508a81600601600001819055508a426119ad91906148c9565b81600e01819055508281600001819055508581600f0160026101000a81548160ff02191690831515021790555084848260100191826119ed9291906153a3565b506119f830346128a1565b3481600301819055507f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a83604051611a309190613be8565b60405180910390a150509a9950505050505050505050565b600e6020528060005260406000206000915054906101000a900460ff1681565b600a602052806000526040600020600091509050806000015490806001018054611a9190614743565b80601f0160208091040260200160405190810160405280929190818152602001828054611abd90614743565b8015611b0a5780601f10611adf57610100808354040283529160200191611b0a565b820191906000526020600020905b815481529060010190602001808311611aed57829003601f168201915b5050505050908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806003015490806005015490806006016040518060a00160405290816000820154815260200160018201600280602002604051908101604052809291908260028015611b97576020028201915b815481526020019060010190808311611b83575b5050505050815260200160038201600280602002604051908101604052809291908260028015611bdc576020028201915b815481526020019060010190808311611bc8575b50505050508152602001600582015481526020016006820160009054906101000a900460ff1615151515815250509080600d01549080600e01549080600f0160009054906101000a900460ff169080600f0160019054906101000a900460ff169080600f0160029054906101000a900460ff1690806010018054611c5f90614743565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8b90614743565b8015611cd85780601f10611cad57610100808354040283529160200191611cd8565b820191906000526020600020905b815481529060010190602001808311611cbb57829003601f168201915b505050505090508c565b60006040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1690614cc5565b60405180910390fd5b6060600060058484604051611d3592919061505b565b9081526020016040518091039020905080600201805480602002602001604051908101604052809291908181526020016000905b82821015611dfb5783829060005260206000209060020201604051806040016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611d69565b5050505091505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008686905011611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc906154e5565b60405180910390fd5b60076000815480929190611ee890614bfd565b91905055506006848490918060018154018082558091505060019003906000526020600020016000909192909192909192909192509182611f2a929190615282565b50600060058585604051611f3f92919061505b565b908152602001604051809103902090506000816002018054905014611f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9090615577565b60405180910390fd5b338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508484826000019182611fef929190615282565b50600080600090505b8888905081101561208e5788888281811061201657612015614a20565b5b905060400201600001358261202b91906148c9565b91508260020189898381811061204457612043614a20565b5b9050604002019080600181540180825580915050600190039060005260206000209060020201600090919091909150818161207f9190615724565b50508080600101915050611ff8565b50606481146120d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c99061577e565b60405180910390fd5b60005b8484905081101561214d57826003018585838181106120f7576120f6614a20565b5b905060200281019061210991906157ad565b9080600181540180825580915050600190039060005260206000209060020201600090919091909150818161213e9190615914565b505080806001019150506120d5565b5060008060005b846003018054905081101561226f57600085600301828154811061217b5761217a614a20565b5b90600052602060002090600202016000015490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c8112156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e990615994565b60405180910390fd5b6064811315612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d90615a26565b60405180910390fd5b600081131561225257808461224b9190615a46565b9350612261565b808361225e9190615a46565b92505b508080600101915050612154565b5060648213156122b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ab90615afc565b60405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c811215612317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230e90615b8e565b60405180910390fd5b7fbd6277baf8ced6ab6543a1aef164635fc2bde1ba962d39d8a0fd81a5af2497278888604051612348929190615bdb565b60405180910390a150505050505050505050565b60058180516020810182018051848252602083016020850120818352809550505050505060009150905080600001805461239590614743565b80601f01602080910402602001604051908101604052809291908181526020018280546123c190614743565b801561240e5780601f106123e35761010080835404028352916020019161240e565b820191906000526020600020905b8154815290600101906020018083116123f157829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154905083565b600033905090565b6124598383836001612923565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124b05780600260008282546124a491906148c9565b92505081905550612583565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561253c578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161253393929190614ce5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125cc5780600260008282540392505081905550612619565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126769190613be8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126f55760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016126ec9190613d48565b60405180910390fd5b6127018260008361245e565b5050565b6127128282600080612afa565b505050565b83600e015442111561275e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275590615c4b565b60405180910390fd5b600084600501600081548092919061277590614bfd565b91905055905060008560040160008381526020019081526020016000209050848160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828160010160006101000a81548160ff021916908315150217905550838160020181905550818160000181905550505050505050565b60006128198484611e08565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461289b578181101561288b578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161288293929190614ce5565b60405180910390fd5b61289a84848484036000612923565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129135760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161290a9190613d48565b60405180910390fd5b61291f6000838361245e565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129955760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161298c9190613d48565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a075760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016129fe9190613d48565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015612af4578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612aeb9190613be8565b60405180910390a35b50505050565b60006009548210612b0d5783905061369a565b6000600586604051612b1f9190615c9c565b908152602001604051809103902090506000816002018054905003612b47578491505061369a565b60005b8160030180549050811015612c7b576000826003018281548110612b7157612b70614a20565b5b9060005260206000209060020201600001541215612c6e57612c6087836003018381548110612ba357612ba2614a20565b5b906000526020600020906002020160405180604001604052908160008201548152602001600182018054612bd690614743565b80601f0160208091040260200160405190810160405280929190818152602001828054612c0290614743565b8015612c4f5780601f10612c2457610100808354040283529160200191612c4f565b820191906000526020600020905b815481529060010190602001808311612c3257829003601f168201915b5050505050815250508888886136a2565b86612c6b9190615cb3565b95505b8080600101915050612b4a565b5060005b8160030180549050811015612db0576000826003018281548110612ca657612ca5614a20565b5b9060005260206000209060020201600001541315612da357612d9587836003018381548110612cd857612cd7614a20565b5b906000526020600020906002020160405180604001604052908160008201548152602001600182018054612d0b90614743565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3790614743565b8015612d845780601f10612d5957610100808354040283529160200191612d84565b820191906000526020600020905b815481529060010190602001808311612d6757829003601f168201915b5050505050815250508888886136a2565b86612da09190615cb3565b95505b8080600101915050612c7f565b50600085131561309c5761307b816040518060a0016040529081600082018054612dd990614743565b80601f0160208091040260200160405190810160405280929190818152602001828054612e0590614743565b8015612e525780601f10612e2757610100808354040283529160200191612e52565b820191906000526020600020905b815481529060010190602001808311612e3557829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015612f685783829060005260206000209060020201604051806040016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190612ed6565b50505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b82821015613063578382906000526020600020906002020160405180604001604052908160008201548152602001600182018054612fd290614743565b80601f0160208091040260200160405190810160405280929190818152602001828054612ffe90614743565b801561304b5780601f106130205761010080835404028352916020019161304b565b820191906000526020600020905b81548152906001019060200180831161302e57829003601f168201915b50505050508152505081526020019060010190612f95565b5050505081526020016004820154815250508661386b565b508481600401600082825461309091906148c9565b92505081905550613698565b60008582600401546130ae9190615a46565b1261339f57613374816040518060a00160405290816000820180546130d290614743565b80601f01602080910402602001604051908101604052809291908181526020018280546130fe90614743565b801561314b5780601f106131205761010080835404028352916020019161314b565b820191906000526020600020905b81548152906001019060200180831161312e57829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156132615783829060005260206000209060020201604051806040016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050815260200190600101906131cf565b50505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561335c5783829060005260206000209060020201604051806040016040529081600082015481526020016001820180546132cb90614743565b80601f01602080910402602001604051908101604052809291908181526020018280546132f790614743565b80156133445780601f1061331957610100808354040283529160200191613344565b820191906000526020600020905b81548152906001019060200180831161332757829003601f168201915b5050505050815250508152602001906001019061328e565b5050505081526020016004820154815250508661386b565b91508461338090615cf6565b8160040160008282546133939190614c45565b92505081905550613697565b8481600401546133af9190615a46565b915061367f816040518060a00160405290816000820180546133d090614743565b80601f01602080910402602001604051908101604052809291908181526020018280546133fc90614743565b80156134495780601f1061341e57610100808354040283529160200191613449565b820191906000526020600020905b81548152906001019060200180831161342c57829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805480602002602001604051908101604052809291908181526020016000905b8282101561355f5783829060005260206000209060020201604051806040016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050815260200190600101906134cd565b50505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561365a5783829060005260206000209060020201604051806040016040529081600082015481526020016001820180546135c990614743565b80601f01602080910402602001604051908101604052809291908181526020018280546135f590614743565b80156136425780601f1061361757610100808354040283529160200191613642565b820191906000526020600020905b81548152906001019060200180831161362557829003601f168201915b5050505050815250508152602001906001019061358c565b505050508152602001600482015481525050826004015461367a90615cf6565b61386b565b8261368a9190615a46565b9150600081600401819055505b5b505b949350505050565b600060648560000151856136b69190615d3e565b6136c09190615db6565b9050600085602001515103613722576000811215613713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370a90615e92565b60405180910390fd5b61371d3082612683565b613862565b60006008876040516137349190615c9c565b908152602001604051809103902086602001516040516137549190615c9c565b908152602001604051809103902054905083156137c157600082121561379c578061377e90615cf6565b8213613793578061378e90615cf6565b613795565b815b91506137c0565b806137a690615cf6565b82126137bb57806137b690615cf6565b6137bd565b815b91505b5b60006137fa87602001518487806137e857506000871480156137e7575060008a60000151125b5b6001886137f591906148c9565b612afa565b905080836138089190615cb3565b92508260088960405161381b9190615c9c565b9081526020016040518091039020886020015160405161383b9190615c9c565b908152602001604051809103902060008282546138589190615a46565b9250508190555050505b95945050505050565b60008060005b8460400151518110156139a45760008560400151828151811061389757613896614a20565b5b60200260200101519050600060018760400151516138b59190614c45565b8310156138ed5760648260000151876138ce9190615d3e565b6138d89190615db6565b905080846138e69190615a46565b93506138fc565b83866138f99190615cb3565b90505b6000811315613919576139143083602001518361245e565b613995565b8061392390615cf6565b61393083602001516113f8565b101561397b5761394382602001516113f8565b8161394e9190615a46565b856139599190615a46565b945061397682602001513061397185602001516113f8565b61245e565b613994565b6139938260200151308361398e90615cf6565b61245e565b5b5b50508080600101915050613871565b505092915050565b82600281019282156139db579160200282015b828111156139da5782358255916020019190600101906139bf565b5b5090506139e891906139ec565b5090565b5b80821115613a055760008160009055506001016139ed565b5090565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a43578082015181840152602081019050613a28565b60008484015250505050565b6000601f19601f8301169050919050565b6000613a6b82613a09565b613a758185613a14565b9350613a85818560208601613a25565b613a8e81613a4f565b840191505092915050565b60006020820190508181036000830152613ab38184613a60565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613afa82613acf565b9050919050565b613b0a81613aef565b8114613b1557600080fd5b50565b600081359050613b2781613b01565b92915050565b6000819050919050565b613b4081613b2d565b8114613b4b57600080fd5b50565b600081359050613b5d81613b37565b92915050565b60008060408385031215613b7a57613b79613ac5565b5b6000613b8885828601613b18565b9250506020613b9985828601613b4e565b9150509250929050565b60008115159050919050565b613bb881613ba3565b82525050565b6000602082019050613bd36000830184613baf565b92915050565b613be281613b2d565b82525050565b6000602082019050613bfd6000830184613bd9565b92915050565b600060208284031215613c1957613c18613ac5565b5b6000613c2784828501613b4e565b91505092915050565b600080600060608486031215613c4957613c48613ac5565b5b6000613c5786828701613b18565b9350506020613c6886828701613b18565b9250506040613c7986828701613b4e565b9150509250925092565b613c8c81613ba3565b8114613c9757600080fd5b50565b600081359050613ca981613c83565b92915050565b600080600060608486031215613cc857613cc7613ac5565b5b6000613cd686828701613b4e565b9350506020613ce786828701613b4e565b9250506040613cf886828701613c9a565b9150509250925092565b600060ff82169050919050565b613d1881613d02565b82525050565b6000602082019050613d336000830184613d0f565b92915050565b613d4281613aef565b82525050565b6000602082019050613d5d6000830184613d39565b92915050565b600060208284031215613d7957613d78613ac5565b5b6000613d8784828501613b18565b91505092915050565b600080600060608486031215613da957613da8613ac5565b5b6000613db786828701613b18565b9350506020613dc886828701613b4e565b9250506040613dd986828701613b4e565b9150509250925092565b60008060008060808587031215613dfd57613dfc613ac5565b5b6000613e0b87828801613b4e565b9450506020613e1c87828801613b18565b9350506040613e2d87828801613b4e565b9250506060613e3e87828801613c9a565b91505092959194509250565b600080fd5b600080fd5b600080fd5b60008083601f840112613e6f57613e6e613e4a565b5b8235905067ffffffffffffffff811115613e8c57613e8b613e4f565b5b602083019150836001820283011115613ea857613ea7613e54565b5b9250929050565b600081905082602060020282011115613ecb57613eca613e54565b5b92915050565b60008083601f840112613ee757613ee6613e4a565b5b8235905067ffffffffffffffff811115613f0457613f03613e4f565b5b602083019150836001820283011115613f2057613f1f613e54565b5b9250929050565b6000806000806000806000806000806101408b8d031215613f4b57613f4a613ac5565b5b60008b013567ffffffffffffffff811115613f6957613f68613aca565b5b613f758d828e01613e59565b9a509a50506020613f888d828e01613b4e565b9850506040613f998d828e01613eaf565b9750506080613faa8d828e01613eaf565b96505060c0613fbb8d828e01613b4e565b95505060e0613fcc8d828e01613c9a565b945050610100613fde8d828e01613c9a565b9350506101208b013567ffffffffffffffff81111561400057613fff613aca565b5b61400c8d828e01613ed1565b92509250509295989b9194979a5092959850565b61402981613b2d565b82525050565b600060029050919050565b600081905092915050565b6000819050919050565b600061405b8383614020565b60208301905092915050565b6000602082019050919050565b61407d8161402f565b614087818461403a565b925061409282614045565b8060005b838110156140c35781516140aa878261404f565b96506140b583614067565b925050600181019050614096565b505050505050565b6140d481613ba3565b82525050565b60e0820160008201516140f06000850182614020565b5060208201516141036020850182614074565b5060408201516141166060850182614074565b50606082015161412960a0850182614020565b50608082015161413c60c08501826140cb565b50505050565b600081519050919050565b600082825260208201905092915050565b600061416982614142565b614173818561414d565b9350614183818560208601613a25565b61418c81613a4f565b840191505092915050565b6000610240820190506141ad600083018f613bd9565b81810360208301526141bf818e613a60565b90506141ce604083018d613d39565b6141db606083018c613bd9565b6141e8608083018b613bd9565b6141f560a083018a6140da565b614203610180830189613bd9565b6142116101a0830188613bd9565b61421f6101c0830187613baf565b61422d6101e0830186613baf565b61423b610200830185613baf565b81810361022083015261424e818461415e565b90509d9c50505050505050505050505050565b6000806020838503121561427857614277613ac5565b5b600083013567ffffffffffffffff81111561429657614295613aca565b5b6142a285828601613e59565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6142e381613aef565b82525050565b6040820160008201516142ff6000850182614020565b50602082015161431260208501826142da565b50505050565b600061432483836142e9565b60408301905092915050565b6000602082019050919050565b6000614348826142ae565b61435281856142b9565b935061435d836142ca565b8060005b8381101561438e5781516143758882614318565b975061438083614330565b925050600181019050614361565b5085935050505092915050565b600060208201905081810360008301526143b5818461433d565b905092915050565b600080604083850312156143d4576143d3613ac5565b5b60006143e285828601613b18565b92505060206143f385828601613b18565b9150509250929050565b60008083601f84011261441357614412613e4a565b5b8235905067ffffffffffffffff8111156144305761442f613e4f565b5b60208301915083604082028301111561444c5761444b613e54565b5b9250929050565b60008083601f84011261446957614468613e4a565b5b8235905067ffffffffffffffff81111561448657614485613e4f565b5b6020830191508360208202830111156144a2576144a1613e54565b5b9250929050565b600080600080600080606087890312156144c6576144c5613ac5565b5b600087013567ffffffffffffffff8111156144e4576144e3613aca565b5b6144f089828a016143fd565b9650965050602087013567ffffffffffffffff81111561451357614512613aca565b5b61451f89828a01613e59565b9450945050604087013567ffffffffffffffff81111561454257614541613aca565b5b61454e89828a01614453565b92509250509295509295509295565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61459a82613a4f565b810181811067ffffffffffffffff821117156145b9576145b8614562565b5b80604052505050565b60006145cc613abb565b90506145d88282614591565b919050565b600067ffffffffffffffff8211156145f8576145f7614562565b5b61460182613a4f565b9050602081019050919050565b82818337600083830152505050565b600061463061462b846145dd565b6145c2565b90508281526020810184848401111561464c5761464b61455d565b5b61465784828561460e565b509392505050565b600082601f83011261467457614673613e4a565b5b813561468484826020860161461d565b91505092915050565b6000602082840312156146a3576146a2613ac5565b5b600082013567ffffffffffffffff8111156146c1576146c0613aca565b5b6146cd8482850161465f565b91505092915050565b600060608201905081810360008301526146f08186613a60565b90506146ff6020830185613d39565b61470c6040830184613bd9565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061475b57607f821691505b60208210810361476e5761476d614714565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546147a181614743565b6147ab8186614774565b945060018216600081146147c657600181146147db5761480e565b60ff198316865281151582028601935061480e565b6147e48561477f565b60005b83811015614806578154818901526001820191506020810190506147e7565b838801955050505b50505092915050565b60006148238284614794565b915081905092915050565b7f506f6f6c20697320616c7265616479207265736f6c7665640000000000000000600082015250565b6000614864601883613a14565b915061486f8261482e565b602082019050919050565b6000602082019050818103600083015261489381614857565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148d482613b2d565b91506148df83613b2d565b92508282019050808211156148f7576148f661489a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061493782613b2d565b915061494283613b2d565b925082614952576149516148fd565b5b828204905092915050565b600061496882613b2d565b915061497383613b2d565b925082614983576149826148fd565b5b828206905092915050565b7f506f6f6c20656e642074696d6520686173206e6f74207965742061727269766560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006149ea602183613a14565b91506149f58261498e565b604082019050919050565b60006020820190508181036000830152614a19816149dd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614a5a82613b2d565b9150614a6583613b2d565b9250828202614a7381613b2d565b91508282048414831517614a8a57614a8961489a565b5b5092915050565b6000606082019050614aa66000830186613bd9565b614ab36020830185613baf565b614ac06040830184613baf565b949350505050565b60008190508160005260206000209050919050565b60008154614aea81614743565b614af4818661414d565b94506001821660008114614b0f5760018114614b2557614b58565b60ff198316865281151560200286019350614b58565b614b2e85614ac8565b60005b83811015614b5057815481890152600182019150602081019050614b31565b808801955050505b50505092915050565b600060a082019050614b766000830188613baf565b614b836020830187613baf565b614b906040830186613bd9565b614b9d6060830185613bd9565b8181036080830152614baf8184614add565b90509695505050505050565b600081519050614bca81613b37565b92915050565b600060208284031215614be657614be5613ac5565b5b6000614bf484828501614bbb565b91505092915050565b6000614c0882613b2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c3a57614c3961489a565b5b600182019050919050565b6000614c5082613b2d565b9150614c5b83613b2d565b9250828203905081811115614c7357614c7261489a565b5b92915050565b7f524550207472616e73666572206973206e6f7420616c6c6f7765640000000000600082015250565b6000614caf601b83613a14565b9150614cba82614c79565b602082019050919050565b60006020820190508181036000830152614cde81614ca2565b9050919050565b6000606082019050614cfa6000830186613d39565b614d076020830185613bd9565b614d146040830184613bd9565b949350505050565b7f46656520697320726571756972656420746f20696e6974696174652076616c6960008201527f646174696f6e20706f6f6c000000000000000000000000000000000000000000602082015250565b6000614d78602b83613a14565b9150614d8382614d1c565b604082019050919050565b60006020820190508181036000830152614da781614d6b565b9050919050565b7f4475726174696f6e20697320746f6f2073686f72740000000000000000000000600082015250565b6000614de4601583613a14565b9150614def82614dae565b602082019050919050565b60006020820190508181036000830152614e1381614dd7565b9050919050565b7f4475726174696f6e20697320746f6f206c6f6e67000000000000000000000000600082015250565b6000614e50601483613a14565b9150614e5b82614e1a565b602082019050919050565b60006020820190508181036000830152614e7f81614e43565b9050919050565b7f51756f72756d2069732062656c6f77206d696e696d756d000000000000000000600082015250565b6000614ebc601783613a14565b9150614ec782614e86565b602082019050919050565b60006020820190508181036000830152614eeb81614eaf565b9050919050565b7f51756f72756d2069732067726561746572207468616e206f6e65000000000000600082015250565b6000614f28601a83613a14565b9150614f3382614ef2565b602082019050919050565b60006020820190508181036000830152614f5781614f1b565b9050919050565b7f57696e20726174696f2069732067726561746572207468616e206f6e65000000600082015250565b6000614f94601d83613a14565b9150614f9f82614f5e565b602082019050919050565b60006020820190508181036000830152614fc381614f87565b9050919050565b7f42696e64696e672070657263656e74206d757374206265203c3d203130300000600082015250565b6000615000601e83613a14565b915061500b82614fca565b602082019050919050565b6000602082019050818103600083015261502f81614ff3565b9050919050565b60006150428385614774565b935061504f83858461460e565b82840190509392505050565b6000615068828486615036565b91508190509392505050565b7f54617267657420706f7374206e6f7420666f756e640000000000000000000000600082015250565b60006150aa601583613a14565b91506150b582615074565b602082019050919050565b600060208201905081810360008301526150d98161509d565b9050919050565b600082905092915050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026151387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826150fb565b61514286836150fb565b95508019841693508086168417925050509392505050565b6000819050919050565b600061517f61517a61517584613b2d565b61515a565b613b2d565b9050919050565b6000819050919050565b61519983615164565b6151ad6151a582615186565b848454615108565b825550505050565b600090565b6151c26151b5565b6151cd818484615190565b505050565b5b818110156151f1576151e66000826151ba565b6001810190506151d3565b5050565b601f821115615236576152078161477f565b615210846150eb565b8101602085101561521f578190505b61523361522b856150eb565b8301826151d2565b50505b505050565b600082821c905092915050565b60006152596000198460080261523b565b1980831691505092915050565b60006152728383615248565b9150826002028217905092915050565b61528c83836150e0565b67ffffffffffffffff8111156152a5576152a4614562565b5b6152af8254614743565b6152ba8282856151f5565b6000601f8311600181146152e957600084156152d7578287013590505b6152e18582615266565b865550615349565b601f1984166152f78661477f565b60005b8281101561531f578489013582556001820191506020850194506020810190506152fa565b8683101561533c5784890135615338601f891682615248565b8355505b6001600288020188555050505b50505050505050565b600082905092915050565b601f82111561539e5761536f81614ac8565b615378846150eb565b81016020851015615387578190505b61539b615393856150eb565b8301826151d2565b50505b505050565b6153ad8383615352565b67ffffffffffffffff8111156153c6576153c5614562565b5b6153d08254614743565b6153db82828561535d565b6000601f83116001811461540a57600084156153f8578287013590505b6154028582615266565b86555061546a565b601f19841661541886614ac8565b60005b828110156154405784890135825560018201915060208501945060208101905061541b565b8683101561545d5784890135615459601f891682615248565b8355505b6001600288020188555050505b50505050505050565b7f506f7374206d75737420696e636c756465206174206c65617374206f6e65206160008201527f7574686f72000000000000000000000000000000000000000000000000000000602082015250565b60006154cf602583613a14565b91506154da82615473565b604082019050919050565b600060208201905081810360008301526154fe816154c2565b9050919050565b7f4120706f73742077697468207468697320636f6e74656e74496420616c72656160008201527f6479206578697374730000000000000000000000000000000000000000000000602082015250565b6000615561602983613a14565b915061556c82615505565b604082019050919050565b6000602082019050818103600083015261559081615554565b9050919050565b600081356155a481613b37565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6155e6846155ad565b9350801983169250808416831791505092915050565b61560582615164565b61561861561182615186565b83546155ba565b8255505050565b6000813561562c81613b01565b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff615655846155ad565b9350801983169250808416831791505092915050565b600061568661568161567c84613acf565b61515a565b613acf565b9050919050565b60006156988261566b565b9050919050565b60006156aa8261568d565b9050919050565b6000819050919050565b6156c48261569f565b6156d76156d0826156b1565b8354615635565b8255505050565b6000810160008301806156f081615597565b90506156fc81846155fc565b5050506001810160208301806157118161561f565b905061571d81846156bb565b5050505050565b61572e82826156de565b5050565b7f417574686f722077656967687473206d7573742073756d20746f203130302500600082015250565b6000615768601f83613a14565b915061577382615732565b602082019050919050565b600060208201905081810360008301526157978161575b565b9050919050565b600080fd5b600080fd5b600080fd5b6000823560016040038336030381126157c9576157c861579e565b5b80830191505092915050565b6000819050919050565b6157e8816157d5565b81146157f357600080fd5b50565b60008135615803816157df565b80915050919050565b600061582761582261581d846157d5565b61515a565b6157d5565b9050919050565b6000819050919050565b6158418261580c565b61585461584d8261582e565b83546155ba565b8255505050565b600080833560016020038436030381126158785761587761579e565b5b80840192508235915067ffffffffffffffff82111561589a576158996157a3565b5b6020830192506001820236038313156158b6576158b56157a8565b5b509250929050565b6158c9838383615282565b505050565b6000810160008301806158e0816157f6565b90506158ec8184615838565b5050506001810160208301615901818561585b565b61590c8183866158be565b505050505050565b61591e82826158ce565b5050565b7f45616368206369746174696f6e20776569676874206d757374206265203e3d2060008201527f2d31303000000000000000000000000000000000000000000000000000000000602082015250565b600061597e602483613a14565b915061598982615922565b604082019050919050565b600060208201905081810360008301526159ad81615971565b9050919050565b7f45616368206369746174696f6e20776569676874206d757374206265203c3d2060008201527f3130300000000000000000000000000000000000000000000000000000000000602082015250565b6000615a10602383613a14565b9150615a1b826159b4565b604082019050919050565b60006020820190508181036000830152615a3f81615a03565b9050919050565b6000615a51826157d5565b9150615a5c836157d5565b925082820190508281121560008312168382126000841215161715615a8457615a8361489a565b5b92915050565b7f53756d206f6620706f736974697665206369746174696f6e73206d757374206260008201527f65203c3d20313030000000000000000000000000000000000000000000000000602082015250565b6000615ae6602883613a14565b9150615af182615a8a565b604082019050919050565b60006020820190508181036000830152615b1581615ad9565b9050919050565b7f53756d206f66206e65676174697665206369746174696f6e73206d757374206260008201527f65203e3d202d3130300000000000000000000000000000000000000000000000602082015250565b6000615b78602983613a14565b9150615b8382615b1c565b604082019050919050565b60006020820190508181036000830152615ba781615b6b565b9050919050565b6000615bba8385613a14565b9350615bc783858461460e565b615bd083613a4f565b840190509392505050565b60006020820190508181036000830152615bf6818486615bae565b90509392505050565b7f506f6f6c20656e642074696d6520686173207061737365640000000000000000600082015250565b6000615c35601883613a14565b9150615c4082615bff565b602082019050919050565b60006020820190508181036000830152615c6481615c28565b9050919050565b6000615c7682613a09565b615c808185614774565b9350615c90818560208601613a25565b80840191505092915050565b6000615ca88284615c6b565b915081905092915050565b6000615cbe826157d5565b9150615cc9836157d5565b9250828203905081811260008412168282136000851215161715615cf057615cef61489a565b5b92915050565b6000615d01826157d5565b91507f80000000000000000000000000000000000000000000000000000000000000008203615d3357615d3261489a565b5b816000039050919050565b6000615d49826157d5565b9150615d54836157d5565b9250828202615d62816157d5565b91507f80000000000000000000000000000000000000000000000000000000000000008414600084121615615d9a57615d9961489a565b5b8282058414831517615daf57615dae61489a565b5b5092915050565b6000615dc1826157d5565b9150615dcc836157d5565b925082615ddc57615ddb6148fd565b5b600160000383147f800000000000000000000000000000000000000000000000000000000000000083141615615e1557615e1461489a565b5b828205905092915050565b7f4c65616368696e672066726f6d20696e63696e657261746f7220697320666f7260008201527f62696464656e0000000000000000000000000000000000000000000000000000602082015250565b6000615e7c602683613a14565b9150615e8782615e20565b604082019050919050565b60006020820190508181036000830152615eab81615e6f565b905091905056fea2646970667358221220c308521dc849f12cca79264e32371da691dbeb8c7ce78eb9e19c75a38fa6949964736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/frontend/contractArtifacts/Onboarding.json b/frontend/contractArtifacts/Onboarding.json new file mode 100644 index 0000000..232e9b7 --- /dev/null +++ b/frontend/contractArtifacts/Onboarding.json @@ -0,0 +1,485 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Onboarding", + "sourceName": "contracts/Onboarding.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract DAO", + "name": "dao_", + "type": "address" + }, + { + "internalType": "contract Proposals", + "name": "proposals_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "price_", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "AvailabilityStaked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "priceProposalIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "PriceChangeAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "priceProposalIndex", + "type": "uint256" + } + ], + "name": "PriceChangeProposed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "name": "WorkApprovalSubmitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "WorkAssigned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + } + ], + "name": "WorkEvidenceSubmitted", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "acceptAvailability", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "extendAvailability", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + } + ], + "name": "onProposalAccepted", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "votePasses", + "type": "bool" + }, + { + "internalType": "bool", + "name": "quorumMet", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + } + ], + "name": "onValidate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "price", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "priceProposalCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "priceProposals", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "proposalIndex", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newPrice", + "type": "uint256" + }, + { + "internalType": "string", + "name": "contentId", + "type": "string" + }, + { + "internalType": "uint256[3]", + "name": "durations", + "type": "uint256[3]" + } + ], + "name": "proposeNewPrice", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "requestCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "requestContentId", + "type": "string" + } + ], + "name": "requestWork", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "requests", + "outputs": [ + { + "internalType": "address", + "name": "customer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + }, + { + "internalType": "enum WorkContract.WorkStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "internalType": "string", + "name": "requestContentId", + "type": "string" + }, + { + "internalType": "string", + "name": "evidenceContentId", + "type": "string" + }, + { + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakeCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "stakes", + "outputs": [ + { + "internalType": "address", + "name": "worker", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "assigned", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "name": "submitWorkApproval", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + }, + { + "internalType": "string", + "name": "evidenceContentId", + "type": "string" + }, + { + "components": [ + { + "internalType": "int256", + "name": "weightPercent", + "type": "int256" + }, + { + "internalType": "string", + "name": "targetPostId", + "type": "string" + } + ], + "internalType": "struct Citation[]", + "name": "citations", + "type": "tuple[]" + } + ], + "name": "submitWorkEvidence", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a06040523480156200001157600080fd5b50604051620035a8380380620035a88339818101604052810190620000379190620001c1565b828282828073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505080600181905550816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050506200021d565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000f582620000c8565b9050919050565b60006200010982620000e8565b9050919050565b6200011b81620000fc565b81146200012757600080fd5b50565b6000815190506200013b8162000110565b92915050565b60006200014e82620000e8565b9050919050565b620001608162000141565b81146200016c57600080fd5b50565b600081519050620001808162000155565b92915050565b6000819050919050565b6200019b8162000186565b8114620001a757600080fd5b50565b600081519050620001bb8162000190565b92915050565b600080600060608486031215620001dd57620001dc620000c3565b5b6000620001ed868287016200012a565b935050602062000200868287016200016f565b92505060406200021386828701620001aa565b9150509250925092565b60805161334c6200025c6000396000818161097f01528181610a4f01528181610b6c01528181610d7f01528181610f970152611029015261334c6000f3fe6080604052600436106100e85760003560e01c8063a035b1fe1161008a578063cf37625611610059578063cf376256146102de578063d0fae95f1461031c578063d5a44f8614610345578063d76b679414610385576100e8565b8063a035b1fe14610222578063b4e6a1d51461024d578063b5b20c001461028a578063c4a9e116146102b3576100e8565b8063815a0572116100c6578063815a05721461015d57806381d12c581461019a578063854b6a4f146101dd57806399ad6c5614610206576100e8565b80630d0271d6146100ed578063216ed6ad146101095780635badbe4c14610132575b600080fd5b610107600480360381019061010291906117fb565b6103b0565b005b34801561011557600080fd5b50610130600480360381019061012b91906118dc565b61049e565b005b34801561013e57600080fd5b506101476105b1565b604051610154919061193e565b60405180910390f35b34801561016957600080fd5b50610184600480360381019061017f91906119af565b6105b7565b604051610191919061193e565b60405180910390f35b3480156101a657600080fd5b506101c160048036038101906101bc9190611a23565b610636565b6040516101d49796959493929190611b81565b60405180910390f35b3480156101e957600080fd5b5061020460048036038101906101ff9190611c2a565b6107c2565b005b610220600480360381019061021b9190611c8c565b610c2c565b005b34801561022e57600080fd5b50610237610d75565b604051610244919061193e565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f9190611d00565b610d7b565b604051610281919061193e565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac9190611d9a565b611127565b005b3480156102bf57600080fd5b506102c861129c565b6040516102d5919061193e565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190611a23565b6112a2565b604051610313929190611dda565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190611e59565b6112c6565b005b34801561035157600080fd5b5061036c60048036038101906103679190611a23565b6114ff565b60405161037c9493929190611eee565b60405180910390f35b34801561039157600080fd5b5061039a61155c565b6040516103a7919061193e565b60405180910390f35b6001543410156103f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ec90611f7f565b60405180910390fd5b60006007600081548092919061040a90611fce565b9190505590506000600660008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034816001018190555061047c82611562565b8160030181905550838382600401918261049792919061225c565b5050505050565b600082116104e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d890612378565b60405180910390fd5b6000600560008154809291906104f690611fce565b9190505590506000600460008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838160010181905550824261056b9190612398565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516105a2919061193e565b60405180910390a15050505050565b60075481565b60008083838101906105c99190611a23565b9050600060026000838152602001908152602001600020905080600001546001819055507f6a3843c02c26620842ae8496fd3afcb44b27463b3808e2ccdae4bcee5a2e3f2082600154604051610620929190611dda565b60405180910390a1600092505050949350505050565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff169080600301549080600401805461069e9061207f565b80601f01602080910402602001604051908101604052809291908181526020018280546106ca9061207f565b80156107175780601f106106ec57610100808354040283529160200191610717565b820191906000526020600020905b8154815290600101906020018083116106fa57829003601f168201915b50505050509080600501805461072c9061207f565b80601f01602080910402602001604051908101604052809291908181526020018280546107589061207f565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b5050505050908060070160009054906101000a900460ff16905087565b6000600660008481526020019081526020016000209050600160038111156107ed576107ec611a5f565b5b8160020160009054906101000a900460ff16600381111561081157610810611a5f565b5b14610851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084890612418565b60405180910390fd5b60006004600083600301548152602001908152602001600020905060028260020160006101000a81548160ff0219169083600381111561089457610893611a5f565b5b0217905550828260070160006101000a81548160ff0219169083151502179055506000600167ffffffffffffffff8111156108d2576108d1612021565b5b60405190808252806020026020018201604052801561090b57816020015b6108f861175c565b8152602001906001900390816108f05790505b5090506040518060400160405280606481526020018360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152508160008151811061097257610971612438565b5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e5b4d8278285600501866006016040518463ffffffff1660e01b81526004016109e0939291906127d5565b600060405180830381600087803b1580156109fa57600080fd5b505af1158015610a0e573d6000803e3d6000fd5b505050507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc8585604051610a43929190612821565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fbe7c73600a8660010154610a9a9190612879565b8660010154610aa991906128aa565b8660050160146040518060400160405280600181526020016003815250604051806040016040528060018152602001600281525060646001808f604051602001610af3919061193e565b6040516020818303038152906040526040518a63ffffffff1660e01b8152600401610b25989796959493929190612a0a565b60206040518083038185885af1158015610b43573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610b689190612aad565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663975762b3828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866001015460016040518563ffffffff1660e01b8152600401610bf29493929190612ada565b600060405180830381600087803b158015610c0c57600080fd5b505af1158015610c20573d6000803e3d6000fd5b50505050505050505050565b600060036000815480929190610c4190611fce565b919050559050600060026000838152602001908152602001600020905085816000018190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632805b5d93487873388600189604051602001610cbb919061193e565b6040516020818303038152906040526040518863ffffffff1660e01b8152600401610ceb96959493929190612b74565b60206040518083038185885af1158015610d09573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d2e9190612aad565b81600101819055507f71eae802097e4e77c5345dee7f35d74ac0ae45eb5a456fdaed0de4d141fc5d8c82604051610d65919061193e565b60405180910390a1505050505050565b60015481565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0290612c49565b60405180910390fd5b60008383810190610e1c9190611a23565b90506000600660008381526020019081526020016000209050881580610e40575087155b15610ecb578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a8360010154610e949190612879565b9081150290604051600060405180830381858888f19350505050158015610ebf573d6000803e3d6000fd5b5060019250505061111d565b60606000600167ffffffffffffffff811115610eea57610ee9612021565b5b604051908082528060200260200182016040528015610f2357816020015b610f1061175c565b815260200190600190039081610f085790505b5090506040518060400160405280606481526020018460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525081600081518110610f8a57610f89612438565b5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e5b4d8278285600401856040518463ffffffff1660e01b8152600401610ff593929190612d90565b600060405180830381600087803b15801561100f57600080fd5b505af1158015611023573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fbe7c73600a85600101546110749190612879565b856004016014604051806040016040528060018152602001600381525060405180604001604052806001815260200160028152506064600160006040518963ffffffff1660e01b81526004016110d09796959493929190612e02565b60206040518083038185885af11580156110ee573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111139190612aad565b5060009450505050505b9695505050505050565b60006004600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790612f00565b60405180910390fd5b8060030160009054906101000a900460ff1615611222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121990612f92565b60405180910390fd5b806002015442111561124757814261123a9190612398565b8160020181905550611260565b8181600201546112579190612398565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98360405161128f919061193e565b60405180910390a1505050565b60055481565b60026020528060005260406000206000915090508060000154908060010154905082565b6000600660008781526020019081526020016000209050600060038111156112f1576112f0611a5f565b5b8160020160009054906101000a900460ff16600381111561131557611314611a5f565b5b14611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90612ffe565b60405180910390fd5b6000600460008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613090565b60405180910390fd5b60018260020160006101000a81548160ff0219169083600381111561142a57611429611a5f565b5b0217905550858583600501918261144292919061225c565b5060005b848490508110156114be578260060185858381811061146857611467612438565b5b905060200281019061147a91906130bf565b908060018154018082558091505060019003906000526020600020906002020160009091909190915081816114af919061326b565b50508080600101915050611446565b507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc876040516114ee919061193e565b60405180910390a150505050505050565b60046020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16905084565b60035481565b600061156c6115e1565b9050600060046000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b483836040516115d3929190611dda565b60405180910390a150919050565b60008060005b600554811015611668576004600082815260200190815260200160002060030160009054906101000a900460ff1661165b576004600082815260200190815260200160002060020154421161165b576004600082815260200190815260200160002060010154826116589190612398565b91505b80806001019150506115e7565b50600081116116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a3906132c5565b60405180910390fd5b600081446116ba91906132e5565b9050600080600090505b600554811015611755576004600082815260200190815260200160002060030160009054906101000a900460ff166117485760046000828152602001908152602001600020600201544211611748576004600082815260200190815260200160002060010154826117359190612398565b91508282111561174757809450611755565b5b80806001019150506116c4565b5050505090565b604051806040016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126117bb576117ba611796565b5b8235905067ffffffffffffffff8111156117d8576117d761179b565b5b6020830191508360018202830111156117f4576117f36117a0565b5b9250929050565b600080602083850312156118125761181161178c565b5b600083013567ffffffffffffffff8111156118305761182f611791565b5b61183c858286016117a5565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061187382611848565b9050919050565b61188381611868565b811461188e57600080fd5b50565b6000813590506118a08161187a565b92915050565b6000819050919050565b6118b9816118a6565b81146118c457600080fd5b50565b6000813590506118d6816118b0565b92915050565b6000806000606084860312156118f5576118f461178c565b5b600061190386828701611891565b9350506020611914868287016118c7565b9250506040611925868287016118c7565b9150509250925092565b611938816118a6565b82525050565b6000602082019050611953600083018461192f565b92915050565b60008083601f84011261196f5761196e611796565b5b8235905067ffffffffffffffff81111561198c5761198b61179b565b5b6020830191508360018202830111156119a8576119a76117a0565b5b9250929050565b600080600080606085870312156119c9576119c861178c565b5b60006119d7878288016118c7565b94505060206119e8878288016118c7565b935050604085013567ffffffffffffffff811115611a0957611a08611791565b5b611a1587828801611959565b925092505092959194509250565b600060208284031215611a3957611a3861178c565b5b6000611a47848285016118c7565b91505092915050565b611a5981611868565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110611a9f57611a9e611a5f565b5b50565b6000819050611ab082611a8e565b919050565b6000611ac082611aa2565b9050919050565b611ad081611ab5565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611b10578082015181840152602081019050611af5565b60008484015250505050565b6000601f19601f8301169050919050565b6000611b3882611ad6565b611b428185611ae1565b9350611b52818560208601611af2565b611b5b81611b1c565b840191505092915050565b60008115159050919050565b611b7b81611b66565b82525050565b600060e082019050611b96600083018a611a50565b611ba3602083018961192f565b611bb06040830188611ac7565b611bbd606083018761192f565b8181036080830152611bcf8186611b2d565b905081810360a0830152611be38185611b2d565b9050611bf260c0830184611b72565b98975050505050505050565b611c0781611b66565b8114611c1257600080fd5b50565b600081359050611c2481611bfe565b92915050565b60008060408385031215611c4157611c4061178c565b5b6000611c4f858286016118c7565b9250506020611c6085828601611c15565b9150509250929050565b600081905082602060030282011115611c8657611c856117a0565b5b92915050565b60008060008060a08587031215611ca657611ca561178c565b5b6000611cb4878288016118c7565b945050602085013567ffffffffffffffff811115611cd557611cd4611791565b5b611ce1878288016117a5565b93509350506040611cf487828801611c6a565b91505092959194509250565b60008060008060008060a08789031215611d1d57611d1c61178c565b5b6000611d2b89828a01611c15565b9650506020611d3c89828a01611c15565b9550506040611d4d89828a016118c7565b9450506060611d5e89828a016118c7565b935050608087013567ffffffffffffffff811115611d7f57611d7e611791565b5b611d8b89828a01611959565b92509250509295509295509295565b60008060408385031215611db157611db061178c565b5b6000611dbf858286016118c7565b9250506020611dd0858286016118c7565b9150509250929050565b6000604082019050611def600083018561192f565b611dfc602083018461192f565b9392505050565b60008083601f840112611e1957611e18611796565b5b8235905067ffffffffffffffff811115611e3657611e3561179b565b5b602083019150836020820283011115611e5257611e516117a0565b5b9250929050565b600080600080600060608688031215611e7557611e7461178c565b5b6000611e83888289016118c7565b955050602086013567ffffffffffffffff811115611ea457611ea3611791565b5b611eb0888289016117a5565b9450945050604086013567ffffffffffffffff811115611ed357611ed2611791565b5b611edf88828901611e03565b92509250509295509295909350565b6000608082019050611f036000830187611a50565b611f10602083018661192f565b611f1d604083018561192f565b611f2a6060830184611b72565b95945050505050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000611f69601083611ae1565b9150611f7482611f33565b602082019050919050565b60006020820190508181036000830152611f9881611f5c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611fd9826118a6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361200b5761200a611f9f565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061209757607f821691505b6020821081036120aa576120a9612050565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026121127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826120d5565b61211c86836120d5565b95508019841693508086168417925050509392505050565b6000819050919050565b600061215961215461214f846118a6565b612134565b6118a6565b9050919050565b6000819050919050565b6121738361213e565b61218761217f82612160565b8484546120e2565b825550505050565b600090565b61219c61218f565b6121a781848461216a565b505050565b5b818110156121cb576121c0600082612194565b6001810190506121ad565b5050565b601f821115612210576121e1816120b0565b6121ea846120c5565b810160208510156121f9578190505b61220d612205856120c5565b8301826121ac565b50505b505050565b600082821c905092915050565b600061223360001984600802612215565b1980831691505092915050565b600061224c8383612222565b9150826002028217905092915050565b6122668383612016565b67ffffffffffffffff81111561227f5761227e612021565b5b612289825461207f565b6122948282856121cf565b6000601f8311600181146122c357600084156122b1578287013590505b6122bb8582612240565b865550612323565b601f1984166122d1866120b0565b60005b828110156122f9578489013582556001820191506020850194506020810190506122d4565b868310156123165784890135612312601f891682612222565b8355505b6001600288020188555050505b50505050505050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b6000612362601183611ae1565b915061236d8261232c565b602082019050919050565b6000602082019050818103600083015261239181612355565b9050919050565b60006123a3826118a6565b91506123ae836118a6565b92508282019050808211156123c6576123c5611f9f565b5b92915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b6000612402602083611ae1565b915061240d826123cc565b602082019050919050565b60006020820190508181036000830152612431816123f5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61249c816118a6565b82525050565b6124ab81611868565b82525050565b6040820160008201516124c76000850182612493565b5060208201516124da60208501826124a2565b50505050565b60006124ec83836124b1565b60408301905092915050565b6000602082019050919050565b600061251082612467565b61251a8185612472565b935061252583612483565b8060005b8381101561255657815161253d88826124e0565b9750612548836124f8565b925050600181019050612529565b5085935050505092915050565b600081546125708161207f565b61257a8186611ae1565b9450600182166000811461259557600181146125ab576125de565b60ff1983168652811515602002860193506125de565b6125b4856120b0565b60005b838110156125d6578154818901526001820191506020810190506125b7565b808801955050505b50505092915050565b600081549050919050565b600082825260208201905092915050565b60008190508160005260206000209050919050565b60008160001c9050919050565b6000819050919050565b600061264261263d83612618565b612625565b9050919050565b6000819050919050565b61265c81612649565b82525050565b600082825260208201905092915050565b600081546126808161207f565b61268a8186612662565b945060018216600081146126a557600181146126bb576126ee565b60ff1983168652811515602002860193506126ee565b6126c4856120b0565b60005b838110156126e6578154818901526001820191506020810190506126c7565b808801955050505b50505092915050565b600060408301600080840154905061270e8161262f565b61271b6000870182612653565b506001840185830360208701526127328382612673565b925050819250505092915050565b600061274c83836126f7565b905092915050565b6000600282019050919050565b600061276c826125e7565b61277681856125f2565b93508360208202850161278885612603565b8060005b858110156127c3578484038952816127a48582612740565b94506127af83612754565b925060208a0199505060018101905061278c565b50829750879550505050505092915050565b600060608201905081810360008301526127ef8186612505565b905081810360208301526128038185612563565b905081810360408301526128178184612761565b9050949350505050565b6000604082019050612836600083018561192f565b6128436020830184611b72565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612884826118a6565b915061288f836118a6565b92508261289f5761289e61284a565b5b828204905092915050565b60006128b5826118a6565b91506128c0836118a6565b92508282039050818111156128d8576128d7611f9f565b5b92915050565b600060029050919050565b600081905092915050565b6000819050919050565b600061290a8383612493565b60208301905092915050565b6000602082019050919050565b61292c816128de565b61293681846128e9565b9250612941826128f4565b8060005b8381101561297257815161295987826128fe565b965061296483612916565b925050600181019050612945565b505050505050565b6000819050919050565b600061299f61299a6129958461297a565b612134565b6118a6565b9050919050565b6129af81612984565b82525050565b600081519050919050565b600082825260208201905092915050565b60006129dc826129b5565b6129e681856129c0565b93506129f6818560208601611af2565b6129ff81611b1c565b840191505092915050565b6000610140820190508181036000830152612a25818b612563565b9050612a34602083018a61192f565b612a416040830189612923565b612a4e6080830188612923565b612a5b60c08301876129a6565b612a6860e0830186611b72565b612a76610100830185611b72565b818103610120830152612a8981846129d1565b90509998505050505050505050565b600081519050612aa7816118b0565b92915050565b600060208284031215612ac357612ac261178c565b5b6000612ad184828501612a98565b91505092915050565b6000608082019050612aef600083018761192f565b612afc6020830186611a50565b612b09604083018561192f565b612b166060830184611b72565b95945050505050565b82818337600083830152505050565b6000612b3a8385611ae1565b9350612b47838584612b1f565b612b5083611b1c565b840190509392505050565b82818337505050565b612b7060608383612b5b565b5050565b600060e0820190508181036000830152612b8f81888a612b2e565b9050612b9e6020830187611a50565b612bab6040830186612b64565b612bb860a0830185611b72565b81810360c0830152612bca81846129d1565b9050979650505050505050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b6000612c33603183611ae1565b9150612c3e82612bd7565b604082019050919050565b60006020820190508181036000830152612c6281612c26565b9050919050565b600081519050919050565b6000819050602082019050919050565b6000612c8f82611ad6565b612c998185612662565b9350612ca9818560208601611af2565b612cb281611b1c565b840191505092915050565b6000604083016000830151612cd56000860182612653565b5060208301518482036020860152612ced8282612c84565b9150508091505092915050565b6000612d068383612cbd565b905092915050565b6000602082019050919050565b6000612d2682612c69565b612d3081856125f2565b935083602082028501612d4285612c74565b8060005b85811015612d7e5784840389528151612d5f8582612cfa565b9450612d6a83612d0e565b925060208a01995050600181019050612d46565b50829750879550505050505092915050565b60006060820190508181036000830152612daa8186612505565b90508181036020830152612dbe8185612563565b90508181036040830152612dd28184612d1b565b9050949350505050565b50565b6000612dec6000836129c0565b9150612df782612ddc565b600082019050919050565b6000610140820190508181036000830152612e1d818a612563565b9050612e2c602083018961192f565b612e396040830188612923565b612e466080830187612923565b612e5360c08301866129a6565b612e6060e0830185611b72565b612e6e610100830184611b72565b818103610120830152612e8081612ddf565b905098975050505050505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b6000612eea603383611ae1565b9150612ef582612e8e565b604082019050919050565b60006020820190508181036000830152612f1981612edd565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b6000612f7c602483611ae1565b9150612f8782612f20565b604082019050919050565b60006020820190508181036000830152612fab81612f6f565b9050919050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000612fe8601883611ae1565b9150612ff382612fb2565b602082019050919050565b6000602082019050818103600083015261301781612fdb565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b600061307a603a83611ae1565b91506130858261301e565b604082019050919050565b600060208201905081810360008301526130a98161306d565b9050919050565b600080fd5b600080fd5b600080fd5b6000823560016040038336030381126130db576130da6130b0565b5b80830191505092915050565b6130f081612649565b81146130fb57600080fd5b50565b6000813561310b816130e7565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61314d84613114565b9350801983169250808416831791505092915050565b600061317e61317961317484612649565b612134565b612649565b9050919050565b6000819050919050565b61319882613163565b6131ab6131a482613185565b8354613121565b8255505050565b600080833560016020038436030381126131cf576131ce6130b0565b5b80840192508235915067ffffffffffffffff8211156131f1576131f06130b5565b5b60208301925060018202360383131561320d5761320c6130ba565b5b509250929050565b61322083838361225c565b505050565b600081016000830180613237816130fe565b9050613243818461318f565b505050600181016020830161325881856131b2565b613263818386613215565b505050505050565b6132758282613225565b5050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b60006132af601a83611ae1565b91506132ba82613279565b602082019050919050565b600060208201905081810360008301526132de816132a2565b9050919050565b60006132f0826118a6565b91506132fb836118a6565b92508261330b5761330a61284a565b5b82820690509291505056fea2646970667358221220614a4462497b67381bd0ef26bbd0292370c52a5d343cb9a3ea3eccc11540c1cc64736f6c63430008180033", + "deployedBytecode": "0x6080604052600436106100e85760003560e01c8063a035b1fe1161008a578063cf37625611610059578063cf376256146102de578063d0fae95f1461031c578063d5a44f8614610345578063d76b679414610385576100e8565b8063a035b1fe14610222578063b4e6a1d51461024d578063b5b20c001461028a578063c4a9e116146102b3576100e8565b8063815a0572116100c6578063815a05721461015d57806381d12c581461019a578063854b6a4f146101dd57806399ad6c5614610206576100e8565b80630d0271d6146100ed578063216ed6ad146101095780635badbe4c14610132575b600080fd5b610107600480360381019061010291906117fb565b6103b0565b005b34801561011557600080fd5b50610130600480360381019061012b91906118dc565b61049e565b005b34801561013e57600080fd5b506101476105b1565b604051610154919061193e565b60405180910390f35b34801561016957600080fd5b50610184600480360381019061017f91906119af565b6105b7565b604051610191919061193e565b60405180910390f35b3480156101a657600080fd5b506101c160048036038101906101bc9190611a23565b610636565b6040516101d49796959493929190611b81565b60405180910390f35b3480156101e957600080fd5b5061020460048036038101906101ff9190611c2a565b6107c2565b005b610220600480360381019061021b9190611c8c565b610c2c565b005b34801561022e57600080fd5b50610237610d75565b604051610244919061193e565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f9190611d00565b610d7b565b604051610281919061193e565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac9190611d9a565b611127565b005b3480156102bf57600080fd5b506102c861129c565b6040516102d5919061193e565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190611a23565b6112a2565b604051610313929190611dda565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190611e59565b6112c6565b005b34801561035157600080fd5b5061036c60048036038101906103679190611a23565b6114ff565b60405161037c9493929190611eee565b60405180910390f35b34801561039157600080fd5b5061039a61155c565b6040516103a7919061193e565b60405180910390f35b6001543410156103f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ec90611f7f565b60405180910390fd5b60006007600081548092919061040a90611fce565b9190505590506000600660008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034816001018190555061047c82611562565b8160030181905550838382600401918261049792919061225c565b5050505050565b600082116104e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d890612378565b60405180910390fd5b6000600560008154809291906104f690611fce565b9190505590506000600460008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838160010181905550824261056b9190612398565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516105a2919061193e565b60405180910390a15050505050565b60075481565b60008083838101906105c99190611a23565b9050600060026000838152602001908152602001600020905080600001546001819055507f6a3843c02c26620842ae8496fd3afcb44b27463b3808e2ccdae4bcee5a2e3f2082600154604051610620929190611dda565b60405180910390a1600092505050949350505050565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff169080600301549080600401805461069e9061207f565b80601f01602080910402602001604051908101604052809291908181526020018280546106ca9061207f565b80156107175780601f106106ec57610100808354040283529160200191610717565b820191906000526020600020905b8154815290600101906020018083116106fa57829003601f168201915b50505050509080600501805461072c9061207f565b80601f01602080910402602001604051908101604052809291908181526020018280546107589061207f565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b5050505050908060070160009054906101000a900460ff16905087565b6000600660008481526020019081526020016000209050600160038111156107ed576107ec611a5f565b5b8160020160009054906101000a900460ff16600381111561081157610810611a5f565b5b14610851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084890612418565b60405180910390fd5b60006004600083600301548152602001908152602001600020905060028260020160006101000a81548160ff0219169083600381111561089457610893611a5f565b5b0217905550828260070160006101000a81548160ff0219169083151502179055506000600167ffffffffffffffff8111156108d2576108d1612021565b5b60405190808252806020026020018201604052801561090b57816020015b6108f861175c565b8152602001906001900390816108f05790505b5090506040518060400160405280606481526020018360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152508160008151811061097257610971612438565b5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e5b4d8278285600501866006016040518463ffffffff1660e01b81526004016109e0939291906127d5565b600060405180830381600087803b1580156109fa57600080fd5b505af1158015610a0e573d6000803e3d6000fd5b505050507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc8585604051610a43929190612821565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fbe7c73600a8660010154610a9a9190612879565b8660010154610aa991906128aa565b8660050160146040518060400160405280600181526020016003815250604051806040016040528060018152602001600281525060646001808f604051602001610af3919061193e565b6040516020818303038152906040526040518a63ffffffff1660e01b8152600401610b25989796959493929190612a0a565b60206040518083038185885af1158015610b43573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610b689190612aad565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663975762b3828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866001015460016040518563ffffffff1660e01b8152600401610bf29493929190612ada565b600060405180830381600087803b158015610c0c57600080fd5b505af1158015610c20573d6000803e3d6000fd5b50505050505050505050565b600060036000815480929190610c4190611fce565b919050559050600060026000838152602001908152602001600020905085816000018190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632805b5d93487873388600189604051602001610cbb919061193e565b6040516020818303038152906040526040518863ffffffff1660e01b8152600401610ceb96959493929190612b74565b60206040518083038185885af1158015610d09573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d2e9190612aad565b81600101819055507f71eae802097e4e77c5345dee7f35d74ac0ae45eb5a456fdaed0de4d141fc5d8c82604051610d65919061193e565b60405180910390a1505050505050565b60015481565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0290612c49565b60405180910390fd5b60008383810190610e1c9190611a23565b90506000600660008381526020019081526020016000209050881580610e40575087155b15610ecb578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a8360010154610e949190612879565b9081150290604051600060405180830381858888f19350505050158015610ebf573d6000803e3d6000fd5b5060019250505061111d565b60606000600167ffffffffffffffff811115610eea57610ee9612021565b5b604051908082528060200260200182016040528015610f2357816020015b610f1061175c565b815260200190600190039081610f085790505b5090506040518060400160405280606481526020018460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525081600081518110610f8a57610f89612438565b5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e5b4d8278285600401856040518463ffffffff1660e01b8152600401610ff593929190612d90565b600060405180830381600087803b15801561100f57600080fd5b505af1158015611023573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fbe7c73600a85600101546110749190612879565b856004016014604051806040016040528060018152602001600381525060405180604001604052806001815260200160028152506064600160006040518963ffffffff1660e01b81526004016110d09796959493929190612e02565b60206040518083038185885af11580156110ee573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111139190612aad565b5060009450505050505b9695505050505050565b60006004600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790612f00565b60405180910390fd5b8060030160009054906101000a900460ff1615611222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121990612f92565b60405180910390fd5b806002015442111561124757814261123a9190612398565b8160020181905550611260565b8181600201546112579190612398565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98360405161128f919061193e565b60405180910390a1505050565b60055481565b60026020528060005260406000206000915090508060000154908060010154905082565b6000600660008781526020019081526020016000209050600060038111156112f1576112f0611a5f565b5b8160020160009054906101000a900460ff16600381111561131557611314611a5f565b5b14611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90612ffe565b60405180910390fd5b6000600460008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613090565b60405180910390fd5b60018260020160006101000a81548160ff0219169083600381111561142a57611429611a5f565b5b0217905550858583600501918261144292919061225c565b5060005b848490508110156114be578260060185858381811061146857611467612438565b5b905060200281019061147a91906130bf565b908060018154018082558091505060019003906000526020600020906002020160009091909190915081816114af919061326b565b50508080600101915050611446565b507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc876040516114ee919061193e565b60405180910390a150505050505050565b60046020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16905084565b60035481565b600061156c6115e1565b9050600060046000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b483836040516115d3929190611dda565b60405180910390a150919050565b60008060005b600554811015611668576004600082815260200190815260200160002060030160009054906101000a900460ff1661165b576004600082815260200190815260200160002060020154421161165b576004600082815260200190815260200160002060010154826116589190612398565b91505b80806001019150506115e7565b50600081116116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a3906132c5565b60405180910390fd5b600081446116ba91906132e5565b9050600080600090505b600554811015611755576004600082815260200190815260200160002060030160009054906101000a900460ff166117485760046000828152602001908152602001600020600201544211611748576004600082815260200190815260200160002060010154826117359190612398565b91508282111561174757809450611755565b5b80806001019150506116c4565b5050505090565b604051806040016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126117bb576117ba611796565b5b8235905067ffffffffffffffff8111156117d8576117d761179b565b5b6020830191508360018202830111156117f4576117f36117a0565b5b9250929050565b600080602083850312156118125761181161178c565b5b600083013567ffffffffffffffff8111156118305761182f611791565b5b61183c858286016117a5565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061187382611848565b9050919050565b61188381611868565b811461188e57600080fd5b50565b6000813590506118a08161187a565b92915050565b6000819050919050565b6118b9816118a6565b81146118c457600080fd5b50565b6000813590506118d6816118b0565b92915050565b6000806000606084860312156118f5576118f461178c565b5b600061190386828701611891565b9350506020611914868287016118c7565b9250506040611925868287016118c7565b9150509250925092565b611938816118a6565b82525050565b6000602082019050611953600083018461192f565b92915050565b60008083601f84011261196f5761196e611796565b5b8235905067ffffffffffffffff81111561198c5761198b61179b565b5b6020830191508360018202830111156119a8576119a76117a0565b5b9250929050565b600080600080606085870312156119c9576119c861178c565b5b60006119d7878288016118c7565b94505060206119e8878288016118c7565b935050604085013567ffffffffffffffff811115611a0957611a08611791565b5b611a1587828801611959565b925092505092959194509250565b600060208284031215611a3957611a3861178c565b5b6000611a47848285016118c7565b91505092915050565b611a5981611868565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110611a9f57611a9e611a5f565b5b50565b6000819050611ab082611a8e565b919050565b6000611ac082611aa2565b9050919050565b611ad081611ab5565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611b10578082015181840152602081019050611af5565b60008484015250505050565b6000601f19601f8301169050919050565b6000611b3882611ad6565b611b428185611ae1565b9350611b52818560208601611af2565b611b5b81611b1c565b840191505092915050565b60008115159050919050565b611b7b81611b66565b82525050565b600060e082019050611b96600083018a611a50565b611ba3602083018961192f565b611bb06040830188611ac7565b611bbd606083018761192f565b8181036080830152611bcf8186611b2d565b905081810360a0830152611be38185611b2d565b9050611bf260c0830184611b72565b98975050505050505050565b611c0781611b66565b8114611c1257600080fd5b50565b600081359050611c2481611bfe565b92915050565b60008060408385031215611c4157611c4061178c565b5b6000611c4f858286016118c7565b9250506020611c6085828601611c15565b9150509250929050565b600081905082602060030282011115611c8657611c856117a0565b5b92915050565b60008060008060a08587031215611ca657611ca561178c565b5b6000611cb4878288016118c7565b945050602085013567ffffffffffffffff811115611cd557611cd4611791565b5b611ce1878288016117a5565b93509350506040611cf487828801611c6a565b91505092959194509250565b60008060008060008060a08789031215611d1d57611d1c61178c565b5b6000611d2b89828a01611c15565b9650506020611d3c89828a01611c15565b9550506040611d4d89828a016118c7565b9450506060611d5e89828a016118c7565b935050608087013567ffffffffffffffff811115611d7f57611d7e611791565b5b611d8b89828a01611959565b92509250509295509295509295565b60008060408385031215611db157611db061178c565b5b6000611dbf858286016118c7565b9250506020611dd0858286016118c7565b9150509250929050565b6000604082019050611def600083018561192f565b611dfc602083018461192f565b9392505050565b60008083601f840112611e1957611e18611796565b5b8235905067ffffffffffffffff811115611e3657611e3561179b565b5b602083019150836020820283011115611e5257611e516117a0565b5b9250929050565b600080600080600060608688031215611e7557611e7461178c565b5b6000611e83888289016118c7565b955050602086013567ffffffffffffffff811115611ea457611ea3611791565b5b611eb0888289016117a5565b9450945050604086013567ffffffffffffffff811115611ed357611ed2611791565b5b611edf88828901611e03565b92509250509295509295909350565b6000608082019050611f036000830187611a50565b611f10602083018661192f565b611f1d604083018561192f565b611f2a6060830184611b72565b95945050505050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000611f69601083611ae1565b9150611f7482611f33565b602082019050919050565b60006020820190508181036000830152611f9881611f5c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611fd9826118a6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361200b5761200a611f9f565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061209757607f821691505b6020821081036120aa576120a9612050565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026121127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826120d5565b61211c86836120d5565b95508019841693508086168417925050509392505050565b6000819050919050565b600061215961215461214f846118a6565b612134565b6118a6565b9050919050565b6000819050919050565b6121738361213e565b61218761217f82612160565b8484546120e2565b825550505050565b600090565b61219c61218f565b6121a781848461216a565b505050565b5b818110156121cb576121c0600082612194565b6001810190506121ad565b5050565b601f821115612210576121e1816120b0565b6121ea846120c5565b810160208510156121f9578190505b61220d612205856120c5565b8301826121ac565b50505b505050565b600082821c905092915050565b600061223360001984600802612215565b1980831691505092915050565b600061224c8383612222565b9150826002028217905092915050565b6122668383612016565b67ffffffffffffffff81111561227f5761227e612021565b5b612289825461207f565b6122948282856121cf565b6000601f8311600181146122c357600084156122b1578287013590505b6122bb8582612240565b865550612323565b601f1984166122d1866120b0565b60005b828110156122f9578489013582556001820191506020850194506020810190506122d4565b868310156123165784890135612312601f891682612222565b8355505b6001600288020188555050505b50505050505050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b6000612362601183611ae1565b915061236d8261232c565b602082019050919050565b6000602082019050818103600083015261239181612355565b9050919050565b60006123a3826118a6565b91506123ae836118a6565b92508282019050808211156123c6576123c5611f9f565b5b92915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b6000612402602083611ae1565b915061240d826123cc565b602082019050919050565b60006020820190508181036000830152612431816123f5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61249c816118a6565b82525050565b6124ab81611868565b82525050565b6040820160008201516124c76000850182612493565b5060208201516124da60208501826124a2565b50505050565b60006124ec83836124b1565b60408301905092915050565b6000602082019050919050565b600061251082612467565b61251a8185612472565b935061252583612483565b8060005b8381101561255657815161253d88826124e0565b9750612548836124f8565b925050600181019050612529565b5085935050505092915050565b600081546125708161207f565b61257a8186611ae1565b9450600182166000811461259557600181146125ab576125de565b60ff1983168652811515602002860193506125de565b6125b4856120b0565b60005b838110156125d6578154818901526001820191506020810190506125b7565b808801955050505b50505092915050565b600081549050919050565b600082825260208201905092915050565b60008190508160005260206000209050919050565b60008160001c9050919050565b6000819050919050565b600061264261263d83612618565b612625565b9050919050565b6000819050919050565b61265c81612649565b82525050565b600082825260208201905092915050565b600081546126808161207f565b61268a8186612662565b945060018216600081146126a557600181146126bb576126ee565b60ff1983168652811515602002860193506126ee565b6126c4856120b0565b60005b838110156126e6578154818901526001820191506020810190506126c7565b808801955050505b50505092915050565b600060408301600080840154905061270e8161262f565b61271b6000870182612653565b506001840185830360208701526127328382612673565b925050819250505092915050565b600061274c83836126f7565b905092915050565b6000600282019050919050565b600061276c826125e7565b61277681856125f2565b93508360208202850161278885612603565b8060005b858110156127c3578484038952816127a48582612740565b94506127af83612754565b925060208a0199505060018101905061278c565b50829750879550505050505092915050565b600060608201905081810360008301526127ef8186612505565b905081810360208301526128038185612563565b905081810360408301526128178184612761565b9050949350505050565b6000604082019050612836600083018561192f565b6128436020830184611b72565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612884826118a6565b915061288f836118a6565b92508261289f5761289e61284a565b5b828204905092915050565b60006128b5826118a6565b91506128c0836118a6565b92508282039050818111156128d8576128d7611f9f565b5b92915050565b600060029050919050565b600081905092915050565b6000819050919050565b600061290a8383612493565b60208301905092915050565b6000602082019050919050565b61292c816128de565b61293681846128e9565b9250612941826128f4565b8060005b8381101561297257815161295987826128fe565b965061296483612916565b925050600181019050612945565b505050505050565b6000819050919050565b600061299f61299a6129958461297a565b612134565b6118a6565b9050919050565b6129af81612984565b82525050565b600081519050919050565b600082825260208201905092915050565b60006129dc826129b5565b6129e681856129c0565b93506129f6818560208601611af2565b6129ff81611b1c565b840191505092915050565b6000610140820190508181036000830152612a25818b612563565b9050612a34602083018a61192f565b612a416040830189612923565b612a4e6080830188612923565b612a5b60c08301876129a6565b612a6860e0830186611b72565b612a76610100830185611b72565b818103610120830152612a8981846129d1565b90509998505050505050505050565b600081519050612aa7816118b0565b92915050565b600060208284031215612ac357612ac261178c565b5b6000612ad184828501612a98565b91505092915050565b6000608082019050612aef600083018761192f565b612afc6020830186611a50565b612b09604083018561192f565b612b166060830184611b72565b95945050505050565b82818337600083830152505050565b6000612b3a8385611ae1565b9350612b47838584612b1f565b612b5083611b1c565b840190509392505050565b82818337505050565b612b7060608383612b5b565b5050565b600060e0820190508181036000830152612b8f81888a612b2e565b9050612b9e6020830187611a50565b612bab6040830186612b64565b612bb860a0830185611b72565b81810360c0830152612bca81846129d1565b9050979650505050505050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b6000612c33603183611ae1565b9150612c3e82612bd7565b604082019050919050565b60006020820190508181036000830152612c6281612c26565b9050919050565b600081519050919050565b6000819050602082019050919050565b6000612c8f82611ad6565b612c998185612662565b9350612ca9818560208601611af2565b612cb281611b1c565b840191505092915050565b6000604083016000830151612cd56000860182612653565b5060208301518482036020860152612ced8282612c84565b9150508091505092915050565b6000612d068383612cbd565b905092915050565b6000602082019050919050565b6000612d2682612c69565b612d3081856125f2565b935083602082028501612d4285612c74565b8060005b85811015612d7e5784840389528151612d5f8582612cfa565b9450612d6a83612d0e565b925060208a01995050600181019050612d46565b50829750879550505050505092915050565b60006060820190508181036000830152612daa8186612505565b90508181036020830152612dbe8185612563565b90508181036040830152612dd28184612d1b565b9050949350505050565b50565b6000612dec6000836129c0565b9150612df782612ddc565b600082019050919050565b6000610140820190508181036000830152612e1d818a612563565b9050612e2c602083018961192f565b612e396040830188612923565b612e466080830187612923565b612e5360c08301866129a6565b612e6060e0830185611b72565b612e6e610100830184611b72565b818103610120830152612e8081612ddf565b905098975050505050505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b6000612eea603383611ae1565b9150612ef582612e8e565b604082019050919050565b60006020820190508181036000830152612f1981612edd565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b6000612f7c602483611ae1565b9150612f8782612f20565b604082019050919050565b60006020820190508181036000830152612fab81612f6f565b9050919050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000612fe8601883611ae1565b9150612ff382612fb2565b602082019050919050565b6000602082019050818103600083015261301781612fdb565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b600061307a603a83611ae1565b91506130858261301e565b604082019050919050565b600060208201905081810360008301526130a98161306d565b9050919050565b600080fd5b600080fd5b600080fd5b6000823560016040038336030381126130db576130da6130b0565b5b80830191505092915050565b6130f081612649565b81146130fb57600080fd5b50565b6000813561310b816130e7565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61314d84613114565b9350801983169250808416831791505092915050565b600061317e61317961317484612649565b612134565b612649565b9050919050565b6000819050919050565b61319882613163565b6131ab6131a482613185565b8354613121565b8255505050565b600080833560016020038436030381126131cf576131ce6130b0565b5b80840192508235915067ffffffffffffffff8211156131f1576131f06130b5565b5b60208301925060018202360383131561320d5761320c6130ba565b5b509250929050565b61322083838361225c565b505050565b600081016000830180613237816130fe565b9050613243818461318f565b505050600181016020830161325881856131b2565b613263818386613215565b505050505050565b6132758282613225565b5050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b60006132af601a83611ae1565b91506132ba82613279565b602082019050919050565b600060208201905081810360008301526132de816132a2565b9050919050565b60006132f0826118a6565b91506132fb836118a6565b92508261330b5761330a61284a565b5b82820690509291505056fea2646970667358221220614a4462497b67381bd0ef26bbd0292370c52a5d343cb9a3ea3eccc11540c1cc64736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/frontend/contractArtifacts/Proposals.json b/frontend/contractArtifacts/Proposals.json new file mode 100644 index 0000000..d7a2870 --- /dev/null +++ b/frontend/contractArtifacts/Proposals.json @@ -0,0 +1,355 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Proposals", + "sourceName": "contracts/Proposals.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract DAO", + "name": "dao", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalIndex", + "type": "uint256" + } + ], + "name": "Attestation", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalIndex", + "type": "uint256" + } + ], + "name": "NewProposal", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalIndex", + "type": "uint256" + } + ], + "name": "ProposalAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "ProposalFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "poolIndex", + "type": "uint256" + } + ], + "name": "ReferendumStarted", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "attest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalIndex", + "type": "uint256" + } + ], + "name": "evaluateAttestation", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalIndex", + "type": "uint256" + } + ], + "name": "getPools", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "poolIndex", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "started", + "type": "bool" + }, + { + "internalType": "bool", + "name": "completed", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "stakedFor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakedAgainst", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "votePasses", + "type": "bool" + }, + { + "internalType": "bool", + "name": "quorumMet", + "type": "bool" + } + ], + "internalType": "struct Proposals.Pool[3][3]", + "name": "pools", + "type": "tuple[3][3]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "votePasses", + "type": "bool" + }, + { + "internalType": "bool", + "name": "quorumMet", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "stakedFor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakedAgainst", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + } + ], + "name": "onValidate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "proposalCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "proposals", + "outputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingFee", + "type": "uint256" + }, + { + "internalType": "string", + "name": "postId", + "type": "string" + }, + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "internalType": "enum Proposals.Stage", + "name": "stage", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "attestationTotal", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "callbackOnAccepted", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "contentId", + "type": "string" + }, + { + "internalType": "address", + "name": "author", + "type": "address" + }, + { + "internalType": "uint256[3]", + "name": "durations", + "type": "uint256[3]" + }, + { + "internalType": "bool", + "name": "callbackOnAccepted", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + } + ], + "name": "propose", + "outputs": [ + { + "internalType": "uint256", + "name": "proposalIndex", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalIndex", + "type": "uint256" + } + ], + "name": "reclaimRemainingFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a06040526040518060600160405280600060ff168152602001600160ff168152602001606460ff1681525060029060036200003d929190620001ef565b5060405180606001604052806000151515158152602001600015151515815260200160011515151581525060059060036200007a92919062000239565b5060405180606001604052806040518060400160405280600160ff168152602001600a60ff1681525081526020016040518060400160405280600160ff168152602001600a60ff1681525081526020016040518060400160405280600160ff168152602001600a60ff168152508152506006906003620000fc929190620002d9565b5060405180606001604052806040518060400160405280600260ff168152602001600360ff1681525081526020016040518060400160405280600260ff168152602001600360ff1681525081526020016040518060400160405280600260ff168152602001600360ff16815250815250600c9060036200017e929190620002d9565b503480156200018c57600080fd5b50604051620039cf380380620039cf8339818101604052810190620001b291906200044e565b808073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050505062000480565b826003810192821562000226579160200282015b8281111562000225578251829060ff1690559160200191906001019062000203565b5b50905062000235919062000331565b5090565b826003601f01602090048101928215620002c65791602002820160005b838211156200029557835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030262000256565b8015620002c45782816101000a81549060ff021916905560010160208160000104928301926001030262000295565b505b509050620002d5919062000331565b5090565b82600360020281019282156200031e579160200282015b828111156200031d578251829060026200030c92919062000350565b5091602001919060020190620002f0565b5b5090506200032d91906200039a565b5090565b5b808211156200034c57600081600090555060010162000332565b5090565b826002810192821562000387579160200282015b8281111562000386578251829060ff1690559160200191906001019062000364565b5b50905062000396919062000331565b5090565b5b80821115620003be5760008181620003b49190620003c2565b506002016200039b565b5090565b506000815560010160009055565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200040282620003d5565b9050919050565b60006200041682620003f5565b9050919050565b620004288162000409565b81146200043457600080fd5b50565b60008151905062000448816200041d565b92915050565b600060208284031215620004675762000466620003d0565b5b6000620004778482850162000437565b91505092915050565b608051613510620004bf6000396000818161046b01528181610a0101528181610bed01528181610de701528181611683015261185101526135106000f3fe60806040526004361061007b5760003560e01c8063b4e6a1d51161004e578063b4e6a1d51461015b578063c019faab14610198578063da35c664146101c1578063ea923e63146101ec5761007b565b8063013cf08b146100805780632805b5d9146100c557806362d26ed7146100f5578063a3bb24cc14610132575b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a29190611b63565b610229565b6040516100bc99989796959493929190611d57565b60405180910390f35b6100df60048036038101906100da9190611f27565b6103c1565b6040516100ec9190611fe3565b60405180910390f35b34801561010157600080fd5b5061011c60048036038101906101179190611b63565b6106c5565b60405161012991906121e3565b60405180910390f35b34801561013e57600080fd5b50610159600480360381019061015491906121ff565b6109fe565b005b34801561016757600080fd5b50610182600480360381019061017d919061223f565b610be9565b60405161018f9190611fe3565b60405180910390f35b3480156101a457600080fd5b506101bf60048036038101906101ba9190611b63565b6114be565b005b3480156101cd57600080fd5b506101d66115ea565b6040516101e39190611fe3565b60405180910390f35b3480156101f857600080fd5b50610213600480360381019061020e9190611b63565b6115f0565b60405161022091906122d9565b60405180910390f35b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301805461027e90612323565b80601f01602080910402602001604051908101604052809291908181526020018280546102aa90612323565b80156102f75780601f106102cc576101008083540402835291602001916102f7565b820191906000526020600020905b8154815290600101906020018083116102da57829003601f168201915b5050505050908060040154908060050160009054906101000a900460ff169080600701549080603b0160009054906101000a900460ff169080603c01805461033e90612323565b80601f016020809104026020016040519081016040528092919081815260200182805461036a90612323565b80156103b75780601f1061038c576101008083540402835291602001916103b7565b820191906000526020600020905b81548152906001019060200180831161039a57829003601f168201915b5050505050905089565b600060606000600167ffffffffffffffff8111156103e2576103e1612354565b5b60405190808252806020026020018201604052801561041b57816020015b610408611a54565b8152602001906001900390816104005790505b5090506040518060400160405280606481526020018973ffffffffffffffffffffffffffffffffffffffff168152508160008151811061045e5761045d612383565b5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e5b4d827828c8c866040518563ffffffff1660e01b81526004016104c8949392919061263d565b600060405180830381600087803b1580156104e257600080fd5b505af11580156104f6573d6000803e3d6000fd5b505050506001600081548092919061050d906126ba565b91905055925060008060008581526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a8a82600301918261057f9291906128b9565b504281600401819055508760006003811061059d5761059c612383565b5b6020020135816008016000600381106105b9576105b8612383565b5b6011020160000181905550876001600381106105d8576105d7612383565b5b6020020135816008016001600381106105f4576105f3612383565b5b60110201600001819055508760026003811061061357610612612383565b5b60200201358160080160026003811061062f5761062e612383565b5b6011020160000181905550348160010181905550806001015481600201819055508681603b0160006101000a81548160ff021916908315150217905550858582603c01918261067f9291906129ef565b507f9a863892f20a6b9c6cec64d611b5864be6373191ce2cacc3b05a299bce3bf80e846040516106af9190611fe3565b60405180910390a1505050979650505050505050565b6106cd611a84565b60008060008481526020019081526020016000209050806008016000600381106106fa576106f9612383565b5b60110201600101600380602002604051908101604052809291906000905b828210156107ca578382600502016040518060e0016040529081600082015481526020016001820160009054906101000a900460ff161515151581526020016001820160019054906101000a900460ff1615151515815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581526020016004820160019054906101000a900460ff16151515158152505081526020019060010190610718565b50505050826000600381106107e2576107e1612383565b5b60200201819052508060080160016003811061080157610800612383565b5b60110201600101600380602002604051908101604052809291906000905b828210156108d1578382600502016040518060e0016040529081600082015481526020016001820160009054906101000a900460ff161515151581526020016001820160019054906101000a900460ff1615151515815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581526020016004820160019054906101000a900460ff1615151515815250508152602001906001019061081f565b50505050826001600381106108e9576108e8612383565b5b60200201819052508060080160026003811061090857610907612383565b5b60110201600101600380602002604051908101604052809291906000905b828210156109d8578382600502016040518060e0016040529081600082015481526020016001820160009054906101000a900460ff161515151581526020016001820160019054906101000a900460ff1615151515815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581526020016004820160019054906101000a900460ff16151515158152505081526020019060010190610926565b50505050826002600381106109f0576109ef612383565b5b602002018190525050919050565b807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610a589190612abf565b602060405180830381865afa158015610a75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a999190612aef565b1015610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190612b8e565b60405180910390fd5b600080600084815260200190815260200160002090508060060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054816007016000828254610b459190612bae565b92505081905550818160060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081816007016000828254610ba69190612be2565b925050819055507fc23775ba00d23f337b9f790bd67eb5194aa9b95876933f9ccd1887becbb55ccb83604051610bdc9190611fe3565b60405180910390a1505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7090612c88565b60405180910390fd5b60008060008585810190610c8d9190612ca8565b925092509250600080600085815260200190815260200160002090506000816008018460038110610cc157610cc0612383565b5b601102019050600081600101826010015460038110610ce357610ce2612383565b5b60050201905060018160010160016101000a81548160ff0219169083151502179055508a81600201819055508981600301819055508b8160040160016101000a81548160ff0219169083151502179055508c8160040160006101000a81548160ff0219169083151502179055508b610de35760048360050160006101000a81548160ff02191690836005811115610d7d57610d7c611c70565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb86604051610db19190612d47565b60405180910390a183836002016000828254610dcd9190612be2565b92505081905550600196505050505050506114b4565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e749190612aef565b8b8d610e809190612be2565b6002610e8c9190612d75565b1015905060016005811115610ea457610ea3611c70565b5b8460050160009054906101000a900460ff166005811115610ec857610ec7611c70565b5b03610fe95760008614610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0790612e03565b60405180910390fd5b8d8015610f1a5750805b15610f515760028460050160006101000a81548160ff02191690836005811115610f4757610f46611c70565b5b0217905550610fe4565b6002836010015410610fc65760048460050160006101000a81548160ff02191690836005811115610f8557610f84611c70565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb87604051610fb99190612e6f565b60405180910390a1610fe3565b6001836010016000828254610fdb9190612be2565b925050819055505b5b611390565b60026005811115610ffd57610ffc611c70565b5b8460050160009054906101000a900460ff16600581111561102157611020611c70565b5b036111425760018614611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090612ee9565b60405180910390fd5b8d80156110735750805b156110aa5760038460050160006101000a81548160ff021916908360058111156110a05761109f611c70565b5b021790555061113d565b600283601001541061111f5760048460050160006101000a81548160ff021916908360058111156110de576110dd611c70565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb876040516111129190612e6f565b60405180910390a161113c565b60018360100160008282546111349190612be2565b925050819055505b5b61138f565b6003600581111561115657611155611c70565b5b8460050160009054906101000a900460ff16600581111561117a57611179611c70565b5b0361138e57600286146111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990612f55565b60405180910390fd5b8d80156111cc5750805b156112fa5760058460050160006101000a81548160ff021916908360058111156111f9576111f8611c70565b5b02179055507fd24c2047577899547bacebb29e319fc7d73f6712b5adb401d45556f34bb2aa3b8760405161122d9190611fe3565b60405180910390a183603b0160009054906101000a900460ff16156112f5578360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663815a05728d8d87603c016040518463ffffffff1660e01b81526004016112b093929190612ff9565b6020604051808303816000875af11580156112cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f39190612aef565b505b61138d565b600283601001541061136f5760048460050160006101000a81548160ff0219169083600581111561132e5761132d611c70565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb876040516113629190612e6f565b60405180910390a161138c565b60018360100160008282546113849190612be2565b925050819055505b5b5b5b5b600160058111156113a4576113a3611c70565b5b8460050160009054906101000a900460ff1660058111156113c8576113c7611c70565b5b036113ee576113e9876000600a87600101546113e49190613066565b61181c565b6114a8565b6002600581111561140257611401611c70565b5b8460050160009054906101000a900460ff16600581111561142657611425611c70565b5b0361144c57611447876001600a87600101546114429190613066565b61181c565b6114a7565b600360058111156114605761145f611c70565b5b8460050160009054906101000a900460ff16600581111561148457611483611c70565b5b036114a6576114a5876002600a87600101546114a09190613066565b61181c565b5b5b5b60009750505050505050505b9695505050505050565b60008060008381526020019081526020016000209050600460058111156114e8576114e7611c70565b5b8160050160009054906101000a900460ff16600581111561150c5761150b611c70565b5b148061154c575060058081111561152657611525611c70565b5b8160050160009054906101000a900460ff16600581111561154a57611549611c70565b5b145b61158b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115829061312f565b60405180910390fd5b600081600201549050600082600201819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115e4573d6000803e3d6000fd5b50505050565b60015481565b60008060008084815260200190815260200160002090506000600581111561161b5761161a611c70565b5b8160050160009054906101000a900460ff16600581111561163f5761163e611c70565b5b1461167f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611676906131c1565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117109190612aef565b8260070154600a6117219190612d75565b1015905060006301e13380836004015461173b9190612be2565b42119050816117c65780156117ba5760048360050160006101000a81548160ff0219169083600581111561177257611771611c70565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb856040516117a69190613253565b60405180910390a160009350505050611817565b60009350505050611817565b60018360050160006101000a81548160ff021916908360058111156117ee576117ed611c70565b5b021790555061180f856000600a866001015461180a9190613066565b61181c565b600193505050505b919050565b60008060008581526020019081526020016000209050818160020160008282546118469190612bae565b9250508190555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fbe7c7384846003018560080188600381106118a6576118a5612383565b5b6011020160000154600689600381106118c2576118c1612383565b5b60020201600c8a600381106118da576118d9612383565b5b6002020160028b600381106118f2576118f1612383565b5b015460058c6003811061190857611907612383565b5b602091828204019190069054906101000a900460ff1660018e8e8e60405160200161193593929190613281565b6040516020818303038152906040526040518a63ffffffff1660e01b8152600401611967989796959493929190613423565b60206040518083038185885af1158015611985573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906119aa9190612aef565b905060008260080185600381106119c4576119c3612383565b5b6011020190506000816001018260100154600381106119e6576119e5612383565b5b60050201905082816000018190555060018160010160006101000a81548160ff0219169083151502179055507f4c14e16a98683e5b8bd70d51192048d0499fb3999b27ff1e9dce7e4a2c6734798784604051611a439291906134b1565b60405180910390a150505050505050565b604051806040016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b60405180606001604052806003905b611a9b611ab1565b815260200190600190039081611a935790505090565b60405180606001604052806003905b611ac8611ade565b815260200190600190039081611ac05790505090565b6040518060e001604052806000815260200160001515815260200160001515815260200160008152602001600081526020016000151581526020016000151581525090565b600080fd5b600080fd5b6000819050919050565b611b4081611b2d565b8114611b4b57600080fd5b50565b600081359050611b5d81611b37565b92915050565b600060208284031215611b7957611b78611b23565b5b6000611b8784828501611b4e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611bbb82611b90565b9050919050565b611bcb81611bb0565b82525050565b611bda81611b2d565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c1a578082015181840152602081019050611bff565b60008484015250505050565b6000601f19601f8301169050919050565b6000611c4282611be0565b611c4c8185611beb565b9350611c5c818560208601611bfc565b611c6581611c26565b840191505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60068110611cb057611caf611c70565b5b50565b6000819050611cc182611c9f565b919050565b6000611cd182611cb3565b9050919050565b611ce181611cc6565b82525050565b60008115159050919050565b611cfc81611ce7565b82525050565b600081519050919050565b600082825260208201905092915050565b6000611d2982611d02565b611d338185611d0d565b9350611d43818560208601611bfc565b611d4c81611c26565b840191505092915050565b600061012082019050611d6d600083018c611bc2565b611d7a602083018b611bd1565b611d87604083018a611bd1565b8181036060830152611d998189611c37565b9050611da86080830188611bd1565b611db560a0830187611cd8565b611dc260c0830186611bd1565b611dcf60e0830185611cf3565b818103610100830152611de28184611d1e565b90509a9950505050505050505050565b600080fd5b600080fd5b600080fd5b60008083601f840112611e1757611e16611df2565b5b8235905067ffffffffffffffff811115611e3457611e33611df7565b5b602083019150836001820283011115611e5057611e4f611dfc565b5b9250929050565b611e6081611bb0565b8114611e6b57600080fd5b50565b600081359050611e7d81611e57565b92915050565b600081905082602060030282011115611e9f57611e9e611dfc565b5b92915050565b611eae81611ce7565b8114611eb957600080fd5b50565b600081359050611ecb81611ea5565b92915050565b60008083601f840112611ee757611ee6611df2565b5b8235905067ffffffffffffffff811115611f0457611f03611df7565b5b602083019150836001820283011115611f2057611f1f611dfc565b5b9250929050565b600080600080600080600060e0888a031215611f4657611f45611b23565b5b600088013567ffffffffffffffff811115611f6457611f63611b28565b5b611f708a828b01611e01565b97509750506020611f838a828b01611e6e565b9550506040611f948a828b01611e83565b94505060a0611fa58a828b01611ebc565b93505060c088013567ffffffffffffffff811115611fc657611fc5611b28565b5b611fd28a828b01611ed1565b925092505092959891949750929550565b6000602082019050611ff86000830184611bd1565b92915050565b600060039050919050565b600081905092915050565b6000819050919050565b600060039050919050565b600081905092915050565b6000819050919050565b61204781611b2d565b82525050565b61205681611ce7565b82525050565b60e082016000820151612072600085018261203e565b506020820151612085602085018261204d565b506040820151612098604085018261204d565b5060608201516120ab606085018261203e565b5060808201516120be608085018261203e565b5060a08201516120d160a085018261204d565b5060c08201516120e460c085018261204d565b50505050565b60006120f6838361205c565b60e08301905092915050565b6000602082019050919050565b6121188161201e565b6121228184612029565b925061212d82612034565b8060005b8381101561215e57815161214587826120ea565b965061215083612102565b925050600181019050612131565b505050505050565b6000612172838361210f565b6102a08301905092915050565b6000602082019050919050565b61219581611ffe565b61219f8184612009565b92506121aa82612014565b8060005b838110156121db5781516121c28782612166565b96506121cd8361217f565b9250506001810190506121ae565b505050505050565b60006107e0820190506121f9600083018461218c565b92915050565b6000806040838503121561221657612215611b23565b5b600061222485828601611b4e565b925050602061223585828601611b4e565b9150509250929050565b60008060008060008060a0878903121561225c5761225b611b23565b5b600061226a89828a01611ebc565b965050602061227b89828a01611ebc565b955050604061228c89828a01611b4e565b945050606061229d89828a01611b4e565b935050608087013567ffffffffffffffff8111156122be576122bd611b28565b5b6122ca89828a01611ed1565b92509250509295509295509295565b60006020820190506122ee6000830184611cf3565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061233b57607f821691505b60208210810361234e5761234d6122f4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6123e781611bb0565b82525050565b604082016000820151612403600085018261203e565b50602082015161241660208501826123de565b50505050565b600061242883836123ed565b60408301905092915050565b6000602082019050919050565b600061244c826123b2565b61245681856123bd565b9350612461836123ce565b8060005b83811015612492578151612479888261241c565b975061248483612434565b925050600181019050612465565b5085935050505092915050565b82818337600083830152505050565b60006124ba8385611beb565b93506124c783858461249f565b6124d083611c26565b840190509392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61251a81612507565b82525050565b600082825260208201905092915050565b600061253c82611be0565b6125468185612520565b9350612556818560208601611bfc565b61255f81611c26565b840191505092915050565b60006040830160008301516125826000860182612511565b506020830151848203602086015261259a8282612531565b9150508091505092915050565b60006125b3838361256a565b905092915050565b6000602082019050919050565b60006125d3826124db565b6125dd81856124e6565b9350836020820285016125ef856124f7565b8060005b8581101561262b578484038952815161260c85826125a7565b9450612617836125bb565b925060208a019950506001810190506125f3565b50829750879550505050505092915050565b600060608201905081810360008301526126578187612441565b9050818103602083015261266c8185876124ae565b9050818103604083015261268081846125c8565b905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126c582611b2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126f7576126f661268b565b5b600182019050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261276f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612732565b6127798683612732565b95508019841693508086168417925050509392505050565b6000819050919050565b60006127b66127b16127ac84611b2d565b612791565b611b2d565b9050919050565b6000819050919050565b6127d08361279b565b6127e46127dc826127bd565b84845461273f565b825550505050565b600090565b6127f96127ec565b6128048184846127c7565b505050565b5b818110156128285761281d6000826127f1565b60018101905061280a565b5050565b601f82111561286d5761283e8161270d565b61284784612722565b81016020851015612856578190505b61286a61286285612722565b830182612809565b50505b505050565b600082821c905092915050565b600061289060001984600802612872565b1980831691505092915050565b60006128a9838361287f565b9150826002028217905092915050565b6128c38383612702565b67ffffffffffffffff8111156128dc576128db612354565b5b6128e68254612323565b6128f182828561282c565b6000601f831160018114612920576000841561290e578287013590505b612918858261289d565b865550612980565b601f19841661292e8661270d565b60005b8281101561295657848901358255600182019150602085019450602081019050612931565b86831015612973578489013561296f601f89168261287f565b8355505b6001600288020188555050505b50505050505050565b600082905092915050565b60008190508160005260206000209050919050565b601f8211156129ea576129bb81612994565b6129c484612722565b810160208510156129d3578190505b6129e76129df85612722565b830182612809565b50505b505050565b6129f98383612989565b67ffffffffffffffff811115612a1257612a11612354565b5b612a1c8254612323565b612a278282856129a9565b6000601f831160018114612a565760008415612a44578287013590505b612a4e858261289d565b865550612ab6565b601f198416612a6486612994565b60005b82811015612a8c57848901358255600182019150602085019450602081019050612a67565b86831015612aa95784890135612aa5601f89168261287f565b8355505b6001600288020188555050505b50505050505050565b6000602082019050612ad46000830184611bc2565b92915050565b600081519050612ae981611b37565b92915050565b600060208284031215612b0557612b04611b23565b5b6000612b1384828501612ada565b91505092915050565b7f53656e6465722068617320696e73756666696369656e74205245502062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b6000612b78602383611beb565b9150612b8382612b1c565b604082019050919050565b60006020820190508181036000830152612ba781612b6b565b9050919050565b6000612bb982611b2d565b9150612bc483611b2d565b9250828203905081811115612bdc57612bdb61268b565b5b92915050565b6000612bed82611b2d565b9150612bf883611b2d565b9250828201905080821115612c1057612c0f61268b565b5b92915050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b6000612c72603183611beb565b9150612c7d82612c16565b604082019050919050565b60006020820190508181036000830152612ca181612c65565b9050919050565b600080600060608486031215612cc157612cc0611b23565b5b6000612ccf86828701611b4e565b9350506020612ce086828701611b4e565b9250506040612cf186828701611b4e565b9150509250925092565b7f51756f72756d206e6f74206d6574000000000000000000000000000000000000600082015250565b6000612d31600e83611beb565b9150612d3c82612cfb565b602082019050919050565b6000604082019050612d5c6000830184611bd1565b8181036020830152612d6d81612d24565b905092915050565b6000612d8082611b2d565b9150612d8b83611b2d565b9250828202612d9981611b2d565b91508282048414831517612db057612daf61268b565b5b5092915050565b7f5374616765203020696e646578206d69736d6174636800000000000000000000600082015250565b6000612ded601683611beb565b9150612df882612db7565b602082019050919050565b60006020820190508181036000830152612e1c81612de0565b9050919050565b7f526574727920636f756e74206578636565646564000000000000000000000000600082015250565b6000612e59601483611beb565b9150612e6482612e23565b602082019050919050565b6000604082019050612e846000830184611bd1565b8181036020830152612e9581612e4c565b905092915050565b7f5374616765203120696e646578206d69736d6174636800000000000000000000600082015250565b6000612ed3601683611beb565b9150612ede82612e9d565b602082019050919050565b60006020820190508181036000830152612f0281612ec6565b9050919050565b7f5374616765203220696e646578206d69736d6174636800000000000000000000600082015250565b6000612f3f601683611beb565b9150612f4a82612f09565b602082019050919050565b60006020820190508181036000830152612f6e81612f32565b9050919050565b60008154612f8281612323565b612f8c8186611d0d565b94506001821660008114612fa75760018114612fbd57612ff0565b60ff198316865281151560200286019350612ff0565b612fc685612994565b60005b83811015612fe857815481890152600182019150602081019050612fc9565b808801955050505b50505092915050565b600060608201905061300e6000830186611bd1565b61301b6020830185611bd1565b818103604083015261302d8184612f75565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061307182611b2d565b915061307c83611b2d565b92508261308c5761308b613037565b5b828204905092915050565b7f52656d61696e696e6720666565732063616e206f6e6c79206265207265636c6160008201527f696d6564207768656e2070726f706f73616c20686173206265656e206163636560208201527f70746564206f72206661696c6564000000000000000000000000000000000000604082015250565b6000613119604e83611beb565b915061312482613097565b606082019050919050565b600060208201905081810360008301526131488161310c565b9050919050565b7f4174746573746174696f6e206f6e6c79207065727461696e7320746f2050726f60008201527f706f73616c207374616765000000000000000000000000000000000000000000602082015250565b60006131ab602b83611beb565b91506131b68261314f565b604082019050919050565b600060208201905081810360008301526131da8161319e565b9050919050565b7f4578706972656420776974686f7574206d656574696e6720617474657374617460008201527f696f6e207468726573686f6c6400000000000000000000000000000000000000602082015250565b600061323d602d83611beb565b9150613248826131e1565b604082019050919050565b60006040820190506132686000830184611bd1565b818103602083015261327981613230565b905092915050565b60006060820190506132966000830186611bd1565b6132a36020830185611bd1565b6132b06040830184611bd1565b949350505050565b600081546132c581612323565b6132cf8186611beb565b945060018216600081146132ea576001811461330057613333565b60ff198316865281151560200286019350613333565b6133098561270d565b60005b8381101561332b5781548189015260018201915060208101905061330c565b808801955050505b50505092915050565b600060029050919050565b600081905092915050565b6000819050919050565b6000613368838361203e565b60208301905092915050565b60008160001c9050919050565b6000819050919050565b600061339e61339983613374565b613381565b9050919050565b60006133b1825461338b565b9050919050565b6000600182019050919050565b6133ce8161333c565b6133d88184613347565b92506133e382613352565b8060005b8381101561341b576133f8826133a5565b613402878261335c565b965061340d836133b8565b9250506001810190506133e7565b505050505050565b600061014082019050818103600083015261343e818b6132b8565b905061344d602083018a611bd1565b61345a60408301896133c5565b61346760808301886133c5565b61347460c0830187611bd1565b61348160e0830186611cf3565b61348f610100830185611cf3565b8181036101208301526134a28184611d1e565b90509998505050505050505050565b60006040820190506134c66000830185611bd1565b6134d36020830184611bd1565b939250505056fea26469706673582212204ff67ea9359978b21e2c15a00c0290a49a16228d21926d629968eb1d951bb13a64736f6c63430008180033", + "deployedBytecode": "0x60806040526004361061007b5760003560e01c8063b4e6a1d51161004e578063b4e6a1d51461015b578063c019faab14610198578063da35c664146101c1578063ea923e63146101ec5761007b565b8063013cf08b146100805780632805b5d9146100c557806362d26ed7146100f5578063a3bb24cc14610132575b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a29190611b63565b610229565b6040516100bc99989796959493929190611d57565b60405180910390f35b6100df60048036038101906100da9190611f27565b6103c1565b6040516100ec9190611fe3565b60405180910390f35b34801561010157600080fd5b5061011c60048036038101906101179190611b63565b6106c5565b60405161012991906121e3565b60405180910390f35b34801561013e57600080fd5b50610159600480360381019061015491906121ff565b6109fe565b005b34801561016757600080fd5b50610182600480360381019061017d919061223f565b610be9565b60405161018f9190611fe3565b60405180910390f35b3480156101a457600080fd5b506101bf60048036038101906101ba9190611b63565b6114be565b005b3480156101cd57600080fd5b506101d66115ea565b6040516101e39190611fe3565b60405180910390f35b3480156101f857600080fd5b50610213600480360381019061020e9190611b63565b6115f0565b60405161022091906122d9565b60405180910390f35b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301805461027e90612323565b80601f01602080910402602001604051908101604052809291908181526020018280546102aa90612323565b80156102f75780601f106102cc576101008083540402835291602001916102f7565b820191906000526020600020905b8154815290600101906020018083116102da57829003601f168201915b5050505050908060040154908060050160009054906101000a900460ff169080600701549080603b0160009054906101000a900460ff169080603c01805461033e90612323565b80601f016020809104026020016040519081016040528092919081815260200182805461036a90612323565b80156103b75780601f1061038c576101008083540402835291602001916103b7565b820191906000526020600020905b81548152906001019060200180831161039a57829003601f168201915b5050505050905089565b600060606000600167ffffffffffffffff8111156103e2576103e1612354565b5b60405190808252806020026020018201604052801561041b57816020015b610408611a54565b8152602001906001900390816104005790505b5090506040518060400160405280606481526020018973ffffffffffffffffffffffffffffffffffffffff168152508160008151811061045e5761045d612383565b5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e5b4d827828c8c866040518563ffffffff1660e01b81526004016104c8949392919061263d565b600060405180830381600087803b1580156104e257600080fd5b505af11580156104f6573d6000803e3d6000fd5b505050506001600081548092919061050d906126ba565b91905055925060008060008581526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a8a82600301918261057f9291906128b9565b504281600401819055508760006003811061059d5761059c612383565b5b6020020135816008016000600381106105b9576105b8612383565b5b6011020160000181905550876001600381106105d8576105d7612383565b5b6020020135816008016001600381106105f4576105f3612383565b5b60110201600001819055508760026003811061061357610612612383565b5b60200201358160080160026003811061062f5761062e612383565b5b6011020160000181905550348160010181905550806001015481600201819055508681603b0160006101000a81548160ff021916908315150217905550858582603c01918261067f9291906129ef565b507f9a863892f20a6b9c6cec64d611b5864be6373191ce2cacc3b05a299bce3bf80e846040516106af9190611fe3565b60405180910390a1505050979650505050505050565b6106cd611a84565b60008060008481526020019081526020016000209050806008016000600381106106fa576106f9612383565b5b60110201600101600380602002604051908101604052809291906000905b828210156107ca578382600502016040518060e0016040529081600082015481526020016001820160009054906101000a900460ff161515151581526020016001820160019054906101000a900460ff1615151515815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581526020016004820160019054906101000a900460ff16151515158152505081526020019060010190610718565b50505050826000600381106107e2576107e1612383565b5b60200201819052508060080160016003811061080157610800612383565b5b60110201600101600380602002604051908101604052809291906000905b828210156108d1578382600502016040518060e0016040529081600082015481526020016001820160009054906101000a900460ff161515151581526020016001820160019054906101000a900460ff1615151515815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581526020016004820160019054906101000a900460ff1615151515815250508152602001906001019061081f565b50505050826001600381106108e9576108e8612383565b5b60200201819052508060080160026003811061090857610907612383565b5b60110201600101600380602002604051908101604052809291906000905b828210156109d8578382600502016040518060e0016040529081600082015481526020016001820160009054906101000a900460ff161515151581526020016001820160019054906101000a900460ff1615151515815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581526020016004820160019054906101000a900460ff16151515158152505081526020019060010190610926565b50505050826002600381106109f0576109ef612383565b5b602002018190525050919050565b807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610a589190612abf565b602060405180830381865afa158015610a75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a999190612aef565b1015610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190612b8e565b60405180910390fd5b600080600084815260200190815260200160002090508060060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054816007016000828254610b459190612bae565b92505081905550818160060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081816007016000828254610ba69190612be2565b925050819055507fc23775ba00d23f337b9f790bd67eb5194aa9b95876933f9ccd1887becbb55ccb83604051610bdc9190611fe3565b60405180910390a1505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7090612c88565b60405180910390fd5b60008060008585810190610c8d9190612ca8565b925092509250600080600085815260200190815260200160002090506000816008018460038110610cc157610cc0612383565b5b601102019050600081600101826010015460038110610ce357610ce2612383565b5b60050201905060018160010160016101000a81548160ff0219169083151502179055508a81600201819055508981600301819055508b8160040160016101000a81548160ff0219169083151502179055508c8160040160006101000a81548160ff0219169083151502179055508b610de35760048360050160006101000a81548160ff02191690836005811115610d7d57610d7c611c70565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb86604051610db19190612d47565b60405180910390a183836002016000828254610dcd9190612be2565b92505081905550600196505050505050506114b4565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e749190612aef565b8b8d610e809190612be2565b6002610e8c9190612d75565b1015905060016005811115610ea457610ea3611c70565b5b8460050160009054906101000a900460ff166005811115610ec857610ec7611c70565b5b03610fe95760008614610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0790612e03565b60405180910390fd5b8d8015610f1a5750805b15610f515760028460050160006101000a81548160ff02191690836005811115610f4757610f46611c70565b5b0217905550610fe4565b6002836010015410610fc65760048460050160006101000a81548160ff02191690836005811115610f8557610f84611c70565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb87604051610fb99190612e6f565b60405180910390a1610fe3565b6001836010016000828254610fdb9190612be2565b925050819055505b5b611390565b60026005811115610ffd57610ffc611c70565b5b8460050160009054906101000a900460ff16600581111561102157611020611c70565b5b036111425760018614611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090612ee9565b60405180910390fd5b8d80156110735750805b156110aa5760038460050160006101000a81548160ff021916908360058111156110a05761109f611c70565b5b021790555061113d565b600283601001541061111f5760048460050160006101000a81548160ff021916908360058111156110de576110dd611c70565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb876040516111129190612e6f565b60405180910390a161113c565b60018360100160008282546111349190612be2565b925050819055505b5b61138f565b6003600581111561115657611155611c70565b5b8460050160009054906101000a900460ff16600581111561117a57611179611c70565b5b0361138e57600286146111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990612f55565b60405180910390fd5b8d80156111cc5750805b156112fa5760058460050160006101000a81548160ff021916908360058111156111f9576111f8611c70565b5b02179055507fd24c2047577899547bacebb29e319fc7d73f6712b5adb401d45556f34bb2aa3b8760405161122d9190611fe3565b60405180910390a183603b0160009054906101000a900460ff16156112f5578360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663815a05728d8d87603c016040518463ffffffff1660e01b81526004016112b093929190612ff9565b6020604051808303816000875af11580156112cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f39190612aef565b505b61138d565b600283601001541061136f5760048460050160006101000a81548160ff0219169083600581111561132e5761132d611c70565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb876040516113629190612e6f565b60405180910390a161138c565b60018360100160008282546113849190612be2565b925050819055505b5b5b5b5b600160058111156113a4576113a3611c70565b5b8460050160009054906101000a900460ff1660058111156113c8576113c7611c70565b5b036113ee576113e9876000600a87600101546113e49190613066565b61181c565b6114a8565b6002600581111561140257611401611c70565b5b8460050160009054906101000a900460ff16600581111561142657611425611c70565b5b0361144c57611447876001600a87600101546114429190613066565b61181c565b6114a7565b600360058111156114605761145f611c70565b5b8460050160009054906101000a900460ff16600581111561148457611483611c70565b5b036114a6576114a5876002600a87600101546114a09190613066565b61181c565b5b5b5b60009750505050505050505b9695505050505050565b60008060008381526020019081526020016000209050600460058111156114e8576114e7611c70565b5b8160050160009054906101000a900460ff16600581111561150c5761150b611c70565b5b148061154c575060058081111561152657611525611c70565b5b8160050160009054906101000a900460ff16600581111561154a57611549611c70565b5b145b61158b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115829061312f565b60405180910390fd5b600081600201549050600082600201819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115e4573d6000803e3d6000fd5b50505050565b60015481565b60008060008084815260200190815260200160002090506000600581111561161b5761161a611c70565b5b8160050160009054906101000a900460ff16600581111561163f5761163e611c70565b5b1461167f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611676906131c1565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117109190612aef565b8260070154600a6117219190612d75565b1015905060006301e13380836004015461173b9190612be2565b42119050816117c65780156117ba5760048360050160006101000a81548160ff0219169083600581111561177257611771611c70565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb856040516117a69190613253565b60405180910390a160009350505050611817565b60009350505050611817565b60018360050160006101000a81548160ff021916908360058111156117ee576117ed611c70565b5b021790555061180f856000600a866001015461180a9190613066565b61181c565b600193505050505b919050565b60008060008581526020019081526020016000209050818160020160008282546118469190612bae565b9250508190555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fbe7c7384846003018560080188600381106118a6576118a5612383565b5b6011020160000154600689600381106118c2576118c1612383565b5b60020201600c8a600381106118da576118d9612383565b5b6002020160028b600381106118f2576118f1612383565b5b015460058c6003811061190857611907612383565b5b602091828204019190069054906101000a900460ff1660018e8e8e60405160200161193593929190613281565b6040516020818303038152906040526040518a63ffffffff1660e01b8152600401611967989796959493929190613423565b60206040518083038185885af1158015611985573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906119aa9190612aef565b905060008260080185600381106119c4576119c3612383565b5b6011020190506000816001018260100154600381106119e6576119e5612383565b5b60050201905082816000018190555060018160010160006101000a81548160ff0219169083151502179055507f4c14e16a98683e5b8bd70d51192048d0499fb3999b27ff1e9dce7e4a2c6734798784604051611a439291906134b1565b60405180910390a150505050505050565b604051806040016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b60405180606001604052806003905b611a9b611ab1565b815260200190600190039081611a935790505090565b60405180606001604052806003905b611ac8611ade565b815260200190600190039081611ac05790505090565b6040518060e001604052806000815260200160001515815260200160001515815260200160008152602001600081526020016000151581526020016000151581525090565b600080fd5b600080fd5b6000819050919050565b611b4081611b2d565b8114611b4b57600080fd5b50565b600081359050611b5d81611b37565b92915050565b600060208284031215611b7957611b78611b23565b5b6000611b8784828501611b4e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611bbb82611b90565b9050919050565b611bcb81611bb0565b82525050565b611bda81611b2d565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c1a578082015181840152602081019050611bff565b60008484015250505050565b6000601f19601f8301169050919050565b6000611c4282611be0565b611c4c8185611beb565b9350611c5c818560208601611bfc565b611c6581611c26565b840191505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60068110611cb057611caf611c70565b5b50565b6000819050611cc182611c9f565b919050565b6000611cd182611cb3565b9050919050565b611ce181611cc6565b82525050565b60008115159050919050565b611cfc81611ce7565b82525050565b600081519050919050565b600082825260208201905092915050565b6000611d2982611d02565b611d338185611d0d565b9350611d43818560208601611bfc565b611d4c81611c26565b840191505092915050565b600061012082019050611d6d600083018c611bc2565b611d7a602083018b611bd1565b611d87604083018a611bd1565b8181036060830152611d998189611c37565b9050611da86080830188611bd1565b611db560a0830187611cd8565b611dc260c0830186611bd1565b611dcf60e0830185611cf3565b818103610100830152611de28184611d1e565b90509a9950505050505050505050565b600080fd5b600080fd5b600080fd5b60008083601f840112611e1757611e16611df2565b5b8235905067ffffffffffffffff811115611e3457611e33611df7565b5b602083019150836001820283011115611e5057611e4f611dfc565b5b9250929050565b611e6081611bb0565b8114611e6b57600080fd5b50565b600081359050611e7d81611e57565b92915050565b600081905082602060030282011115611e9f57611e9e611dfc565b5b92915050565b611eae81611ce7565b8114611eb957600080fd5b50565b600081359050611ecb81611ea5565b92915050565b60008083601f840112611ee757611ee6611df2565b5b8235905067ffffffffffffffff811115611f0457611f03611df7565b5b602083019150836001820283011115611f2057611f1f611dfc565b5b9250929050565b600080600080600080600060e0888a031215611f4657611f45611b23565b5b600088013567ffffffffffffffff811115611f6457611f63611b28565b5b611f708a828b01611e01565b97509750506020611f838a828b01611e6e565b9550506040611f948a828b01611e83565b94505060a0611fa58a828b01611ebc565b93505060c088013567ffffffffffffffff811115611fc657611fc5611b28565b5b611fd28a828b01611ed1565b925092505092959891949750929550565b6000602082019050611ff86000830184611bd1565b92915050565b600060039050919050565b600081905092915050565b6000819050919050565b600060039050919050565b600081905092915050565b6000819050919050565b61204781611b2d565b82525050565b61205681611ce7565b82525050565b60e082016000820151612072600085018261203e565b506020820151612085602085018261204d565b506040820151612098604085018261204d565b5060608201516120ab606085018261203e565b5060808201516120be608085018261203e565b5060a08201516120d160a085018261204d565b5060c08201516120e460c085018261204d565b50505050565b60006120f6838361205c565b60e08301905092915050565b6000602082019050919050565b6121188161201e565b6121228184612029565b925061212d82612034565b8060005b8381101561215e57815161214587826120ea565b965061215083612102565b925050600181019050612131565b505050505050565b6000612172838361210f565b6102a08301905092915050565b6000602082019050919050565b61219581611ffe565b61219f8184612009565b92506121aa82612014565b8060005b838110156121db5781516121c28782612166565b96506121cd8361217f565b9250506001810190506121ae565b505050505050565b60006107e0820190506121f9600083018461218c565b92915050565b6000806040838503121561221657612215611b23565b5b600061222485828601611b4e565b925050602061223585828601611b4e565b9150509250929050565b60008060008060008060a0878903121561225c5761225b611b23565b5b600061226a89828a01611ebc565b965050602061227b89828a01611ebc565b955050604061228c89828a01611b4e565b945050606061229d89828a01611b4e565b935050608087013567ffffffffffffffff8111156122be576122bd611b28565b5b6122ca89828a01611ed1565b92509250509295509295509295565b60006020820190506122ee6000830184611cf3565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061233b57607f821691505b60208210810361234e5761234d6122f4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6123e781611bb0565b82525050565b604082016000820151612403600085018261203e565b50602082015161241660208501826123de565b50505050565b600061242883836123ed565b60408301905092915050565b6000602082019050919050565b600061244c826123b2565b61245681856123bd565b9350612461836123ce565b8060005b83811015612492578151612479888261241c565b975061248483612434565b925050600181019050612465565b5085935050505092915050565b82818337600083830152505050565b60006124ba8385611beb565b93506124c783858461249f565b6124d083611c26565b840190509392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61251a81612507565b82525050565b600082825260208201905092915050565b600061253c82611be0565b6125468185612520565b9350612556818560208601611bfc565b61255f81611c26565b840191505092915050565b60006040830160008301516125826000860182612511565b506020830151848203602086015261259a8282612531565b9150508091505092915050565b60006125b3838361256a565b905092915050565b6000602082019050919050565b60006125d3826124db565b6125dd81856124e6565b9350836020820285016125ef856124f7565b8060005b8581101561262b578484038952815161260c85826125a7565b9450612617836125bb565b925060208a019950506001810190506125f3565b50829750879550505050505092915050565b600060608201905081810360008301526126578187612441565b9050818103602083015261266c8185876124ae565b9050818103604083015261268081846125c8565b905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126c582611b2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126f7576126f661268b565b5b600182019050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261276f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612732565b6127798683612732565b95508019841693508086168417925050509392505050565b6000819050919050565b60006127b66127b16127ac84611b2d565b612791565b611b2d565b9050919050565b6000819050919050565b6127d08361279b565b6127e46127dc826127bd565b84845461273f565b825550505050565b600090565b6127f96127ec565b6128048184846127c7565b505050565b5b818110156128285761281d6000826127f1565b60018101905061280a565b5050565b601f82111561286d5761283e8161270d565b61284784612722565b81016020851015612856578190505b61286a61286285612722565b830182612809565b50505b505050565b600082821c905092915050565b600061289060001984600802612872565b1980831691505092915050565b60006128a9838361287f565b9150826002028217905092915050565b6128c38383612702565b67ffffffffffffffff8111156128dc576128db612354565b5b6128e68254612323565b6128f182828561282c565b6000601f831160018114612920576000841561290e578287013590505b612918858261289d565b865550612980565b601f19841661292e8661270d565b60005b8281101561295657848901358255600182019150602085019450602081019050612931565b86831015612973578489013561296f601f89168261287f565b8355505b6001600288020188555050505b50505050505050565b600082905092915050565b60008190508160005260206000209050919050565b601f8211156129ea576129bb81612994565b6129c484612722565b810160208510156129d3578190505b6129e76129df85612722565b830182612809565b50505b505050565b6129f98383612989565b67ffffffffffffffff811115612a1257612a11612354565b5b612a1c8254612323565b612a278282856129a9565b6000601f831160018114612a565760008415612a44578287013590505b612a4e858261289d565b865550612ab6565b601f198416612a6486612994565b60005b82811015612a8c57848901358255600182019150602085019450602081019050612a67565b86831015612aa95784890135612aa5601f89168261287f565b8355505b6001600288020188555050505b50505050505050565b6000602082019050612ad46000830184611bc2565b92915050565b600081519050612ae981611b37565b92915050565b600060208284031215612b0557612b04611b23565b5b6000612b1384828501612ada565b91505092915050565b7f53656e6465722068617320696e73756666696369656e74205245502062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b6000612b78602383611beb565b9150612b8382612b1c565b604082019050919050565b60006020820190508181036000830152612ba781612b6b565b9050919050565b6000612bb982611b2d565b9150612bc483611b2d565b9250828203905081811115612bdc57612bdb61268b565b5b92915050565b6000612bed82611b2d565b9150612bf883611b2d565b9250828201905080821115612c1057612c0f61268b565b5b92915050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b6000612c72603183611beb565b9150612c7d82612c16565b604082019050919050565b60006020820190508181036000830152612ca181612c65565b9050919050565b600080600060608486031215612cc157612cc0611b23565b5b6000612ccf86828701611b4e565b9350506020612ce086828701611b4e565b9250506040612cf186828701611b4e565b9150509250925092565b7f51756f72756d206e6f74206d6574000000000000000000000000000000000000600082015250565b6000612d31600e83611beb565b9150612d3c82612cfb565b602082019050919050565b6000604082019050612d5c6000830184611bd1565b8181036020830152612d6d81612d24565b905092915050565b6000612d8082611b2d565b9150612d8b83611b2d565b9250828202612d9981611b2d565b91508282048414831517612db057612daf61268b565b5b5092915050565b7f5374616765203020696e646578206d69736d6174636800000000000000000000600082015250565b6000612ded601683611beb565b9150612df882612db7565b602082019050919050565b60006020820190508181036000830152612e1c81612de0565b9050919050565b7f526574727920636f756e74206578636565646564000000000000000000000000600082015250565b6000612e59601483611beb565b9150612e6482612e23565b602082019050919050565b6000604082019050612e846000830184611bd1565b8181036020830152612e9581612e4c565b905092915050565b7f5374616765203120696e646578206d69736d6174636800000000000000000000600082015250565b6000612ed3601683611beb565b9150612ede82612e9d565b602082019050919050565b60006020820190508181036000830152612f0281612ec6565b9050919050565b7f5374616765203220696e646578206d69736d6174636800000000000000000000600082015250565b6000612f3f601683611beb565b9150612f4a82612f09565b602082019050919050565b60006020820190508181036000830152612f6e81612f32565b9050919050565b60008154612f8281612323565b612f8c8186611d0d565b94506001821660008114612fa75760018114612fbd57612ff0565b60ff198316865281151560200286019350612ff0565b612fc685612994565b60005b83811015612fe857815481890152600182019150602081019050612fc9565b808801955050505b50505092915050565b600060608201905061300e6000830186611bd1565b61301b6020830185611bd1565b818103604083015261302d8184612f75565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061307182611b2d565b915061307c83611b2d565b92508261308c5761308b613037565b5b828204905092915050565b7f52656d61696e696e6720666565732063616e206f6e6c79206265207265636c6160008201527f696d6564207768656e2070726f706f73616c20686173206265656e206163636560208201527f70746564206f72206661696c6564000000000000000000000000000000000000604082015250565b6000613119604e83611beb565b915061312482613097565b606082019050919050565b600060208201905081810360008301526131488161310c565b9050919050565b7f4174746573746174696f6e206f6e6c79207065727461696e7320746f2050726f60008201527f706f73616c207374616765000000000000000000000000000000000000000000602082015250565b60006131ab602b83611beb565b91506131b68261314f565b604082019050919050565b600060208201905081810360008301526131da8161319e565b9050919050565b7f4578706972656420776974686f7574206d656574696e6720617474657374617460008201527f696f6e207468726573686f6c6400000000000000000000000000000000000000602082015250565b600061323d602d83611beb565b9150613248826131e1565b604082019050919050565b60006040820190506132686000830184611bd1565b818103602083015261327981613230565b905092915050565b60006060820190506132966000830186611bd1565b6132a36020830185611bd1565b6132b06040830184611bd1565b949350505050565b600081546132c581612323565b6132cf8186611beb565b945060018216600081146132ea576001811461330057613333565b60ff198316865281151560200286019350613333565b6133098561270d565b60005b8381101561332b5781548189015260018201915060208101905061330c565b808801955050505b50505092915050565b600060029050919050565b600081905092915050565b6000819050919050565b6000613368838361203e565b60208301905092915050565b60008160001c9050919050565b6000819050919050565b600061339e61339983613374565b613381565b9050919050565b60006133b1825461338b565b9050919050565b6000600182019050919050565b6133ce8161333c565b6133d88184613347565b92506133e382613352565b8060005b8381101561341b576133f8826133a5565b613402878261335c565b965061340d836133b8565b9250506001810190506133e7565b505050505050565b600061014082019050818103600083015261343e818b6132b8565b905061344d602083018a611bd1565b61345a60408301896133c5565b61346760808301886133c5565b61347460c0830187611bd1565b61348160e0830186611cf3565b61348f610100830185611cf3565b8181036101208301526134a28184611d1e565b90509998505050505050505050565b60006040820190506134c66000830185611bd1565b6134d36020830184611bd1565b939250505056fea26469706673582212204ff67ea9359978b21e2c15a00c0290a49a16228d21926d629968eb1d951bb13a64736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/frontend/contractArtifacts/Work1.json b/frontend/contractArtifacts/Work1.json new file mode 100644 index 0000000..6c72614 --- /dev/null +++ b/frontend/contractArtifacts/Work1.json @@ -0,0 +1,446 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Work1", + "sourceName": "contracts/Work1.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract DAO", + "name": "dao_", + "type": "address" + }, + { + "internalType": "contract Proposals", + "name": "proposals_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "price_", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "AvailabilityStaked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "priceProposalIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "PriceChangeAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "priceProposalIndex", + "type": "uint256" + } + ], + "name": "PriceChangeProposed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "name": "WorkApprovalSubmitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "WorkAssigned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + } + ], + "name": "WorkEvidenceSubmitted", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "acceptAvailability", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "extendAvailability", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + } + ], + "name": "onProposalAccepted", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "price", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "priceProposalCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "priceProposals", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "proposalIndex", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newPrice", + "type": "uint256" + }, + { + "internalType": "string", + "name": "contentId", + "type": "string" + }, + { + "internalType": "uint256[3]", + "name": "durations", + "type": "uint256[3]" + } + ], + "name": "proposeNewPrice", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "requestCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "requestContentId", + "type": "string" + } + ], + "name": "requestWork", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "requests", + "outputs": [ + { + "internalType": "address", + "name": "customer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + }, + { + "internalType": "enum WorkContract.WorkStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "internalType": "string", + "name": "requestContentId", + "type": "string" + }, + { + "internalType": "string", + "name": "evidenceContentId", + "type": "string" + }, + { + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakeCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "stakes", + "outputs": [ + { + "internalType": "address", + "name": "worker", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "assigned", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "name": "submitWorkApproval", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + }, + { + "internalType": "string", + "name": "evidenceContentId", + "type": "string" + }, + { + "components": [ + { + "internalType": "int256", + "name": "weightPercent", + "type": "int256" + }, + { + "internalType": "string", + "name": "targetPostId", + "type": "string" + } + ], + "internalType": "struct Citation[]", + "name": "citations", + "type": "tuple[]" + } + ], + "name": "submitWorkEvidence", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162002dd238038062002dd28339818101604052810190620000379190620001c1565b828282828073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505080600181905550816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050506200021d565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000f582620000c8565b9050919050565b60006200010982620000e8565b9050919050565b6200011b81620000fc565b81146200012757600080fd5b50565b6000815190506200013b8162000110565b92915050565b60006200014e82620000e8565b9050919050565b620001608162000141565b81146200016c57600080fd5b50565b600081519050620001808162000155565b92915050565b6000819050919050565b6200019b8162000186565b8114620001a757600080fd5b50565b600081519050620001bb8162000190565b92915050565b600080600060608486031215620001dd57620001dc620000c3565b5b6000620001ed868287016200012a565b935050602062000200868287016200016f565b92505060406200021386828701620001aa565b9150509250925092565b608051612b8b620002476000396000818161093701528181610a070152610ae90152612b8b6000f3fe6080604052600436106100dd5760003560e01c8063a035b1fe1161007f578063cf37625611610059578063cf37625614610296578063d0fae95f146102d4578063d5a44f86146102fd578063d76b67941461033d576100dd565b8063a035b1fe14610217578063b5b20c0014610242578063c4a9e1161461026b576100dd565b8063815a0572116100bb578063815a05721461015257806381d12c581461018f578063854b6a4f146101d257806399ad6c56146101fb576100dd565b80630d0271d6146100e2578063216ed6ad146100fe5780635badbe4c14610127575b600080fd5b6100fc60048036038101906100f791906113cc565b610368565b005b34801561010a57600080fd5b50610125600480360381019061012091906114ad565b610456565b005b34801561013357600080fd5b5061013c610569565b604051610149919061150f565b60405180910390f35b34801561015e57600080fd5b5061017960048036038101906101749190611580565b61056f565b604051610186919061150f565b60405180910390f35b34801561019b57600080fd5b506101b660048036038101906101b191906115f4565b6105ee565b6040516101c99796959493929190611752565b60405180910390f35b3480156101de57600080fd5b506101f960048036038101906101f491906117fb565b61077a565b005b6102156004803603810190610210919061185d565b610ba9565b005b34801561022357600080fd5b5061022c610cf2565b604051610239919061150f565b60405180910390f35b34801561024e57600080fd5b50610269600480360381019061026491906118d1565b610cf8565b005b34801561027757600080fd5b50610280610e6d565b60405161028d919061150f565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b891906115f4565b610e73565b6040516102cb929190611911565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190611990565b610e97565b005b34801561030957600080fd5b50610324600480360381019061031f91906115f4565b6110d0565b6040516103349493929190611a25565b60405180910390f35b34801561034957600080fd5b5061035261112d565b60405161035f919061150f565b60405180910390f35b6001543410156103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a490611ab6565b60405180910390fd5b6000600760008154809291906103c290611b05565b9190505590506000600660008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034816001018190555061043482611133565b8160030181905550838382600401918261044f929190611d93565b5050505050565b60008211610499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049090611eaf565b60405180910390fd5b6000600560008154809291906104ae90611b05565b9190505590506000600460008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083816001018190555082426105239190611ecf565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161055a919061150f565b60405180910390a15050505050565b60075481565b600080838381019061058191906115f4565b9050600060026000838152602001908152602001600020905080600001546001819055507f6a3843c02c26620842ae8496fd3afcb44b27463b3808e2ccdae4bcee5a2e3f20826001546040516105d8929190611911565b60405180910390a1600092505050949350505050565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff169080600301549080600401805461065690611bb6565b80601f016020809104026020016040519081016040528092919081815260200182805461068290611bb6565b80156106cf5780601f106106a4576101008083540402835291602001916106cf565b820191906000526020600020905b8154815290600101906020018083116106b257829003601f168201915b5050505050908060050180546106e490611bb6565b80601f016020809104026020016040519081016040528092919081815260200182805461071090611bb6565b801561075d5780601f106107325761010080835404028352916020019161075d565b820191906000526020600020905b81548152906001019060200180831161074057829003601f168201915b5050505050908060070160009054906101000a900460ff16905087565b6000600660008481526020019081526020016000209050600160038111156107a5576107a4611630565b5b8160020160009054906101000a900460ff1660038111156107c9576107c8611630565b5b14610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090611f4f565b60405180910390fd5b60006004600083600301548152602001908152602001600020905060028260020160006101000a81548160ff0219169083600381111561084c5761084b611630565b5b0217905550828260070160006101000a81548160ff0219169083151502179055506000600167ffffffffffffffff81111561088a57610889611b58565b5b6040519080825280602002602001820160405280156108c357816020015b6108b061132d565b8152602001906001900390816108a85790505b5090506040518060400160405280606481526020018360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152508160008151811061092a57610929611f6f565b5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e5b4d8278285600501866006016040518463ffffffff1660e01b81526004016109989392919061230c565b600060405180830381600087803b1580156109b257600080fd5b505af11580156109c6573d6000803e3d6000fd5b505050507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc85856040516109fb929190612358565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fbe7c738560010154866005016014604051806040016040528060018152602001600381525060405180604001604052806001815260200160028152506064600160006040518963ffffffff1660e01b8152600401610aa2979695949392919061248f565b60206040518083038185885af1158015610ac0573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ae59190612530565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663975762b3828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866001015460016040518563ffffffff1660e01b8152600401610b6f949392919061255d565b600060405180830381600087803b158015610b8957600080fd5b505af1158015610b9d573d6000803e3d6000fd5b50505050505050505050565b600060036000815480929190610bbe90611b05565b919050559050600060026000838152602001908152602001600020905085816000018190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632805b5d93487873388600189604051602001610c38919061150f565b6040516020818303038152906040526040518863ffffffff1660e01b8152600401610c689695949392919061263b565b60206040518083038185885af1158015610c86573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610cab9190612530565b81600101819055507f71eae802097e4e77c5345dee7f35d74ac0ae45eb5a456fdaed0de4d141fc5d8c82604051610ce2919061150f565b60405180910390a1505050505050565b60015481565b60006004600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9890612710565b60405180910390fd5b8060030160009054906101000a900460ff1615610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906127a2565b60405180910390fd5b8060020154421115610e18578142610e0b9190611ecf565b8160020181905550610e31565b818160020154610e289190611ecf565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e983604051610e60919061150f565b60405180910390a1505050565b60055481565b60026020528060005260406000206000915090508060000154908060010154905082565b600060066000878152602001908152602001600020905060006003811115610ec257610ec1611630565b5b8160020160009054906101000a900460ff166003811115610ee657610ee5611630565b5b14610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d9061280e565b60405180910390fd5b6000600460008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca906128a0565b60405180910390fd5b60018260020160006101000a81548160ff02191690836003811115610ffb57610ffa611630565b5b02179055508585836005019182611013929190611d93565b5060005b8484905081101561108f578260060185858381811061103957611038611f6f565b5b905060200281019061104b91906128cf565b908060018154018082558091505060019003906000526020600020906002020160009091909190915081816110809190612a7b565b50508080600101915050611017565b507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc876040516110bf919061150f565b60405180910390a150505050505050565b60046020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16905084565b60035481565b600061113d6111b2565b9050600060046000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b483836040516111a4929190611911565b60405180910390a150919050565b60008060005b600554811015611239576004600082815260200190815260200160002060030160009054906101000a900460ff1661122c576004600082815260200190815260200160002060020154421161122c576004600082815260200190815260200160002060010154826112299190611ecf565b91505b80806001019150506111b8565b506000811161127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490612ad5565b60405180910390fd5b6000814461128b9190612b24565b9050600080600090505b600554811015611326576004600082815260200190815260200160002060030160009054906101000a900460ff166113195760046000828152602001908152602001600020600201544211611319576004600082815260200190815260200160002060010154826113069190611ecf565b91508282111561131857809450611326565b5b8080600101915050611295565b5050505090565b604051806040016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261138c5761138b611367565b5b8235905067ffffffffffffffff8111156113a9576113a861136c565b5b6020830191508360018202830111156113c5576113c4611371565b5b9250929050565b600080602083850312156113e3576113e261135d565b5b600083013567ffffffffffffffff81111561140157611400611362565b5b61140d85828601611376565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061144482611419565b9050919050565b61145481611439565b811461145f57600080fd5b50565b6000813590506114718161144b565b92915050565b6000819050919050565b61148a81611477565b811461149557600080fd5b50565b6000813590506114a781611481565b92915050565b6000806000606084860312156114c6576114c561135d565b5b60006114d486828701611462565b93505060206114e586828701611498565b92505060406114f686828701611498565b9150509250925092565b61150981611477565b82525050565b60006020820190506115246000830184611500565b92915050565b60008083601f8401126115405761153f611367565b5b8235905067ffffffffffffffff81111561155d5761155c61136c565b5b60208301915083600182028301111561157957611578611371565b5b9250929050565b6000806000806060858703121561159a5761159961135d565b5b60006115a887828801611498565b94505060206115b987828801611498565b935050604085013567ffffffffffffffff8111156115da576115d9611362565b5b6115e68782880161152a565b925092505092959194509250565b60006020828403121561160a5761160961135d565b5b600061161884828501611498565b91505092915050565b61162a81611439565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106116705761166f611630565b5b50565b60008190506116818261165f565b919050565b600061169182611673565b9050919050565b6116a181611686565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156116e15780820151818401526020810190506116c6565b60008484015250505050565b6000601f19601f8301169050919050565b6000611709826116a7565b61171381856116b2565b93506117238185602086016116c3565b61172c816116ed565b840191505092915050565b60008115159050919050565b61174c81611737565b82525050565b600060e082019050611767600083018a611621565b6117746020830189611500565b6117816040830188611698565b61178e6060830187611500565b81810360808301526117a081866116fe565b905081810360a08301526117b481856116fe565b90506117c360c0830184611743565b98975050505050505050565b6117d881611737565b81146117e357600080fd5b50565b6000813590506117f5816117cf565b92915050565b600080604083850312156118125761181161135d565b5b600061182085828601611498565b9250506020611831858286016117e6565b9150509250929050565b60008190508260206003028201111561185757611856611371565b5b92915050565b60008060008060a085870312156118775761187661135d565b5b600061188587828801611498565b945050602085013567ffffffffffffffff8111156118a6576118a5611362565b5b6118b287828801611376565b935093505060406118c58782880161183b565b91505092959194509250565b600080604083850312156118e8576118e761135d565b5b60006118f685828601611498565b925050602061190785828601611498565b9150509250929050565b60006040820190506119266000830185611500565b6119336020830184611500565b9392505050565b60008083601f8401126119505761194f611367565b5b8235905067ffffffffffffffff81111561196d5761196c61136c565b5b60208301915083602082028301111561198957611988611371565b5b9250929050565b6000806000806000606086880312156119ac576119ab61135d565b5b60006119ba88828901611498565b955050602086013567ffffffffffffffff8111156119db576119da611362565b5b6119e788828901611376565b9450945050604086013567ffffffffffffffff811115611a0a57611a09611362565b5b611a168882890161193a565b92509250509295509295909350565b6000608082019050611a3a6000830187611621565b611a476020830186611500565b611a546040830185611500565b611a616060830184611743565b95945050505050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000611aa06010836116b2565b9150611aab82611a6a565b602082019050919050565b60006020820190508181036000830152611acf81611a93565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611b1082611477565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611b4257611b41611ad6565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611bce57607f821691505b602082108103611be157611be0611b87565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611c497fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611c0c565b611c538683611c0c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611c90611c8b611c8684611477565b611c6b565b611477565b9050919050565b6000819050919050565b611caa83611c75565b611cbe611cb682611c97565b848454611c19565b825550505050565b600090565b611cd3611cc6565b611cde818484611ca1565b505050565b5b81811015611d0257611cf7600082611ccb565b600181019050611ce4565b5050565b601f821115611d4757611d1881611be7565b611d2184611bfc565b81016020851015611d30578190505b611d44611d3c85611bfc565b830182611ce3565b50505b505050565b600082821c905092915050565b6000611d6a60001984600802611d4c565b1980831691505092915050565b6000611d838383611d59565b9150826002028217905092915050565b611d9d8383611b4d565b67ffffffffffffffff811115611db657611db5611b58565b5b611dc08254611bb6565b611dcb828285611d06565b6000601f831160018114611dfa5760008415611de8578287013590505b611df28582611d77565b865550611e5a565b601f198416611e0886611be7565b60005b82811015611e3057848901358255600182019150602085019450602081019050611e0b565b86831015611e4d5784890135611e49601f891682611d59565b8355505b6001600288020188555050505b50505050505050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b6000611e996011836116b2565b9150611ea482611e63565b602082019050919050565b60006020820190508181036000830152611ec881611e8c565b9050919050565b6000611eda82611477565b9150611ee583611477565b9250828201905080821115611efd57611efc611ad6565b5b92915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b6000611f396020836116b2565b9150611f4482611f03565b602082019050919050565b60006020820190508181036000830152611f6881611f2c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611fd381611477565b82525050565b611fe281611439565b82525050565b604082016000820151611ffe6000850182611fca565b5060208201516120116020850182611fd9565b50505050565b60006120238383611fe8565b60408301905092915050565b6000602082019050919050565b600061204782611f9e565b6120518185611fa9565b935061205c83611fba565b8060005b8381101561208d5781516120748882612017565b975061207f8361202f565b925050600181019050612060565b5085935050505092915050565b600081546120a781611bb6565b6120b181866116b2565b945060018216600081146120cc57600181146120e257612115565b60ff198316865281151560200286019350612115565b6120eb85611be7565b60005b8381101561210d578154818901526001820191506020810190506120ee565b808801955050505b50505092915050565b600081549050919050565b600082825260208201905092915050565b60008190508160005260206000209050919050565b60008160001c9050919050565b6000819050919050565b60006121796121748361214f565b61215c565b9050919050565b6000819050919050565b61219381612180565b82525050565b600082825260208201905092915050565b600081546121b781611bb6565b6121c18186612199565b945060018216600081146121dc57600181146121f257612225565b60ff198316865281151560200286019350612225565b6121fb85611be7565b60005b8381101561221d578154818901526001820191506020810190506121fe565b808801955050505b50505092915050565b600060408301600080840154905061224581612166565b612252600087018261218a565b5060018401858303602087015261226983826121aa565b925050819250505092915050565b6000612283838361222e565b905092915050565b6000600282019050919050565b60006122a38261211e565b6122ad8185612129565b9350836020820285016122bf8561213a565b8060005b858110156122fa578484038952816122db8582612277565b94506122e68361228b565b925060208a019950506001810190506122c3565b50829750879550505050505092915050565b60006060820190508181036000830152612326818661203c565b9050818103602083015261233a818561209a565b9050818103604083015261234e8184612298565b9050949350505050565b600060408201905061236d6000830185611500565b61237a6020830184611743565b9392505050565b600060029050919050565b600081905092915050565b6000819050919050565b60006123ad8383611fca565b60208301905092915050565b6000602082019050919050565b6123cf81612381565b6123d9818461238c565b92506123e482612397565b8060005b838110156124155781516123fc87826123a1565b9650612407836123b9565b9250506001810190506123e8565b505050505050565b6000819050919050565b600061244261243d6124388461241d565b611c6b565b611477565b9050919050565b61245281612427565b82525050565b600082825260208201905092915050565b50565b6000612479600083612458565b915061248482612469565b600082019050919050565b60006101408201905081810360008301526124aa818a61209a565b90506124b96020830189611500565b6124c660408301886123c6565b6124d360808301876123c6565b6124e060c0830186612449565b6124ed60e0830185611743565b6124fb610100830184611743565b81810361012083015261250d8161246c565b905098975050505050505050565b60008151905061252a81611481565b92915050565b6000602082840312156125465761254561135d565b5b60006125548482850161251b565b91505092915050565b60006080820190506125726000830187611500565b61257f6020830186611621565b61258c6040830185611500565b6125996060830184611743565b95945050505050565b82818337600083830152505050565b60006125bd83856116b2565b93506125ca8385846125a2565b6125d3836116ed565b840190509392505050565b82818337505050565b6125f3606083836125de565b5050565b600081519050919050565b600061260d826125f7565b6126178185612458565b93506126278185602086016116c3565b612630816116ed565b840191505092915050565b600060e082019050818103600083015261265681888a6125b1565b90506126656020830187611621565b61267260408301866125e7565b61267f60a0830185611743565b81810360c08301526126918184612602565b9050979650505050505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b60006126fa6033836116b2565b91506127058261269e565b604082019050919050565b60006020820190508181036000830152612729816126ed565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b600061278c6024836116b2565b915061279782612730565b604082019050919050565b600060208201905081810360008301526127bb8161277f565b9050919050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b60006127f86018836116b2565b9150612803826127c2565b602082019050919050565b60006020820190508181036000830152612827816127eb565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b600061288a603a836116b2565b91506128958261282e565b604082019050919050565b600060208201905081810360008301526128b98161287d565b9050919050565b600080fd5b600080fd5b600080fd5b6000823560016040038336030381126128eb576128ea6128c0565b5b80830191505092915050565b61290081612180565b811461290b57600080fd5b50565b6000813561291b816128f7565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61295d84612924565b9350801983169250808416831791505092915050565b600061298e61298961298484612180565b611c6b565b612180565b9050919050565b6000819050919050565b6129a882612973565b6129bb6129b482612995565b8354612931565b8255505050565b600080833560016020038436030381126129df576129de6128c0565b5b80840192508235915067ffffffffffffffff821115612a0157612a006128c5565b5b602083019250600182023603831315612a1d57612a1c6128ca565b5b509250929050565b612a30838383611d93565b505050565b600081016000830180612a478161290e565b9050612a53818461299f565b5050506001810160208301612a6881856129c2565b612a73818386612a25565b505050505050565b612a858282612a35565b5050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b6000612abf601a836116b2565b9150612aca82612a89565b602082019050919050565b60006020820190508181036000830152612aee81612ab2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612b2f82611477565b9150612b3a83611477565b925082612b4a57612b49612af5565b5b82820690509291505056fea2646970667358221220c5398d4ced267e33ea7156eece7a41020e945cd53dfaff5448c334f13f7b1e6064736f6c63430008180033", + "deployedBytecode": "0x6080604052600436106100dd5760003560e01c8063a035b1fe1161007f578063cf37625611610059578063cf37625614610296578063d0fae95f146102d4578063d5a44f86146102fd578063d76b67941461033d576100dd565b8063a035b1fe14610217578063b5b20c0014610242578063c4a9e1161461026b576100dd565b8063815a0572116100bb578063815a05721461015257806381d12c581461018f578063854b6a4f146101d257806399ad6c56146101fb576100dd565b80630d0271d6146100e2578063216ed6ad146100fe5780635badbe4c14610127575b600080fd5b6100fc60048036038101906100f791906113cc565b610368565b005b34801561010a57600080fd5b50610125600480360381019061012091906114ad565b610456565b005b34801561013357600080fd5b5061013c610569565b604051610149919061150f565b60405180910390f35b34801561015e57600080fd5b5061017960048036038101906101749190611580565b61056f565b604051610186919061150f565b60405180910390f35b34801561019b57600080fd5b506101b660048036038101906101b191906115f4565b6105ee565b6040516101c99796959493929190611752565b60405180910390f35b3480156101de57600080fd5b506101f960048036038101906101f491906117fb565b61077a565b005b6102156004803603810190610210919061185d565b610ba9565b005b34801561022357600080fd5b5061022c610cf2565b604051610239919061150f565b60405180910390f35b34801561024e57600080fd5b50610269600480360381019061026491906118d1565b610cf8565b005b34801561027757600080fd5b50610280610e6d565b60405161028d919061150f565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b891906115f4565b610e73565b6040516102cb929190611911565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190611990565b610e97565b005b34801561030957600080fd5b50610324600480360381019061031f91906115f4565b6110d0565b6040516103349493929190611a25565b60405180910390f35b34801561034957600080fd5b5061035261112d565b60405161035f919061150f565b60405180910390f35b6001543410156103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a490611ab6565b60405180910390fd5b6000600760008154809291906103c290611b05565b9190505590506000600660008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034816001018190555061043482611133565b8160030181905550838382600401918261044f929190611d93565b5050505050565b60008211610499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049090611eaf565b60405180910390fd5b6000600560008154809291906104ae90611b05565b9190505590506000600460008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083816001018190555082426105239190611ecf565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161055a919061150f565b60405180910390a15050505050565b60075481565b600080838381019061058191906115f4565b9050600060026000838152602001908152602001600020905080600001546001819055507f6a3843c02c26620842ae8496fd3afcb44b27463b3808e2ccdae4bcee5a2e3f20826001546040516105d8929190611911565b60405180910390a1600092505050949350505050565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff169080600301549080600401805461065690611bb6565b80601f016020809104026020016040519081016040528092919081815260200182805461068290611bb6565b80156106cf5780601f106106a4576101008083540402835291602001916106cf565b820191906000526020600020905b8154815290600101906020018083116106b257829003601f168201915b5050505050908060050180546106e490611bb6565b80601f016020809104026020016040519081016040528092919081815260200182805461071090611bb6565b801561075d5780601f106107325761010080835404028352916020019161075d565b820191906000526020600020905b81548152906001019060200180831161074057829003601f168201915b5050505050908060070160009054906101000a900460ff16905087565b6000600660008481526020019081526020016000209050600160038111156107a5576107a4611630565b5b8160020160009054906101000a900460ff1660038111156107c9576107c8611630565b5b14610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090611f4f565b60405180910390fd5b60006004600083600301548152602001908152602001600020905060028260020160006101000a81548160ff0219169083600381111561084c5761084b611630565b5b0217905550828260070160006101000a81548160ff0219169083151502179055506000600167ffffffffffffffff81111561088a57610889611b58565b5b6040519080825280602002602001820160405280156108c357816020015b6108b061132d565b8152602001906001900390816108a85790505b5090506040518060400160405280606481526020018360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152508160008151811061092a57610929611f6f565b5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e5b4d8278285600501866006016040518463ffffffff1660e01b81526004016109989392919061230c565b600060405180830381600087803b1580156109b257600080fd5b505af11580156109c6573d6000803e3d6000fd5b505050507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc85856040516109fb929190612358565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fbe7c738560010154866005016014604051806040016040528060018152602001600381525060405180604001604052806001815260200160028152506064600160006040518963ffffffff1660e01b8152600401610aa2979695949392919061248f565b60206040518083038185885af1158015610ac0573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ae59190612530565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663975762b3828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866001015460016040518563ffffffff1660e01b8152600401610b6f949392919061255d565b600060405180830381600087803b158015610b8957600080fd5b505af1158015610b9d573d6000803e3d6000fd5b50505050505050505050565b600060036000815480929190610bbe90611b05565b919050559050600060026000838152602001908152602001600020905085816000018190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632805b5d93487873388600189604051602001610c38919061150f565b6040516020818303038152906040526040518863ffffffff1660e01b8152600401610c689695949392919061263b565b60206040518083038185885af1158015610c86573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610cab9190612530565b81600101819055507f71eae802097e4e77c5345dee7f35d74ac0ae45eb5a456fdaed0de4d141fc5d8c82604051610ce2919061150f565b60405180910390a1505050505050565b60015481565b60006004600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9890612710565b60405180910390fd5b8060030160009054906101000a900460ff1615610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906127a2565b60405180910390fd5b8060020154421115610e18578142610e0b9190611ecf565b8160020181905550610e31565b818160020154610e289190611ecf565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e983604051610e60919061150f565b60405180910390a1505050565b60055481565b60026020528060005260406000206000915090508060000154908060010154905082565b600060066000878152602001908152602001600020905060006003811115610ec257610ec1611630565b5b8160020160009054906101000a900460ff166003811115610ee657610ee5611630565b5b14610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d9061280e565b60405180910390fd5b6000600460008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca906128a0565b60405180910390fd5b60018260020160006101000a81548160ff02191690836003811115610ffb57610ffa611630565b5b02179055508585836005019182611013929190611d93565b5060005b8484905081101561108f578260060185858381811061103957611038611f6f565b5b905060200281019061104b91906128cf565b908060018154018082558091505060019003906000526020600020906002020160009091909190915081816110809190612a7b565b50508080600101915050611017565b507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc876040516110bf919061150f565b60405180910390a150505050505050565b60046020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16905084565b60035481565b600061113d6111b2565b9050600060046000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b483836040516111a4929190611911565b60405180910390a150919050565b60008060005b600554811015611239576004600082815260200190815260200160002060030160009054906101000a900460ff1661122c576004600082815260200190815260200160002060020154421161122c576004600082815260200190815260200160002060010154826112299190611ecf565b91505b80806001019150506111b8565b506000811161127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490612ad5565b60405180910390fd5b6000814461128b9190612b24565b9050600080600090505b600554811015611326576004600082815260200190815260200160002060030160009054906101000a900460ff166113195760046000828152602001908152602001600020600201544211611319576004600082815260200190815260200160002060010154826113069190611ecf565b91508282111561131857809450611326565b5b8080600101915050611295565b5050505090565b604051806040016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261138c5761138b611367565b5b8235905067ffffffffffffffff8111156113a9576113a861136c565b5b6020830191508360018202830111156113c5576113c4611371565b5b9250929050565b600080602083850312156113e3576113e261135d565b5b600083013567ffffffffffffffff81111561140157611400611362565b5b61140d85828601611376565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061144482611419565b9050919050565b61145481611439565b811461145f57600080fd5b50565b6000813590506114718161144b565b92915050565b6000819050919050565b61148a81611477565b811461149557600080fd5b50565b6000813590506114a781611481565b92915050565b6000806000606084860312156114c6576114c561135d565b5b60006114d486828701611462565b93505060206114e586828701611498565b92505060406114f686828701611498565b9150509250925092565b61150981611477565b82525050565b60006020820190506115246000830184611500565b92915050565b60008083601f8401126115405761153f611367565b5b8235905067ffffffffffffffff81111561155d5761155c61136c565b5b60208301915083600182028301111561157957611578611371565b5b9250929050565b6000806000806060858703121561159a5761159961135d565b5b60006115a887828801611498565b94505060206115b987828801611498565b935050604085013567ffffffffffffffff8111156115da576115d9611362565b5b6115e68782880161152a565b925092505092959194509250565b60006020828403121561160a5761160961135d565b5b600061161884828501611498565b91505092915050565b61162a81611439565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106116705761166f611630565b5b50565b60008190506116818261165f565b919050565b600061169182611673565b9050919050565b6116a181611686565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156116e15780820151818401526020810190506116c6565b60008484015250505050565b6000601f19601f8301169050919050565b6000611709826116a7565b61171381856116b2565b93506117238185602086016116c3565b61172c816116ed565b840191505092915050565b60008115159050919050565b61174c81611737565b82525050565b600060e082019050611767600083018a611621565b6117746020830189611500565b6117816040830188611698565b61178e6060830187611500565b81810360808301526117a081866116fe565b905081810360a08301526117b481856116fe565b90506117c360c0830184611743565b98975050505050505050565b6117d881611737565b81146117e357600080fd5b50565b6000813590506117f5816117cf565b92915050565b600080604083850312156118125761181161135d565b5b600061182085828601611498565b9250506020611831858286016117e6565b9150509250929050565b60008190508260206003028201111561185757611856611371565b5b92915050565b60008060008060a085870312156118775761187661135d565b5b600061188587828801611498565b945050602085013567ffffffffffffffff8111156118a6576118a5611362565b5b6118b287828801611376565b935093505060406118c58782880161183b565b91505092959194509250565b600080604083850312156118e8576118e761135d565b5b60006118f685828601611498565b925050602061190785828601611498565b9150509250929050565b60006040820190506119266000830185611500565b6119336020830184611500565b9392505050565b60008083601f8401126119505761194f611367565b5b8235905067ffffffffffffffff81111561196d5761196c61136c565b5b60208301915083602082028301111561198957611988611371565b5b9250929050565b6000806000806000606086880312156119ac576119ab61135d565b5b60006119ba88828901611498565b955050602086013567ffffffffffffffff8111156119db576119da611362565b5b6119e788828901611376565b9450945050604086013567ffffffffffffffff811115611a0a57611a09611362565b5b611a168882890161193a565b92509250509295509295909350565b6000608082019050611a3a6000830187611621565b611a476020830186611500565b611a546040830185611500565b611a616060830184611743565b95945050505050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000611aa06010836116b2565b9150611aab82611a6a565b602082019050919050565b60006020820190508181036000830152611acf81611a93565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611b1082611477565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611b4257611b41611ad6565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611bce57607f821691505b602082108103611be157611be0611b87565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611c497fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611c0c565b611c538683611c0c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611c90611c8b611c8684611477565b611c6b565b611477565b9050919050565b6000819050919050565b611caa83611c75565b611cbe611cb682611c97565b848454611c19565b825550505050565b600090565b611cd3611cc6565b611cde818484611ca1565b505050565b5b81811015611d0257611cf7600082611ccb565b600181019050611ce4565b5050565b601f821115611d4757611d1881611be7565b611d2184611bfc565b81016020851015611d30578190505b611d44611d3c85611bfc565b830182611ce3565b50505b505050565b600082821c905092915050565b6000611d6a60001984600802611d4c565b1980831691505092915050565b6000611d838383611d59565b9150826002028217905092915050565b611d9d8383611b4d565b67ffffffffffffffff811115611db657611db5611b58565b5b611dc08254611bb6565b611dcb828285611d06565b6000601f831160018114611dfa5760008415611de8578287013590505b611df28582611d77565b865550611e5a565b601f198416611e0886611be7565b60005b82811015611e3057848901358255600182019150602085019450602081019050611e0b565b86831015611e4d5784890135611e49601f891682611d59565b8355505b6001600288020188555050505b50505050505050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b6000611e996011836116b2565b9150611ea482611e63565b602082019050919050565b60006020820190508181036000830152611ec881611e8c565b9050919050565b6000611eda82611477565b9150611ee583611477565b9250828201905080821115611efd57611efc611ad6565b5b92915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b6000611f396020836116b2565b9150611f4482611f03565b602082019050919050565b60006020820190508181036000830152611f6881611f2c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611fd381611477565b82525050565b611fe281611439565b82525050565b604082016000820151611ffe6000850182611fca565b5060208201516120116020850182611fd9565b50505050565b60006120238383611fe8565b60408301905092915050565b6000602082019050919050565b600061204782611f9e565b6120518185611fa9565b935061205c83611fba565b8060005b8381101561208d5781516120748882612017565b975061207f8361202f565b925050600181019050612060565b5085935050505092915050565b600081546120a781611bb6565b6120b181866116b2565b945060018216600081146120cc57600181146120e257612115565b60ff198316865281151560200286019350612115565b6120eb85611be7565b60005b8381101561210d578154818901526001820191506020810190506120ee565b808801955050505b50505092915050565b600081549050919050565b600082825260208201905092915050565b60008190508160005260206000209050919050565b60008160001c9050919050565b6000819050919050565b60006121796121748361214f565b61215c565b9050919050565b6000819050919050565b61219381612180565b82525050565b600082825260208201905092915050565b600081546121b781611bb6565b6121c18186612199565b945060018216600081146121dc57600181146121f257612225565b60ff198316865281151560200286019350612225565b6121fb85611be7565b60005b8381101561221d578154818901526001820191506020810190506121fe565b808801955050505b50505092915050565b600060408301600080840154905061224581612166565b612252600087018261218a565b5060018401858303602087015261226983826121aa565b925050819250505092915050565b6000612283838361222e565b905092915050565b6000600282019050919050565b60006122a38261211e565b6122ad8185612129565b9350836020820285016122bf8561213a565b8060005b858110156122fa578484038952816122db8582612277565b94506122e68361228b565b925060208a019950506001810190506122c3565b50829750879550505050505092915050565b60006060820190508181036000830152612326818661203c565b9050818103602083015261233a818561209a565b9050818103604083015261234e8184612298565b9050949350505050565b600060408201905061236d6000830185611500565b61237a6020830184611743565b9392505050565b600060029050919050565b600081905092915050565b6000819050919050565b60006123ad8383611fca565b60208301905092915050565b6000602082019050919050565b6123cf81612381565b6123d9818461238c565b92506123e482612397565b8060005b838110156124155781516123fc87826123a1565b9650612407836123b9565b9250506001810190506123e8565b505050505050565b6000819050919050565b600061244261243d6124388461241d565b611c6b565b611477565b9050919050565b61245281612427565b82525050565b600082825260208201905092915050565b50565b6000612479600083612458565b915061248482612469565b600082019050919050565b60006101408201905081810360008301526124aa818a61209a565b90506124b96020830189611500565b6124c660408301886123c6565b6124d360808301876123c6565b6124e060c0830186612449565b6124ed60e0830185611743565b6124fb610100830184611743565b81810361012083015261250d8161246c565b905098975050505050505050565b60008151905061252a81611481565b92915050565b6000602082840312156125465761254561135d565b5b60006125548482850161251b565b91505092915050565b60006080820190506125726000830187611500565b61257f6020830186611621565b61258c6040830185611500565b6125996060830184611743565b95945050505050565b82818337600083830152505050565b60006125bd83856116b2565b93506125ca8385846125a2565b6125d3836116ed565b840190509392505050565b82818337505050565b6125f3606083836125de565b5050565b600081519050919050565b600061260d826125f7565b6126178185612458565b93506126278185602086016116c3565b612630816116ed565b840191505092915050565b600060e082019050818103600083015261265681888a6125b1565b90506126656020830187611621565b61267260408301866125e7565b61267f60a0830185611743565b81810360c08301526126918184612602565b9050979650505050505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b60006126fa6033836116b2565b91506127058261269e565b604082019050919050565b60006020820190508181036000830152612729816126ed565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b600061278c6024836116b2565b915061279782612730565b604082019050919050565b600060208201905081810360008301526127bb8161277f565b9050919050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b60006127f86018836116b2565b9150612803826127c2565b602082019050919050565b60006020820190508181036000830152612827816127eb565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b600061288a603a836116b2565b91506128958261282e565b604082019050919050565b600060208201905081810360008301526128b98161287d565b9050919050565b600080fd5b600080fd5b600080fd5b6000823560016040038336030381126128eb576128ea6128c0565b5b80830191505092915050565b61290081612180565b811461290b57600080fd5b50565b6000813561291b816128f7565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61295d84612924565b9350801983169250808416831791505092915050565b600061298e61298961298484612180565b611c6b565b612180565b9050919050565b6000819050919050565b6129a882612973565b6129bb6129b482612995565b8354612931565b8255505050565b600080833560016020038436030381126129df576129de6128c0565b5b80840192508235915067ffffffffffffffff821115612a0157612a006128c5565b5b602083019250600182023603831315612a1d57612a1c6128ca565b5b509250929050565b612a30838383611d93565b505050565b600081016000830180612a478161290e565b9050612a53818461299f565b5050506001810160208301612a6881856129c2565b612a73818386612a25565b505050505050565b612a858282612a35565b5050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b6000612abf601a836116b2565b9150612aca82612a89565b602082019050919050565b60006020820190508181036000830152612aee81612ab2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612b2f82611477565b9150612b3a83611477565b925082612b4a57612b49612af5565b5b82820690509291505056fea2646970667358221220c5398d4ced267e33ea7156eece7a41020e945cd53dfaff5448c334f13f7b1e6064736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index a06b2d3..87341de 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -17,9 +17,9 @@ import './App.css'; import useList from './utils/List'; import { getContractAddressByChainId } from './utils/contract-config'; import Web3Context from './contexts/Web3Context'; -import DAOArtifact from './assets/DAO.json'; -import Work1Artifact from './assets/Work1.json'; -import OnboardingArtifact from './assets/Onboarding.json'; +import DAOArtifact from '../contractArtifacts/DAO.json'; +import Work1Artifact from '../contractArtifacts/Work1.json'; +import OnboardingArtifact from '../contractArtifacts/Onboarding.json'; import WorkContract from './components/work-contracts/WorkContract'; import AddPostModal from './components/posts/AddPostModal'; import ViewPostModal from './components/posts/ViewPostModal'; diff --git a/frontend/src/components/Proposals.jsx b/frontend/src/components/Proposals.jsx index 808b7e7..d29fcfd 100644 --- a/frontend/src/components/Proposals.jsx +++ b/frontend/src/components/Proposals.jsx @@ -7,7 +7,7 @@ import Button from 'react-bootstrap/esm/Button'; import Stack from 'react-bootstrap/esm/Stack'; import useList from '../utils/List'; import Web3Context from '../contexts/Web3Context'; -import ProposalsArtifact from '../assets/Proposals.json'; +import ProposalsArtifact from '../../contractArtifacts/Proposals.json'; import { getContractAddressByChainId } from '../utils/contract-config'; import AddPostModal from './posts/AddPostModal'; import ViewPostModal from './posts/ViewPostModal'; diff --git a/frontend/src/components/posts/AddPostModal.jsx b/frontend/src/components/posts/AddPostModal.jsx index 3f93311..3c9cdde 100644 --- a/frontend/src/components/posts/AddPostModal.jsx +++ b/frontend/src/components/posts/AddPostModal.jsx @@ -38,7 +38,7 @@ function AddPostModal({ }, [provider, DAO, account, content, setShow, postToBlockchain, onSubmit]); return ( - + {title} diff --git a/frontend/src/components/posts/ViewPostModal.jsx b/frontend/src/components/posts/ViewPostModal.jsx index 3695c70..257d690 100644 --- a/frontend/src/components/posts/ViewPostModal.jsx +++ b/frontend/src/components/posts/ViewPostModal.jsx @@ -7,41 +7,57 @@ function ViewPostModal({ show, setShow, title, post, }) { const handleClose = () => setShow(false); - const { content, authors, embeddedData } = post; + const { + content, authors, embeddedData, citations, + } = post; const embeddedDataJson = JSON.stringify(embeddedData, null, 2); return ( - + {title} -
- Authors: - - {authors?.map(({ authorAddress, weightPercent }) => ( -
- {authorAddress} - {' '} - {weightPercent.toString()} - % -
- ))} -
- -
+
Authors
+ + {authors?.map(({ authorAddress, weightPercent }) => ( +
+ {authorAddress} + {' '} + {weightPercent.toString()} + % +
+ ))} +

{content}

- {embeddedData && Object.entries(embeddedData).length && ( +
+ {embeddedData && Object.entries(embeddedData).length > 0 && (
             {embeddedDataJson}
           
)} + {citations && citations.length > 0 && ( + <> +
+
Citations
+ + {citations.map(({ weightPercent, targetPostId }) => ( +
+ {targetPostId} + {' '} + {weightPercent.toString()} + % +
+ ))} +
+ + )}