├── src
├── css
│ ├── products.css
│ ├── title.css
│ ├── Authenticate.css
│ ├── mainBar.css
│ ├── connectWallet.css
│ ├── distributors.css
│ ├── distributorform.css
│ ├── sidebar.css
│ └── home.css
├── setupTests.js
├── App.test.js
├── components
│ ├── Title.js
│ ├── MainBar.js
│ ├── VendorForm.css
│ ├── Dashboard.js
│ ├── Distributors.js
│ ├── TrackProducts.js
│ ├── Home.js
│ ├── SideBar.js
│ ├── getStarted.js
│ ├── Authenticate.js
│ ├── DistributorForm.js
│ └── VendorForm.js
├── index.css
├── reportWebVitals.js
├── index.js
├── logo.svg
├── App.css
├── App.js
└── utils
│ └── AssetTracker.json
├── public
├── robots.txt
├── favicon.ico
├── logo192.png
├── logo512.png
├── assets
│ └── images
│ │ ├── qr-code.png
│ │ ├── distributor.png
│ │ ├── light-theme.png
│ │ ├── manufacturer.png
│ │ └── qr-code-scan.png
├── manifest.json
└── index.html
├── .gitignore
├── package.json
└── README.md
/src/css/products.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/css/title.css:
--------------------------------------------------------------------------------
1 | .title {
2 | color: #551a8a;
3 | text-align: center;
4 | }
5 |
--------------------------------------------------------------------------------
/src/css/Authenticate.css:
--------------------------------------------------------------------------------
1 | .cam {
2 | display: flex;
3 | justify-content: center;
4 | }
5 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/logo512.png
--------------------------------------------------------------------------------
/public/assets/images/qr-code.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/assets/images/qr-code.png
--------------------------------------------------------------------------------
/public/assets/images/distributor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/assets/images/distributor.png
--------------------------------------------------------------------------------
/public/assets/images/light-theme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/assets/images/light-theme.png
--------------------------------------------------------------------------------
/public/assets/images/manufacturer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/assets/images/manufacturer.png
--------------------------------------------------------------------------------
/public/assets/images/qr-code-scan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/assets/images/qr-code-scan.png
--------------------------------------------------------------------------------
/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render( );
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/src/components/Title.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "../css/title.css";
3 |
4 | function Title(props) {
5 | return (
6 |
7 |
{props.title}
8 |
9 | );
10 | }
11 |
12 | export default Title;
13 |
--------------------------------------------------------------------------------
/src/css/mainBar.css:
--------------------------------------------------------------------------------
1 | #box-container {
2 | margin: 0px;
3 | width: 75%;
4 | height: 93vh;
5 | background-color: var(--light-bg);
6 | border-radius: 40px;
7 | padding: 1rem 6rem;
8 | box-sizing: border-box;
9 | overflow-y: scroll;
10 | }
11 |
12 | #page-title {
13 | color: var(--lightPrimaryColor);
14 | margin: 2.5rem 0px;
15 | font-size: 3rem;
16 | }
17 |
--------------------------------------------------------------------------------
/src/components/MainBar.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "../css/mainBar.css";
3 |
4 | const MainBar = ({ pageTitle, children }) => {
5 | return (
6 |
7 |
8 |
{pageTitle}
9 |
10 | {children}
11 |
12 | );
13 | };
14 |
15 | export default MainBar;
16 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
4 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env
17 | .env.local
18 | .env.development.local
19 | .env.test.local
20 | .env.production.local
21 | .env.staging
22 |
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 |
--------------------------------------------------------------------------------
/src/components/VendorForm.css:
--------------------------------------------------------------------------------
1 | .VendorInfo {
2 | width: 80%;
3 | height: 30px;
4 | margin-bottom: 2px;
5 | }
6 | tr {
7 | height: 90px;
8 | }
9 | .cell-input {
10 | height: 40px;
11 | text-align: center;
12 | }
13 | .label {
14 | margin: 10px;
15 | }
16 | .info-container {
17 | display: flex;
18 | flex-direction: column;
19 | }
20 | .getAssetById {
21 | display: flex;
22 | }
23 | .btn {
24 | cursor: pointer;
25 | width: "140px";
26 | height: "50px";
27 | }
28 |
--------------------------------------------------------------------------------
/src/css/connectWallet.css:
--------------------------------------------------------------------------------
1 | .connectWalletBtn {
2 | text-decoration: none;
3 | /* border: 3px solid FEF8F8; */
4 | color: #551a8a;
5 | padding: 10px 60px;
6 | font-size: 28px;
7 | font-family: sans-serif;
8 | letter-spacing: 5px;
9 | transition: all 0.5s;
10 | position: relative;
11 | cursor: pointer;
12 | background-color: white;
13 | border-radius: 20px;
14 | }
15 | .connectWalletContainer {
16 | display: flex;
17 | justify-content: center;
18 | }
19 | .img {
20 | height: 30px;
21 | }
22 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom";
3 | import "./index.css";
4 | import App from "./App";
5 | import reportWebVitals from "./reportWebVitals";
6 |
7 | ReactDOM.render(
8 |
9 |
10 | ,
11 | document.getElementById("root")
12 | );
13 |
14 | // If you want to start measuring performance in your app, pass a function
15 | // to log results (for example: reportWebVitals(console.log))
16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
17 | reportWebVitals();
18 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/src/css/distributors.css:
--------------------------------------------------------------------------------
1 | .styled-table {
2 | border-collapse: collapse;
3 | /* margin: 25px; */
4 | font-size: 0.9em;
5 | font-family: sans-serif;
6 | min-width: 600px;
7 | box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
8 | margin: 0px auto;
9 | }
10 | .styled-table thead tr {
11 | background-color: #551a8b;
12 | color: #ffffff;
13 | text-align: left;
14 | height: 50px;
15 | }
16 | .styled-table th,
17 | .styled-table td {
18 | padding: 12px 15px;
19 | }
20 | .styled-table tbody tr {
21 | border-bottom: 1px solid #dddddd;
22 | }
23 |
24 | .styled-table tbody tr:last-of-type {
25 | border-bottom: 2px solid #551a8a;
26 | }
27 | .styled-table tbody tr.active-row {
28 | font-weight: bold;
29 | color: #551a8a;
30 | }
31 |
--------------------------------------------------------------------------------
/src/components/Dashboard.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { Outlet, useLocation } from "react-router-dom";
3 | import SideBar from "./SideBar";
4 | import MainBar from "./MainBar";
5 | import "../css/products.css";
6 |
7 | const Greetings = () => {
8 | return (
9 | //
10 |
11 | {/* */}
12 |
13 | Navigate to profile to view all your registered details
14 |
15 |
16 | Navigate to Track Products to track status of all of your products added
17 | to our system
18 |
19 |
20 | Navigate to Add Products to publish a new product to our system
21 |
22 |
23 | //
24 | );
25 | };
26 |
27 | const Dashboard = () => {
28 | const { pathname } = useLocation();
29 | const arrURL = pathname.split("/");
30 | let currentPageURL = arrURL[2];
31 | let isLinkPage;
32 | if (arrURL.length >= 3) {
33 | isLinkPage = arrURL[2] === "";
34 | } else {
35 | isLinkPage = true;
36 | }
37 |
38 | return (
39 |
40 | ;{isLinkPage && }
41 |
42 |
43 | );
44 | };
45 |
46 | export default Dashboard;
47 |
--------------------------------------------------------------------------------
/src/components/Distributors.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from "react";
2 | import "../css/distributors.css";
3 | import Title from "./Title";
4 | import MainBar from "./MainBar";
5 | import { useNavigate } from "react-router-dom";
6 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
7 |
8 | function Distributors({ contract, account }) {
9 | const navigate = useNavigate();
10 | const [distributors, setDistributors] = useState([]);
11 |
12 | const getDistributor = async () => {
13 | try {
14 | const di = await contract.getAlldistributors();
15 | console.log(di);
16 |
17 | setDistributors(di);
18 | } catch (e) {
19 | console.log(e);
20 | }
21 | };
22 |
23 | useEffect(() => {
24 | getDistributor();
25 | }, []);
26 |
27 | return (
28 | distributors && (
29 |
30 |
31 |
32 |
33 | id
34 | Name
35 | Address
36 | Email
37 | Phone
38 |
39 |
40 |
41 | {distributors.map((d, i) => (
42 |
43 | {i}
44 | {d.name}
45 | {d.add}
46 | {d.email}
47 | {d.phone}
48 |
49 | ))}
50 |
51 |
52 |
53 | )
54 | );
55 | }
56 |
57 | export default Distributors;
58 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "asset-tracker",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@fortawesome/fontawesome-svg-core": "^6.1.1",
7 | "@fortawesome/free-solid-svg-icons": "^6.1.1",
8 | "@fortawesome/react-fontawesome": "^0.1.18",
9 | "@testing-library/jest-dom": "^5.16.2",
10 | "@testing-library/react": "^12.1.2",
11 | "@testing-library/user-event": "^13.5.0",
12 | "axios": "^0.26.1",
13 | "env-cmd": "^10.1.0",
14 | "ethers": "^5.5.4",
15 | "qrcode.react": "^1.0.1",
16 | "react": "^17.0.2",
17 | "react-dom": "^17.0.2",
18 | "react-form": "^4.0.1",
19 | "react-modal": "^3.14.4",
20 | "react-qr-reader": "^3.0.0-beta-1",
21 | "react-router-link": "^2.0.2",
22 | "react-scripts": "5.0.0",
23 | "react-table": "^7.7.0",
24 | "styled-components": "^5.3.3",
25 | "web-vitals": "^2.1.4"
26 | },
27 | "scripts": {
28 | "start": "react-scripts start",
29 | "build:staging": "env-cmd -f .env.staging react-scripts build",
30 | "build:production": "env-cmd -f .env.production react-scripts build",
31 | "test": "react-scripts test",
32 | "eject": "react-scripts eject"
33 | },
34 | "eslintConfig": {
35 | "extends": [
36 | "react-app",
37 | "react-app/jest"
38 | ]
39 | },
40 | "browserslist": {
41 | "production": [
42 | ">0.2%",
43 | "not dead",
44 | "not op_mini all"
45 | ],
46 | "development": [
47 | "last 1 chrome version",
48 | "last 1 firefox version",
49 | "last 1 safari version"
50 | ]
51 | },
52 | "devDependencies": {
53 | "react-router-dom": "^6.3.0"
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/src/components/TrackProducts.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from "react";
2 | import Title from "./Title";
3 | import MainBar from "./MainBar";
4 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
5 | import { useNavigate } from "react-router-dom";
6 |
7 | function TrackProducts({ contract, account }) {
8 | const navigate = useNavigate();
9 | const [assets, setAssets] = useState([]);
10 |
11 | const getAssets = async () => {
12 | try {
13 | let a = await contract.getAllAssets();
14 | setAssets(a);
15 | } catch (e) {
16 | console.log(e);
17 | }
18 | };
19 |
20 | useEffect(() => {
21 | getAssets();
22 | }, []);
23 | return (
24 |
25 |
26 |
27 |
28 |
29 | Distributor Id
30 | Name
31 | Description
32 | Cost
33 | Quantity
34 | Vendor
35 | Consumer
36 | Address From
37 | Address To
38 | Intialized
39 | Arrived
40 |
41 |
42 |
43 | {assets.map((d, i) => (
44 |
45 | {d[10].toString()}
46 | {d[0]}
47 | {d[1]}
48 | {d[2].toString()}
49 | {d[3].toString()}
50 | {d[4].toString()}
51 | {d[5].toString()}
52 | {d[6].toString()}
53 | {d[7].toString()}
54 | {d[8].toString()}
55 | {d[9].toString()}
56 |
57 | ))}
58 |
59 |
60 |
61 | );
62 | }
63 |
64 | export default TrackProducts;
65 |
--------------------------------------------------------------------------------
/src/css/distributorform.css:
--------------------------------------------------------------------------------
1 | body {
2 | min-height: 100vh;
3 | width: 100vw;
4 | }
5 |
6 | .form {
7 | height: auto;
8 | width: 600px;
9 | /* background-image: linear-gradient(
10 | to bottom right,
11 | rgba(255, 255, 255, 0.3) 0%,
12 | rgba(255, 255, 255, 0.1) 100%
13 | ); */
14 | background-color: #F7FAFF;
15 | position: absolute;
16 | transform: translate(-50%, -50%);
17 | top: 50%;
18 | left: 50%;
19 | border-radius: 10px;
20 | backdrop-filter: blur(6px);
21 |
22 | border-top: 1px solid rgba(255, 255, 255, 0.5);
23 | border-left: 1px solid rgba(255, 255, 255, 0.5);
24 | box-shadow: rgba(255, 255, 255, 0.5) -20px -20px 45px inset,
25 | rgba(0, 0, 0, 0.1) 10px 10px 20px, rgba(0, 0, 0, 0.06) 5px 5px 10px;
26 | padding: 35px;
27 | font-size: large;
28 | font-weight: 900;
29 | }
30 | .form * {
31 | font-family: "Poppins", sans-serif;
32 |
33 | letter-spacing: 0.5px;
34 | outline: none;
35 | border: none;
36 | }
37 | .form h2 {
38 | font-size: 32px;
39 | font-weight: 900;
40 | line-height: 42px;
41 | text-align: center;
42 | }
43 |
44 | .form-title{
45 | color: var(--primaryColor);
46 | }
47 |
48 | .lable {
49 | display: block;
50 | /* margin-top: 1rem; */
51 | /* font-size: 16px; */
52 | font-weight: 500;
53 | font-size: 2.5rem;
54 | margin: 1rem 0px;
55 | color: #42427d;
56 | opacity: 0.9;
57 | /* color: brown; */
58 | }
59 | .input {
60 | display: block;
61 | height: 50px;
62 | width: 100%;
63 | background-color: rgba(255, 255, 255, 0.1);
64 | border: 0.75px solid #000000;
65 | border-radius: 3px;
66 | padding: 0 10px;
67 | margin-top: 9px;
68 | font-size: 14px;
69 | font-weight: 300;
70 | }
71 |
72 | .button {
73 | display: block;
74 | width: 50%;
75 | background-image: linear-gradient(
76 | -45deg,
77 | rgba(9, 28, 60, 1) 0%,
78 | rgba(67, 46, 103, 1) 100%
79 | );
80 | color: white;
81 | padding: 15px 0;
82 | text-decoration: none;
83 | font-weight: 900;
84 | text-transform: uppercase;
85 | font-size: 14px;
86 | letter-spacing: 0.2em;
87 | border-radius: 5px;
88 | cursor: pointer;
89 | margin: 0px auto;
90 | margin-top: 3rem;
91 |
92 | }
93 |
--------------------------------------------------------------------------------
/src/components/Home.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "../css/home.css";
3 | import { NavLink } from "react-router-dom";
4 |
5 | const Home = ({ account }) => {
6 | return (
7 |
8 |
9 |
10 | Wallet Address:
11 | {account.substring(0, 4) +
12 | "..." +
13 | account.substring(account.length - 4, account.length)}
14 |
15 |
16 |
17 |
Welcome to Asset Tracker!
18 |
19 | A Blockchain Based Fake Product Detection 🕵️♀️
20 |
21 |
22 |
23 |
24 |
29 |
Manufacturer Login
30 |
31 |
32 |
33 |
34 |
39 |
Distributor Login
40 |
41 |
42 |
43 |
44 |
49 |
Authenticate Product
50 |
51 |
52 |
53 |
54 |
55 |
56 | );
57 | };
58 |
59 | export default Home;
60 |
--------------------------------------------------------------------------------
/src/css/sidebar.css:
--------------------------------------------------------------------------------
1 | /* .dashboard-container {
2 | min-height: 100vh;
3 | width: 100vw;
4 | }
5 | #sidebar-container {
6 | width: 90%;
7 | position: absolute;
8 | top: 20%;
9 | }
10 |
11 | #menu-item-container {
12 | width: 100%;
13 | display: flex;
14 | margin-left: 5%;
15 | justify-content: center;
16 | flex-direction: row;
17 | align-items: center;
18 | }
19 |
20 | .menu-item {
21 | margin-right: 100px;
22 | background-image: linear-gradient(
23 | to bottom right,
24 | rgba(255, 255, 255, 0.3) 0%,
25 | rgba(255, 255, 255, 0.1) 100%
26 | );
27 | backdrop-filter: blur(6px);
28 | border-radius: 12px;
29 |
30 | border-top: 1px solid rgba(255, 255, 255, 0.5);
31 | border-left: 1px solid rgba(255, 255, 255, 0.5);
32 |
33 | box-shadow: rgba(255, 255, 255, 0.5) -20px -20px 45px inset,
34 | rgba(0, 0, 0, 0.1) 10px 10px 20px, rgba(0, 0, 0, 0.06) 5px 5px 10px;
35 | position: relative;
36 | width: 90%;
37 |
38 | margin: 10px;
39 | height: 400px;
40 | display: flex;
41 |
42 | /* box-sizing: border-box; */
43 | /* } */
44 |
45 | /* .menu-link {
46 | text-decoration: none;
47 | display: flex;
48 | align-items: center;
49 | padding: 2rem;
50 | }
51 |
52 | .active-menu {
53 | background-color: var(--light-bg);
54 | border-radius: 20px 0px 0px 20px;
55 | }
56 |
57 | .menu-icon,
58 | .menu-title {
59 | font-size: 2rem;
60 | margin: 0px 1.5rem;
61 | color: "#ffafcc";
62 | } */
63 |
64 | #sidebar-container {
65 | width: 25%;
66 | /* width: 350px; */
67 | /* justify-content: flex-end; */
68 | }
69 |
70 | #menu-item-container {
71 | width: 100%;
72 | display: flex;
73 | height: 75vh;
74 | justify-content: center;
75 | flex-direction: column;
76 | align-items: flex-end;
77 | }
78 |
79 | .menu-item {
80 | width: 80%;
81 |
82 | /* box-sizing: border-box; */
83 | }
84 |
85 | .menu-link{
86 | text-decoration: none;
87 | display: flex;
88 | align-items: center;
89 | padding: 2rem;
90 | }
91 |
92 | .active-menu {
93 | background-color: var(--light-bg);
94 | border-radius: 20px 0px 0px 20px;
95 | }
96 |
97 | .menu-icon,
98 | .menu-title {
99 | font-size: 2rem;
100 | margin: 0px 1.5rem;
101 | color: var(--primaryColor);
102 | }
103 |
104 |
--------------------------------------------------------------------------------
/src/components/SideBar.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from "react";
2 | import { NavLink, Outlet } from "react-router-dom";
3 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
4 | import "../css/sidebar.css";
5 | import Title from "./Title";
6 | import { useNavigate } from "react-router-dom";
7 |
8 | const MenuItem = ({ iconName, title, isActive, url }) => {
9 | let menuClass = "menu-item";
10 | if (isActive) {
11 | menuClass += " active-menu";
12 | }
13 | return (
14 |
15 |
16 |
17 |
18 | {title}
19 |
20 |
21 | );
22 | };
23 |
24 | const SideBar = ({ contract, account, activeLink }) => {
25 | const navigate = useNavigate();
26 | return (
27 |
28 |
65 |
66 | );
67 | };
68 |
69 | export default SideBar;
70 |
--------------------------------------------------------------------------------
/src/components/getStarted.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import { Outlet, useLocation } from "react-router-dom";
3 | import SideBar from "./SideBar";
4 | import MainBar from "./MainBar";
5 | import "../css/products.css";
6 |
7 | const Greetings = () => {
8 | return (
9 | //
10 |
11 | {/* */}
12 |
13 | Navigate to profile to view all your registered details
14 |
15 |
16 | Navigate to Track Products to track status of all of your products added
17 | to our system
18 |
19 |
20 | Navigate to Add Products to publish a new product to our system
21 |
22 |
23 | //
24 | );
25 | };
26 |
27 | const GetStarted = ({ contract, account }) => {
28 | console.log("get started", account);
29 | const [show, setShow] = useState(false);
30 | const { pathname } = useLocation();
31 |
32 | console.log(account);
33 |
34 | const checkAccount = () => {
35 | setShow(account === process.env.REACT_APP_WALLET_ADD);
36 | };
37 |
38 | useEffect(() => {
39 | checkAccount();
40 | }, []);
41 |
42 | if (!show) {
43 | return (
44 |
45 |
46 |
OOPs 🙊 your company is not registerd
47 |
48 | Please do register your company to avail our services
49 |
50 |
51 |
Proceed to the Home Page
52 |
53 |
54 | );
55 | }
56 | const arrURL = pathname.split("/");
57 | let currentPageURL = arrURL[2];
58 | let isLinkPage;
59 | if (arrURL.length >= 3) {
60 | isLinkPage = arrURL[2] === "";
61 | } else {
62 | isLinkPage = true;
63 | }
64 |
65 | return (
66 |
67 |
72 | {isLinkPage && }
73 |
74 |
75 | );
76 | };
77 |
78 | export default GetStarted;
79 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
19 |
25 |
29 |
30 |
37 |
46 | React App
47 |
48 |
49 | You need to enable JavaScript to run this app.
50 |
51 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/src/components/Authenticate.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import { QrReader } from "react-qr-reader";
3 | import axios from "axios";
4 |
5 | import "../css/Authenticate.css";
6 | const Authenticate = ({ account }) => {
7 | const [auth, setAuth] = useState(false);
8 | const [message, setMessage] = useState("");
9 | return (
10 | <>
11 |
12 |
13 | Wallet Address:{" "}
14 | {account.substring(0, 4) +
15 | "..." +
16 | account.substring(account.length - 4, account.length)}
17 |
18 |
19 |
20 | Hold QR Code Steady and Clear to Scan
21 |
22 |
{
24 | if (!!result && !!result?.text) {
25 | let data = JSON.parse(result?.text);
26 | if (data.hash) {
27 | let res = await axios.get(
28 | `https://api-rinkeby.etherscan.io/api?module=proxy&action=eth_getTransactionByHash&txhash=${data.hash}&apikey=${process.env.REACT_APP_ETHERSCAN_API_KEY}`
29 | );
30 | if (res) {
31 | setMessage("Product is Authenticated ✅");
32 | setAuth(true);
33 | }
34 | }
35 | }
36 | if (!!error) {
37 | console.info(error);
38 | }
39 | }}
40 | style={{ width: "100%" }}
41 | />
42 |
52 |
53 |
{message}
54 |
55 |
56 |
57 |
58 | Please wait for 15 sec if Authentication messages is not appearing
59 | on the screen then your product is not Authenticated.
60 |
61 |
62 | Please reload the page to Scan again.
63 |
64 |
65 | >
66 | );
67 | };
68 |
69 | export default Authenticate;
70 |
--------------------------------------------------------------------------------
/src/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | @import url("https://fonts.googleapis.com/css2?family=IBM+Plex+Serif:wght@300&family=Shadows+Into+Light&display=swap");
2 |
3 | :root {
4 | --primaryColor: #42427d;
5 | --lightPrimaryColor: #5840bb;
6 | --secondaryColor:#7979B2;
7 | --light-bg: #e5eff7;
8 | }
9 |
10 |
11 | html {
12 | font-size: 10px;
13 | }
14 |
15 | ::-webkit-scrollbar {
16 | width: 0; /* Remove scrollbar space */
17 | background: transparent; /* Optional: just make scrollbar invisible */
18 | }
19 |
20 | * {
21 | padding: 0;
22 | margin: 0;
23 | box-sizing: border-box;
24 | font-family: "IBM Plex Serif", serif !important;
25 | }
26 | body {
27 | background-image: url("../public/assets/images/light-theme.png");
28 | background-position: center;
29 | background-size: cover;
30 | }
31 |
32 | .connectWalletContainer {
33 | height: 300px;
34 | width: 400px;
35 | background-image: linear-gradient(
36 | to bottom right,
37 | rgba(255, 255, 255, 0.3) 0%,
38 | rgba(255, 255, 255, 0.1) 100%
39 | );
40 | position: absolute;
41 | transform: translate(-50%, -50%);
42 | top: 50%;
43 | left: 50%;
44 | border-radius: 10px;
45 | backdrop-filter: blur(6px);
46 |
47 | border-top: 1px solid rgba(255, 255, 255, 0.5);
48 | border-left: 1px solid rgba(255, 255, 255, 0.5);
49 | box-shadow: rgba(255, 255, 255, 0.5) -20px -20px 45px inset,
50 | rgba(0, 0, 0, 0.1) 10px 10px 20px, rgba(0, 0, 0, 0.06) 5px 5px 10px;
51 | padding: 50px 35px;
52 | font-size: large;
53 | font-weight: 900;
54 | }
55 | .img {
56 | height: 30px;
57 | }
58 | .connectWalletBtn {
59 | text-decoration: none;
60 | /* border: 3px solid FEF8F8; */
61 | color: #551a8a;
62 | padding: 10px 60px;
63 | font-size: 28px;
64 | font-family: sans-serif;
65 | letter-spacing: 5px;
66 | transition: all 0.5s;
67 | position: relative;
68 | cursor: pointer;
69 | background: none;
70 | border-radius: 20px;
71 | }
72 |
73 |
74 | .main-container{
75 | width: 100%;
76 | /* height: 97vh; */
77 | padding: 2.5rem;
78 | display: flex;
79 | box-sizing: border-box;
80 | }
81 |
82 | .primary-txt{
83 | font-size: 2.5rem;
84 | color: var(--lightPrimaryColor);
85 | }
86 |
87 | .secondary-txt{
88 | font-size: 2rem;
89 | color: var(--secondaryColor);
90 | }
91 |
92 | .nav-link-btn{
93 | text-decoration: none;
94 | display: flex;
95 | align-items: center;
96 | }
97 |
98 |
99 | .primary-btn{
100 | min-width: 100px;
101 | background-color: var(--lightPrimaryColor);
102 | color: white;
103 | padding: 1rem 2rem;
104 | /* border-radius: 25px; */
105 | border: none;
106 | box-shadow: 4px 0px 20px rgba(0, 0, 0, 0.15);
107 | border-radius: 15px 5px;
108 | cursor: pointer;
109 | }
110 |
111 | .two-div-flex{
112 | display: flex;
113 | justify-content: space-between;
114 | align-items: center;
115 | flex-wrap: wrap;
116 | padding-right: 3rem;
117 | }
118 |
119 | .wallet-addr-txt{
120 | font-size: 1.5rem;
121 | color: var(--lightPrimaryColor);
122 |
123 | }
--------------------------------------------------------------------------------
/src/css/home.css:
--------------------------------------------------------------------------------
1 | /*
2 | initiall css for home page
3 | .container {
4 | min-height: 100vh;
5 | width: 100vw;
6 | }
7 |
8 | .bg {
9 | position: fixed;
10 | top: 50%;
11 | left: 50%;
12 |
13 | display: flex;
14 | align-items: center;
15 |
16 | transform: translate(-50%, -50%);
17 | }
18 |
19 | .panel {
20 | margin-right: 100px;
21 | background-image: linear-gradient(
22 | to bottom right,
23 | rgba(255, 255, 255, 0.3) 0%,
24 | rgba(255, 255, 255, 0.1) 100%
25 | );
26 | backdrop-filter: blur(6px);
27 | border-radius: 12px;
28 | width: 320px;
29 | border-top: 1px solid rgba(255, 255, 255, 0.5);
30 | border-left: 1px solid rgba(255, 255, 255, 0.5);
31 | padding: 60px;
32 | box-shadow: rgba(255, 255, 255, 0.5) -20px -20px 45px inset,
33 | rgba(0, 0, 0, 0.1) 10px 10px 20px, rgba(0, 0, 0, 0.06) 5px 5px 10px;
34 | position: relative;
35 | }
36 |
37 | h2 {
38 | font-size: 2em;
39 | font-weight: 1000;
40 | margin-top: 0;
41 | }
42 |
43 | .card__text {
44 | font-size: 14px;
45 | line-height: 1.45;
46 | opacity: 0.8;
47 | margin-bottom: 2em;
48 | }
49 |
50 | .button {
51 | display: inline-block;
52 | padding: 1.5em 3em;
53 | background-image: linear-gradient(
54 | -45deg,
55 | rgba(9, 28, 60, 1) 0%,
56 | rgba(67, 46, 103, 1) 100%
57 | );
58 | text-decoration: none;
59 | font-weight: 900;
60 | text-transform: uppercase;
61 | font-size: 14px;
62 | letter-spacing: 0.2em;
63 | border-radius: 10em;
64 | color: white;
65 | }
66 |
67 | */
68 |
69 | #login-type-container {
70 | height: 100vh;
71 | width: 100%;
72 | display: flex;
73 | justify-content: center;
74 | align-items: center;
75 | }
76 |
77 | #login-type {
78 | width: 80%;
79 | min-width:800px;
80 | max-width: 1200px;
81 | /* min-width: 600px; */
82 | color: var(--lightPrimaryColor);
83 | font-family: "Courgette", cursive;
84 | text-align: center;
85 |
86 | }
87 |
88 | #greetings {
89 | font-size: 6.5rem;
90 | margin-bottom: 0.5rem;
91 | }
92 | #subtitle-txt {
93 | font-size: 3rem;
94 | margin-bottom: 5rem;
95 | }
96 |
97 | #options-container {
98 | display: flex;
99 | justify-content: space-around;
100 | }
101 |
102 | @media (max-width: 800px) {
103 | #login-type-container {
104 | height: auto;
105 | width: 100%;
106 | }
107 | #login-type {
108 | width: 100%;
109 | padding: 30px;
110 | min-width: 0px;
111 | }
112 | #options-container {
113 | display: flex;
114 | flex-direction: column;
115 | }
116 |
117 | .options {
118 | margin: 10px 5px;
119 | }
120 | }
121 |
122 | .options-image {
123 | width: 240px;
124 | height: 240px;
125 | display: block;
126 | margin: 0px auto;
127 | }
128 |
129 | .options-image-caption {
130 | margin-top: 24px;
131 | color: var(--primaryColor);
132 | font-family: "Inter", sans-serif;
133 | font-size: 3rem;
134 | text-align: center;
135 | }
136 |
137 | .select-link{
138 | text-decoration: none;
139 | }
140 |
141 | @media (min-width:800px) and (max-width: 1000px) {
142 | .options-image {
143 | width: 160px;
144 | height: 160px;
145 | display: block;
146 | margin: 0px auto;
147 | }
148 | }
--------------------------------------------------------------------------------
/src/components/DistributorForm.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
3 | import { useNavigate } from "react-router-dom";
4 | import "../css/distributorform.css";
5 | import Title from "./Title";
6 | import Modal from "react-modal";
7 |
8 | const DistributorForm = ({ contract, account }) => {
9 | const customStyle = {
10 | content: {
11 | top: "40%",
12 | left: "50%",
13 | right: "auto",
14 | bottom: "auto",
15 | marginRight: "-50%",
16 | transform: "translate(-50%, -50%)",
17 | width: "600px",
18 | height: "250px",
19 | borderRadius: "20px",
20 | },
21 | };
22 | const navigate = useNavigate();
23 |
24 | const [state, setState] = useState({
25 | name: "",
26 | address: "",
27 | email: "",
28 | phone: "",
29 | });
30 | const [modalIsOpen, setIsOpen] = React.useState(false);
31 | const [message, setMessage] = useState("Register");
32 | const closeModal = () => {
33 | setIsOpen(false);
34 | };
35 |
36 | const handler = (e) => {
37 | e.preventDefault();
38 | const val = e.target.value;
39 | setState({ ...state, [e.target.name]: val });
40 | console.log(e.target.value);
41 | };
42 |
43 | const Submit = async (e) => {
44 | e.preventDefault();
45 | if (!state.name || !state.address || !state.email || !state.phone) {
46 | setMessage("Please fill all the fields");
47 | } else {
48 | setMessage("Registering...");
49 | try {
50 | let createDistributor = await contract.insertDistributor(
51 | state.name,
52 | state.address,
53 | state.email,
54 | state.phone
55 | );
56 | await createDistributor.wait();
57 | console.log(createDistributor.hash);
58 | setMessage("Register");
59 | setIsOpen(true);
60 | } catch (e) {
61 | setMessage("Distributor Already Exits");
62 | console.log(e);
63 | }
64 | }
65 | };
66 |
67 | return (
68 |
69 |
75 |
76 |
Your have successfully Registerated.. 🚀
77 |
You will get a mail if vendor assigns you a dispatch order
78 |
79 |
Proceed to the Home Page
80 |
81 |
82 |
92 |
93 |
94 |
95 |
96 | navigate(-1)}
101 | />
102 |
103 | Wallet Address:
104 | {account.substring(0, 4) +
105 | "..." +
106 | account.substring(account.length - 4, account.length)}
107 |
108 |
109 |
110 |
111 |
112 |
113 |
163 |
164 |
165 | );
166 | };
167 |
168 | export default DistributorForm;
169 |
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import "./App.css";
2 |
3 | import React, { useEffect, useState } from "react";
4 |
5 | import VendorForm from "./components/VendorForm";
6 | import { ethers } from "ethers";
7 | import { BrowserRouter, Routes, Route } from "react-router-dom";
8 | import DistributorForm from "./components/DistributorForm";
9 | import Home from "./components/Home";
10 | import AssetTracker from "./utils/AssetTracker.json";
11 |
12 | import { library } from "@fortawesome/fontawesome-svg-core";
13 | import { fas } from "@fortawesome/free-solid-svg-icons";
14 | import Products from "./components/TrackProducts";
15 | import Distributors from "./components/Distributors";
16 |
17 | import SideBar from "./components/SideBar";
18 |
19 | import Authenticate from "./components/Authenticate";
20 | import GetStarted from "./components/getStarted";
21 |
22 | const CONTRACT_ADDRESS = process.env.REACT_APP_CONTRACT_ADD;
23 |
24 | library.add(fas);
25 |
26 | const App = () => {
27 | console.log(process.env.REACT_APP_WALLET_ADD);
28 | const [currentAccount, setCurrentAccount] = useState("");
29 | const [wallet, setWallet] = useState("Please Connect Your Wallet to Proceed");
30 | const [contract, setContract] = useState(null);
31 |
32 | const checkIfWalletIsConnected = async () => {
33 | const { ethereum } = window;
34 |
35 | if (!ethereum) {
36 | console.log("Make sure you have metamask!");
37 | return;
38 | } else {
39 | console.log("We have the ethereum object", ethereum);
40 | }
41 |
42 | const accounts = await ethereum.request({ method: "eth_accounts" });
43 |
44 | if (accounts.length !== 0) {
45 | const account = accounts[0];
46 |
47 | console.log("Found an authorized account:", account);
48 | setWallet("Connected");
49 |
50 | setCurrentAccount(account);
51 |
52 | const provider = new ethers.providers.Web3Provider(ethereum);
53 | const signer = provider.getSigner();
54 | const contract = new ethers.Contract(
55 | CONTRACT_ADDRESS,
56 | AssetTracker.abi,
57 | signer
58 | );
59 | console.log("contract", contract);
60 | setContract(contract);
61 | } else {
62 | console.log("No authorized account found");
63 | }
64 | };
65 |
66 | const connectWallet = async () => {
67 | try {
68 | const { ethereum } = window;
69 |
70 | if (!ethereum) {
71 | alert("Get MetaMask!");
72 | return;
73 | }
74 |
75 | const accounts = await ethereum.request({
76 | method: "eth_requestAccounts",
77 | });
78 |
79 | console.log("Connected", accounts[0]);
80 |
81 | setWallet("Connected");
82 |
83 | setCurrentAccount(accounts[0]);
84 | const provider = new ethers.providers.Web3Provider(ethereum);
85 | const signer = provider.getSigner();
86 | const contract = new ethers.Contract(
87 | CONTRACT_ADDRESS,
88 | AssetTracker.abi,
89 | signer
90 | );
91 | setContract(contract);
92 | } catch (error) {
93 | console.log(error);
94 | }
95 | };
96 |
97 | useEffect(() => {
98 | checkIfWalletIsConnected();
99 | }, []);
100 |
101 | return (
102 | <>
103 | {contract ? (
104 |
105 |
106 | }>
107 | {/* }
110 | > */}
111 |
115 | }
116 | >
117 |
121 | }
122 | >
123 |
127 | }
128 | />
129 |
133 | }
134 | />
135 |
136 |
140 | }
141 | >
142 | {/*
146 | }
147 | >
148 |
152 | }
153 | />
154 |
158 | }
159 | /> */}
160 |
164 | }
165 | />
166 |
167 |
168 | ) : (
169 |
170 |
171 |
172 | {wallet == "Please Connect Your Wallet to Proceed" && (
173 |
174 | {" "}
180 | {wallet}
181 |
182 | )}
183 |
184 |
185 |
186 | )}
187 | >
188 | );
189 | };
190 |
191 | export default App;
192 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # About Fake Product Identification 🕵️♀️
2 | An app which will help to detect whether the product is authenticated or not using blockchain.
3 |
4 | ## The App has two panel :
5 | * ### Manufacturer
6 | * ### Distributor
7 |
8 | *Manufacturer* has the right to create the asset and based upon the unique hash returned after the transaction unique Qrcode is genereted which contains
9 | asset details and the unique hash of the asset.
10 |
11 | *Distributor* just need to register himself on the platform,no further functionalities is provided to the distributor,after the manufacturer create the asset he/she assign the registered distributor along with it,then selected distributor recieves the mail regarding the same to deliver the order.
12 |
13 | ## Then how will the distributor or the consumer can check wether the product is authenticate or not 🤔?
14 | Simply by proceeding to the authentication page where the *Distributor* or *Consumer* can scan the Qrcode pasted on the product and check for the authenticity of the product.
15 |
16 | # Work Flow
17 |
18 |
19 |
20 | # But why Blockchain?
21 | After going through multiple methodologies and techniques used in the market to ensure authenticity of a product . We came up with a decentralized solution to authenticate the products whether they are real or fake.One of the reasons behind opting for a decentralized system is that it is immutable, so there are no chances of tampering the data and they are public, so there is nothing like secrecy. As it will provide complete transparency to the users, manufactures,vendors and others.
22 |
23 | ### Demo Video
24 | https://www.loom.com/share/12e29a7cd8264662b218602e7e28c235
25 |
26 | ### Screenshots
27 |
28 | #### Home Page
29 |
30 |
31 | #### Manufacturer/TrackProduct
32 |
33 |
34 | #### Manufacturer/AddProduct
35 |
36 |
37 | #### Manufacturer/Available Distributors
38 |
39 |
40 | #### Distributor Registeration
41 |
42 |
43 |
44 | #### Authentication Page
45 |
46 |
47 |
48 | ### Backend Code
49 | https://github.com/rohit-raje-786/Fake-prodcut-identification-smart-contract
50 |
51 | # Getting Started with Create React App
52 |
53 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
54 |
55 | ## Available Scripts
56 |
57 | In the project directory, you can run:
58 |
59 | ### `npm start`
60 |
61 | Runs the app in the development mode.\
62 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
63 |
64 | The page will reload when you make changes.\
65 | You may also see any lint errors in the console.
66 |
67 | ### `npm test`
68 |
69 | Launches the test runner in the interactive watch mode.\
70 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
71 |
72 | ### `npm run build`
73 |
74 | Builds the app for production to the `build` folder.\
75 | It correctly bundles React in production mode and optimizes the build for the best performance.
76 |
77 | The build is minified and the filenames include the hashes.\
78 | Your app is ready to be deployed!
79 |
80 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
81 |
82 | ### `npm run eject`
83 |
84 | **Note: this is a one-way operation. Once you `eject`, you can't go back!**
85 |
86 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
87 |
88 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
89 |
90 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
91 |
92 | ## Learn More
93 |
94 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
95 |
96 | To learn React, check out the [React documentation](https://reactjs.org/).
97 |
98 | ### Code Splitting
99 |
100 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
101 |
102 | ### Analyzing the Bundle Size
103 |
104 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
105 |
106 | ### Making a Progressive Web App
107 |
108 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
109 |
110 | ### Advanced Configuration
111 |
112 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
113 |
114 | ### Deployment
115 |
116 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
117 |
118 | ### `npm run build` fails to minify
119 |
120 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
121 |
122 |
--------------------------------------------------------------------------------
/src/components/VendorForm.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from "react";
2 | import ReactDOM from "react-dom";
3 | import styled, { createGlobalStyle } from "styled-components";
4 | import { useForm, useField, splitFormProps } from "react-form";
5 | import { useTable } from "react-table";
6 | import QRCode from "qrcode.react";
7 | import Modal from "react-modal";
8 | import "./VendorForm.css";
9 | import axios from "axios";
10 | import { useNavigate } from "react-router-dom";
11 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
12 | import Title from "./Title";
13 | import MainBar from "./MainBar";
14 |
15 | const TableInput = (props) => {
16 | console.log("TableInput", props);
17 | const { column, row, cell, updateData } = props;
18 | const onChange = (e) => updateData(row.index, column.id, e.target.value);
19 | return (
20 |
26 | );
27 | };
28 |
29 | const ItemName = (props) => {
30 | console.log("ItemName", props);
31 | const { column, row, cell, updateData } = props;
32 | const onChange = (e) => updateData(row.index, column.id, e.target.value);
33 | return (
34 |
40 | );
41 | };
42 |
43 | const StyledTable = styled.table`
44 | width: 100%;
45 | border-collapse: collapse;
46 | th,
47 | td {
48 | width: 25%;
49 | text-align: center;
50 | border: 1px solid lightgray;
51 | padding: 5px;
52 | }
53 | `;
54 | const ReactTable = React.memo((props) => {
55 | console.log("ReactTable", props);
56 | const { setAmountDue } = props;
57 | const columns = React.useMemo(
58 | () => [
59 | {
60 | Header: "Item",
61 | accessor: "item",
62 | Cell: ItemName,
63 | },
64 | {
65 | Header: "Item Description",
66 | accessor: "description",
67 | Cell: ItemName,
68 | },
69 | {
70 | Header: "Cost (INR)",
71 | accessor: "cost",
72 | Cell: TableInput,
73 | },
74 | {
75 | Header: "Quantity",
76 | accessor: "quantity",
77 | Cell: TableInput,
78 | },
79 | {
80 | Header: "Total (INR)",
81 | accessor: (row) => row.cost * row.quantity,
82 | id: "total",
83 | },
84 | ],
85 | []
86 | );
87 | const initialData = [
88 | {
89 | item: "Vaccine",
90 | description: "Medicine",
91 | cost: 1,
92 | quantity: 2,
93 | },
94 | ];
95 | const [data, setData] = React.useState(initialData);
96 | const resetData = () => setData(initialData);
97 |
98 | const updateData = (rowIndex, columnID, value) => {
99 | setData((oldData) =>
100 | oldData.map((row, index) => {
101 | if (index === rowIndex) {
102 | return {
103 | ...oldData[rowIndex],
104 | [columnID]: value,
105 | };
106 | }
107 | return row;
108 | })
109 | );
110 | };
111 | const table = useTable({ columns, data, updateData });
112 | const { getTableProps, headerGroups, rows, prepareRow } = table;
113 | const tableSum = rows.reduce((sum, row) => sum + row.values.total, 0);
114 | console.log("setAmountDue", tableSum);
115 | setAmountDue(tableSum);
116 |
117 | const [modalIsOpen, setIsOpen] = React.useState(false);
118 | const [qrcode, setQrcode] = React.useState(null);
119 | const [hash, setHash] = React.useState(null);
120 | const [assetMessage, setAssetMessage] = React.useState("Create");
121 | const [assetModalIsOpen, setAssetModalIsOpen] = React.useState(false);
122 | const [assetDetails, setAssetDetails] = React.useState([]);
123 |
124 | const closeModal = () => {
125 | setQrcode(null);
126 | setIsOpen(false);
127 | };
128 |
129 | const assetcloseModal = () => {
130 | setAssetModalIsOpen(false);
131 | };
132 |
133 | const customStyles = {
134 | content: {
135 | top: "50%",
136 | left: "50%",
137 | right: "auto",
138 | bottom: "auto",
139 | marginRight: "-50%",
140 | transform: "translate(-50%, -50%)",
141 | width: "600px",
142 | height: "580px",
143 | borderRadius: "20px",
144 | backgroundClip: "text",
145 | },
146 | };
147 | const assetModalStyles = {
148 | content: {
149 | top: "50%",
150 | left: "50%",
151 | right: "auto",
152 | bottom: "auto",
153 | marginRight: "-50%",
154 | transform: "translate(-50%, -50%)",
155 | width: "600px",
156 | height: "400px",
157 | borderRadius: "20px",
158 | backgroundClip: "text",
159 | },
160 | };
161 |
162 | return (
163 | <>
164 |
171 |
174 |
175 |
185 |
186 |
187 |
188 |
195 |
196 |
Name:{assetDetails[0]}
197 | Description:{assetDetails[1]}
198 | Quantity:{assetDetails[8]}
199 | Cost:{assetDetails[7]}
200 | Manufacturer:{assetDetails[2]}
201 | Consumer:{assetDetails[3]}
202 | AddressFrom:{assetDetails[4]}
203 | AddressTo:{assetDetails[5]}
204 |
205 |
206 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 | {headerGroups.map((headerGroup) => (
224 |
225 | {headerGroup.headers.map((column) => (
226 | {column.render("Header")}
227 | ))}
228 |
229 | ))}
230 |
231 |
232 | {rows.map((row) => {
233 | prepareRow(row);
234 | return (
235 |
236 | {row.cells.map((cell) => (
237 | {cell.render("Cell")}
238 | ))}
239 |
240 | );
241 | })}
242 |
243 |
244 |
245 | Reset Table
246 |
247 |
248 |
249 | {
252 | console.log("id", props.distributorId);
253 | if (
254 | !data[0].item ||
255 | !data[0].description ||
256 | !data[0].cost ||
257 | !data[0].quantity ||
258 | !props.vendorName ||
259 | !props.consumerName ||
260 | !props.vendorAdd ||
261 | !props.consumerAdd ||
262 | !props.distributorId
263 | ) {
264 | setAssetMessage("Plese fill all the fields");
265 | } else {
266 | setAssetMessage("Creating...");
267 | e.preventDefault();
268 | console.log(
269 | data[0].item,
270 | data[0].description,
271 | data[0].cost,
272 | data[0].quantity,
273 | props.vendorName,
274 | props.consumerName,
275 | props.vendorAdd,
276 | props.consumerAdd,
277 | props.distributorId
278 | );
279 | let asset = await props.contract.createAsset(
280 | data[0].item,
281 | data[0].description,
282 | props.distributorId,
283 | data[0].cost,
284 | data[0].quantity,
285 | props.vendorName,
286 | props.consumerName,
287 | props.vendorAdd,
288 | props.consumerAdd
289 | );
290 | await asset.wait();
291 | console.log("asset created", asset.hash);
292 | setHash(asset.hash);
293 | if (asset.hash) {
294 | const info = {
295 | name: data[0].item,
296 | description: data[0].description,
297 | distributorId: props.distributorId,
298 | cost: data[0].cost,
299 | quantity: data[0].quantity,
300 | vendorName: props.vendorName,
301 | consumerName: props.consumerName,
302 | vendorAdd: props.vendorAdd,
303 | consumerAdd: props.consumerAdd,
304 | hash: asset.hash,
305 | };
306 | let strData = JSON.stringify(info);
307 | setQrcode(strData);
308 | try {
309 | let distributor = await props.contract.getDistributorbyId(
310 | props.distributorId
311 | );
312 | console.log(distributor[2]);
313 | if (distributor[2]) {
314 | let body = `Deliver to the given address: ${props.consumerAdd}`;
315 | const options = {
316 | method: "POST",
317 | url: "https://rapidprod-sendgrid-v1.p.rapidapi.com/mail/send",
318 | headers: {
319 | "content-type": "application/json",
320 | "X-RapidAPI-Host":
321 | "rapidprod-sendgrid-v1.p.rapidapi.com",
322 | "X-RapidAPI-Key":
323 | process.env.REACT_APP_RAPID_API_KEY,
324 | },
325 | data: `{"personalizations":[{"to":[{"email":"${distributor[2]}"}],"subject":"Dispatch Item"}],"from":{"email":"rp589006@gmail.com"},"content":[{"type":"text/plain","value":"${body}"}]}`,
326 | };
327 | axios
328 | .request(options)
329 | .then(function (response) {
330 | console.log("Email Succesfully Send");
331 | })
332 | .catch(function (error) {
333 | console.error("Unable to send the mail");
334 | });
335 | setAssetMessage("Create");
336 | setIsOpen(true);
337 | } else {
338 | console.log("distributor does not exixts");
339 | return;
340 | }
341 | } catch (e) {
342 | console.log(e);
343 | }
344 | } else {
345 | console.log("unable to create asset");
346 | }
347 | }
348 | }}
349 | className="btn"
350 | style={{ marginLeft: "40%" }}
351 | >
352 | {assetMessage}
353 |
354 |
355 |
356 |
357 | >
358 | );
359 | });
360 |
361 | const FormStyles = styled.div`
362 | form {
363 | margin: 10px;
364 | label {
365 | display: flex;
366 | justify-content: space-between;
367 | align-items: center;
368 | }
369 | aside {
370 | display: flex;
371 | justify-content: space-between;
372 | }
373 | section {
374 | flex: 1 1 auto;
375 | display: flex;
376 | flex-flow: column nowrap;
377 | }
378 | button {
379 | margin: 5px;
380 | padding: 5px;
381 | width: 100px;
382 | align-self: flex-end;
383 | }
384 | }
385 | `;
386 | const AmountDue = styled.label`
387 | margin: 10px;
388 | font-size: 1.5em;
389 | align-self: flex-end;
390 | `;
391 | const PaymentQRCode = styled(QRCode)`
392 | padding: 5px;
393 | align-self: flex-end;
394 | `;
395 |
396 | const ReactForm = (props) => {
397 | console.log("ReactForm", props);
398 | const navigate = useNavigate();
399 | const { amountDue, setAmountDue, distributors } = props;
400 | const defaultValues = React.useMemo(
401 | () => ({
402 | name: "Rohit",
403 | dashAddress: "Kalyan",
404 | dashAddressto: "Gujrat",
405 | notes: "Payment terms: Net 30",
406 | }),
407 | []
408 | );
409 | const onSubmit = async (values, instance) => {
410 | console.log("Form values:", values);
411 | instance.reset();
412 | };
413 | const form = useForm({ defaultValues, onSubmit });
414 | const { Form, values, meta } = form;
415 |
416 | const [vendorName, setVendorName] = React.useState("");
417 | const [vendorAdd, setVendorAdd] = React.useState("");
418 | const [consumerAdd, setConsumerAdd] = React.useState("");
419 | const [consumerName, setConsumerName] = React.useState("");
420 | const [distributorId, setDistributorId] = React.useState(0);
421 | return (
422 | <>
423 | {/* navigate(-1)}
428 | /> */}
429 |
430 |
431 |
512 |
513 | >
514 | );
515 | };
516 |
517 | const Main = styled.main`
518 | border-radius: 5px;
519 | padding: 10px;
520 | background: white;
521 | height: 100vh;
522 | h2 {
523 | text-align: center;
524 | }
525 | `;
526 | const Invoice = (props) => {
527 | console.log("Invoice", props);
528 | const [amountDue, setAmountDue] = React.useState(0);
529 |
530 | return (
531 |
532 |
539 |
540 | );
541 | };
542 |
543 | const App = (props) => {
544 | const [distributors, setDistributors] = useState([]);
545 | const getDistributors = async () => {
546 | let dis = await props.contract.getAlldistributors();
547 | setDistributors(dis);
548 | };
549 | useEffect(() => {
550 | getDistributors();
551 | }, []);
552 | return (
553 |
554 |
559 |
560 | );
561 | };
562 | export default App;
563 |
--------------------------------------------------------------------------------
/src/utils/AssetTracker.json:
--------------------------------------------------------------------------------
1 | {
2 | "_format": "hh-sol-artifact-1",
3 | "contractName": "AssetTracker",
4 | "sourceName": "contracts/AssetTracker.sol",
5 | "abi": [
6 | {
7 | "anonymous": false,
8 | "inputs": [
9 | {
10 | "indexed": false,
11 | "internalType": "string",
12 | "name": "name",
13 | "type": "string"
14 | },
15 | {
16 | "indexed": false,
17 | "internalType": "string",
18 | "name": "add",
19 | "type": "string"
20 | },
21 | {
22 | "indexed": false,
23 | "internalType": "string",
24 | "name": "email",
25 | "type": "string"
26 | },
27 | {
28 | "indexed": false,
29 | "internalType": "string",
30 | "name": "phone",
31 | "type": "string"
32 | }
33 | ],
34 | "name": "RejectDistributor",
35 | "type": "event"
36 | },
37 | {
38 | "inputs": [
39 | {
40 | "internalType": "uint256",
41 | "name": "i",
42 | "type": "uint256"
43 | }
44 | ],
45 | "name": "Arrived",
46 | "outputs": [],
47 | "stateMutability": "nonpayable",
48 | "type": "function"
49 | },
50 | {
51 | "inputs": [],
52 | "name": "assetCount",
53 | "outputs": [
54 | {
55 | "internalType": "uint256",
56 | "name": "",
57 | "type": "uint256"
58 | }
59 | ],
60 | "stateMutability": "view",
61 | "type": "function"
62 | },
63 | {
64 | "inputs": [
65 | {
66 | "internalType": "uint256",
67 | "name": "_amount",
68 | "type": "uint256"
69 | }
70 | ],
71 | "name": "balance",
72 | "outputs": [
73 | {
74 | "internalType": "bool",
75 | "name": "",
76 | "type": "bool"
77 | }
78 | ],
79 | "stateMutability": "pure",
80 | "type": "function"
81 | },
82 | {
83 | "inputs": [
84 | {
85 | "internalType": "string",
86 | "name": "name",
87 | "type": "string"
88 | },
89 | {
90 | "internalType": "string",
91 | "name": "description",
92 | "type": "string"
93 | },
94 | {
95 | "internalType": "uint256",
96 | "name": "distributorId",
97 | "type": "uint256"
98 | },
99 | {
100 | "internalType": "uint256",
101 | "name": "cost",
102 | "type": "uint256"
103 | },
104 | {
105 | "internalType": "uint256",
106 | "name": "quantity",
107 | "type": "uint256"
108 | },
109 | {
110 | "internalType": "string",
111 | "name": "manufacturer",
112 | "type": "string"
113 | },
114 | {
115 | "internalType": "string",
116 | "name": "customer",
117 | "type": "string"
118 | },
119 | {
120 | "internalType": "string",
121 | "name": "addressFrom",
122 | "type": "string"
123 | },
124 | {
125 | "internalType": "string",
126 | "name": "addressTo",
127 | "type": "string"
128 | }
129 | ],
130 | "name": "createAsset",
131 | "outputs": [],
132 | "stateMutability": "nonpayable",
133 | "type": "function"
134 | },
135 | {
136 | "inputs": [],
137 | "name": "distributorCount",
138 | "outputs": [
139 | {
140 | "internalType": "uint256",
141 | "name": "",
142 | "type": "uint256"
143 | }
144 | ],
145 | "stateMutability": "view",
146 | "type": "function"
147 | },
148 | {
149 | "inputs": [],
150 | "name": "getAllAssets",
151 | "outputs": [
152 | {
153 | "components": [
154 | {
155 | "internalType": "string",
156 | "name": "name",
157 | "type": "string"
158 | },
159 | {
160 | "internalType": "string",
161 | "name": "description",
162 | "type": "string"
163 | },
164 | {
165 | "internalType": "uint256",
166 | "name": "cost",
167 | "type": "uint256"
168 | },
169 | {
170 | "internalType": "uint256",
171 | "name": "quantity",
172 | "type": "uint256"
173 | },
174 | {
175 | "internalType": "string",
176 | "name": "manufacturer",
177 | "type": "string"
178 | },
179 | {
180 | "internalType": "string",
181 | "name": "customer",
182 | "type": "string"
183 | },
184 | {
185 | "internalType": "string",
186 | "name": "addressFrom",
187 | "type": "string"
188 | },
189 | {
190 | "internalType": "string",
191 | "name": "addressTo",
192 | "type": "string"
193 | },
194 | {
195 | "internalType": "bool",
196 | "name": "initialized",
197 | "type": "bool"
198 | },
199 | {
200 | "internalType": "bool",
201 | "name": "arrived",
202 | "type": "bool"
203 | },
204 | {
205 | "internalType": "uint256",
206 | "name": "distributorId",
207 | "type": "uint256"
208 | }
209 | ],
210 | "internalType": "struct AssetTracker.Asset[]",
211 | "name": "",
212 | "type": "tuple[]"
213 | }
214 | ],
215 | "stateMutability": "view",
216 | "type": "function"
217 | },
218 | {
219 | "inputs": [],
220 | "name": "getAlldistributors",
221 | "outputs": [
222 | {
223 | "components": [
224 | {
225 | "internalType": "uint256",
226 | "name": "id",
227 | "type": "uint256"
228 | },
229 | {
230 | "internalType": "string",
231 | "name": "name",
232 | "type": "string"
233 | },
234 | {
235 | "internalType": "string",
236 | "name": "add",
237 | "type": "string"
238 | },
239 | {
240 | "internalType": "string",
241 | "name": "email",
242 | "type": "string"
243 | },
244 | {
245 | "internalType": "string",
246 | "name": "phone",
247 | "type": "string"
248 | }
249 | ],
250 | "internalType": "struct AssetTracker.Person[]",
251 | "name": "",
252 | "type": "tuple[]"
253 | }
254 | ],
255 | "stateMutability": "view",
256 | "type": "function"
257 | },
258 | {
259 | "inputs": [
260 | {
261 | "internalType": "uint256",
262 | "name": "id",
263 | "type": "uint256"
264 | }
265 | ],
266 | "name": "getDistributorbyId",
267 | "outputs": [
268 | {
269 | "internalType": "string",
270 | "name": "",
271 | "type": "string"
272 | },
273 | {
274 | "internalType": "string",
275 | "name": "",
276 | "type": "string"
277 | },
278 | {
279 | "internalType": "string",
280 | "name": "",
281 | "type": "string"
282 | },
283 | {
284 | "internalType": "string",
285 | "name": "",
286 | "type": "string"
287 | }
288 | ],
289 | "stateMutability": "view",
290 | "type": "function"
291 | },
292 | {
293 | "inputs": [
294 | {
295 | "internalType": "uint256",
296 | "name": "i",
297 | "type": "uint256"
298 | }
299 | ],
300 | "name": "getItemByUUID",
301 | "outputs": [
302 | {
303 | "internalType": "uint256",
304 | "name": "cost",
305 | "type": "uint256"
306 | },
307 | {
308 | "internalType": "uint256",
309 | "name": "quantity",
310 | "type": "uint256"
311 | }
312 | ],
313 | "stateMutability": "view",
314 | "type": "function"
315 | },
316 | {
317 | "inputs": [
318 | {
319 | "internalType": "string",
320 | "name": "name",
321 | "type": "string"
322 | },
323 | {
324 | "internalType": "string",
325 | "name": "add",
326 | "type": "string"
327 | },
328 | {
329 | "internalType": "string",
330 | "name": "email",
331 | "type": "string"
332 | },
333 | {
334 | "internalType": "string",
335 | "name": "phone",
336 | "type": "string"
337 | }
338 | ],
339 | "name": "insertDistributor",
340 | "outputs": [
341 | {
342 | "internalType": "bool",
343 | "name": "",
344 | "type": "bool"
345 | }
346 | ],
347 | "stateMutability": "nonpayable",
348 | "type": "function"
349 | },
350 | {
351 | "inputs": [
352 | {
353 | "internalType": "address",
354 | "name": "owner",
355 | "type": "address"
356 | },
357 | {
358 | "internalType": "uint256",
359 | "name": "i",
360 | "type": "uint256"
361 | }
362 | ],
363 | "name": "isOwnerOf",
364 | "outputs": [
365 | {
366 | "internalType": "bool",
367 | "name": "",
368 | "type": "bool"
369 | }
370 | ],
371 | "stateMutability": "view",
372 | "type": "function"
373 | },
374 | {
375 | "inputs": [
376 | {
377 | "internalType": "address",
378 | "name": "to",
379 | "type": "address"
380 | },
381 | {
382 | "internalType": "uint256",
383 | "name": "i",
384 | "type": "uint256"
385 | }
386 | ],
387 | "name": "transferAsset",
388 | "outputs": [],
389 | "stateMutability": "nonpayable",
390 | "type": "function"
391 | }
392 | ],
393 | "bytecode": "0x60806040526000600155600060025534801561001a57600080fd5b506123898061002a6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063ba1d899511610071578063ba1d89951461018d578063c5246353146101be578063c5b8f772146101dc578063c9469a4b1461020c578063eafe7a7414610228578063fdd0e4d714610246576100b4565b80631e78717d146100b95780632acada4d146100d55780633ac140e8146100f357806347bb89f0146101115780635c921eb914610141578063752493291461015d575b600080fd5b6100d360048036038101906100ce9190611723565b610279565b005b6100dd610480565b6040516100ea9190611d7c565b60405180910390f35b6100fb610953565b6040516101089190611edc565b60405180910390f35b61012b60048036038101906101269190611879565b610959565b6040516101389190611dc0565b60405180910390f35b61015b60048036038101906101569190611624565b6109a7565b005b61017760048036038101906101729190611660565b610b8d565b6040516101849190611dc0565b60405180910390f35b6101a760048036038101906101a29190611879565b610d36565b6040516101b5929190611ef7565b60405180910390f35b6101c6610db5565b6040516101d39190611d9e565b60405180910390f35b6101f660048036038101906101f19190611624565b611118565b6040516102039190611dc0565b60405180910390f35b61022660048036038101906102219190611879565b611191565b005b6102306111c3565b60405161023d9190611edc565b60405180910390f35b610260600480360381019061025b9190611879565b6111c9565b6040516102709493929190611ddb565b60405180910390f35b6040518061016001604052808a81526020018981526020018781526020018681526020018581526020018481526020018381526020018281526020016001151581526020016000151581526020018881525060036000600254815260200190815260200160002060008201518160000190805190602001906102fc929190611462565b506020820151816001019080519060200190610319929190611462565b506040820151816002015560608201518160030155608082015181600401908051906020019061034a929190611462565b5060a0820151816005019080519060200190610367929190611462565b5060c0820151816006019080519060200190610384929190611462565b5060e08201518160070190805190602001906103a1929190611462565b506101008201518160080160006101000a81548160ff0219169083151502179055506101208201518160080160016101000a81548160ff02191690831515021790555061014082015181600901559050506001600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600254815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600081548092919061047090612122565b9190505550505050505050505050565b6060600060025467ffffffffffffffff8111156104c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156104ff57816020015b6104ec6114e8565b8152602001906001900390816104e45790505b50905060005b60025481101561094b5760006003600083815260200190815260200160002090508060405180610160016040529081600082018054610543906120bf565b80601f016020809104026020016040519081016040528092919081815260200182805461056f906120bf565b80156105bc5780601f10610591576101008083540402835291602001916105bc565b820191906000526020600020905b81548152906001019060200180831161059f57829003601f168201915b505050505081526020016001820180546105d5906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610601906120bf565b801561064e5780601f106106235761010080835404028352916020019161064e565b820191906000526020600020905b81548152906001019060200180831161063157829003601f168201915b50505050508152602001600282015481526020016003820154815260200160048201805461067b906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546106a7906120bf565b80156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050815260200160058201805461070d906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610739906120bf565b80156107865780601f1061075b57610100808354040283529160200191610786565b820191906000526020600020905b81548152906001019060200180831161076957829003601f168201915b5050505050815260200160068201805461079f906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546107cb906120bf565b80156108185780601f106107ed57610100808354040283529160200191610818565b820191906000526020600020905b8154815290600101906020018083116107fb57829003601f168201915b50505050508152602001600782018054610831906120bf565b80601f016020809104026020016040519081016040528092919081815260200182805461085d906120bf565b80156108aa5780601f1061087f576101008083540402835291602001916108aa565b820191906000526020600020905b81548152906001019060200180831161088d57829003601f168201915b505050505081526020016008820160009054906101000a900460ff161515151581526020016008820160019054906101000a900460ff1615151515815260200160098201548152505083838151811061092c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018190525050808061094390612122565b915050610505565b508091505090565b60015481565b60006014821061099e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099590611e9c565b60405180910390fd5b60019050919050565b6001151560036000600254815260200190815260200160002060080160009054906101000a900460ff16151514610a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0a90611e7c565b60405180910390fd5b60011515600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16151514610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae90611e5c565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080600090505b600154811015610c5357604051602001610bae90611d67565b60405160208183030381529060405280519060200120600080838152602001908152602001600020600301604051602001610be99190611d50565b604051602081830303815290604052805190602001201415610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790611e3c565b60405180910390fd5b8080610c4b90612122565b915050610b95565b506040518060a001604052806001548152602001868152602001858152602001848152602001838152506000806001548152602001908152602001600020600082015181600001556020820151816001019080519060200190610cb7929190611462565b506040820151816002019080519060200190610cd4929190611462565b506060820151816003019080519060200190610cf1929190611462565b506080820151816004019080519060200190610d0e929190611462565b5090505060016000815480929190610d2590612122565b919050555060019050949350505050565b600080600254831115610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7590611ebc565b60405180910390fd5b6003600084815260200190815260200160002060020154600360008581526020019081526020016000206003015491509150915091565b6060600060015467ffffffffffffffff811115610dfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610e3457816020015b610e21611546565b815260200190600190039081610e195790505b50905060005b6001548110156111105760008060008381526020019081526020016000209050806040518060a001604052908160008201548152602001600182018054610e80906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610eac906120bf565b8015610ef95780601f10610ece57610100808354040283529160200191610ef9565b820191906000526020600020905b815481529060010190602001808311610edc57829003601f168201915b50505050508152602001600282018054610f12906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3e906120bf565b8015610f8b5780601f10610f6057610100808354040283529160200191610f8b565b820191906000526020600020905b815481529060010190602001808311610f6e57829003601f168201915b50505050508152602001600382018054610fa4906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd0906120bf565b801561101d5780601f10610ff25761010080835404028352916020019161101d565b820191906000526020600020905b81548152906001019060200180831161100057829003601f168201915b50505050508152602001600482018054611036906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611062906120bf565b80156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b5050505050815250508383815181106110f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018190525050808061110890612122565b915050610e3a565b508091505090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff1615611186576001905061118b565b600090505b92915050565b60016003600083815260200190815260200160002060080160016101000a81548160ff02191690831515021790555050565b60025481565b60608060608060008086815260200190815260200160002060010160008087815260200190815260200160002060020160008088815260200190815260200160002060030160008089815260200190815260200160002060040183805461122f906120bf565b80601f016020809104026020016040519081016040528092919081815260200182805461125b906120bf565b80156112a85780601f1061127d576101008083540402835291602001916112a8565b820191906000526020600020905b81548152906001019060200180831161128b57829003601f168201915b505050505093508280546112bb906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546112e7906120bf565b80156113345780601f1061130957610100808354040283529160200191611334565b820191906000526020600020905b81548152906001019060200180831161131757829003601f168201915b50505050509250818054611347906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611373906120bf565b80156113c05780601f10611395576101008083540402835291602001916113c0565b820191906000526020600020905b8154815290600101906020018083116113a357829003601f168201915b505050505091508080546113d3906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546113ff906120bf565b801561144c5780601f106114215761010080835404028352916020019161144c565b820191906000526020600020905b81548152906001019060200180831161142f57829003601f168201915b5050505050905093509350935093509193509193565b82805461146e906120bf565b90600052602060002090601f01602090048101928261149057600085556114d7565b82601f106114a957805160ff19168380011785556114d7565b828001600101855582156114d7579182015b828111156114d65782518255916020019190600101906114bb565b5b5090506114e49190611575565b5090565b6040518061016001604052806060815260200160608152602001600081526020016000815260200160608152602001606081526020016060815260200160608152602001600015158152602001600015158152602001600081525090565b6040518060a0016040528060008152602001606081526020016060815260200160608152602001606081525090565b5b8082111561158e576000816000905550600101611576565b5090565b60006115a56115a084611f45565b611f20565b9050828152602081018484840111156115bd57600080fd5b6115c884828561207d565b509392505050565b6000813590506115df81612325565b92915050565b600082601f8301126115f657600080fd5b8135611606848260208601611592565b91505092915050565b60008135905061161e8161233c565b92915050565b6000806040838503121561163757600080fd5b6000611645858286016115d0565b92505060206116568582860161160f565b9150509250929050565b6000806000806080858703121561167657600080fd5b600085013567ffffffffffffffff81111561169057600080fd5b61169c878288016115e5565b945050602085013567ffffffffffffffff8111156116b957600080fd5b6116c5878288016115e5565b935050604085013567ffffffffffffffff8111156116e257600080fd5b6116ee878288016115e5565b925050606085013567ffffffffffffffff81111561170b57600080fd5b611717878288016115e5565b91505092959194509250565b60008060008060008060008060006101208a8c03121561174257600080fd5b60008a013567ffffffffffffffff81111561175c57600080fd5b6117688c828d016115e5565b99505060208a013567ffffffffffffffff81111561178557600080fd5b6117918c828d016115e5565b98505060406117a28c828d0161160f565b97505060606117b38c828d0161160f565b96505060806117c48c828d0161160f565b95505060a08a013567ffffffffffffffff8111156117e157600080fd5b6117ed8c828d016115e5565b94505060c08a013567ffffffffffffffff81111561180a57600080fd5b6118168c828d016115e5565b93505060e08a013567ffffffffffffffff81111561183357600080fd5b61183f8c828d016115e5565b9250506101008a013567ffffffffffffffff81111561185d57600080fd5b6118698c828d016115e5565b9150509295985092959850929598565b60006020828403121561188b57600080fd5b60006118998482850161160f565b91505092915050565b60006118ae8383611b95565b905092915050565b60006118c28383611ca7565b905092915050565b60006118d582611fab565b6118df8185611fe6565b9350836020820285016118f185611f76565b8060005b8581101561192d578484038952815161190e85826118a2565b945061191983611fcc565b925060208a019950506001810190506118f5565b50829750879550505050505092915050565b600061194a82611fb6565b6119548185611ff7565b93508360208202850161196685611f86565b8060005b858110156119a2578484038952815161198385826118b6565b945061198e83611fd9565b925060208a0199505060018101905061196a565b50829750879550505050505092915050565b6119bd81612047565b82525050565b6119cc81612047565b82525050565b60006119dd82611fc1565b6119e78185612008565b93506119f781856020860161208c565b611a00816121f8565b840191505092915050565b6000611a1682611fc1565b611a208185612019565b9350611a3081856020860161208c565b611a39816121f8565b840191505092915050565b60008154611a51816120bf565b611a5b818661202a565b94506001821660008114611a765760018114611a8757611aba565b60ff19831686528186019350611aba565b611a9085611f96565b60005b83811015611ab257815481890152600182019150602081019050611a93565b838801955050505b50505092915050565b6000611ad0600d8361202a565b9150611adb82612209565b600d82019050919050565b6000611af3601a83612019565b9150611afe82612232565b602082019050919050565b6000611b16601f83612019565b9150611b218261225b565b602082019050919050565b6000611b39601e83612019565b9150611b4482612284565b602082019050919050565b6000611b5c602283612019565b9150611b67826122ad565b604082019050919050565b6000611b7f601583612019565b9150611b8a826122fc565b602082019050919050565b6000610160830160008301518482036000860152611bb382826119d2565b91505060208301518482036020860152611bcd82826119d2565b9150506040830151611be26040860182611d32565b506060830151611bf56060860182611d32565b5060808301518482036080860152611c0d82826119d2565b91505060a083015184820360a0860152611c2782826119d2565b91505060c083015184820360c0860152611c4182826119d2565b91505060e083015184820360e0860152611c5b82826119d2565b915050610100830151611c726101008601826119b4565b50610120830151611c876101208601826119b4565b50610140830151611c9c610140860182611d32565b508091505092915050565b600060a083016000830151611cbf6000860182611d32565b5060208301518482036020860152611cd782826119d2565b91505060408301518482036040860152611cf182826119d2565b91505060608301518482036060860152611d0b82826119d2565b91505060808301518482036080860152611d2582826119d2565b9150508091505092915050565b611d3b81612073565b82525050565b611d4a81612073565b82525050565b6000611d5c8284611a44565b915081905092915050565b6000611d7282611ac3565b9150819050919050565b60006020820190508181036000830152611d9681846118ca565b905092915050565b60006020820190508181036000830152611db8818461193f565b905092915050565b6000602082019050611dd560008301846119c3565b92915050565b60006080820190508181036000830152611df58187611a0b565b90508181036020830152611e098186611a0b565b90508181036040830152611e1d8185611a0b565b90508181036060830152611e318184611a0b565b905095945050505050565b60006020820190508181036000830152611e5581611ae6565b9050919050565b60006020820190508181036000830152611e7581611b09565b9050919050565b60006020820190508181036000830152611e9581611b2c565b9050919050565b60006020820190508181036000830152611eb581611b4f565b9050919050565b60006020820190508181036000830152611ed581611b72565b9050919050565b6000602082019050611ef16000830184611d41565b92915050565b6000604082019050611f0c6000830185611d41565b611f196020830184611d41565b9392505050565b6000611f2a611f3b565b9050611f3682826120f1565b919050565b6000604051905090565b600067ffffffffffffffff821115611f6057611f5f6121c9565b5b611f69826121f8565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061204082612053565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156120aa57808201518184015260208101905061208f565b838111156120b9576000848401525b50505050565b600060028204905060018216806120d757607f821691505b602082108114156120eb576120ea61219a565b5b50919050565b6120fa826121f8565b810181811067ffffffffffffffff82111715612119576121186121c9565b5b80604052505050565b600061212d82612073565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156121605761215f61216b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f31323340676d61696c2e636f6d00000000000000000000000000000000000000600082015250565b7f4469737472696275746f7220616c726561647920657869737473000000000000600082015250565b7f53656e64657220646f6573206e6f74206f776e20746869732061737365742e00600082015250565b7f4e6f206173736574207769746820746869732055554944206578697374730000600082015250565b7f42616c616e6365206e65656420746f2062652067726561746572207468616e2060008201527f3230000000000000000000000000000000000000000000000000000000000000602082015250565b7f417373657420646f6573206e6f74206578697374730000000000000000000000600082015250565b61232e81612035565b811461233957600080fd5b50565b61234581612073565b811461235057600080fd5b5056fea264697066735822122097566c39a073d71e138d442ea865b8a2c16913eff2e4f0705f2492da15cb47f064736f6c63430008040033",
394 | "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063ba1d899511610071578063ba1d89951461018d578063c5246353146101be578063c5b8f772146101dc578063c9469a4b1461020c578063eafe7a7414610228578063fdd0e4d714610246576100b4565b80631e78717d146100b95780632acada4d146100d55780633ac140e8146100f357806347bb89f0146101115780635c921eb914610141578063752493291461015d575b600080fd5b6100d360048036038101906100ce9190611723565b610279565b005b6100dd610480565b6040516100ea9190611d7c565b60405180910390f35b6100fb610953565b6040516101089190611edc565b60405180910390f35b61012b60048036038101906101269190611879565b610959565b6040516101389190611dc0565b60405180910390f35b61015b60048036038101906101569190611624565b6109a7565b005b61017760048036038101906101729190611660565b610b8d565b6040516101849190611dc0565b60405180910390f35b6101a760048036038101906101a29190611879565b610d36565b6040516101b5929190611ef7565b60405180910390f35b6101c6610db5565b6040516101d39190611d9e565b60405180910390f35b6101f660048036038101906101f19190611624565b611118565b6040516102039190611dc0565b60405180910390f35b61022660048036038101906102219190611879565b611191565b005b6102306111c3565b60405161023d9190611edc565b60405180910390f35b610260600480360381019061025b9190611879565b6111c9565b6040516102709493929190611ddb565b60405180910390f35b6040518061016001604052808a81526020018981526020018781526020018681526020018581526020018481526020018381526020018281526020016001151581526020016000151581526020018881525060036000600254815260200190815260200160002060008201518160000190805190602001906102fc929190611462565b506020820151816001019080519060200190610319929190611462565b506040820151816002015560608201518160030155608082015181600401908051906020019061034a929190611462565b5060a0820151816005019080519060200190610367929190611462565b5060c0820151816006019080519060200190610384929190611462565b5060e08201518160070190805190602001906103a1929190611462565b506101008201518160080160006101000a81548160ff0219169083151502179055506101208201518160080160016101000a81548160ff02191690831515021790555061014082015181600901559050506001600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600254815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600081548092919061047090612122565b9190505550505050505050505050565b6060600060025467ffffffffffffffff8111156104c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156104ff57816020015b6104ec6114e8565b8152602001906001900390816104e45790505b50905060005b60025481101561094b5760006003600083815260200190815260200160002090508060405180610160016040529081600082018054610543906120bf565b80601f016020809104026020016040519081016040528092919081815260200182805461056f906120bf565b80156105bc5780601f10610591576101008083540402835291602001916105bc565b820191906000526020600020905b81548152906001019060200180831161059f57829003601f168201915b505050505081526020016001820180546105d5906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610601906120bf565b801561064e5780601f106106235761010080835404028352916020019161064e565b820191906000526020600020905b81548152906001019060200180831161063157829003601f168201915b50505050508152602001600282015481526020016003820154815260200160048201805461067b906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546106a7906120bf565b80156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050815260200160058201805461070d906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610739906120bf565b80156107865780601f1061075b57610100808354040283529160200191610786565b820191906000526020600020905b81548152906001019060200180831161076957829003601f168201915b5050505050815260200160068201805461079f906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546107cb906120bf565b80156108185780601f106107ed57610100808354040283529160200191610818565b820191906000526020600020905b8154815290600101906020018083116107fb57829003601f168201915b50505050508152602001600782018054610831906120bf565b80601f016020809104026020016040519081016040528092919081815260200182805461085d906120bf565b80156108aa5780601f1061087f576101008083540402835291602001916108aa565b820191906000526020600020905b81548152906001019060200180831161088d57829003601f168201915b505050505081526020016008820160009054906101000a900460ff161515151581526020016008820160019054906101000a900460ff1615151515815260200160098201548152505083838151811061092c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018190525050808061094390612122565b915050610505565b508091505090565b60015481565b60006014821061099e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099590611e9c565b60405180910390fd5b60019050919050565b6001151560036000600254815260200190815260200160002060080160009054906101000a900460ff16151514610a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0a90611e7c565b60405180910390fd5b60011515600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16151514610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae90611e5c565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080600090505b600154811015610c5357604051602001610bae90611d67565b60405160208183030381529060405280519060200120600080838152602001908152602001600020600301604051602001610be99190611d50565b604051602081830303815290604052805190602001201415610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790611e3c565b60405180910390fd5b8080610c4b90612122565b915050610b95565b506040518060a001604052806001548152602001868152602001858152602001848152602001838152506000806001548152602001908152602001600020600082015181600001556020820151816001019080519060200190610cb7929190611462565b506040820151816002019080519060200190610cd4929190611462565b506060820151816003019080519060200190610cf1929190611462565b506080820151816004019080519060200190610d0e929190611462565b5090505060016000815480929190610d2590612122565b919050555060019050949350505050565b600080600254831115610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7590611ebc565b60405180910390fd5b6003600084815260200190815260200160002060020154600360008581526020019081526020016000206003015491509150915091565b6060600060015467ffffffffffffffff811115610dfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610e3457816020015b610e21611546565b815260200190600190039081610e195790505b50905060005b6001548110156111105760008060008381526020019081526020016000209050806040518060a001604052908160008201548152602001600182018054610e80906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610eac906120bf565b8015610ef95780601f10610ece57610100808354040283529160200191610ef9565b820191906000526020600020905b815481529060010190602001808311610edc57829003601f168201915b50505050508152602001600282018054610f12906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3e906120bf565b8015610f8b5780601f10610f6057610100808354040283529160200191610f8b565b820191906000526020600020905b815481529060010190602001808311610f6e57829003601f168201915b50505050508152602001600382018054610fa4906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd0906120bf565b801561101d5780601f10610ff25761010080835404028352916020019161101d565b820191906000526020600020905b81548152906001019060200180831161100057829003601f168201915b50505050508152602001600482018054611036906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611062906120bf565b80156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b5050505050815250508383815181106110f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018190525050808061110890612122565b915050610e3a565b508091505090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff1615611186576001905061118b565b600090505b92915050565b60016003600083815260200190815260200160002060080160016101000a81548160ff02191690831515021790555050565b60025481565b60608060608060008086815260200190815260200160002060010160008087815260200190815260200160002060020160008088815260200190815260200160002060030160008089815260200190815260200160002060040183805461122f906120bf565b80601f016020809104026020016040519081016040528092919081815260200182805461125b906120bf565b80156112a85780601f1061127d576101008083540402835291602001916112a8565b820191906000526020600020905b81548152906001019060200180831161128b57829003601f168201915b505050505093508280546112bb906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546112e7906120bf565b80156113345780601f1061130957610100808354040283529160200191611334565b820191906000526020600020905b81548152906001019060200180831161131757829003601f168201915b50505050509250818054611347906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611373906120bf565b80156113c05780601f10611395576101008083540402835291602001916113c0565b820191906000526020600020905b8154815290600101906020018083116113a357829003601f168201915b505050505091508080546113d3906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546113ff906120bf565b801561144c5780601f106114215761010080835404028352916020019161144c565b820191906000526020600020905b81548152906001019060200180831161142f57829003601f168201915b5050505050905093509350935093509193509193565b82805461146e906120bf565b90600052602060002090601f01602090048101928261149057600085556114d7565b82601f106114a957805160ff19168380011785556114d7565b828001600101855582156114d7579182015b828111156114d65782518255916020019190600101906114bb565b5b5090506114e49190611575565b5090565b6040518061016001604052806060815260200160608152602001600081526020016000815260200160608152602001606081526020016060815260200160608152602001600015158152602001600015158152602001600081525090565b6040518060a0016040528060008152602001606081526020016060815260200160608152602001606081525090565b5b8082111561158e576000816000905550600101611576565b5090565b60006115a56115a084611f45565b611f20565b9050828152602081018484840111156115bd57600080fd5b6115c884828561207d565b509392505050565b6000813590506115df81612325565b92915050565b600082601f8301126115f657600080fd5b8135611606848260208601611592565b91505092915050565b60008135905061161e8161233c565b92915050565b6000806040838503121561163757600080fd5b6000611645858286016115d0565b92505060206116568582860161160f565b9150509250929050565b6000806000806080858703121561167657600080fd5b600085013567ffffffffffffffff81111561169057600080fd5b61169c878288016115e5565b945050602085013567ffffffffffffffff8111156116b957600080fd5b6116c5878288016115e5565b935050604085013567ffffffffffffffff8111156116e257600080fd5b6116ee878288016115e5565b925050606085013567ffffffffffffffff81111561170b57600080fd5b611717878288016115e5565b91505092959194509250565b60008060008060008060008060006101208a8c03121561174257600080fd5b60008a013567ffffffffffffffff81111561175c57600080fd5b6117688c828d016115e5565b99505060208a013567ffffffffffffffff81111561178557600080fd5b6117918c828d016115e5565b98505060406117a28c828d0161160f565b97505060606117b38c828d0161160f565b96505060806117c48c828d0161160f565b95505060a08a013567ffffffffffffffff8111156117e157600080fd5b6117ed8c828d016115e5565b94505060c08a013567ffffffffffffffff81111561180a57600080fd5b6118168c828d016115e5565b93505060e08a013567ffffffffffffffff81111561183357600080fd5b61183f8c828d016115e5565b9250506101008a013567ffffffffffffffff81111561185d57600080fd5b6118698c828d016115e5565b9150509295985092959850929598565b60006020828403121561188b57600080fd5b60006118998482850161160f565b91505092915050565b60006118ae8383611b95565b905092915050565b60006118c28383611ca7565b905092915050565b60006118d582611fab565b6118df8185611fe6565b9350836020820285016118f185611f76565b8060005b8581101561192d578484038952815161190e85826118a2565b945061191983611fcc565b925060208a019950506001810190506118f5565b50829750879550505050505092915050565b600061194a82611fb6565b6119548185611ff7565b93508360208202850161196685611f86565b8060005b858110156119a2578484038952815161198385826118b6565b945061198e83611fd9565b925060208a0199505060018101905061196a565b50829750879550505050505092915050565b6119bd81612047565b82525050565b6119cc81612047565b82525050565b60006119dd82611fc1565b6119e78185612008565b93506119f781856020860161208c565b611a00816121f8565b840191505092915050565b6000611a1682611fc1565b611a208185612019565b9350611a3081856020860161208c565b611a39816121f8565b840191505092915050565b60008154611a51816120bf565b611a5b818661202a565b94506001821660008114611a765760018114611a8757611aba565b60ff19831686528186019350611aba565b611a9085611f96565b60005b83811015611ab257815481890152600182019150602081019050611a93565b838801955050505b50505092915050565b6000611ad0600d8361202a565b9150611adb82612209565b600d82019050919050565b6000611af3601a83612019565b9150611afe82612232565b602082019050919050565b6000611b16601f83612019565b9150611b218261225b565b602082019050919050565b6000611b39601e83612019565b9150611b4482612284565b602082019050919050565b6000611b5c602283612019565b9150611b67826122ad565b604082019050919050565b6000611b7f601583612019565b9150611b8a826122fc565b602082019050919050565b6000610160830160008301518482036000860152611bb382826119d2565b91505060208301518482036020860152611bcd82826119d2565b9150506040830151611be26040860182611d32565b506060830151611bf56060860182611d32565b5060808301518482036080860152611c0d82826119d2565b91505060a083015184820360a0860152611c2782826119d2565b91505060c083015184820360c0860152611c4182826119d2565b91505060e083015184820360e0860152611c5b82826119d2565b915050610100830151611c726101008601826119b4565b50610120830151611c876101208601826119b4565b50610140830151611c9c610140860182611d32565b508091505092915050565b600060a083016000830151611cbf6000860182611d32565b5060208301518482036020860152611cd782826119d2565b91505060408301518482036040860152611cf182826119d2565b91505060608301518482036060860152611d0b82826119d2565b91505060808301518482036080860152611d2582826119d2565b9150508091505092915050565b611d3b81612073565b82525050565b611d4a81612073565b82525050565b6000611d5c8284611a44565b915081905092915050565b6000611d7282611ac3565b9150819050919050565b60006020820190508181036000830152611d9681846118ca565b905092915050565b60006020820190508181036000830152611db8818461193f565b905092915050565b6000602082019050611dd560008301846119c3565b92915050565b60006080820190508181036000830152611df58187611a0b565b90508181036020830152611e098186611a0b565b90508181036040830152611e1d8185611a0b565b90508181036060830152611e318184611a0b565b905095945050505050565b60006020820190508181036000830152611e5581611ae6565b9050919050565b60006020820190508181036000830152611e7581611b09565b9050919050565b60006020820190508181036000830152611e9581611b2c565b9050919050565b60006020820190508181036000830152611eb581611b4f565b9050919050565b60006020820190508181036000830152611ed581611b72565b9050919050565b6000602082019050611ef16000830184611d41565b92915050565b6000604082019050611f0c6000830185611d41565b611f196020830184611d41565b9392505050565b6000611f2a611f3b565b9050611f3682826120f1565b919050565b6000604051905090565b600067ffffffffffffffff821115611f6057611f5f6121c9565b5b611f69826121f8565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061204082612053565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156120aa57808201518184015260208101905061208f565b838111156120b9576000848401525b50505050565b600060028204905060018216806120d757607f821691505b602082108114156120eb576120ea61219a565b5b50919050565b6120fa826121f8565b810181811067ffffffffffffffff82111715612119576121186121c9565b5b80604052505050565b600061212d82612073565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156121605761215f61216b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f31323340676d61696c2e636f6d00000000000000000000000000000000000000600082015250565b7f4469737472696275746f7220616c726561647920657869737473000000000000600082015250565b7f53656e64657220646f6573206e6f74206f776e20746869732061737365742e00600082015250565b7f4e6f206173736574207769746820746869732055554944206578697374730000600082015250565b7f42616c616e6365206e65656420746f2062652067726561746572207468616e2060008201527f3230000000000000000000000000000000000000000000000000000000000000602082015250565b7f417373657420646f6573206e6f74206578697374730000000000000000000000600082015250565b61232e81612035565b811461233957600080fd5b50565b61234581612073565b811461235057600080fd5b5056fea264697066735822122097566c39a073d71e138d442ea865b8a2c16913eff2e4f0705f2492da15cb47f064736f6c63430008040033",
395 | "linkReferences": {},
396 | "deployedLinkReferences": {}
397 | }
398 |
--------------------------------------------------------------------------------