From b90d86f8f58827f3e35357abf2694c1fd88e4b1c Mon Sep 17 00:00:00 2001 From: Jing Tao Date: Mon, 8 Jan 2018 16:27:11 +0800 Subject: [PATCH 01/36] payroll homework --- payroll.sol | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 payroll.sol diff --git a/payroll.sol b/payroll.sol new file mode 100644 index 000000000..feb91e838 --- /dev/null +++ b/payroll.sol @@ -0,0 +1,38 @@ +pragma solidity ^0.4.14; + +contract payRoll{ + uint salary = 1 ether; + address wallet = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c; + uint constant payDuration = 30 days; + uint lastPayday = now; + + function getWallet() { + wallet = msg.sender; + } + + function addFund() returns (uint) { + return this.balance; + } + + function calculateRunway() returns (uint) { + return this.balance / salary; + } + + function hasEnoughFund() returns (bool) { + return calculateRunway() > 0; + } + + function getPaid() { + if(msg.sender != wallet){ + revert(); + } + + uint nextPayday = lastPayday + payDuration; + if(nextPayday > now){ + revert(); + } + lastPayday = nextPayday; + wallet.transfer(salary); + } + +} \ No newline at end of file From 8512a0cf481d879a67db26c71abee056bb533c52 Mon Sep 17 00:00:00 2001 From: Jing Tao Date: Mon, 8 Jan 2018 16:30:37 +0800 Subject: [PATCH 02/36] remove orginal address --- payroll.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/payroll.sol b/payroll.sol index feb91e838..455d868ab 100644 --- a/payroll.sol +++ b/payroll.sol @@ -2,7 +2,7 @@ pragma solidity ^0.4.14; contract payRoll{ uint salary = 1 ether; - address wallet = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c; + address wallet; uint constant payDuration = 30 days; uint lastPayday = now; From d60b6b0909cad74b509fe3c429051ec2facaf368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Mon, 8 Jan 2018 23:06:07 +0800 Subject: [PATCH 03/36] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lesson1/assignment/yours.sol | 50 ++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/lesson1/assignment/yours.sol b/lesson1/assignment/yours.sol index dfdb2c486..83de7b206 100644 --- a/lesson1/assignment/yours.sol +++ b/lesson1/assignment/yours.sol @@ -1 +1,51 @@ /*作业请提交在这个目录下*/ +pragma solidity ^0.4.14; + +contract Payroll { + uint constant payDuration = 10 seconds; + + address owner; + uint salary; + address employee; + uint lastPayday; + + function Payroll() { + owner = msg.sender; + } + + function updateEmployee(address e, uint s) { + require(msg.sender == owner); + + if (employee != 0x0) { + uint payment = salary * (now - lastPayday) / payDuration; + employee.transfer(payment); + } + + employee = e; + salary = s * 1 ether; + lastPayday = now; + } + + function addFund() payable returns (uint) { + return this.balance; + } + + function calculateRunway() returns (uint) { + return this.balance / salary; + } + + function hasEnoughFund() returns (bool) { + return calculateRunway() > 0; + } + + function getPaid() { + require(msg.sender == employee); + + uint nextPayday = lastPayday + payDuration; + assert(nextPayday < now); + + lastPayday = nextPayday; + employee.transfer(salary); + } +} + From 503a54ab2655a1f48a97db6fe48fb348190d99e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Tue, 9 Jan 2018 22:18:35 +0800 Subject: [PATCH 04/36] =?UTF-8?q?=E6=8B=86=E5=88=86=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lesson1/assignment/yours.sol | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lesson1/assignment/yours.sol b/lesson1/assignment/yours.sol index 83de7b206..0212d6b99 100644 --- a/lesson1/assignment/yours.sol +++ b/lesson1/assignment/yours.sol @@ -8,12 +8,20 @@ contract Payroll { uint salary; address employee; uint lastPayday; + function Payroll() { owner = msg.sender; } - function updateEmployee(address e, uint s) { + + function updateEmployee(address e) { + require(msg.sender == owner); + + employee = e; + } + + function updateSalary(uint s) { require(msg.sender == owner); if (employee != 0x0) { @@ -21,12 +29,12 @@ contract Payroll { employee.transfer(payment); } - employee = e; salary = s * 1 ether; lastPayday = now; } function addFund() payable returns (uint) { + return this.balance; } @@ -48,4 +56,3 @@ contract Payroll { employee.transfer(salary); } } - From 371670a28b96d4ed808b3da80f2d6bc2d54ccdc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Tue, 9 Jan 2018 22:21:02 +0800 Subject: [PATCH 05/36] . --- lesson1/assignment/yours.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/lesson1/assignment/yours.sol b/lesson1/assignment/yours.sol index 0212d6b99..06fa52419 100644 --- a/lesson1/assignment/yours.sol +++ b/lesson1/assignment/yours.sol @@ -9,7 +9,6 @@ contract Payroll { address employee; uint lastPayday; - function Payroll() { owner = msg.sender; } From da27d339d1810d6a319b63de701181d40cdaaaf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Tue, 9 Jan 2018 22:25:29 +0800 Subject: [PATCH 06/36] . --- lesson1/assignment/yours.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/lesson1/assignment/yours.sol b/lesson1/assignment/yours.sol index 06fa52419..a6d58e3d1 100644 --- a/lesson1/assignment/yours.sol +++ b/lesson1/assignment/yours.sol @@ -33,7 +33,6 @@ contract Payroll { } function addFund() payable returns (uint) { - return this.balance; } From ce541bd70107aef26f66578dde2fc276118f36b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Wed, 10 Jan 2018 00:13:12 +0800 Subject: [PATCH 07/36] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lesson1/assignment/yours.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lesson1/assignment/yours.sol b/lesson1/assignment/yours.sol index a6d58e3d1..d8fdd73ae 100644 --- a/lesson1/assignment/yours.sol +++ b/lesson1/assignment/yours.sol @@ -37,7 +37,8 @@ contract Payroll { } function calculateRunway() returns (uint) { - return this.balance / salary; + uint payment = salary * (now - lastPayday) / payDuration; + return this.balance / payment; } function hasEnoughFund() returns (bool) { From 31eeb028baf604d7c5e88907ed665114336b3255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Sat, 13 Jan 2018 19:55:16 +0800 Subject: [PATCH 08/36] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E8=AF=BE=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lesson2/assignment/record_gas.md | 15 ++++++ Lesson2/assignment/yours.sol | 88 ++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 Lesson2/assignment/record_gas.md diff --git a/Lesson2/assignment/record_gas.md b/Lesson2/assignment/record_gas.md new file mode 100644 index 000000000..115b23e8f --- /dev/null +++ b/Lesson2/assignment/record_gas.md @@ -0,0 +1,15 @@ +# Gas消耗记录 + +|序号|Transaction Cost|Execution Cost|Second Transaction Cost|Second Execution Cost| +|---|----------------|--------------|--------------------------|------------------------| +|1 |22966 |1694 |22124 |852 | +|2 |23747 |2475 |22124 |852 | +|3 |24528 |3256 |22124 |852 | +|4 |25309 |4037 |22124 |852 | +|5 |26090 |4818 |22124 |852 | +|6 |26871 |5599 |22124 |852 | +|7 |27652 |6380 |22124 |852 | +|8 |28433 |7161 |22124 |852 | +|9 |29214 |7942 |22124 |852 | +|10 |29995 |8723 | 22124 |852 | +因为每次都要循环遍历的缘故,没加一次雇员,需要更多的gas,所以我把totalSalary的运算放在其他函数,以降低gas的消耗 \ No newline at end of file diff --git a/Lesson2/assignment/yours.sol b/Lesson2/assignment/yours.sol index dfdb2c486..48e5c1cad 100644 --- a/Lesson2/assignment/yours.sol +++ b/Lesson2/assignment/yours.sol @@ -1 +1,89 @@ /*作业请提交在这个目录下*/ +pragma solidity ^0.4.14; +//因为每次都要循环遍历的缘故,没加一次雇员,需要更多的gas,所以我把totalSalary的运算放在其他会改动totalSalary的函数,以降低gas的消耗 +contract Payroll { + struct Employee { + address id; + uint salary; + uint lastPayday; + } + + uint constant payDuration = 10 seconds; + uint totalSalary; + + address owner; + Employee[] employees; + + function Payroll() { + owner = msg.sender; + } + + function _partialPaid(Employee employee) private { + uint payment = employee.salary * (now - employee.lastPayday) / payDuration; + employee.id.transfer(payment); + } + + function _findEmployee(address employeeId) private returns (Employee, uint) { + for(uint i = 0; i < employees.length; i++) { + if (employees[i].id == employeeId) { + return (employees[i], i); + } + } + } + + function addEmployee(address employeeId, uint salary) { + require(msg.sender == owner); + + var (employee, index) = _findEmployee(employeeId); + assert(employee.id == 0x0); + totalSalary = totalSalary + salary; + employees.push(Employee(employeeId, salary, now)); + } + + function removeEmployee(address employeeId) { + require(msg.sender == owner); + + var (employee, index) = _findEmployee(employeeId); + assert(employee.id != 0x0); + _partialPaid(employees[index]); + totalSalary = totalSalary - employee.salary; + delete employees[index]; + employees[index] = employees[employees.length -1]; + employees.length -= 1; + + } + + function updateEmployee(address employeeId, uint salary) { + require(msg.sender == owner); + + var (employee, index) = _findEmployee(employeeId); + assert(employee.id != 0x0); + _partialPaid(employee); + totalSalary = totalSalary + salary - employee.salary; + employee.salary = salary; + employee.lastPayday = now; + } + + function addFund() payable returns (uint) { + return this.balance; + } + + function calculateRunway() returns (uint) { + return this.balance / totalSalary; + } + + function hasEnoughFund() returns (bool) { + return calculateRunway() > 0; + } + + function getPaid() { + var (employee, index) = _findEmployee(msg.sender); + assert(employee.id != 0x0); + + uint nextPayday = employee.lastPayday + payDuration; + assert(nextPayday < now); + + employee.lastPayday = nextPayday; + employee.id.transfer(employee.salary); + } +} From c85308b6a35db66c7fddce2d49acf8a165d4561a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Mon, 15 Jan 2018 22:43:50 +0800 Subject: [PATCH 09/36] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E8=AF=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lesson3/assignment/image.md | 18 ++++++++++++++++++ Lesson3/orgin/payroll.sol | 17 +++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 Lesson3/assignment/image.md diff --git a/Lesson3/assignment/image.md b/Lesson3/assignment/image.md new file mode 100644 index 000000000..95746f5a8 --- /dev/null +++ b/Lesson3/assignment/image.md @@ -0,0 +1,18 @@ +# 截图 + +![](https://lh3.googleusercontent.com/-Z7wmwDmr2Yo/Wly58wMqz8I/AAAAAAAACN4/k7H-zjCS3jouLSKjn64eLfQfurpUxFBKgCHMYCw/I/15160261093451.jpg) + +![](https://lh3.googleusercontent.com/-TZc_49k37sM/Wly59-DMw6I/AAAAAAAACN8/Km_W5izGcq85DsSIHZhf6xozL8JJIhJowCHMYCw/I/15160261452190.jpg) + +![](https://lh3.googleusercontent.com/-uKY9K0s4beY/Wly5-sH9xOI/AAAAAAAACOA/hw4AuE-TBHoRxEEnGXu6TcPP8tpM4RCXQCHMYCw/I/15160261645468.jpg) + +![](https://lh3.googleusercontent.com/-9Yckg2u56oM/Wly5_-LfakI/AAAAAAAACOE/oWWfUNd5x4MUkP2xaS_wR41urE9t5OiLwCHMYCw/I/15160261984761.jpg) + +![](https://lh3.googleusercontent.com/-f4cw-uiTsnc/Wly6BSxuTjI/AAAAAAAACOI/RUCjK81MEfMce0nOj--JcCdvi_rE42XSwCHMYCw/I/15160262186508.jpg) + +![](https://lh3.googleusercontent.com/-13qPZ-xrYNg/Wly6Ch4chOI/AAAAAAAACOM/JppTGYZiOQ0nE_GkJrrQrCmEslDBHIlFgCHMYCw/I/15160262349547.jpg) + +![](https://lh3.googleusercontent.com/-2PtUNchpvW8/Wly6DI-hiPI/AAAAAAAACOQ/xUkK0jlu5M0nZZmaOHPEv97iwDrVpn-BwCHMYCw/I/15160262540190.jpg) + +![](https://lh3.googleusercontent.com/-Jmzv3ST6x8I/Wly6D9S6zRI/AAAAAAAACOU/bC7wZuoDp6EPH_bSyZ-O_M318ah0pY9pACHMYCw/I/15160262764811.jpg) + diff --git a/Lesson3/orgin/payroll.sol b/Lesson3/orgin/payroll.sol index e69de29bb..fdafa6cab 100644 --- a/Lesson3/orgin/payroll.sol +++ b/Lesson3/orgin/payroll.sol @@ -0,0 +1,17 @@ +//新增更改员工薪水的支付地址的函数 +function changePaymentAddress(address employeeId, address newEmployeeId) onlyOwner employeeExist(employeeId) { + var employee = employees[employeeId]; + + _partialPaid(employee); + employees[employeeId].id = newEmployeeId; + employees[newEmployeeId].lastPayday = now; +} + +//加分题 +O[O], +A[A,O], +B[B,O], +C[C,O], +K1[K1,A,B,O], +K2[K2,A,C,O], +Z[K1,K2,A,B,C,O] \ No newline at end of file From bd713707ce5a268acd1fb8801c5a7cb3bd7d7771 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Mon, 15 Jan 2018 22:45:31 +0800 Subject: [PATCH 10/36] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E8=AF=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lesson3/assignment/image.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Lesson3/assignment/image.md b/Lesson3/assignment/image.md index 95746f5a8..eb3cb57e6 100644 --- a/Lesson3/assignment/image.md +++ b/Lesson3/assignment/image.md @@ -1,4 +1,5 @@ # 截图 +## 图床存在google,显示可能需要等一会儿 ![](https://lh3.googleusercontent.com/-Z7wmwDmr2Yo/Wly58wMqz8I/AAAAAAAACN4/k7H-zjCS3jouLSKjn64eLfQfurpUxFBKgCHMYCw/I/15160261093451.jpg) From 718e0e6e376b7c48c25ac039583f0853107e96b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Mon, 15 Jan 2018 22:48:36 +0800 Subject: [PATCH 11/36] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E8=AF=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lesson3/assignment/yours.sol | 17 +++++++++++++++++ Lesson3/orgin/payroll.sol | 17 ----------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Lesson3/assignment/yours.sol b/Lesson3/assignment/yours.sol index dfdb2c486..c5f4a9110 100644 --- a/Lesson3/assignment/yours.sol +++ b/Lesson3/assignment/yours.sol @@ -1 +1,18 @@ /*作业请提交在这个目录下*/ +//新增更改员工薪水的支付地址的函数 +function changePaymentAddress(address employeeId, address newEmployeeId) onlyOwner employeeExist(employeeId) { + var employee = employees[employeeId]; + + _partialPaid(employee); + employees[employeeId].id = newEmployeeId; + employees[newEmployeeId].lastPayday = now; +} + +//加分题 +O[O], +A[A,O], +B[B,O], +C[C,O], +K1[K1,A,B,O], +K2[K2,A,C,O], +Z[K1,K2,A,B,C,O] \ No newline at end of file diff --git a/Lesson3/orgin/payroll.sol b/Lesson3/orgin/payroll.sol index fdafa6cab..e69de29bb 100644 --- a/Lesson3/orgin/payroll.sol +++ b/Lesson3/orgin/payroll.sol @@ -1,17 +0,0 @@ -//新增更改员工薪水的支付地址的函数 -function changePaymentAddress(address employeeId, address newEmployeeId) onlyOwner employeeExist(employeeId) { - var employee = employees[employeeId]; - - _partialPaid(employee); - employees[employeeId].id = newEmployeeId; - employees[newEmployeeId].lastPayday = now; -} - -//加分题 -O[O], -A[A,O], -B[B,O], -C[C,O], -K1[K1,A,B,O], -K2[K2,A,C,O], -Z[K1,K2,A,B,C,O] \ No newline at end of file From 20e9d2194e949d57743f753a4d04f0a21d2a78f8 Mon Sep 17 00:00:00 2001 From: Jing Tao Date: Wed, 17 Jan 2018 15:31:53 +0800 Subject: [PATCH 12/36] hw-2 --- payroll.sol => hw-1.sol | 0 hw-2.sol | 95 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) rename payroll.sol => hw-1.sol (100%) create mode 100644 hw-2.sol diff --git a/payroll.sol b/hw-1.sol similarity index 100% rename from payroll.sol rename to hw-1.sol diff --git a/hw-2.sol b/hw-2.sol new file mode 100644 index 000000000..99ec61f12 --- /dev/null +++ b/hw-2.sol @@ -0,0 +1,95 @@ +pragma solidity ^0.4.14; + +contract payRoll{ + struct Employee { + address id; + uint salary; + uint lastPayday; + } + + uint constant payDuration = 10 seconds; + + address owner; + Employee[] employees; + + function Payroll(){ + owner = msg.sender; + } + + function _partialPaid(Employee employee) private { + uint payment = employee.salary * (now - employee.lastPayday) / payDuration; + employee.id.transfer(payment); + } + + function _findEmployee(address employeeId) private returns (Employee, uint){ + for(uint i=0; i 0; + } + + function getPaid() { + var (employee, index) = _findEmployee(msg.sender); + assert(employee.id == 0x0); + + + uint nextPayday = employee.lastPayday + payDuration; + assert(nextPayday < now); + + employees[index].lastPayday = nextPayday; + employees[index].id.transfer(employee.salary); + } + +} \ No newline at end of file From d355bf4a8064cf31ea0fabd6ebb5952a532cc483 Mon Sep 17 00:00:00 2001 From: Jing Tao Date: Thu, 18 Jan 2018 01:08:42 +0800 Subject: [PATCH 13/36] HW-3 --- hw-2.sol => Lesson2/hw-2.sol | 0 Lesson3/assignment/yours.sol | 103 +++++++++++++++++++++++++++++++++++ hw-1.sol => lesson1/hw-1.sol | 0 3 files changed, 103 insertions(+) rename hw-2.sol => Lesson2/hw-2.sol (100%) rename hw-1.sol => lesson1/hw-1.sol (100%) diff --git a/hw-2.sol b/Lesson2/hw-2.sol similarity index 100% rename from hw-2.sol rename to Lesson2/hw-2.sol diff --git a/Lesson3/assignment/yours.sol b/Lesson3/assignment/yours.sol index dfdb2c486..189a9cd28 100644 --- a/Lesson3/assignment/yours.sol +++ b/Lesson3/assignment/yours.sol @@ -1 +1,104 @@ /*作业请提交在这个目录下*/ + +//q1 + +pragma solidity ^0.4.14; + +contract payRoll{ + struct Employee { + address id; + uint salary; + uint lastPayday; + } + + uint constant payDuration = 10 seconds; + + address owner; + uint totalSalary; + mapping(address => Employee) employees; + + function Payroll(){ + owner = msg.sender; + } + + function _partialPaid(Employee employee) private { + uint payment = employee.salary * (now - employee.lastPayday) / payDuration; + employee.id.transfer(payment); + } + + function addEmployee(address employeeId, uint salary){ + require(msg.sender == owner); + + var employee = employees[employeeId]; + assert(employee.id == 0x0); + totalSalary += salary * 1 ether; + employees[employeeId] = (Employee(employeeId, salary * 1 ether, now)); + } + + function removeEmployee(address employeeId){ + require(msg.sender == owner); + + var employee = employees[employeeId]; + + assert(employee.id == 0x0); + _partialPaid(employee); + totalSalary -= employees[employeeId].salary; + delete employees[employeeId]; + + } + + function updateEmployee(address employeeId, uint salary) { + require(msg.sender == owner); + + var employee = employees[employeeId]; + + assert(employee.id == 0x0); + _partialPaid(employee); + totalSalary -= employees[employeeId].salary; + employees[employeeId].salary = salary; + employees[employeeId].lastPayday = now; + totalSalary += employees[employeeId].salary; + + } + + function addFund() returns (uint) { + return this.balance; + } + + function calculateRunway() returns (uint) { + return this.balance / totalSalary; + } + + function hasEnoughFund() returns (bool) { + return calculateRunway() > 0; + } + + function checckEmployee(address employeeId) returns (uint salary, uint lastPayday){ + var employee = employees[employeeId]; + salary = employee.salary; + lastPayday = employee.lastPayday; + } + + function getPaid() { + var employee = employees[msg.sender]; + assert(employee.id == 0x0); + + + uint nextPayday = employee.lastPayday + payDuration; + assert(nextPayday < now); + + employee.lastPayday = nextPayday; + employee.id.transfer(employee.salary); + } + +} + + +/// q2 +function changePaymentAddress(address employeeId, address newEmployeeId) onlyOwner employeeExist(employeeId) { + var employee = employees[employeeId]; + + _partialPaid(employee); + employees[employeeId].id = newEmployeeId; + employees[newEmployeeId].lastPayday = now; +} diff --git a/hw-1.sol b/lesson1/hw-1.sol similarity index 100% rename from hw-1.sol rename to lesson1/hw-1.sol From 08dd48cbd216af8421d481f2be5ed6974d81866d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Fri, 19 Jan 2018 21:01:17 +0800 Subject: [PATCH 14/36] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=99=84=E5=8A=A0?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lesson3/assignment/yours.sol | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/Lesson3/assignment/yours.sol b/Lesson3/assignment/yours.sol index c5f4a9110..d69445076 100644 --- a/Lesson3/assignment/yours.sol +++ b/Lesson3/assignment/yours.sol @@ -9,10 +9,25 @@ function changePaymentAddress(address employeeId, address newEmployeeId) onlyOwn } //加分题 -O[O], -A[A,O], -B[B,O], -C[C,O], -K1[K1,A,B,O], -K2[K2,A,C,O], -Z[K1,K2,A,B,C,O] \ No newline at end of file +L[O] = 0 + +L[A] = A + merge[L[0],0] + = [A,0] + +L[B] = B + merge[L[0],0] + = [B,0] + +L[C] = C + merge[L[0],0] + = [C,0] + +L[K1] = K1 + merge[[A,0],[B,0],[A,B]] + = [K1,B] + merge[[A,0],[0],[A]] + = [K1,B,A,0] + +L[K2] = K2 + merge[[A,0]],[C,0]],[A,C]] + = [K2,C,A,0] + +L[Z] = Z + merge[[K1,B,A,0],[K2,C,A,0],[K1,K2]] + = [Z,K2] + merge[[K1,B,A,0],[C,A,0],K1] + = [Z,K2,K1] + merge[[B,A,0],[C,A,0]] + = [Z,K2,K1,A,C,B,0] \ No newline at end of file From 3f5d92ff5ea1cec0f760c71eb12d0adc2fd8a39d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Sat, 20 Jan 2018 08:33:01 +0800 Subject: [PATCH 15/36] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lesson3/assignment/yours.sol | 90 +++++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/Lesson3/assignment/yours.sol b/Lesson3/assignment/yours.sol index d69445076..16f7b409f 100644 --- a/Lesson3/assignment/yours.sol +++ b/Lesson3/assignment/yours.sol @@ -30,4 +30,92 @@ L[K2] = K2 + merge[[A,0]],[C,0]],[A,C]] L[Z] = Z + merge[[K1,B,A,0],[K2,C,A,0],[K1,K2]] = [Z,K2] + merge[[K1,B,A,0],[C,A,0],K1] = [Z,K2,K1] + merge[[B,A,0],[C,A,0]] - = [Z,K2,K1,A,C,B,0] \ No newline at end of file + = [Z,K2,K1,A,C,B,0] + + +//源码 +pragma solidity ^0.4.14; + +contract Payroll { + struct Employee { + address id; + uint salary; + uint lastPayday; + } + + uint constant payDuration = 10 seconds; + + uint totalSalary; + address owner; + mapping(address => Employee) public employees; + + function Payroll() { + owner = msg.sender; + } + + modifier onlyOwner { + require(msg.sender == owner); + _; + } + + modifier employeeExist(address employeeId) { + var employee = employees[employeeId]; + assert(employee.id != 0x0); + _; + } + + function _partialPaid(Employee employee) private { + uint payment = employee.salary * (now - employee.lastPayday) / payDuration; + employee.id.transfer(payment); + } + + function addEmployee(address employeeId, uint salary) onlyOwner { + var employee = employees[employeeId]; + assert(employee.id == 0x0); + totalSalary += salary * 1 ether; + + employees[employeeId] = Employee(employeeId, salary * 1 ether, now); + } + + function removeEmployee(address employeeId) onlyOwner employeeExist(employeeId) { + + var employee = employees[employeeId]; + + _partialPaid(employee); + totalSalary -= employees[employeeId].salary; + delete employees[employeeId]; + + } + + function updateEmployee(address employeeId, uint salary) onlyOwner employeeExist(employeeId) { + var employee = employees[employeeId]; + + _partialPaid(employee); + totalSalary -= employees[employeeId].salary; + employees[employeeId].salary = salary * 1 ether; + totalSalary += employees[employeeId].salary; + employees[employeeId].lastPayday = now; + } + + function addFund() payable returns (uint) { + return this.balance; + } + + function calculateRunway() returns (uint) { + return this.balance / totalSalary; + } + + function hasEnoughFund() returns (bool) { + return calculateRunway() > 0; + } + + function getPaid() employeeExist(msg.sender) { + var employee = employees[msg.sender]; + + uint nextPayday = employee.lastPayday + payDuration; + assert(nextPayday < now); + + employees[msg.sender].lastPayday = nextPayday; + employee.id.transfer(employee.salary); + } +} From d4860f158681087c86620091a56a8cd0fc9f559a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Sat, 20 Jan 2018 09:37:33 +0800 Subject: [PATCH 16/36] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lesson3/assignment/yours.sol | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Lesson3/assignment/yours.sol b/Lesson3/assignment/yours.sol index 16f7b409f..a15ee3106 100644 --- a/Lesson3/assignment/yours.sol +++ b/Lesson3/assignment/yours.sol @@ -3,9 +3,7 @@ function changePaymentAddress(address employeeId, address newEmployeeId) onlyOwner employeeExist(employeeId) { var employee = employees[employeeId]; - _partialPaid(employee); employees[employeeId].id = newEmployeeId; - employees[newEmployeeId].lastPayday = now; } //加分题 @@ -20,17 +18,20 @@ L[B] = B + merge[L[0],0] L[C] = C + merge[L[0],0] = [C,0] -L[K1] = K1 + merge[[A,0],[B,0],[A,B]] - = [K1,B] + merge[[A,0],[0],[A]] +L[K1] = K1 + merge[L[B],L[A],B,A] + = K1 + merge[[B,0],[A,0],[B,A]] + = [K1,B] + merge[[0],[A,0],[A]] = [K1,B,A,0] -L[K2] = K2 + merge[[A,0]],[C,0]],[A,C]] +L[K2] = K2 + merge[L[C],L[A],C,A] + = K2 + merge[[C,0]],[A,0]],[C,A]] = [K2,C,A,0] -L[Z] = Z + merge[[K1,B,A,0],[K2,C,A,0],[K1,K2]] - = [Z,K2] + merge[[K1,B,A,0],[C,A,0],K1] - = [Z,K2,K1] + merge[[B,A,0],[C,A,0]] - = [Z,K2,K1,A,C,B,0] +L[Z] = Z + merge[L[K2],L[K1],[K2,K1]] + = Z + merge[[K2,C,A,0],[K1,B,A,0],[K2,K1]] + = [Z,K2] + merge[[C,A,0],[B,A,0],K1] + = [Z,K2,K1] + merge[[C,A,0],[B,A,0]] + = [Z,K2,K1,C,A,B,0] //源码 From 064653a2cbc213c89a6c0812dd94c48c4643326e Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 20 Jan 2018 13:40:51 +0000 Subject: [PATCH 17/36] forth homework --- Lesson4/README.md | 16 - Lesson4/assignment/README.md | 12 - .../build/contracts/Migrations.json | 821 ++++ .../assignment/build/contracts/Payroll.json | 4066 +++++++++++++++++ Lesson4/assignment/contracts/Migrations.sol | 23 + Lesson4/assignment/contracts/Payroll.sol | 85 + .../migrations/1_initial_migration.js | 5 + .../migrations/2_deploy_contracts.js | 5 + Lesson4/assignment/test/payroll.js | 35 + Lesson4/assignment/truffle.js | 9 + Lesson4/assignment/yours.sol | 1 - 11 files changed, 5049 insertions(+), 29 deletions(-) delete mode 100644 Lesson4/README.md delete mode 100644 Lesson4/assignment/README.md create mode 100644 Lesson4/assignment/build/contracts/Migrations.json create mode 100644 Lesson4/assignment/build/contracts/Payroll.json create mode 100644 Lesson4/assignment/contracts/Migrations.sol create mode 100644 Lesson4/assignment/contracts/Payroll.sol create mode 100644 Lesson4/assignment/migrations/1_initial_migration.js create mode 100644 Lesson4/assignment/migrations/2_deploy_contracts.js create mode 100644 Lesson4/assignment/test/payroll.js create mode 100644 Lesson4/assignment/truffle.js delete mode 100644 Lesson4/assignment/yours.sol diff --git a/Lesson4/README.md b/Lesson4/README.md deleted file mode 100644 index 34bf0bb82..000000000 --- a/Lesson4/README.md +++ /dev/null @@ -1,16 +0,0 @@ -## 硅谷live以太坊智能合约频道官方地址 - -### 第四课《使用Truffle架构进行前后端交互,测试,部署》 - -目录结构 -
| -
|--orgin 课程初始代码 -
| -
|--assignment 课程作业提交代码 -
-### 本节知识点 -第4课:使用Truffle架构进行前后端交互,测试,部署 -- 为什么要用Truffle,Truffle的基本概念 -- Truffle 的command line 功能 -- 初始化项目与Truffle项目目录结构 -- 编译部署合约到testrpc diff --git a/Lesson4/assignment/README.md b/Lesson4/assignment/README.md deleted file mode 100644 index 871e6be04..000000000 --- a/Lesson4/assignment/README.md +++ /dev/null @@ -1,12 +0,0 @@ -## 硅谷live以太坊智能合约 第四课作业 -这里是同学提交作业的目录 - -### 第四课:课后作业 -- 将第三课完成的payroll.sol程序导入truffle工程 -- 在test文件夹中,写出对如下两个函数的单元测试: -- function addEmployee(address employeeId, uint salary) onlyOwner -- function removeEmployee(address employeeId) onlyOwner employeeExist(employeeId) -- 思考一下我们如何能覆盖所有的测试路径,包括函数异常的捕捉 -- (加分题,选作) -- 写出对以下函数的基于solidity或javascript的单元测试 function getPaid() employeeExist(msg.sender) -- Hint:思考如何对timestamp进行修改,是否需要对所测试的合约进行修改来达到测试的目的? diff --git a/Lesson4/assignment/build/contracts/Migrations.json b/Lesson4/assignment/build/contracts/Migrations.json new file mode 100644 index 000000000..b3f8a56c9 --- /dev/null +++ b/Lesson4/assignment/build/contracts/Migrations.json @@ -0,0 +1,821 @@ +{ + "contractName": "Migrations", + "abi": [ + { + "constant": false, + "inputs": [ + { + "name": "new_address", + "type": "address" + } + ], + "name": "upgrade", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "last_completed_migration", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "completed", + "type": "uint256" + } + ], + "name": "setCompleted", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + } + ], + "bytecode": "0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102db8061005e6000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a723058204fb963c2245703d3b2947bd4183f53bb59f31503790fbcd9810ccaa14e50fe310029", + "deployedBytecode": "0x606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a723058204fb963c2245703d3b2947bd4183f53bb59f31503790fbcd9810ccaa14e50fe310029", + "sourceMap": "26:488:0:-;;;178:58;;;;;;;;221:10;213:5;;:18;;;;;;;;;;;;;;;;;;26:488;;;;;;", + "deployedSourceMap": "26:488:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;347:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;74:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;240:103;;;;;;;;;;;;;;;;;;;;;;;;;;347:165;409:19;161:5;;;;;;;;;;;147:19;;:10;:19;;;143:26;;;442:11;409:45;;460:8;:21;;;482:24;;460:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;143:26;347:165;;:::o;74:36::-;;;;:::o;50:20::-;;;;;;;;;;;;;:::o;240:103::-;161:5;;;;;;;;;;;147:19;;:10;:19;;;143:26;;;329:9;302:24;:36;;;;143:26;240:103;:::o", + "source": "pragma solidity ^0.4.17;\n\ncontract Migrations {\n address public owner;\n uint public last_completed_migration;\n\n modifier restricted() {\n if (msg.sender == owner) _;\n }\n\n function Migrations() public {\n owner = msg.sender;\n }\n\n function setCompleted(uint completed) public restricted {\n last_completed_migration = completed;\n }\n\n function upgrade(address new_address) public restricted {\n Migrations upgraded = Migrations(new_address);\n upgraded.setCompleted(last_completed_migration);\n }\n}\n", + "sourcePath": "/home/juicebox/guigulive-operation/Lesson4/assignment/contracts/Migrations.sol", + "ast": { + "attributes": { + "absolutePath": "/home/juicebox/guigulive-operation/Lesson4/assignment/contracts/Migrations.sol", + "exportedSymbols": { + "Migrations": [ + 56 + ] + } + }, + "children": [ + { + "attributes": { + "literals": [ + "solidity", + "^", + "0.4", + ".17" + ] + }, + "id": 1, + "name": "PragmaDirective", + "src": "0:24:0" + }, + { + "attributes": { + "baseContracts": [ + null + ], + "contractDependencies": [ + null + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "linearizedBaseContracts": [ + 56 + ], + "name": "Migrations", + "scope": 57 + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "owner", + "scope": 56, + "stateVariable": true, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 2, + "name": "ElementaryTypeName", + "src": "50:7:0" + } + ], + "id": 3, + "name": "VariableDeclaration", + "src": "50:20:0" + }, + { + "attributes": { + "constant": false, + "name": "last_completed_migration", + "scope": 56, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 4, + "name": "ElementaryTypeName", + "src": "74:4:0" + } + ], + "id": 5, + "name": "VariableDeclaration", + "src": "74:36:0" + }, + { + "attributes": { + "name": "restricted", + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 6, + "name": "ParameterList", + "src": "134:2:0" + }, + { + "children": [ + { + "attributes": { + "falseBody": null + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "==", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 353, + "type": "msg", + "value": "msg" + }, + "id": 7, + "name": "Identifier", + "src": "147:3:0" + } + ], + "id": 8, + "name": "MemberAccess", + "src": "147:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 3, + "type": "address", + "value": "owner" + }, + "id": 9, + "name": "Identifier", + "src": "161:5:0" + } + ], + "id": 10, + "name": "BinaryOperation", + "src": "147:19:0" + }, + { + "id": 11, + "name": "PlaceholderStatement", + "src": "168:1:0" + } + ], + "id": 12, + "name": "IfStatement", + "src": "143:26:0" + } + ], + "id": 13, + "name": "Block", + "src": "137:37:0" + } + ], + "id": 14, + "name": "ModifierDefinition", + "src": "115:59:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": true, + "modifiers": [ + null + ], + "name": "Migrations", + "payable": false, + "scope": 56, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 15, + "name": "ParameterList", + "src": "197:2:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 16, + "name": "ParameterList", + "src": "207:0:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 3, + "type": "address", + "value": "owner" + }, + "id": 17, + "name": "Identifier", + "src": "213:5:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 353, + "type": "msg", + "value": "msg" + }, + "id": 18, + "name": "Identifier", + "src": "221:3:0" + } + ], + "id": 19, + "name": "MemberAccess", + "src": "221:10:0" + } + ], + "id": 20, + "name": "Assignment", + "src": "213:18:0" + } + ], + "id": 21, + "name": "ExpressionStatement", + "src": "213:18:0" + } + ], + "id": 22, + "name": "Block", + "src": "207:29:0" + } + ], + "id": 23, + "name": "FunctionDefinition", + "src": "178:58:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "setCompleted", + "payable": false, + "scope": 56, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "completed", + "scope": 35, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 24, + "name": "ElementaryTypeName", + "src": "262:4:0" + } + ], + "id": 25, + "name": "VariableDeclaration", + "src": "262:14:0" + } + ], + "id": 26, + "name": "ParameterList", + "src": "261:16:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 29, + "name": "ParameterList", + "src": "296:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 14, + "type": "modifier ()", + "value": "restricted" + }, + "id": 27, + "name": "Identifier", + "src": "285:10:0" + } + ], + "id": 28, + "name": "ModifierInvocation", + "src": "285:10:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 5, + "type": "uint256", + "value": "last_completed_migration" + }, + "id": 30, + "name": "Identifier", + "src": "302:24:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 25, + "type": "uint256", + "value": "completed" + }, + "id": 31, + "name": "Identifier", + "src": "329:9:0" + } + ], + "id": 32, + "name": "Assignment", + "src": "302:36:0" + } + ], + "id": 33, + "name": "ExpressionStatement", + "src": "302:36:0" + } + ], + "id": 34, + "name": "Block", + "src": "296:47:0" + } + ], + "id": 35, + "name": "FunctionDefinition", + "src": "240:103:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "upgrade", + "payable": false, + "scope": 56, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "new_address", + "scope": 55, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 36, + "name": "ElementaryTypeName", + "src": "364:7:0" + } + ], + "id": 37, + "name": "VariableDeclaration", + "src": "364:19:0" + } + ], + "id": 38, + "name": "ParameterList", + "src": "363:21:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 41, + "name": "ParameterList", + "src": "403:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 14, + "type": "modifier ()", + "value": "restricted" + }, + "id": 39, + "name": "Identifier", + "src": "392:10:0" + } + ], + "id": 40, + "name": "ModifierInvocation", + "src": "392:10:0" + }, + { + "children": [ + { + "attributes": { + "assignments": [ + 43 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "upgraded", + "scope": 55, + "stateVariable": false, + "storageLocation": "default", + "type": "contract Migrations", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "Migrations", + "referencedDeclaration": 56, + "type": "contract Migrations" + }, + "id": 42, + "name": "UserDefinedTypeName", + "src": "409:10:0" + } + ], + "id": 43, + "name": "VariableDeclaration", + "src": "409:19:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "contract Migrations", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 56, + "type": "type(contract Migrations)", + "value": "Migrations" + }, + "id": 44, + "name": "Identifier", + "src": "431:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 37, + "type": "address", + "value": "new_address" + }, + "id": 45, + "name": "Identifier", + "src": "442:11:0" + } + ], + "id": 46, + "name": "FunctionCall", + "src": "431:23:0" + } + ], + "id": 47, + "name": "VariableDeclarationStatement", + "src": "409:45:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "setCompleted", + "referencedDeclaration": 35, + "type": "function (uint256) external" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 43, + "type": "contract Migrations", + "value": "upgraded" + }, + "id": 48, + "name": "Identifier", + "src": "460:8:0" + } + ], + "id": 50, + "name": "MemberAccess", + "src": "460:21:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 5, + "type": "uint256", + "value": "last_completed_migration" + }, + "id": 51, + "name": "Identifier", + "src": "482:24:0" + } + ], + "id": 52, + "name": "FunctionCall", + "src": "460:47:0" + } + ], + "id": 53, + "name": "ExpressionStatement", + "src": "460:47:0" + } + ], + "id": 54, + "name": "Block", + "src": "403:109:0" + } + ], + "id": 55, + "name": "FunctionDefinition", + "src": "347:165:0" + } + ], + "id": 56, + "name": "ContractDefinition", + "src": "26:488:0" + } + ], + "id": 57, + "name": "SourceUnit", + "src": "0:515:0" + }, + "compiler": { + "name": "solc", + "version": "0.4.18+commit.9cf6e910.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "1.0.1", + "updatedAt": "2018-01-20T13:37:25.948Z" +} \ No newline at end of file diff --git a/Lesson4/assignment/build/contracts/Payroll.json b/Lesson4/assignment/build/contracts/Payroll.json new file mode 100644 index 000000000..43b4cfb0b --- /dev/null +++ b/Lesson4/assignment/build/contracts/Payroll.json @@ -0,0 +1,4066 @@ +{ + "contractName": "Payroll", + "abi": [ + { + "constant": false, + "inputs": [], + "name": "hasEnoughFund", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "calculateRunway", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "employeeId", + "type": "address" + }, + { + "name": "salary", + "type": "uint256" + } + ], + "name": "updateEmployee", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "addFund", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "getPaid", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "employees", + "outputs": [ + { + "name": "id", + "type": "address" + }, + { + "name": "salary", + "type": "uint256" + }, + { + "name": "lastPayday", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "employeeId", + "type": "address" + } + ], + "name": "removeEmployee", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "employeeId", + "type": "address" + }, + { + "name": "salary", + "type": "uint256" + } + ], + "name": "addEmployee", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + } + ], + "bytecode": "0x6060604052341561000f57600080fd5b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610c6e8061005f6000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806323fed09e146100935780634ec19512146100c05780635e91d8ec146100e9578063a2f09dfa1461012b578063cf41d6f814610149578063d06789471461015e578063d108177a146101e5578063e7fd9a131461021e575b600080fd5b341561009e57600080fd5b6100a6610260565b604051808215151515815260200191505060405180910390f35b34156100cb57600080fd5b6100d3610271565b6040518082815260200191505060405180910390f35b34156100f457600080fd5b610129600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061029c565b005b610133610586565b6040518082815260200191505060405180910390f35b341561015457600080fd5b61015c6105a5565b005b341561016957600080fd5b610195600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061073e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390f35b34156101f057600080fd5b61021c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610788565b005b341561022957600080fd5b61025e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a01565b005b60008061026b610271565b11905090565b600080543073ffffffffffffffffffffffffffffffffffffffff163181151561029657fe5b04905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102fa57600080fd5b826000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561038557fe5b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925061044583606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050610bdd565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000808282540392505081905550670de0b6b3a76400008402600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600080828254019250508190555042600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600080336000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561063357fe5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209350600a8460020154019250428310151561068957fe5b82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc85600101549081150290604051600060405180830381858888f19350505050151561073857600080fd5b50505050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107e657600080fd5b816000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561087157fe5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925061093183606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050610bdd565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000808282540392505081905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a5f57600080fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610ae657fe5b670de0b6b3a7640000820260008082825401925050819055506060604051908101604052808473ffffffffffffffffffffffffffffffffffffffff168152602001670de0b6b3a76400008402815260200142815250600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155905050505050565b6000600a82604001514203836020015102811515610bf757fe5b049050816000015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610c3e57600080fd5b50505600a165627a7a72305820f59b58a93f6942947470a744e1d9f18ae0116c4d5b71893c4a94f200acb5a15e0029", + "deployedBytecode": "0x60606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806323fed09e146100935780634ec19512146100c05780635e91d8ec146100e9578063a2f09dfa1461012b578063cf41d6f814610149578063d06789471461015e578063d108177a146101e5578063e7fd9a131461021e575b600080fd5b341561009e57600080fd5b6100a6610260565b604051808215151515815260200191505060405180910390f35b34156100cb57600080fd5b6100d3610271565b6040518082815260200191505060405180910390f35b34156100f457600080fd5b610129600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061029c565b005b610133610586565b6040518082815260200191505060405180910390f35b341561015457600080fd5b61015c6105a5565b005b341561016957600080fd5b610195600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061073e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390f35b34156101f057600080fd5b61021c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610788565b005b341561022957600080fd5b61025e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a01565b005b60008061026b610271565b11905090565b600080543073ffffffffffffffffffffffffffffffffffffffff163181151561029657fe5b04905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102fa57600080fd5b826000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561038557fe5b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925061044583606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050610bdd565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000808282540392505081905550670de0b6b3a76400008402600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600080828254019250508190555042600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600080336000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561063357fe5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209350600a8460020154019250428310151561068957fe5b82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc85600101549081150290604051600060405180830381858888f19350505050151561073857600080fd5b50505050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107e657600080fd5b816000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561087157fe5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925061093183606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050610bdd565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000808282540392505081905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a5f57600080fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610ae657fe5b670de0b6b3a7640000820260008082825401925050819055506060604051908101604052808473ffffffffffffffffffffffffffffffffffffffff168152602001670de0b6b3a76400008402815260200142815250600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155905050505050565b6000600a82604001514203836020015102811515610bf757fe5b049050816000015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610c3e57600080fd5b50505600a165627a7a72305820f59b58a93f6942947470a744e1d9f18ae0116c4d5b71893c4a94f200acb5a15e0029", + "sourceMap": "26:2347:1:-;;;290:54;;;;;;;;327:10;319:5;;:18;;;;;;;;;;;;;;;;;;26:2347;;;;;;", + "deployedSourceMap": "26:2347:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1963:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1861:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1365:398;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1773:78;;;;;;;;;;;;;;;;;;;;;;;2058:313;;;;;;;;;;;;;;238:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1072:283;;;;;;;;;;;;;;;;;;;;;;;;;;;;782:280;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1963:85;1997:4;2040:1;2020:17;:15;:17::i;:::-;:21;2013:28;;1963:85;:::o;1861:92::-;1897:4;1935:11;;1920:4;:12;;;:26;;;;;;;;1913:33;;1861:92;:::o;1365:398::-;1468:12;405:5;;;;;;;;;;;391:19;;:10;:19;;;383:28;;;;;;;;1446:10;493:12;508:9;:21;518:10;508:21;;;;;;;;;;;;;;;493:36;;561:3;546:8;:11;;;;;;;;;;;;:18;;;;539:26;;;;;;1483:9;:21;1493:10;1483:21;;;;;;;;;;;;;;;1468:36;;1523:22;1536:8;1523:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:22::i;:::-;1570:9;:21;1580:10;1570:21;;;;;;;;;;;;;;;:28;;;1555:11;;:43;;;;;;;;;;;1648:7;1639:6;:16;1608:9;:21;1618:10;1608:21;;;;;;;;;;;;;;;:28;;:47;;;;1680:9;:21;1690:10;1680:21;;;;;;;;;;;;;;;:28;;;1665:11;;:43;;;;;;;;;;;1753:3;1718:9;:21;1728:10;1718:21;;;;;;;;;;;;;;;:32;;:38;;;;421:1;;1365:398;;;:::o;1773:78::-;1809:4;1832;:12;;;1825:19;;1773:78;:::o;2058:313::-;2113:12;2168:15;2091:10;493:12;508:9;:21;518:10;508:21;;;;;;;;;;;;;;;493:36;;561:3;546:8;:11;;;;;;;;;;;;:18;;;;539:26;;;;;;2128:9;:21;2138:10;2128:21;;;;;;;;;;;;;;;2113:36;;176:10;2186:8;:19;;;:33;2168:51;;2249:3;2236:10;:16;2229:24;;;;;;2307:10;2272:9;:21;2282:10;2272:21;;;;;;;;;;;;;;;:32;;:45;;;;2327:8;:11;;;;;;;;;;;;:20;;:37;2348:8;:15;;;2327:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2058:313;;;;:::o;238:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1072:283::-;1171:12;405:5;;;;;;;;;;;391:19;;:10;:19;;;383:28;;;;;;;;1140:10;493:12;508:9;:21;518:10;508:21;;;;;;;;;;;;;;;493:36;;561:3;546:8;:11;;;;;;;;;;;;:18;;;;539:26;;;;;;1186:9;:21;1196:10;1186:21;;;;;;;;;;;;;;;1171:36;;1226:22;1239:8;1226:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:22::i;:::-;1273:9;:21;1283:10;1273:21;;;;;;;;;;;;;;;:28;;;1258:11;;:43;;;;;;;;;;;1318:9;:21;1328:10;1318:21;;;;;;;;;;;;;;;;1311:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;421:1;;1072:283;;:::o;782:280::-;856:12;405:5;;;;;;;;;;;391:19;;:10;:19;;;383:28;;;;;;;;871:9;:21;881:10;871:21;;;;;;;;;;;;;;;856:36;;924:3;909:8;:11;;;;;;;;;;;;:18;;;902:26;;;;;;962:7;953:6;:16;938:11;;:31;;;;;;;;;;;1012:43;;;;;;;;;1021:10;1012:43;;;;;;1042:7;1033:6;:16;1012:43;;;;1051:3;1012:43;;;988:9;:21;998:10;988:21;;;;;;;;;;;;;;;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;782:280;;;:::o;593:179::-;652:12;176:10;692:8;:19;;;686:3;:25;667:8;:15;;;:45;:59;;;;;;;;652:74;;736:8;:11;;;:20;;:29;757:7;736:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;593:179;;:::o", + "source": "pragma solidity ^0.4.14;\n\ncontract Payroll {\n struct Employee {\n address id;\n uint salary;\n uint lastPayday;\n }\n \n uint constant payDuration = 10 seconds;\n \n uint totalSalary;\n address owner;\n mapping(address => Employee) public employees;\n\n function Payroll() {\n owner = msg.sender;\n }\n \n modifier onlyOwner {\n require(msg.sender == owner);\n _;\n }\n \n modifier employeeExist(address employeeId) {\n var employee = employees[employeeId];\n assert(employee.id != 0x0);\n _;\n }\n \n function _partialPaid(Employee employee) private {\n uint payment = employee.salary * (now - employee.lastPayday) / payDuration;\n employee.id.transfer(payment);\n }\n \n function addEmployee(address employeeId, uint salary) onlyOwner {\n var employee = employees[employeeId];\n assert(employee.id == 0x0);\n totalSalary += salary * 1 ether;\n \n employees[employeeId] = Employee(employeeId, salary * 1 ether, now);\n }\n \n function removeEmployee(address employeeId) onlyOwner employeeExist(employeeId) {\n \n var employee = employees[employeeId];\n \n _partialPaid(employee);\n totalSalary -= employees[employeeId].salary;\n delete employees[employeeId];\n \n }\n \n function updateEmployee(address employeeId, uint salary) onlyOwner employeeExist(employeeId) {\n var employee = employees[employeeId];\n \n _partialPaid(employee);\n totalSalary -= employees[employeeId].salary;\n employees[employeeId].salary = salary * 1 ether;\n totalSalary += employees[employeeId].salary;\n employees[employeeId].lastPayday = now;\n }\n \n function addFund() payable returns (uint) {\n return this.balance;\n }\n \n function calculateRunway() returns (uint) {\n return this.balance / totalSalary;\n }\n \n function hasEnoughFund() returns (bool) {\n return calculateRunway() > 0;\n }\n \n function getPaid() employeeExist(msg.sender) {\n var employee = employees[msg.sender];\n \n uint nextPayday = employee.lastPayday + payDuration;\n assert(nextPayday < now);\n \n employees[msg.sender].lastPayday = nextPayday;\n employee.id.transfer(employee.salary);\n }\n}\n", + "sourcePath": "/home/juicebox/guigulive-operation/Lesson4/assignment/contracts/Payroll.sol", + "ast": { + "attributes": { + "absolutePath": "/home/juicebox/guigulive-operation/Lesson4/assignment/contracts/Payroll.sol", + "exportedSymbols": { + "Payroll": [ + 341 + ] + } + }, + "children": [ + { + "attributes": { + "literals": [ + "solidity", + "^", + "0.4", + ".14" + ] + }, + "id": 58, + "name": "PragmaDirective", + "src": "0:24:1" + }, + { + "attributes": { + "baseContracts": [ + null + ], + "contractDependencies": [ + null + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "linearizedBaseContracts": [ + 341 + ], + "name": "Payroll", + "scope": 342 + }, + "children": [ + { + "attributes": { + "canonicalName": "Payroll.Employee", + "name": "Employee", + "scope": 341, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "id", + "scope": 65, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 59, + "name": "ElementaryTypeName", + "src": "75:7:1" + } + ], + "id": 60, + "name": "VariableDeclaration", + "src": "75:10:1" + }, + { + "attributes": { + "constant": false, + "name": "salary", + "scope": 65, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 61, + "name": "ElementaryTypeName", + "src": "95:4:1" + } + ], + "id": 62, + "name": "VariableDeclaration", + "src": "95:11:1" + }, + { + "attributes": { + "constant": false, + "name": "lastPayday", + "scope": 65, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 63, + "name": "ElementaryTypeName", + "src": "116:4:1" + } + ], + "id": 64, + "name": "VariableDeclaration", + "src": "116:15:1" + } + ], + "id": 65, + "name": "StructDefinition", + "src": "49:89:1" + }, + { + "attributes": { + "constant": true, + "name": "payDuration", + "scope": 341, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 66, + "name": "ElementaryTypeName", + "src": "148:4:1" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "3130", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": "seconds", + "token": "number", + "type": "int_const 10", + "value": "10" + }, + "id": 67, + "name": "Literal", + "src": "176:10:1" + } + ], + "id": 68, + "name": "VariableDeclaration", + "src": "148:38:1" + }, + { + "attributes": { + "constant": false, + "name": "totalSalary", + "scope": 341, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 69, + "name": "ElementaryTypeName", + "src": "197:4:1" + } + ], + "id": 70, + "name": "VariableDeclaration", + "src": "197:16:1" + }, + { + "attributes": { + "constant": false, + "name": "owner", + "scope": 341, + "stateVariable": true, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 71, + "name": "ElementaryTypeName", + "src": "219:7:1" + } + ], + "id": 72, + "name": "VariableDeclaration", + "src": "219:13:1" + }, + { + "attributes": { + "constant": false, + "name": "employees", + "scope": 341, + "stateVariable": true, + "storageLocation": "default", + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "type": "mapping(address => struct Payroll.Employee storage ref)" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 73, + "name": "ElementaryTypeName", + "src": "246:7:1" + }, + { + "attributes": { + "contractScope": null, + "name": "Employee", + "referencedDeclaration": 65, + "type": "struct Payroll.Employee storage pointer" + }, + "id": 74, + "name": "UserDefinedTypeName", + "src": "257:8:1" + } + ], + "id": 75, + "name": "Mapping", + "src": "238:28:1" + } + ], + "id": 76, + "name": "VariableDeclaration", + "src": "238:45:1" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": true, + "modifiers": [ + null + ], + "name": "Payroll", + "payable": false, + "scope": 341, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 77, + "name": "ParameterList", + "src": "306:2:1" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 78, + "name": "ParameterList", + "src": "309:0:1" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 72, + "type": "address", + "value": "owner" + }, + "id": 79, + "name": "Identifier", + "src": "319:5:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 353, + "type": "msg", + "value": "msg" + }, + "id": 80, + "name": "Identifier", + "src": "327:3:1" + } + ], + "id": 81, + "name": "MemberAccess", + "src": "327:10:1" + } + ], + "id": 82, + "name": "Assignment", + "src": "319:18:1" + } + ], + "id": 83, + "name": "ExpressionStatement", + "src": "319:18:1" + } + ], + "id": 84, + "name": "Block", + "src": "309:35:1" + } + ], + "id": 85, + "name": "FunctionDefinition", + "src": "290:54:1" + }, + { + "attributes": { + "name": "onlyOwner", + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 86, + "name": "ParameterList", + "src": "373:0:1" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 356, + "type": "function (bool) pure", + "value": "require" + }, + "id": 87, + "name": "Identifier", + "src": "383:7:1" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "==", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 353, + "type": "msg", + "value": "msg" + }, + "id": 88, + "name": "Identifier", + "src": "391:3:1" + } + ], + "id": 89, + "name": "MemberAccess", + "src": "391:10:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 72, + "type": "address", + "value": "owner" + }, + "id": 90, + "name": "Identifier", + "src": "405:5:1" + } + ], + "id": 91, + "name": "BinaryOperation", + "src": "391:19:1" + } + ], + "id": 92, + "name": "FunctionCall", + "src": "383:28:1" + } + ], + "id": 93, + "name": "ExpressionStatement", + "src": "383:28:1" + }, + { + "id": 94, + "name": "PlaceholderStatement", + "src": "421:1:1" + } + ], + "id": 95, + "name": "Block", + "src": "373:56:1" + } + ], + "id": 96, + "name": "ModifierDefinition", + "src": "354:75:1" + }, + { + "attributes": { + "name": "employeeExist", + "visibility": "internal" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "employeeId", + "scope": 114, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 97, + "name": "ElementaryTypeName", + "src": "462:7:1" + } + ], + "id": 98, + "name": "VariableDeclaration", + "src": "462:18:1" + } + ], + "id": 99, + "name": "ParameterList", + "src": "461:20:1" + }, + { + "children": [ + { + "attributes": { + "assignments": [ + 100 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "employee", + "scope": 114, + "stateVariable": false, + "storageLocation": "default", + "type": "struct Payroll.Employee storage pointer", + "typeName": null, + "value": null, + "visibility": "internal" + }, + "children": [], + "id": 100, + "name": "VariableDeclaration", + "src": "493:12:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": "employees" + }, + "id": 101, + "name": "Identifier", + "src": "508:9:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 98, + "type": "address", + "value": "employeeId" + }, + "id": 102, + "name": "Identifier", + "src": "518:10:1" + } + ], + "id": 103, + "name": "IndexAccess", + "src": "508:21:1" + } + ], + "id": 104, + "name": "VariableDeclarationStatement", + "src": "493:36:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 344, + "type": "function (bool) pure", + "value": "assert" + }, + "id": 105, + "name": "Identifier", + "src": "539:6:1" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "!=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "id", + "referencedDeclaration": 60, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 100, + "type": "struct Payroll.Employee storage pointer", + "value": "employee" + }, + "id": 106, + "name": "Identifier", + "src": "546:8:1" + } + ], + "id": 107, + "name": "MemberAccess", + "src": "546:11:1" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "307830", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0x0" + }, + "id": 108, + "name": "Literal", + "src": "561:3:1" + } + ], + "id": 109, + "name": "BinaryOperation", + "src": "546:18:1" + } + ], + "id": 110, + "name": "FunctionCall", + "src": "539:26:1" + } + ], + "id": 111, + "name": "ExpressionStatement", + "src": "539:26:1" + }, + { + "id": 112, + "name": "PlaceholderStatement", + "src": "575:1:1" + } + ], + "id": 113, + "name": "Block", + "src": "482:101:1" + } + ], + "id": 114, + "name": "ModifierDefinition", + "src": "439:144:1" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "_partialPaid", + "payable": false, + "scope": 341, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "private" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "employee", + "scope": 141, + "stateVariable": false, + "storageLocation": "default", + "type": "struct Payroll.Employee memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "Employee", + "referencedDeclaration": 65, + "type": "struct Payroll.Employee storage pointer" + }, + "id": 115, + "name": "UserDefinedTypeName", + "src": "615:8:1" + } + ], + "id": 116, + "name": "VariableDeclaration", + "src": "615:17:1" + } + ], + "id": 117, + "name": "ParameterList", + "src": "614:19:1" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 118, + "name": "ParameterList", + "src": "642:0:1" + }, + { + "children": [ + { + "attributes": { + "assignments": [ + 120 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "payment", + "scope": 141, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 119, + "name": "ElementaryTypeName", + "src": "652:4:1" + } + ], + "id": 120, + "name": "VariableDeclaration", + "src": "652:12:1" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "/", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "*", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "salary", + "referencedDeclaration": 62, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 116, + "type": "struct Payroll.Employee memory", + "value": "employee" + }, + "id": 121, + "name": "Identifier", + "src": "667:8:1" + } + ], + "id": 122, + "name": "MemberAccess", + "src": "667:15:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "-", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 355, + "type": "uint256", + "value": "now" + }, + "id": 123, + "name": "Identifier", + "src": "686:3:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "lastPayday", + "referencedDeclaration": 64, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 116, + "type": "struct Payroll.Employee memory", + "value": "employee" + }, + "id": 124, + "name": "Identifier", + "src": "692:8:1" + } + ], + "id": 125, + "name": "MemberAccess", + "src": "692:19:1" + } + ], + "id": 126, + "name": "BinaryOperation", + "src": "686:25:1" + } + ], + "id": 127, + "name": "TupleExpression", + "src": "685:27:1" + } + ], + "id": 128, + "name": "BinaryOperation", + "src": "667:45:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 68, + "type": "uint256", + "value": "payDuration" + }, + "id": 129, + "name": "Identifier", + "src": "715:11:1" + } + ], + "id": 130, + "name": "BinaryOperation", + "src": "667:59:1" + } + ], + "id": 131, + "name": "VariableDeclarationStatement", + "src": "652:74:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "transfer", + "referencedDeclaration": null, + "type": "function (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "id", + "referencedDeclaration": 60, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 116, + "type": "struct Payroll.Employee memory", + "value": "employee" + }, + "id": 132, + "name": "Identifier", + "src": "736:8:1" + } + ], + "id": 135, + "name": "MemberAccess", + "src": "736:11:1" + } + ], + "id": 136, + "name": "MemberAccess", + "src": "736:20:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 120, + "type": "uint256", + "value": "payment" + }, + "id": 137, + "name": "Identifier", + "src": "757:7:1" + } + ], + "id": 138, + "name": "FunctionCall", + "src": "736:29:1" + } + ], + "id": 139, + "name": "ExpressionStatement", + "src": "736:29:1" + } + ], + "id": 140, + "name": "Block", + "src": "642:130:1" + } + ], + "id": 141, + "name": "FunctionDefinition", + "src": "593:179:1" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "addEmployee", + "payable": false, + "scope": 341, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "employeeId", + "scope": 181, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 142, + "name": "ElementaryTypeName", + "src": "803:7:1" + } + ], + "id": 143, + "name": "VariableDeclaration", + "src": "803:18:1" + }, + { + "attributes": { + "constant": false, + "name": "salary", + "scope": 181, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 144, + "name": "ElementaryTypeName", + "src": "823:4:1" + } + ], + "id": 145, + "name": "VariableDeclaration", + "src": "823:11:1" + } + ], + "id": 146, + "name": "ParameterList", + "src": "802:33:1" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 149, + "name": "ParameterList", + "src": "846:0:1" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 96, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 147, + "name": "Identifier", + "src": "836:9:1" + } + ], + "id": 148, + "name": "ModifierInvocation", + "src": "836:9:1" + }, + { + "children": [ + { + "attributes": { + "assignments": [ + 150 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "employee", + "scope": 181, + "stateVariable": false, + "storageLocation": "default", + "type": "struct Payroll.Employee storage pointer", + "typeName": null, + "value": null, + "visibility": "internal" + }, + "children": [], + "id": 150, + "name": "VariableDeclaration", + "src": "856:12:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": "employees" + }, + "id": 151, + "name": "Identifier", + "src": "871:9:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 143, + "type": "address", + "value": "employeeId" + }, + "id": 152, + "name": "Identifier", + "src": "881:10:1" + } + ], + "id": 153, + "name": "IndexAccess", + "src": "871:21:1" + } + ], + "id": 154, + "name": "VariableDeclarationStatement", + "src": "856:36:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 344, + "type": "function (bool) pure", + "value": "assert" + }, + "id": 155, + "name": "Identifier", + "src": "902:6:1" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "==", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "id", + "referencedDeclaration": 60, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 150, + "type": "struct Payroll.Employee storage pointer", + "value": "employee" + }, + "id": 156, + "name": "Identifier", + "src": "909:8:1" + } + ], + "id": 157, + "name": "MemberAccess", + "src": "909:11:1" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "307830", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0x0" + }, + "id": 158, + "name": "Literal", + "src": "924:3:1" + } + ], + "id": 159, + "name": "BinaryOperation", + "src": "909:18:1" + } + ], + "id": 160, + "name": "FunctionCall", + "src": "902:26:1" + } + ], + "id": 161, + "name": "ExpressionStatement", + "src": "902:26:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "+=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 70, + "type": "uint256", + "value": "totalSalary" + }, + "id": 162, + "name": "Identifier", + "src": "938:11:1" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "*", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 145, + "type": "uint256", + "value": "salary" + }, + "id": 163, + "name": "Identifier", + "src": "953:6:1" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "31", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": "ether", + "token": "number", + "type": "int_const 1000000000000000000", + "value": "1" + }, + "id": 164, + "name": "Literal", + "src": "962:7:1" + } + ], + "id": 165, + "name": "BinaryOperation", + "src": "953:16:1" + } + ], + "id": 166, + "name": "Assignment", + "src": "938:31:1" + } + ], + "id": 167, + "name": "ExpressionStatement", + "src": "938:31:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": "employees" + }, + "id": 168, + "name": "Identifier", + "src": "988:9:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 143, + "type": "address", + "value": "employeeId" + }, + "id": 169, + "name": "Identifier", + "src": "998:10:1" + } + ], + "id": 170, + "name": "IndexAccess", + "src": "988:21:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": true, + "lValueRequested": false, + "names": [ + null + ], + "type": "struct Payroll.Employee memory", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 65, + "type": "type(struct Payroll.Employee storage pointer)", + "value": "Employee" + }, + "id": 171, + "name": "Identifier", + "src": "1012:8:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 143, + "type": "address", + "value": "employeeId" + }, + "id": 172, + "name": "Identifier", + "src": "1021:10:1" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "*", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 145, + "type": "uint256", + "value": "salary" + }, + "id": 173, + "name": "Identifier", + "src": "1033:6:1" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "31", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": "ether", + "token": "number", + "type": "int_const 1000000000000000000", + "value": "1" + }, + "id": 174, + "name": "Literal", + "src": "1042:7:1" + } + ], + "id": 175, + "name": "BinaryOperation", + "src": "1033:16:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 355, + "type": "uint256", + "value": "now" + }, + "id": 176, + "name": "Identifier", + "src": "1051:3:1" + } + ], + "id": 177, + "name": "FunctionCall", + "src": "1012:43:1" + } + ], + "id": 178, + "name": "Assignment", + "src": "988:67:1" + } + ], + "id": 179, + "name": "ExpressionStatement", + "src": "988:67:1" + } + ], + "id": 180, + "name": "Block", + "src": "846:216:1" + } + ], + "id": 181, + "name": "FunctionDefinition", + "src": "782:280:1" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "removeEmployee", + "payable": false, + "scope": 341, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "employeeId", + "scope": 213, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 182, + "name": "ElementaryTypeName", + "src": "1096:7:1" + } + ], + "id": 183, + "name": "VariableDeclaration", + "src": "1096:18:1" + } + ], + "id": 184, + "name": "ParameterList", + "src": "1095:20:1" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 190, + "name": "ParameterList", + "src": "1152:0:1" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 96, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 185, + "name": "Identifier", + "src": "1116:9:1" + } + ], + "id": 186, + "name": "ModifierInvocation", + "src": "1116:9:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 114, + "type": "modifier (address)", + "value": "employeeExist" + }, + "id": 187, + "name": "Identifier", + "src": "1126:13:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 183, + "type": "address", + "value": "employeeId" + }, + "id": 188, + "name": "Identifier", + "src": "1140:10:1" + } + ], + "id": 189, + "name": "ModifierInvocation", + "src": "1126:25:1" + }, + { + "children": [ + { + "attributes": { + "assignments": [ + 191 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "employee", + "scope": 213, + "stateVariable": false, + "storageLocation": "default", + "type": "struct Payroll.Employee storage pointer", + "typeName": null, + "value": null, + "visibility": "internal" + }, + "children": [], + "id": 191, + "name": "VariableDeclaration", + "src": "1171:12:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": "employees" + }, + "id": 192, + "name": "Identifier", + "src": "1186:9:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 183, + "type": "address", + "value": "employeeId" + }, + "id": 193, + "name": "Identifier", + "src": "1196:10:1" + } + ], + "id": 194, + "name": "IndexAccess", + "src": "1186:21:1" + } + ], + "id": 195, + "name": "VariableDeclarationStatement", + "src": "1171:36:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_Employee_$65_storage_ptr", + "typeString": "struct Payroll.Employee storage pointer" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 141, + "type": "function (struct Payroll.Employee memory)", + "value": "_partialPaid" + }, + "id": 196, + "name": "Identifier", + "src": "1226:12:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 191, + "type": "struct Payroll.Employee storage pointer", + "value": "employee" + }, + "id": 197, + "name": "Identifier", + "src": "1239:8:1" + } + ], + "id": 198, + "name": "FunctionCall", + "src": "1226:22:1" + } + ], + "id": 199, + "name": "ExpressionStatement", + "src": "1226:22:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "-=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 70, + "type": "uint256", + "value": "totalSalary" + }, + "id": 200, + "name": "Identifier", + "src": "1258:11:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "salary", + "referencedDeclaration": 62, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": "employees" + }, + "id": 201, + "name": "Identifier", + "src": "1273:9:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 183, + "type": "address", + "value": "employeeId" + }, + "id": 202, + "name": "Identifier", + "src": "1283:10:1" + } + ], + "id": 203, + "name": "IndexAccess", + "src": "1273:21:1" + } + ], + "id": 204, + "name": "MemberAccess", + "src": "1273:28:1" + } + ], + "id": 205, + "name": "Assignment", + "src": "1258:43:1" + } + ], + "id": 206, + "name": "ExpressionStatement", + "src": "1258:43:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "delete", + "prefix": true, + "type": "tuple()" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": "employees" + }, + "id": 207, + "name": "Identifier", + "src": "1318:9:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 183, + "type": "address", + "value": "employeeId" + }, + "id": 208, + "name": "Identifier", + "src": "1328:10:1" + } + ], + "id": 209, + "name": "IndexAccess", + "src": "1318:21:1" + } + ], + "id": 210, + "name": "UnaryOperation", + "src": "1311:28:1" + } + ], + "id": 211, + "name": "ExpressionStatement", + "src": "1311:28:1" + } + ], + "id": 212, + "name": "Block", + "src": "1152:203:1" + } + ], + "id": 213, + "name": "FunctionDefinition", + "src": "1072:283:1" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "updateEmployee", + "payable": false, + "scope": 341, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "employeeId", + "scope": 265, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 214, + "name": "ElementaryTypeName", + "src": "1389:7:1" + } + ], + "id": 215, + "name": "VariableDeclaration", + "src": "1389:18:1" + }, + { + "attributes": { + "constant": false, + "name": "salary", + "scope": 265, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 216, + "name": "ElementaryTypeName", + "src": "1409:4:1" + } + ], + "id": 217, + "name": "VariableDeclaration", + "src": "1409:11:1" + } + ], + "id": 218, + "name": "ParameterList", + "src": "1388:33:1" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 224, + "name": "ParameterList", + "src": "1458:0:1" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 96, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 219, + "name": "Identifier", + "src": "1422:9:1" + } + ], + "id": 220, + "name": "ModifierInvocation", + "src": "1422:9:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 114, + "type": "modifier (address)", + "value": "employeeExist" + }, + "id": 221, + "name": "Identifier", + "src": "1432:13:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 215, + "type": "address", + "value": "employeeId" + }, + "id": 222, + "name": "Identifier", + "src": "1446:10:1" + } + ], + "id": 223, + "name": "ModifierInvocation", + "src": "1432:25:1" + }, + { + "children": [ + { + "attributes": { + "assignments": [ + 225 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "employee", + "scope": 265, + "stateVariable": false, + "storageLocation": "default", + "type": "struct Payroll.Employee storage pointer", + "typeName": null, + "value": null, + "visibility": "internal" + }, + "children": [], + "id": 225, + "name": "VariableDeclaration", + "src": "1468:12:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": "employees" + }, + "id": 226, + "name": "Identifier", + "src": "1483:9:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 215, + "type": "address", + "value": "employeeId" + }, + "id": 227, + "name": "Identifier", + "src": "1493:10:1" + } + ], + "id": 228, + "name": "IndexAccess", + "src": "1483:21:1" + } + ], + "id": 229, + "name": "VariableDeclarationStatement", + "src": "1468:36:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_Employee_$65_storage_ptr", + "typeString": "struct Payroll.Employee storage pointer" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 141, + "type": "function (struct Payroll.Employee memory)", + "value": "_partialPaid" + }, + "id": 230, + "name": "Identifier", + "src": "1523:12:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 225, + "type": "struct Payroll.Employee storage pointer", + "value": "employee" + }, + "id": 231, + "name": "Identifier", + "src": "1536:8:1" + } + ], + "id": 232, + "name": "FunctionCall", + "src": "1523:22:1" + } + ], + "id": 233, + "name": "ExpressionStatement", + "src": "1523:22:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "-=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 70, + "type": "uint256", + "value": "totalSalary" + }, + "id": 234, + "name": "Identifier", + "src": "1555:11:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "salary", + "referencedDeclaration": 62, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": "employees" + }, + "id": 235, + "name": "Identifier", + "src": "1570:9:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 215, + "type": "address", + "value": "employeeId" + }, + "id": 236, + "name": "Identifier", + "src": "1580:10:1" + } + ], + "id": 237, + "name": "IndexAccess", + "src": "1570:21:1" + } + ], + "id": 238, + "name": "MemberAccess", + "src": "1570:28:1" + } + ], + "id": 239, + "name": "Assignment", + "src": "1555:43:1" + } + ], + "id": 240, + "name": "ExpressionStatement", + "src": "1555:43:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "member_name": "salary", + "referencedDeclaration": 62, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": "employees" + }, + "id": 241, + "name": "Identifier", + "src": "1608:9:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 215, + "type": "address", + "value": "employeeId" + }, + "id": 242, + "name": "Identifier", + "src": "1618:10:1" + } + ], + "id": 243, + "name": "IndexAccess", + "src": "1608:21:1" + } + ], + "id": 244, + "name": "MemberAccess", + "src": "1608:28:1" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "*", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 217, + "type": "uint256", + "value": "salary" + }, + "id": 245, + "name": "Identifier", + "src": "1639:6:1" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "31", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": "ether", + "token": "number", + "type": "int_const 1000000000000000000", + "value": "1" + }, + "id": 246, + "name": "Literal", + "src": "1648:7:1" + } + ], + "id": 247, + "name": "BinaryOperation", + "src": "1639:16:1" + } + ], + "id": 248, + "name": "Assignment", + "src": "1608:47:1" + } + ], + "id": 249, + "name": "ExpressionStatement", + "src": "1608:47:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "+=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 70, + "type": "uint256", + "value": "totalSalary" + }, + "id": 250, + "name": "Identifier", + "src": "1665:11:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "salary", + "referencedDeclaration": 62, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": "employees" + }, + "id": 251, + "name": "Identifier", + "src": "1680:9:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 215, + "type": "address", + "value": "employeeId" + }, + "id": 252, + "name": "Identifier", + "src": "1690:10:1" + } + ], + "id": 253, + "name": "IndexAccess", + "src": "1680:21:1" + } + ], + "id": 254, + "name": "MemberAccess", + "src": "1680:28:1" + } + ], + "id": 255, + "name": "Assignment", + "src": "1665:43:1" + } + ], + "id": 256, + "name": "ExpressionStatement", + "src": "1665:43:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "member_name": "lastPayday", + "referencedDeclaration": 64, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": "employees" + }, + "id": 257, + "name": "Identifier", + "src": "1718:9:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 215, + "type": "address", + "value": "employeeId" + }, + "id": 258, + "name": "Identifier", + "src": "1728:10:1" + } + ], + "id": 259, + "name": "IndexAccess", + "src": "1718:21:1" + } + ], + "id": 260, + "name": "MemberAccess", + "src": "1718:32:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 355, + "type": "uint256", + "value": "now" + }, + "id": 261, + "name": "Identifier", + "src": "1753:3:1" + } + ], + "id": 262, + "name": "Assignment", + "src": "1718:38:1" + } + ], + "id": 263, + "name": "ExpressionStatement", + "src": "1718:38:1" + } + ], + "id": 264, + "name": "Block", + "src": "1458:305:1" + } + ], + "id": 265, + "name": "FunctionDefinition", + "src": "1365:398:1" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "addFund", + "payable": true, + "scope": 341, + "stateMutability": "payable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 266, + "name": "ParameterList", + "src": "1789:2:1" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 274, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 267, + "name": "ElementaryTypeName", + "src": "1809:4:1" + } + ], + "id": 268, + "name": "VariableDeclaration", + "src": "1809:4:1" + } + ], + "id": 269, + "name": "ParameterList", + "src": "1808:6:1" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 269 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "balance", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 366, + "type": "contract Payroll", + "value": "this" + }, + "id": 270, + "name": "Identifier", + "src": "1832:4:1" + } + ], + "id": 271, + "name": "MemberAccess", + "src": "1832:12:1" + } + ], + "id": 272, + "name": "Return", + "src": "1825:19:1" + } + ], + "id": 273, + "name": "Block", + "src": "1815:36:1" + } + ], + "id": 274, + "name": "FunctionDefinition", + "src": "1773:78:1" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "calculateRunway", + "payable": false, + "scope": 341, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 275, + "name": "ParameterList", + "src": "1885:2:1" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 285, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 276, + "name": "ElementaryTypeName", + "src": "1897:4:1" + } + ], + "id": 277, + "name": "VariableDeclaration", + "src": "1897:4:1" + } + ], + "id": 278, + "name": "ParameterList", + "src": "1896:6:1" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 278 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "/", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "balance", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 366, + "type": "contract Payroll", + "value": "this" + }, + "id": 279, + "name": "Identifier", + "src": "1920:4:1" + } + ], + "id": 280, + "name": "MemberAccess", + "src": "1920:12:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 70, + "type": "uint256", + "value": "totalSalary" + }, + "id": 281, + "name": "Identifier", + "src": "1935:11:1" + } + ], + "id": 282, + "name": "BinaryOperation", + "src": "1920:26:1" + } + ], + "id": 283, + "name": "Return", + "src": "1913:33:1" + } + ], + "id": 284, + "name": "Block", + "src": "1903:50:1" + } + ], + "id": 285, + "name": "FunctionDefinition", + "src": "1861:92:1" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "hasEnoughFund", + "payable": false, + "scope": 341, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 286, + "name": "ParameterList", + "src": "1985:2:1" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 296, + "stateVariable": false, + "storageLocation": "default", + "type": "bool", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "bool", + "type": "bool" + }, + "id": 287, + "name": "ElementaryTypeName", + "src": "1997:4:1" + } + ], + "id": 288, + "name": "VariableDeclaration", + "src": "1997:4:1" + } + ], + "id": 289, + "name": "ParameterList", + "src": "1996:6:1" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 289 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "arguments": [ + null + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + null + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 285, + "type": "function () returns (uint256)", + "value": "calculateRunway" + }, + "id": 290, + "name": "Identifier", + "src": "2020:15:1" + } + ], + "id": 291, + "name": "FunctionCall", + "src": "2020:17:1" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 292, + "name": "Literal", + "src": "2040:1:1" + } + ], + "id": 293, + "name": "BinaryOperation", + "src": "2020:21:1" + } + ], + "id": 294, + "name": "Return", + "src": "2013:28:1" + } + ], + "id": 295, + "name": "Block", + "src": "2003:45:1" + } + ], + "id": 296, + "name": "FunctionDefinition", + "src": "1963:85:1" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "getPaid", + "payable": false, + "scope": 341, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 297, + "name": "ParameterList", + "src": "2074:2:1" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 302, + "name": "ParameterList", + "src": "2103:0:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 114, + "type": "modifier (address)", + "value": "employeeExist" + }, + "id": 298, + "name": "Identifier", + "src": "2077:13:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 353, + "type": "msg", + "value": "msg" + }, + "id": 299, + "name": "Identifier", + "src": "2091:3:1" + } + ], + "id": 300, + "name": "MemberAccess", + "src": "2091:10:1" + } + ], + "id": 301, + "name": "ModifierInvocation", + "src": "2077:25:1" + }, + { + "children": [ + { + "attributes": { + "assignments": [ + 303 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "employee", + "scope": 340, + "stateVariable": false, + "storageLocation": "default", + "type": "struct Payroll.Employee storage pointer", + "typeName": null, + "value": null, + "visibility": "internal" + }, + "children": [], + "id": 303, + "name": "VariableDeclaration", + "src": "2113:12:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": "employees" + }, + "id": 304, + "name": "Identifier", + "src": "2128:9:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 353, + "type": "msg", + "value": "msg" + }, + "id": 305, + "name": "Identifier", + "src": "2138:3:1" + } + ], + "id": 306, + "name": "MemberAccess", + "src": "2138:10:1" + } + ], + "id": 307, + "name": "IndexAccess", + "src": "2128:21:1" + } + ], + "id": 308, + "name": "VariableDeclarationStatement", + "src": "2113:36:1" + }, + { + "attributes": { + "assignments": [ + 310 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "nextPayday", + "scope": 340, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 309, + "name": "ElementaryTypeName", + "src": "2168:4:1" + } + ], + "id": 310, + "name": "VariableDeclaration", + "src": "2168:15:1" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "+", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "lastPayday", + "referencedDeclaration": 64, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 303, + "type": "struct Payroll.Employee storage pointer", + "value": "employee" + }, + "id": 311, + "name": "Identifier", + "src": "2186:8:1" + } + ], + "id": 312, + "name": "MemberAccess", + "src": "2186:19:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 68, + "type": "uint256", + "value": "payDuration" + }, + "id": 313, + "name": "Identifier", + "src": "2208:11:1" + } + ], + "id": 314, + "name": "BinaryOperation", + "src": "2186:33:1" + } + ], + "id": 315, + "name": "VariableDeclarationStatement", + "src": "2168:51:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 344, + "type": "function (bool) pure", + "value": "assert" + }, + "id": 316, + "name": "Identifier", + "src": "2229:6:1" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "<", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 310, + "type": "uint256", + "value": "nextPayday" + }, + "id": 317, + "name": "Identifier", + "src": "2236:10:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 355, + "type": "uint256", + "value": "now" + }, + "id": 318, + "name": "Identifier", + "src": "2249:3:1" + } + ], + "id": 319, + "name": "BinaryOperation", + "src": "2236:16:1" + } + ], + "id": 320, + "name": "FunctionCall", + "src": "2229:24:1" + } + ], + "id": 321, + "name": "ExpressionStatement", + "src": "2229:24:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "member_name": "lastPayday", + "referencedDeclaration": 64, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "struct Payroll.Employee storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "mapping(address => struct Payroll.Employee storage ref)", + "value": "employees" + }, + "id": 322, + "name": "Identifier", + "src": "2272:9:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 353, + "type": "msg", + "value": "msg" + }, + "id": 323, + "name": "Identifier", + "src": "2282:3:1" + } + ], + "id": 324, + "name": "MemberAccess", + "src": "2282:10:1" + } + ], + "id": 325, + "name": "IndexAccess", + "src": "2272:21:1" + } + ], + "id": 326, + "name": "MemberAccess", + "src": "2272:32:1" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 310, + "type": "uint256", + "value": "nextPayday" + }, + "id": 327, + "name": "Identifier", + "src": "2307:10:1" + } + ], + "id": 328, + "name": "Assignment", + "src": "2272:45:1" + } + ], + "id": 329, + "name": "ExpressionStatement", + "src": "2272:45:1" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "transfer", + "referencedDeclaration": null, + "type": "function (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "id", + "referencedDeclaration": 60, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 303, + "type": "struct Payroll.Employee storage pointer", + "value": "employee" + }, + "id": 330, + "name": "Identifier", + "src": "2327:8:1" + } + ], + "id": 333, + "name": "MemberAccess", + "src": "2327:11:1" + } + ], + "id": 334, + "name": "MemberAccess", + "src": "2327:20:1" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "salary", + "referencedDeclaration": 62, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 303, + "type": "struct Payroll.Employee storage pointer", + "value": "employee" + }, + "id": 335, + "name": "Identifier", + "src": "2348:8:1" + } + ], + "id": 336, + "name": "MemberAccess", + "src": "2348:15:1" + } + ], + "id": 337, + "name": "FunctionCall", + "src": "2327:37:1" + } + ], + "id": 338, + "name": "ExpressionStatement", + "src": "2327:37:1" + } + ], + "id": 339, + "name": "Block", + "src": "2103:268:1" + } + ], + "id": 340, + "name": "FunctionDefinition", + "src": "2058:313:1" + } + ], + "id": 341, + "name": "ContractDefinition", + "src": "26:2347:1" + } + ], + "id": 342, + "name": "SourceUnit", + "src": "0:2374:1" + }, + "compiler": { + "name": "solc", + "version": "0.4.18+commit.9cf6e910.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "1.0.1", + "updatedAt": "2018-01-20T13:37:25.864Z" +} \ No newline at end of file diff --git a/Lesson4/assignment/contracts/Migrations.sol b/Lesson4/assignment/contracts/Migrations.sol new file mode 100644 index 000000000..f170cb4fa --- /dev/null +++ b/Lesson4/assignment/contracts/Migrations.sol @@ -0,0 +1,23 @@ +pragma solidity ^0.4.17; + +contract Migrations { + address public owner; + uint public last_completed_migration; + + modifier restricted() { + if (msg.sender == owner) _; + } + + function Migrations() public { + owner = msg.sender; + } + + function setCompleted(uint completed) public restricted { + last_completed_migration = completed; + } + + function upgrade(address new_address) public restricted { + Migrations upgraded = Migrations(new_address); + upgraded.setCompleted(last_completed_migration); + } +} diff --git a/Lesson4/assignment/contracts/Payroll.sol b/Lesson4/assignment/contracts/Payroll.sol new file mode 100644 index 000000000..8c47a6221 --- /dev/null +++ b/Lesson4/assignment/contracts/Payroll.sol @@ -0,0 +1,85 @@ +pragma solidity ^0.4.14; + +contract Payroll { + struct Employee { + address id; + uint salary; + uint lastPayday; + } + + uint constant payDuration = 10 seconds; + + uint totalSalary; + address owner; + mapping(address => Employee) public employees; + + function Payroll() { + owner = msg.sender; + } + + modifier onlyOwner { + require(msg.sender == owner); + _; + } + + modifier employeeExist(address employeeId) { + var employee = employees[employeeId]; + assert(employee.id != 0x0); + _; + } + + function _partialPaid(Employee employee) private { + uint payment = employee.salary * (now - employee.lastPayday) / payDuration; + employee.id.transfer(payment); + } + + function addEmployee(address employeeId, uint salary) onlyOwner { + var employee = employees[employeeId]; + assert(employee.id == 0x0); + totalSalary += salary * 1 ether; + + employees[employeeId] = Employee(employeeId, salary * 1 ether, now); + } + + function removeEmployee(address employeeId) onlyOwner employeeExist(employeeId) { + + var employee = employees[employeeId]; + + _partialPaid(employee); + totalSalary -= employees[employeeId].salary; + delete employees[employeeId]; + + } + + function updateEmployee(address employeeId, uint salary) onlyOwner employeeExist(employeeId) { + var employee = employees[employeeId]; + + _partialPaid(employee); + totalSalary -= employees[employeeId].salary; + employees[employeeId].salary = salary * 1 ether; + totalSalary += employees[employeeId].salary; + employees[employeeId].lastPayday = now; + } + + function addFund() payable returns (uint) { + return this.balance; + } + + function calculateRunway() returns (uint) { + return this.balance / totalSalary; + } + + function hasEnoughFund() returns (bool) { + return calculateRunway() > 0; + } + + function getPaid() employeeExist(msg.sender) { + var employee = employees[msg.sender]; + + uint nextPayday = employee.lastPayday + payDuration; + assert(nextPayday < now); + + employees[msg.sender].lastPayday = nextPayday; + employee.id.transfer(employee.salary); + } +} diff --git a/Lesson4/assignment/migrations/1_initial_migration.js b/Lesson4/assignment/migrations/1_initial_migration.js new file mode 100644 index 000000000..4d5f3f9b0 --- /dev/null +++ b/Lesson4/assignment/migrations/1_initial_migration.js @@ -0,0 +1,5 @@ +var Migrations = artifacts.require("./Migrations.sol"); + +module.exports = function(deployer) { + deployer.deploy(Migrations); +}; diff --git a/Lesson4/assignment/migrations/2_deploy_contracts.js b/Lesson4/assignment/migrations/2_deploy_contracts.js new file mode 100644 index 000000000..acae4b365 --- /dev/null +++ b/Lesson4/assignment/migrations/2_deploy_contracts.js @@ -0,0 +1,5 @@ +var Payroll = artifacts.required("./Payroll.sol"); + +module.exports = function(deployer) { + deployer.deploy(Payroll); +} diff --git a/Lesson4/assignment/test/payroll.js b/Lesson4/assignment/test/payroll.js new file mode 100644 index 000000000..b2e8a25e6 --- /dev/null +++ b/Lesson4/assignment/test/payroll.js @@ -0,0 +1,35 @@ +var PayRoll = artifacts.require("./Payroll.sol"); + +contract('PayRoll', function (accounts) { + + + // addEmployee + it("...add emoloyee successfully.", function () { + return PayRoll.deployed().then(function (instance) { + payrollInstance = instance; + }).then(function(){ + return payrollInstance.addFund({value: web3.toWei(50)}); + }).then(function(){ + return payrollInstance.addEmployee(accounts[1], 2); + }).then(function(){ + return payrollInstance.employees.call(accounts[1]); + }).then(function(employee){ + assert.equal(employee[1].valueOf(), web3.toWei(2), "fail"); + }); + }); + + // removeEmployee + it("...remove employee successfully.", function() { + return PayRoll.deployed().then(function (instance) { + payrollInstance = instance; + }).then(function() { + return payrollInstance.addEmployee(accounts[2], 5); + }).then(function() { + return payrollInstance.removeEmployee(accounts[2]); + }).then(function() { + return payrollInstance.employees.call(accounts[2]); + }).then(function(employee) { + assert.equal(employee[0].valueOf(), 0x0, "fail") + }) + }); +}); \ No newline at end of file diff --git a/Lesson4/assignment/truffle.js b/Lesson4/assignment/truffle.js new file mode 100644 index 000000000..7a1c2577e --- /dev/null +++ b/Lesson4/assignment/truffle.js @@ -0,0 +1,9 @@ +module.exports = { + networks:{ + development:{ + host: "localhost", + port: 8545, + network_id: "*" + } + } +}; diff --git a/Lesson4/assignment/yours.sol b/Lesson4/assignment/yours.sol deleted file mode 100644 index dfdb2c486..000000000 --- a/Lesson4/assignment/yours.sol +++ /dev/null @@ -1 +0,0 @@ -/*作业请提交在这个目录下*/ From e026572c5cd4cf5c679bbf8cb20b89cdfb7aa686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Sun, 21 Jan 2018 08:27:55 +0800 Subject: [PATCH 18/36] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assignment/build/contracts/Migrations.json | 18 ++++++++++++------ .../assignment/build/contracts/Payroll.json | 18 ++++++++++++------ .../migrations/2_deploy_contracts.js | 2 +- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/Lesson4/assignment/build/contracts/Migrations.json b/Lesson4/assignment/build/contracts/Migrations.json index b3f8a56c9..18b5ff119 100644 --- a/Lesson4/assignment/build/contracts/Migrations.json +++ b/Lesson4/assignment/build/contracts/Migrations.json @@ -64,15 +64,15 @@ "type": "constructor" } ], - "bytecode": "0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102db8061005e6000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a723058204fb963c2245703d3b2947bd4183f53bb59f31503790fbcd9810ccaa14e50fe310029", - "deployedBytecode": "0x606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a723058204fb963c2245703d3b2947bd4183f53bb59f31503790fbcd9810ccaa14e50fe310029", + "bytecode": "0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102db8061005e6000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a723058203606e0715fee2f0895a09db333bc01a70597b159ce908726c4199ce80af73d590029", + "deployedBytecode": "0x606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a723058203606e0715fee2f0895a09db333bc01a70597b159ce908726c4199ce80af73d590029", "sourceMap": "26:488:0:-;;;178:58;;;;;;;;221:10;213:5;;:18;;;;;;;;;;;;;;;;;;26:488;;;;;;", "deployedSourceMap": "26:488:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;347:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;74:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;240:103;;;;;;;;;;;;;;;;;;;;;;;;;;347:165;409:19;161:5;;;;;;;;;;;147:19;;:10;:19;;;143:26;;;442:11;409:45;;460:8;:21;;;482:24;;460:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;143:26;347:165;;:::o;74:36::-;;;;:::o;50:20::-;;;;;;;;;;;;;:::o;240:103::-;161:5;;;;;;;;;;;147:19;;:10;:19;;;143:26;;;329:9;302:24;:36;;;;143:26;240:103;:::o", "source": "pragma solidity ^0.4.17;\n\ncontract Migrations {\n address public owner;\n uint public last_completed_migration;\n\n modifier restricted() {\n if (msg.sender == owner) _;\n }\n\n function Migrations() public {\n owner = msg.sender;\n }\n\n function setCompleted(uint completed) public restricted {\n last_completed_migration = completed;\n }\n\n function upgrade(address new_address) public restricted {\n Migrations upgraded = Migrations(new_address);\n upgraded.setCompleted(last_completed_migration);\n }\n}\n", - "sourcePath": "/home/juicebox/guigulive-operation/Lesson4/assignment/contracts/Migrations.sol", + "sourcePath": "/Users/chenyangfan/编程/区块链/智能合约/guigulive-operation/Lesson4/assignment/contracts/Migrations.sol", "ast": { "attributes": { - "absolutePath": "/home/juicebox/guigulive-operation/Lesson4/assignment/contracts/Migrations.sol", + "absolutePath": "/Users/chenyangfan/编程/区块链/智能合约/guigulive-operation/Lesson4/assignment/contracts/Migrations.sol", "exportedSymbols": { "Migrations": [ 56 @@ -815,7 +815,13 @@ "name": "solc", "version": "0.4.18+commit.9cf6e910.Emscripten.clang" }, - "networks": {}, + "networks": { + "1516494346939": { + "events": {}, + "links": {}, + "address": "0x0dc9474ffd55ebfcb47239e73a57591a9701c897" + } + }, "schemaVersion": "1.0.1", - "updatedAt": "2018-01-20T13:37:25.948Z" + "updatedAt": "2018-01-21T00:27:10.211Z" } \ No newline at end of file diff --git a/Lesson4/assignment/build/contracts/Payroll.json b/Lesson4/assignment/build/contracts/Payroll.json index 43b4cfb0b..763b52b43 100644 --- a/Lesson4/assignment/build/contracts/Payroll.json +++ b/Lesson4/assignment/build/contracts/Payroll.json @@ -136,15 +136,15 @@ "type": "constructor" } ], - "bytecode": "0x6060604052341561000f57600080fd5b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610c6e8061005f6000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806323fed09e146100935780634ec19512146100c05780635e91d8ec146100e9578063a2f09dfa1461012b578063cf41d6f814610149578063d06789471461015e578063d108177a146101e5578063e7fd9a131461021e575b600080fd5b341561009e57600080fd5b6100a6610260565b604051808215151515815260200191505060405180910390f35b34156100cb57600080fd5b6100d3610271565b6040518082815260200191505060405180910390f35b34156100f457600080fd5b610129600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061029c565b005b610133610586565b6040518082815260200191505060405180910390f35b341561015457600080fd5b61015c6105a5565b005b341561016957600080fd5b610195600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061073e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390f35b34156101f057600080fd5b61021c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610788565b005b341561022957600080fd5b61025e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a01565b005b60008061026b610271565b11905090565b600080543073ffffffffffffffffffffffffffffffffffffffff163181151561029657fe5b04905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102fa57600080fd5b826000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561038557fe5b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925061044583606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050610bdd565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000808282540392505081905550670de0b6b3a76400008402600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600080828254019250508190555042600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600080336000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561063357fe5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209350600a8460020154019250428310151561068957fe5b82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc85600101549081150290604051600060405180830381858888f19350505050151561073857600080fd5b50505050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107e657600080fd5b816000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561087157fe5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925061093183606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050610bdd565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000808282540392505081905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a5f57600080fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610ae657fe5b670de0b6b3a7640000820260008082825401925050819055506060604051908101604052808473ffffffffffffffffffffffffffffffffffffffff168152602001670de0b6b3a76400008402815260200142815250600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155905050505050565b6000600a82604001514203836020015102811515610bf757fe5b049050816000015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610c3e57600080fd5b50505600a165627a7a72305820f59b58a93f6942947470a744e1d9f18ae0116c4d5b71893c4a94f200acb5a15e0029", - "deployedBytecode": "0x60606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806323fed09e146100935780634ec19512146100c05780635e91d8ec146100e9578063a2f09dfa1461012b578063cf41d6f814610149578063d06789471461015e578063d108177a146101e5578063e7fd9a131461021e575b600080fd5b341561009e57600080fd5b6100a6610260565b604051808215151515815260200191505060405180910390f35b34156100cb57600080fd5b6100d3610271565b6040518082815260200191505060405180910390f35b34156100f457600080fd5b610129600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061029c565b005b610133610586565b6040518082815260200191505060405180910390f35b341561015457600080fd5b61015c6105a5565b005b341561016957600080fd5b610195600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061073e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390f35b34156101f057600080fd5b61021c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610788565b005b341561022957600080fd5b61025e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a01565b005b60008061026b610271565b11905090565b600080543073ffffffffffffffffffffffffffffffffffffffff163181151561029657fe5b04905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102fa57600080fd5b826000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561038557fe5b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925061044583606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050610bdd565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000808282540392505081905550670de0b6b3a76400008402600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600080828254019250508190555042600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600080336000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561063357fe5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209350600a8460020154019250428310151561068957fe5b82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc85600101549081150290604051600060405180830381858888f19350505050151561073857600080fd5b50505050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107e657600080fd5b816000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561087157fe5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925061093183606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050610bdd565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000808282540392505081905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a5f57600080fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610ae657fe5b670de0b6b3a7640000820260008082825401925050819055506060604051908101604052808473ffffffffffffffffffffffffffffffffffffffff168152602001670de0b6b3a76400008402815260200142815250600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155905050505050565b6000600a82604001514203836020015102811515610bf757fe5b049050816000015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610c3e57600080fd5b50505600a165627a7a72305820f59b58a93f6942947470a744e1d9f18ae0116c4d5b71893c4a94f200acb5a15e0029", + "bytecode": "0x6060604052341561000f57600080fd5b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610c6e8061005f6000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806323fed09e146100935780634ec19512146100c05780635e91d8ec146100e9578063a2f09dfa1461012b578063cf41d6f814610149578063d06789471461015e578063d108177a146101e5578063e7fd9a131461021e575b600080fd5b341561009e57600080fd5b6100a6610260565b604051808215151515815260200191505060405180910390f35b34156100cb57600080fd5b6100d3610271565b6040518082815260200191505060405180910390f35b34156100f457600080fd5b610129600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061029c565b005b610133610586565b6040518082815260200191505060405180910390f35b341561015457600080fd5b61015c6105a5565b005b341561016957600080fd5b610195600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061073e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390f35b34156101f057600080fd5b61021c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610788565b005b341561022957600080fd5b61025e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a01565b005b60008061026b610271565b11905090565b600080543073ffffffffffffffffffffffffffffffffffffffff163181151561029657fe5b04905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102fa57600080fd5b826000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561038557fe5b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925061044583606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050610bdd565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000808282540392505081905550670de0b6b3a76400008402600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600080828254019250508190555042600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600080336000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561063357fe5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209350600a8460020154019250428310151561068957fe5b82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc85600101549081150290604051600060405180830381858888f19350505050151561073857600080fd5b50505050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107e657600080fd5b816000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561087157fe5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925061093183606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050610bdd565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000808282540392505081905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a5f57600080fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610ae657fe5b670de0b6b3a7640000820260008082825401925050819055506060604051908101604052808473ffffffffffffffffffffffffffffffffffffffff168152602001670de0b6b3a76400008402815260200142815250600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155905050505050565b6000600a82604001514203836020015102811515610bf757fe5b049050816000015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610c3e57600080fd5b50505600a165627a7a72305820ecd839661eff8b7f7398aa1f1a1fef0152b6e84ebf3c8cdb6049955477132a200029", + "deployedBytecode": "0x60606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806323fed09e146100935780634ec19512146100c05780635e91d8ec146100e9578063a2f09dfa1461012b578063cf41d6f814610149578063d06789471461015e578063d108177a146101e5578063e7fd9a131461021e575b600080fd5b341561009e57600080fd5b6100a6610260565b604051808215151515815260200191505060405180910390f35b34156100cb57600080fd5b6100d3610271565b6040518082815260200191505060405180910390f35b34156100f457600080fd5b610129600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061029c565b005b610133610586565b6040518082815260200191505060405180910390f35b341561015457600080fd5b61015c6105a5565b005b341561016957600080fd5b610195600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061073e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390f35b34156101f057600080fd5b61021c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610788565b005b341561022957600080fd5b61025e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a01565b005b60008061026b610271565b11905090565b600080543073ffffffffffffffffffffffffffffffffffffffff163181151561029657fe5b04905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102fa57600080fd5b826000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561038557fe5b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925061044583606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050610bdd565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000808282540392505081905550670de0b6b3a76400008402600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600080828254019250508190555042600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600080336000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561063357fe5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209350600a8460020154019250428310151561068957fe5b82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc85600101549081150290604051600060405180830381858888f19350505050151561073857600080fd5b50505050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107e657600080fd5b816000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561087157fe5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925061093183606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050610bdd565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000808282540392505081905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a5f57600080fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610ae657fe5b670de0b6b3a7640000820260008082825401925050819055506060604051908101604052808473ffffffffffffffffffffffffffffffffffffffff168152602001670de0b6b3a76400008402815260200142815250600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155905050505050565b6000600a82604001514203836020015102811515610bf757fe5b049050816000015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610c3e57600080fd5b50505600a165627a7a72305820ecd839661eff8b7f7398aa1f1a1fef0152b6e84ebf3c8cdb6049955477132a200029", "sourceMap": "26:2347:1:-;;;290:54;;;;;;;;327:10;319:5;;:18;;;;;;;;;;;;;;;;;;26:2347;;;;;;", "deployedSourceMap": "26:2347:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1963:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1861:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1365:398;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1773:78;;;;;;;;;;;;;;;;;;;;;;;2058:313;;;;;;;;;;;;;;238:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1072:283;;;;;;;;;;;;;;;;;;;;;;;;;;;;782:280;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1963:85;1997:4;2040:1;2020:17;:15;:17::i;:::-;:21;2013:28;;1963:85;:::o;1861:92::-;1897:4;1935:11;;1920:4;:12;;;:26;;;;;;;;1913:33;;1861:92;:::o;1365:398::-;1468:12;405:5;;;;;;;;;;;391:19;;:10;:19;;;383:28;;;;;;;;1446:10;493:12;508:9;:21;518:10;508:21;;;;;;;;;;;;;;;493:36;;561:3;546:8;:11;;;;;;;;;;;;:18;;;;539:26;;;;;;1483:9;:21;1493:10;1483:21;;;;;;;;;;;;;;;1468:36;;1523:22;1536:8;1523:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:22::i;:::-;1570:9;:21;1580:10;1570:21;;;;;;;;;;;;;;;:28;;;1555:11;;:43;;;;;;;;;;;1648:7;1639:6;:16;1608:9;:21;1618:10;1608:21;;;;;;;;;;;;;;;:28;;:47;;;;1680:9;:21;1690:10;1680:21;;;;;;;;;;;;;;;:28;;;1665:11;;:43;;;;;;;;;;;1753:3;1718:9;:21;1728:10;1718:21;;;;;;;;;;;;;;;:32;;:38;;;;421:1;;1365:398;;;:::o;1773:78::-;1809:4;1832;:12;;;1825:19;;1773:78;:::o;2058:313::-;2113:12;2168:15;2091:10;493:12;508:9;:21;518:10;508:21;;;;;;;;;;;;;;;493:36;;561:3;546:8;:11;;;;;;;;;;;;:18;;;;539:26;;;;;;2128:9;:21;2138:10;2128:21;;;;;;;;;;;;;;;2113:36;;176:10;2186:8;:19;;;:33;2168:51;;2249:3;2236:10;:16;2229:24;;;;;;2307:10;2272:9;:21;2282:10;2272:21;;;;;;;;;;;;;;;:32;;:45;;;;2327:8;:11;;;;;;;;;;;;:20;;:37;2348:8;:15;;;2327:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2058:313;;;;:::o;238:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1072:283::-;1171:12;405:5;;;;;;;;;;;391:19;;:10;:19;;;383:28;;;;;;;;1140:10;493:12;508:9;:21;518:10;508:21;;;;;;;;;;;;;;;493:36;;561:3;546:8;:11;;;;;;;;;;;;:18;;;;539:26;;;;;;1186:9;:21;1196:10;1186:21;;;;;;;;;;;;;;;1171:36;;1226:22;1239:8;1226:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:22::i;:::-;1273:9;:21;1283:10;1273:21;;;;;;;;;;;;;;;:28;;;1258:11;;:43;;;;;;;;;;;1318:9;:21;1328:10;1318:21;;;;;;;;;;;;;;;;1311:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;421:1;;1072:283;;:::o;782:280::-;856:12;405:5;;;;;;;;;;;391:19;;:10;:19;;;383:28;;;;;;;;871:9;:21;881:10;871:21;;;;;;;;;;;;;;;856:36;;924:3;909:8;:11;;;;;;;;;;;;:18;;;902:26;;;;;;962:7;953:6;:16;938:11;;:31;;;;;;;;;;;1012:43;;;;;;;;;1021:10;1012:43;;;;;;1042:7;1033:6;:16;1012:43;;;;1051:3;1012:43;;;988:9;:21;998:10;988:21;;;;;;;;;;;;;;;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;782:280;;;:::o;593:179::-;652:12;176:10;692:8;:19;;;686:3;:25;667:8;:15;;;:45;:59;;;;;;;;652:74;;736:8;:11;;;:20;;:29;757:7;736:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;593:179;;:::o", "source": "pragma solidity ^0.4.14;\n\ncontract Payroll {\n struct Employee {\n address id;\n uint salary;\n uint lastPayday;\n }\n \n uint constant payDuration = 10 seconds;\n \n uint totalSalary;\n address owner;\n mapping(address => Employee) public employees;\n\n function Payroll() {\n owner = msg.sender;\n }\n \n modifier onlyOwner {\n require(msg.sender == owner);\n _;\n }\n \n modifier employeeExist(address employeeId) {\n var employee = employees[employeeId];\n assert(employee.id != 0x0);\n _;\n }\n \n function _partialPaid(Employee employee) private {\n uint payment = employee.salary * (now - employee.lastPayday) / payDuration;\n employee.id.transfer(payment);\n }\n \n function addEmployee(address employeeId, uint salary) onlyOwner {\n var employee = employees[employeeId];\n assert(employee.id == 0x0);\n totalSalary += salary * 1 ether;\n \n employees[employeeId] = Employee(employeeId, salary * 1 ether, now);\n }\n \n function removeEmployee(address employeeId) onlyOwner employeeExist(employeeId) {\n \n var employee = employees[employeeId];\n \n _partialPaid(employee);\n totalSalary -= employees[employeeId].salary;\n delete employees[employeeId];\n \n }\n \n function updateEmployee(address employeeId, uint salary) onlyOwner employeeExist(employeeId) {\n var employee = employees[employeeId];\n \n _partialPaid(employee);\n totalSalary -= employees[employeeId].salary;\n employees[employeeId].salary = salary * 1 ether;\n totalSalary += employees[employeeId].salary;\n employees[employeeId].lastPayday = now;\n }\n \n function addFund() payable returns (uint) {\n return this.balance;\n }\n \n function calculateRunway() returns (uint) {\n return this.balance / totalSalary;\n }\n \n function hasEnoughFund() returns (bool) {\n return calculateRunway() > 0;\n }\n \n function getPaid() employeeExist(msg.sender) {\n var employee = employees[msg.sender];\n \n uint nextPayday = employee.lastPayday + payDuration;\n assert(nextPayday < now);\n \n employees[msg.sender].lastPayday = nextPayday;\n employee.id.transfer(employee.salary);\n }\n}\n", - "sourcePath": "/home/juicebox/guigulive-operation/Lesson4/assignment/contracts/Payroll.sol", + "sourcePath": "/Users/chenyangfan/编程/区块链/智能合约/guigulive-operation/Lesson4/assignment/contracts/Payroll.sol", "ast": { "attributes": { - "absolutePath": "/home/juicebox/guigulive-operation/Lesson4/assignment/contracts/Payroll.sol", + "absolutePath": "/Users/chenyangfan/编程/区块链/智能合约/guigulive-operation/Lesson4/assignment/contracts/Payroll.sol", "exportedSymbols": { "Payroll": [ 341 @@ -4060,7 +4060,13 @@ "name": "solc", "version": "0.4.18+commit.9cf6e910.Emscripten.clang" }, - "networks": {}, + "networks": { + "1516494346939": { + "events": {}, + "links": {}, + "address": "0xc8ff05eb96968673de5681a437f3fa31aa15184d" + } + }, "schemaVersion": "1.0.1", - "updatedAt": "2018-01-20T13:37:25.864Z" + "updatedAt": "2018-01-21T00:27:10.216Z" } \ No newline at end of file diff --git a/Lesson4/assignment/migrations/2_deploy_contracts.js b/Lesson4/assignment/migrations/2_deploy_contracts.js index acae4b365..302e9a72f 100644 --- a/Lesson4/assignment/migrations/2_deploy_contracts.js +++ b/Lesson4/assignment/migrations/2_deploy_contracts.js @@ -1,4 +1,4 @@ -var Payroll = artifacts.required("./Payroll.sol"); +var Payroll = artifacts.require("./Payroll.sol"); module.exports = function(deployer) { deployer.deploy(Payroll); From 88acde5c5491cd0bfbd85f642268ea66324c13b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=89=AC=E5=B8=86?= Date: Sun, 21 Jan 2018 09:38:14 +0800 Subject: [PATCH 19/36] . --- Lesson4/assignment/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 Lesson4/assignment/README.md diff --git a/Lesson4/assignment/README.md b/Lesson4/assignment/README.md new file mode 100644 index 000000000..871e6be04 --- /dev/null +++ b/Lesson4/assignment/README.md @@ -0,0 +1,12 @@ +## 硅谷live以太坊智能合约 第四课作业 +这里是同学提交作业的目录 + +### 第四课:课后作业 +- 将第三课完成的payroll.sol程序导入truffle工程 +- 在test文件夹中,写出对如下两个函数的单元测试: +- function addEmployee(address employeeId, uint salary) onlyOwner +- function removeEmployee(address employeeId) onlyOwner employeeExist(employeeId) +- 思考一下我们如何能覆盖所有的测试路径,包括函数异常的捕捉 +- (加分题,选作) +- 写出对以下函数的基于solidity或javascript的单元测试 function getPaid() employeeExist(msg.sender) +- Hint:思考如何对timestamp进行修改,是否需要对所测试的合约进行修改来达到测试的目的? From 3ec4c1e30e9104abe3d20c34d6dab137965bb3b8 Mon Sep 17 00:00:00 2001 From: Shunda <923076444@qq.com> Date: Mon, 22 Jan 2018 10:23:17 +0800 Subject: [PATCH 20/36] Revert "91_HW-3" --- Lesson2/hw-2.sol | 95 ---------------- Lesson3/assignment/yours.sol | 103 ------------------ lesson1/hw-1.sol | 38 ------- ...0\200\350\257\276\344\275\234\344\270\232" | 1 - 4 files changed, 237 deletions(-) delete mode 100644 Lesson2/hw-2.sol delete mode 100644 lesson1/hw-1.sol delete mode 100644 "\343\200\220\346\265\213\350\257\225\343\200\221\347\254\254\344\270\200\350\257\276\344\275\234\344\270\232" diff --git a/Lesson2/hw-2.sol b/Lesson2/hw-2.sol deleted file mode 100644 index 99ec61f12..000000000 --- a/Lesson2/hw-2.sol +++ /dev/null @@ -1,95 +0,0 @@ -pragma solidity ^0.4.14; - -contract payRoll{ - struct Employee { - address id; - uint salary; - uint lastPayday; - } - - uint constant payDuration = 10 seconds; - - address owner; - Employee[] employees; - - function Payroll(){ - owner = msg.sender; - } - - function _partialPaid(Employee employee) private { - uint payment = employee.salary * (now - employee.lastPayday) / payDuration; - employee.id.transfer(payment); - } - - function _findEmployee(address employeeId) private returns (Employee, uint){ - for(uint i=0; i 0; - } - - function getPaid() { - var (employee, index) = _findEmployee(msg.sender); - assert(employee.id == 0x0); - - - uint nextPayday = employee.lastPayday + payDuration; - assert(nextPayday < now); - - employees[index].lastPayday = nextPayday; - employees[index].id.transfer(employee.salary); - } - -} \ No newline at end of file diff --git a/Lesson3/assignment/yours.sol b/Lesson3/assignment/yours.sol index 189a9cd28..dfdb2c486 100644 --- a/Lesson3/assignment/yours.sol +++ b/Lesson3/assignment/yours.sol @@ -1,104 +1 @@ /*作业请提交在这个目录下*/ - -//q1 - -pragma solidity ^0.4.14; - -contract payRoll{ - struct Employee { - address id; - uint salary; - uint lastPayday; - } - - uint constant payDuration = 10 seconds; - - address owner; - uint totalSalary; - mapping(address => Employee) employees; - - function Payroll(){ - owner = msg.sender; - } - - function _partialPaid(Employee employee) private { - uint payment = employee.salary * (now - employee.lastPayday) / payDuration; - employee.id.transfer(payment); - } - - function addEmployee(address employeeId, uint salary){ - require(msg.sender == owner); - - var employee = employees[employeeId]; - assert(employee.id == 0x0); - totalSalary += salary * 1 ether; - employees[employeeId] = (Employee(employeeId, salary * 1 ether, now)); - } - - function removeEmployee(address employeeId){ - require(msg.sender == owner); - - var employee = employees[employeeId]; - - assert(employee.id == 0x0); - _partialPaid(employee); - totalSalary -= employees[employeeId].salary; - delete employees[employeeId]; - - } - - function updateEmployee(address employeeId, uint salary) { - require(msg.sender == owner); - - var employee = employees[employeeId]; - - assert(employee.id == 0x0); - _partialPaid(employee); - totalSalary -= employees[employeeId].salary; - employees[employeeId].salary = salary; - employees[employeeId].lastPayday = now; - totalSalary += employees[employeeId].salary; - - } - - function addFund() returns (uint) { - return this.balance; - } - - function calculateRunway() returns (uint) { - return this.balance / totalSalary; - } - - function hasEnoughFund() returns (bool) { - return calculateRunway() > 0; - } - - function checckEmployee(address employeeId) returns (uint salary, uint lastPayday){ - var employee = employees[employeeId]; - salary = employee.salary; - lastPayday = employee.lastPayday; - } - - function getPaid() { - var employee = employees[msg.sender]; - assert(employee.id == 0x0); - - - uint nextPayday = employee.lastPayday + payDuration; - assert(nextPayday < now); - - employee.lastPayday = nextPayday; - employee.id.transfer(employee.salary); - } - -} - - -/// q2 -function changePaymentAddress(address employeeId, address newEmployeeId) onlyOwner employeeExist(employeeId) { - var employee = employees[employeeId]; - - _partialPaid(employee); - employees[employeeId].id = newEmployeeId; - employees[newEmployeeId].lastPayday = now; -} diff --git a/lesson1/hw-1.sol b/lesson1/hw-1.sol deleted file mode 100644 index 455d868ab..000000000 --- a/lesson1/hw-1.sol +++ /dev/null @@ -1,38 +0,0 @@ -pragma solidity ^0.4.14; - -contract payRoll{ - uint salary = 1 ether; - address wallet; - uint constant payDuration = 30 days; - uint lastPayday = now; - - function getWallet() { - wallet = msg.sender; - } - - function addFund() returns (uint) { - return this.balance; - } - - function calculateRunway() returns (uint) { - return this.balance / salary; - } - - function hasEnoughFund() returns (bool) { - return calculateRunway() > 0; - } - - function getPaid() { - if(msg.sender != wallet){ - revert(); - } - - uint nextPayday = lastPayday + payDuration; - if(nextPayday > now){ - revert(); - } - lastPayday = nextPayday; - wallet.transfer(salary); - } - -} \ No newline at end of file diff --git "a/\343\200\220\346\265\213\350\257\225\343\200\221\347\254\254\344\270\200\350\257\276\344\275\234\344\270\232" "b/\343\200\220\346\265\213\350\257\225\343\200\221\347\254\254\344\270\200\350\257\276\344\275\234\344\270\232" deleted file mode 100644 index f0ce4777d..000000000 --- "a/\343\200\220\346\265\213\350\257\225\343\200\221\347\254\254\344\270\200\350\257\276\344\275\234\344\270\232" +++ /dev/null @@ -1 +0,0 @@ -测试·第一课作业 From e834fa8c512855a4539888b153bf21bbd38fbbca Mon Sep 17 00:00:00 2001 From: 923076444 <923076444@qq.com> Date: Mon, 22 Jan 2018 10:37:05 +0800 Subject: [PATCH 21/36] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AC=AC=E4=BA=94?= =?UTF-8?q?=E8=AF=BE=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lesson5/README.md | 13 +++++++++++++ Lesson5/assignment/README.md | 2 ++ Lesson5/assignment/yours.sol | 1 + Lesson5/orgin/README.md | 3 +++ Lesson5/orgin/payroll.sol | 1 + 5 files changed, 20 insertions(+) create mode 100644 Lesson5/README.md create mode 100644 Lesson5/assignment/README.md create mode 100644 Lesson5/assignment/yours.sol create mode 100644 Lesson5/orgin/README.md create mode 100644 Lesson5/orgin/payroll.sol diff --git a/Lesson5/README.md b/Lesson5/README.md new file mode 100644 index 000000000..0d3ed1d1e --- /dev/null +++ b/Lesson5/README.md @@ -0,0 +1,13 @@ +## 硅谷live以太坊智能合约频道官方地址 + +### 第五课 + +目录结构 +
| +
|--orgin 课程初始代码 +
| +
|--assignment 课程作业提交代码 +
+ +### 本节知识点 + diff --git a/Lesson5/assignment/README.md b/Lesson5/assignment/README.md new file mode 100644 index 000000000..5661cd368 --- /dev/null +++ b/Lesson5/assignment/README.md @@ -0,0 +1,2 @@ +## 硅谷live以太坊智能合约 第五课作业 +这里是同学提交作业的目录 diff --git a/Lesson5/assignment/yours.sol b/Lesson5/assignment/yours.sol new file mode 100644 index 000000000..dfdb2c486 --- /dev/null +++ b/Lesson5/assignment/yours.sol @@ -0,0 +1 @@ +/*作业请提交在这个目录下*/ diff --git a/Lesson5/orgin/README.md b/Lesson5/orgin/README.md new file mode 100644 index 000000000..8eb7d081e --- /dev/null +++ b/Lesson5/orgin/README.md @@ -0,0 +1,3 @@ +## 硅谷live以太坊智能合约 第五课 + +这里是每一课的初始代码,有需要的同学可以参考 diff --git a/Lesson5/orgin/payroll.sol b/Lesson5/orgin/payroll.sol new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Lesson5/orgin/payroll.sol @@ -0,0 +1 @@ + From 6aa23514b6533809de7d0079ed31101390c85f7c Mon Sep 17 00:00:00 2001 From: someone <> Date: Sun, 21 Jan 2018 22:59:05 -0800 Subject: [PATCH 22/36] whatever --- Lesson5/orgin/LICENSE | 201 ++ Lesson5/orgin/README.md | 14 +- Lesson5/orgin/box-img-lg.png | Bin 0 -> 113830 bytes Lesson5/orgin/box-img-sm.png | Bin 0 -> 5412 bytes Lesson5/orgin/config/env.js | 28 + Lesson5/orgin/config/jest/cssTransform.js | 12 + Lesson5/orgin/config/jest/fileTransform.js | 10 + Lesson5/orgin/config/paths.js | 46 + Lesson5/orgin/config/polyfills.js | 14 + Lesson5/orgin/config/webpack.config.dev.js | 242 +++ Lesson5/orgin/config/webpack.config.prod.js | 269 +++ Lesson5/orgin/contracts/Migrations.sol | 23 + Lesson5/orgin/contracts/Ownable.sol | 44 + Lesson5/orgin/contracts/Payroll.sol | 101 + Lesson5/orgin/contracts/SafeMath.sol | 32 + .../orgin/migrations/1_initial_migration.js | 5 + .../orgin/migrations/2_deploy_contracts.js | 12 + Lesson5/orgin/package.json | 102 + Lesson5/orgin/public/favicon.ico | Bin 0 -> 32038 bytes Lesson5/orgin/public/index.html | 31 + Lesson5/orgin/scripts/build.js | 224 +++ Lesson5/orgin/scripts/start.js | 315 ++++ Lesson5/orgin/scripts/test.js | 31 + Lesson5/orgin/src/App.css | 12 + Lesson5/orgin/src/App.js | 125 ++ Lesson5/orgin/src/App.test.js | 8 + Lesson5/orgin/src/components/Common.js | 70 + Lesson5/orgin/src/components/EditableCell.js | 55 + Lesson5/orgin/src/components/Employee.js | 67 + Lesson5/orgin/src/components/EmployeeList.js | 129 ++ Lesson5/orgin/src/components/Employer.js | 73 + Lesson5/orgin/src/components/Fund.js | 52 + Lesson5/orgin/src/css/open-sans.css | 13 + Lesson5/orgin/src/css/oswald.css | 27 + Lesson5/orgin/src/css/pure-min.css | 11 + .../src/fonts/Open-Sans-regular/LICENSE.txt | 202 ++ .../Open-Sans-regular/Open-Sans-regular.eot | Bin 0 -> 18233 bytes .../Open-Sans-regular/Open-Sans-regular.svg | 1637 +++++++++++++++++ .../Open-Sans-regular/Open-Sans-regular.ttf | Bin 0 -> 34156 bytes .../Open-Sans-regular/Open-Sans-regular.woff | Bin 0 -> 14260 bytes .../Open-Sans-regular/Open-Sans-regular.woff2 | Bin 0 -> 10352 bytes .../orgin/src/fonts/Oswald-300/LICENSE.txt | 93 + .../orgin/src/fonts/Oswald-300/Oswald-300.eot | Bin 0 -> 16752 bytes .../orgin/src/fonts/Oswald-300/Oswald-300.svg | 335 ++++ .../orgin/src/fonts/Oswald-300/Oswald-300.ttf | Bin 0 -> 30704 bytes .../src/fonts/Oswald-300/Oswald-300.woff | Bin 0 -> 12864 bytes .../src/fonts/Oswald-300/Oswald-300.woff2 | Bin 0 -> 10056 bytes .../src/fonts/Oswald-regular/LICENSE.txt | 93 + .../fonts/Oswald-regular/Oswald-regular.eot | Bin 0 -> 17937 bytes .../fonts/Oswald-regular/Oswald-regular.svg | 347 ++++ .../fonts/Oswald-regular/Oswald-regular.ttf | Bin 0 -> 34408 bytes .../fonts/Oswald-regular/Oswald-regular.woff | Bin 0 -> 12732 bytes .../fonts/Oswald-regular/Oswald-regular.woff2 | Bin 0 -> 9964 bytes Lesson5/orgin/src/index.css | 5 + Lesson5/orgin/src/index.js | 8 + Lesson5/orgin/src/utils/getWeb3.js | 38 + Lesson5/orgin/test/TestSimpleStorage.sol | 14 + Lesson5/orgin/test/simplestorage.js | 17 + Lesson5/orgin/truffle-config.js | 10 + Lesson5/orgin/truffle.js | 10 + 60 files changed, 5205 insertions(+), 2 deletions(-) create mode 100644 Lesson5/orgin/LICENSE create mode 100644 Lesson5/orgin/box-img-lg.png create mode 100644 Lesson5/orgin/box-img-sm.png create mode 100644 Lesson5/orgin/config/env.js create mode 100644 Lesson5/orgin/config/jest/cssTransform.js create mode 100644 Lesson5/orgin/config/jest/fileTransform.js create mode 100644 Lesson5/orgin/config/paths.js create mode 100644 Lesson5/orgin/config/polyfills.js create mode 100644 Lesson5/orgin/config/webpack.config.dev.js create mode 100644 Lesson5/orgin/config/webpack.config.prod.js create mode 100644 Lesson5/orgin/contracts/Migrations.sol create mode 100644 Lesson5/orgin/contracts/Ownable.sol create mode 100644 Lesson5/orgin/contracts/Payroll.sol create mode 100644 Lesson5/orgin/contracts/SafeMath.sol create mode 100644 Lesson5/orgin/migrations/1_initial_migration.js create mode 100644 Lesson5/orgin/migrations/2_deploy_contracts.js create mode 100644 Lesson5/orgin/package.json create mode 100644 Lesson5/orgin/public/favicon.ico create mode 100644 Lesson5/orgin/public/index.html create mode 100644 Lesson5/orgin/scripts/build.js create mode 100644 Lesson5/orgin/scripts/start.js create mode 100644 Lesson5/orgin/scripts/test.js create mode 100644 Lesson5/orgin/src/App.css create mode 100644 Lesson5/orgin/src/App.js create mode 100644 Lesson5/orgin/src/App.test.js create mode 100644 Lesson5/orgin/src/components/Common.js create mode 100644 Lesson5/orgin/src/components/EditableCell.js create mode 100644 Lesson5/orgin/src/components/Employee.js create mode 100644 Lesson5/orgin/src/components/EmployeeList.js create mode 100644 Lesson5/orgin/src/components/Employer.js create mode 100644 Lesson5/orgin/src/components/Fund.js create mode 100644 Lesson5/orgin/src/css/open-sans.css create mode 100644 Lesson5/orgin/src/css/oswald.css create mode 100644 Lesson5/orgin/src/css/pure-min.css create mode 100644 Lesson5/orgin/src/fonts/Open-Sans-regular/LICENSE.txt create mode 100644 Lesson5/orgin/src/fonts/Open-Sans-regular/Open-Sans-regular.eot create mode 100644 Lesson5/orgin/src/fonts/Open-Sans-regular/Open-Sans-regular.svg create mode 100644 Lesson5/orgin/src/fonts/Open-Sans-regular/Open-Sans-regular.ttf create mode 100644 Lesson5/orgin/src/fonts/Open-Sans-regular/Open-Sans-regular.woff create mode 100644 Lesson5/orgin/src/fonts/Open-Sans-regular/Open-Sans-regular.woff2 create mode 100644 Lesson5/orgin/src/fonts/Oswald-300/LICENSE.txt create mode 100644 Lesson5/orgin/src/fonts/Oswald-300/Oswald-300.eot create mode 100644 Lesson5/orgin/src/fonts/Oswald-300/Oswald-300.svg create mode 100644 Lesson5/orgin/src/fonts/Oswald-300/Oswald-300.ttf create mode 100644 Lesson5/orgin/src/fonts/Oswald-300/Oswald-300.woff create mode 100644 Lesson5/orgin/src/fonts/Oswald-300/Oswald-300.woff2 create mode 100644 Lesson5/orgin/src/fonts/Oswald-regular/LICENSE.txt create mode 100644 Lesson5/orgin/src/fonts/Oswald-regular/Oswald-regular.eot create mode 100644 Lesson5/orgin/src/fonts/Oswald-regular/Oswald-regular.svg create mode 100644 Lesson5/orgin/src/fonts/Oswald-regular/Oswald-regular.ttf create mode 100644 Lesson5/orgin/src/fonts/Oswald-regular/Oswald-regular.woff create mode 100644 Lesson5/orgin/src/fonts/Oswald-regular/Oswald-regular.woff2 create mode 100644 Lesson5/orgin/src/index.css create mode 100644 Lesson5/orgin/src/index.js create mode 100644 Lesson5/orgin/src/utils/getWeb3.js create mode 100644 Lesson5/orgin/test/TestSimpleStorage.sol create mode 100644 Lesson5/orgin/test/simplestorage.js create mode 100644 Lesson5/orgin/truffle-config.js create mode 100644 Lesson5/orgin/truffle.js diff --git a/Lesson5/orgin/LICENSE b/Lesson5/orgin/LICENSE new file mode 100644 index 000000000..8dada3eda --- /dev/null +++ b/Lesson5/orgin/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Lesson5/orgin/README.md b/Lesson5/orgin/README.md index 8eb7d081e..7c98c0387 100644 --- a/Lesson5/orgin/README.md +++ b/Lesson5/orgin/README.md @@ -1,3 +1,13 @@ -## 硅谷live以太坊智能合约 第五课 +# payroll -这里是每一课的初始代码,有需要的同学可以参考 +A payroll system developed with React and Solidty for Ethereum Blockchain platform. + +## Get Started + +1. Install dependencies `npm install -g truffle ethereumjs-testrpc` +1. Install [Metamask](https://metamask.io/) +1. Run `testrpc` +1. Add first account in testrpc to Metamask by importing private key +1. Run `truffle compile` in the project directory +1. `truffle migrate` +1. `npm run start` diff --git a/Lesson5/orgin/box-img-lg.png b/Lesson5/orgin/box-img-lg.png new file mode 100644 index 0000000000000000000000000000000000000000..60c19962ad5846379c8f2a985e21fb518e7dcaa6 GIT binary patch literal 113830 zcmeEtWm8;1*X_XIPH?y2?(V^YhhV|o-Ccq^Awhy$aCaZv-FJYdQe{ zh@U<_5L2tZ&+iurJilu=f46Y9HUR+OQs|jv7-$*i7zb%abS(!5RO1P?R)^JCLDD7+Z_{?RP3-Y^>8fSU1p)6{wSf?hg$6@`oa)x;Rzu zZTao7)*E!KXHrD^YSI0osfZgE#HwJd({Q~j1Or~tc z|M}P8#|X~;J6uh&Ct_l`m|(z_s9ACE-B(|Y^G*IX3D^#KyDAe)h49ocy9Xb zJ$5^*(+9?^kppWW+#^dBM?!~1nD>O8-<~x@C{2QImo&^OlA_Bw(nHqkde-#hP~|=Q z?=%0cU@RxPMJrxKyj8SJJo>;Kve%Z>zh%c_w$oAb$>y&Kr|&N)zT>}eO28uE**FJ= z3-3N3$vpcl`;XADW+E4}o#x9(gI-J@H5d z@KV!mEEfN9-L3STYg|94r|KOHs7B<}+ z4dV}nM{n8FlCieu1OjXUY)S44--CKmau21w(;w=$>bqv@oSxWqTF+vc!8*Q2Y_@n* z1XJ4DK~7FXaH$!WJ4HiN^GO~F!hg50qCnR60*J$wLXu+!?-P7K`!T`l>|FQ#WB%$q zYGh?1FRsgxK2w_}k-f5!cxcRt*ws|7du+iB){_s?NPl5XoUE)TdJTT+na@?OGI!2- ztPz%BRBEQR)VukwCO|c}>ug3+_@yW8@D?^xZwf#f0OQl#etff&7nq z<|9S>vVp|5T*Ci^q3kIjBE}`sr=#GpFuI2@>Cb@OCzKWyh`LdZr&^||Qrmrgr|t}2 zcG=jk@OrugdSEdW8)ASZTtw&FJF$}LNZ`}rS3L6g`NE4LK%T?&}ViFqgbwa@TlDl>%=l zU5O6$3X+Ex4rbiCu+qApy+3zMQi?NYjrq5xWn0FN(k*)k=kd+;u)0eUiL~@r(5bui zkI5kAt>yDcc}*Zz*ZzUxz1{fI@)TD7e(oF&IfbIQk3 z?z>hw|Kz#+Ng@5V?LlmgglOBt`t9Nc$bd^Qy_n=1y~-AfKVrdlUc}Bq;IH^{J=V($ zELd*W0c#@FvdpkFWY&?oYs)HEz%%gBcvi9g!`>kA76#}cLr_ot(Dqyz<1iJ1>8%a? zVTyUHn`aqtiHkQiVuMj9wwHK{s5RrNzUt??w7a%pukm7zDv@|fytiUe8_ &IIu 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%0A5D*17g&GCtGr;&jPHo!?qH&fEO{R*_sF;J2 z!IGDF5FI;o{25TPR4!&Q(uv_i9+VB0FrkezLOI(CJAa*N$qUqUu#%D7WQRJfw+`z8 z51mq0q*#!F0MU1L0YV0}ee{$~(+<$+uV{QI8_n2w5mLsxJ|!c$Q@%+%S-?=H9X69c ztN~t6U^{OdcqQQ{bT4#be2&)Z+@ZK+<#7C~fB6&fsvrN!_$^&_|B#;Y zzhdsP_|+9>#SQQKK>XhS`1P3Bw>OqAUKBIO#=41pNcW>X(aR}xx6v`Z)_2Z%amh*A%a`~J90_xIPGdw#55ds>X>Ho@*4+w~k;P8_bP`0P_vVRUpP=4b+2fAh_H zBK>fjf61jWs)fY5(Yf(~T^r-<*$d*LHS6NWFMd9DKFk*qwFr@rWwVDgu@1$<2e@Y~ zflA-5Z!F|V++o#;^M>Nml`~_-oSgiz(TgP2qve_SJD7NOtX>;e{;U5MC){*(eAktK z9y90Z2cT#JehE^?QTc2B;X`rK9XH0Z+ir*r=e!^uJm=zgc=f5V_|9A7RsZih;;cKb zk9oRUGehm;Z&gU28cPpwZjCt)+!eRI><44lvJ+#?&DZ2J12jnWyIwY7)MHp3@r1d< zv0!XCw&_a1xW5Ti3{TK!)}#J3JVOgR3P&bD`W}E|1Y9#r$IKoPn~lHdI5@RT9RWKw zok506z4|9pmf=Z;JXEoZ>MV4KFmoNr!(<=@C9!0^kemETQbY-w!j}u6Lg)acZL&cH zuyA2IGUX-TB;x3q0S!dp^N{&uEcRMl2vam!yGD;P4Zz4LQC`gS(Xwcwm^(6=awV?! zqOq+hYsklOY%BV;3x?zTWy5jt^Is4@@RL6sf38XP{W~_q<#U$AFDzXb*S!Dz@yGA} z?U+AvRQLL4mrcDh{&snPQeT=`dE&|O+PD5lT=0U+{lxzibI!leMIHqF#`V|5N8a-% zvEj};^^U(D7StIm6{WshA>boG%k(wDPkrP=amDMuFHT;wR^JMk8_&__V85sd>ukLp zaQ^cyiwEz%%k798xx%nolj}lFayLFS9uMs1*?8K|UYuge(_O&Vq|+CT_{@Jy*Z;dd zToXUF&pt_?p;SH={>E4SNbH-pI4=Cchhvr|dmh+xS7~)qVPwWc>^bqYxbuoP#$Mg$ zAANX-o&(UUn9Enk#>-z5tFQS;3?1Z2`jnp?OIFO98>ij<)wts;SH;~g{hrwHrGJRi zZv2#P1?aYp?4H3rcUzCfUWd#6c{om0|Cz5V8rN<*7&{Lh)^iNdJ<-Hiq=)^i_mMKJ zlh5?3uJ)fux)YB^Zr_2>CUfzmtuE7jC=-1!UBx2QjkwRZ2q^Y0uC1<(qdOtL0$3olA=fM*5g?*^vImH3ehxF^BUdxx(t2p(xF(oY+3xtb zl75=?H&>q@U;o6F@$Uce-(umM*_!-ySyr-pm;L2SO=QEmTs*1!)2s9}|4+Q*m*T98 zF7~DQW0}F3?Fzm6cjko`$6dF6J$7!}rg}2j$yfB(V&pdh#`o=uh09mQSr_EuVW0He zqz40Ep(_(yLHOc7U1=MVB{@e`vDNd2W3N7U$C;_S*Awv3vFv}ma0Xudeb&-Z`w}{)zY;J$wpU z77Y#QZH6P0l)07lorF$&DiftK+UL<_i1^QgGho?rpE(0eq^jIpx~ zRXJ)Fn@Ce-%JUdzRPuSu>NK?aCXXixm=zEH#5_7g+tc1LPOFS+Hk}ilL2l%%pMzV6 zPJ@%RwTTliD{xwm080x4c8ASYRl!1xgVrlTWGU}I^N0(&(q$o%BM8z;UJnhd*PGy@ zh>X$?$l?-~a*-vV^yTDl@={qkEC@O!u^Op?lPa@WX4#u{6b-G}Xwwh@lAdDoMOU@5 ztrVvY^A`{Dt%HD2s2m}KptWNpClmJN=72VRip`EDfEH@5GkT6llZQF`*Y(!&_7UiB zS!5t*^1ncn|5;1)Znx}u^$)!@W}kj~{Lbdvgd2*VUv_#--upoO`Tu%%ESNn@lRsbd z(~__5=`(TUriF^q+<6P)%|G?_IC0I|Z>hf#tXO?wy!wrA(Ix-9+}o2`m%rtsnfd_H z!w+q0EOCOq8aUyrTe{?b!U?j0p{f4lJp7MahIPDn#i-A=X;UWP;o4_AD%dqkE3u9ahvlW}}j=B5v;G^os!eB&KQkeKdm-KJG^tRfZ zeW6>I|F~m)ycMYhr zgTw^DC5+8lWJ~eU5#TY(YE{OD>IgPRNdK9qXq&8}%Q|6eB}A}UA2JK0tU=mk(6@Rg zt?6BlCWs^aFlI2Ot)c{^WS&mGfIURd9`Qq-dq`wY@n=Sbsvq#Q4F>dJBg8sFV_Omj zfMDl$!F%$AtCVMxdHFvH$`6g;TO8Y&Ka>CIi%0ZszAl@edRn~V^>2v(t4sg4>H|MN zx#;A$Y;0lt<{$m{*t2a*ELpe^Pf4=uVlwbCYrqF-CiS78v!8oOoPN&v-$MH%(WkCE zD;6zV9$UY;$+F$9c1qIHpT_)SM_JyXHv;DHfSOWw)u6RcwJCnXS{6CyEafUn#I1Tb z&}XoX))JoD9s00?MbP$kTX8Zm4{K(?f z-?d;_>|U@W_Rn1u`{vA#4QtPf$yq!zqEGtjKK^HZ{Fn6!i5#|OsC~wD`vlyB>&}h8 z{TII)tM#=1@WK5tf9JNCt!<&c1u%E}=2)O_2|RSpg|TDBDSn>dfNl@)RRZ_5=DX|) z>11K3B`7{v#Dk>IUpW?E)a`)Hd$qu5JdexOie){|kPo;{9eNR$Cj)oP2rZY3P6h2nvpI(aj*v#z$lt^z`h@98N76xtHaG4&9?O=yz=h`K?mzhr}B zss!N;X?WK|JQfGW1gL^g2*HeFS9ZwgR_d7{V*U*NsZToEQksUS1h}a9ZhLrKzp6k}JbpWSS{_@DL6DCfovB3@XaDw{>e>0Q^7(~C&i>^C(KF%m zJj4OLpTFs(b+P%xb+K{HdHUs^h#Oz_#<<~%H|LoyX3+F>XR5RJP%OFg8!m8pzgut$ z0@-YRk#X+UO>uC}yx6_^q_}CLu66n#N$C-&JRGvc|+N8*|X59^~rs?+1_7j8m7cOZj!5cVj|HG^AZ z`Y@0y$1a&v31urzsdqNDVnuklH=-3a1bqYHVEnZa~(yCZRjd~B=}D-pM@KhbcsU=8x=%u)(x5PVOO&UGHBrA zTMDq4&9LKu~@bHn7$ge|rM zCWs9%T^d_;L%(IGg2pRC1SBg**_5>e*194*jo%FHl%TPJm4#pbR+Ml!n;m4+h#rp_ zfCJK#{~V4sZt7WUsUmnS5st@{2uL`XklN(W(XBV#5D#y8NY4y#DCK0?Ejqa>cWj!L+EZ~7Zo%u6q$_jL1D+3%y%5CEv{{!aV!trdagQgE4ksZ+!iwZ-|H2oDm~>W%BaB`NLRy z^VMFA;S&;lDEl{l)!;4vjq5%8FMQv>iF+=)B8K)Kj59v_;aH}t0T1hpf9JB*vFY5) zVqA9Id;aBd?}eAg?CslQ(WZO#P~fLy_3hWk;s@`JA$>n!5}#W>y-GR9ya9$UnmH8D zJ7F}g-8gQ)b9>{lCV9mZ&BWmYYAd}4djzYmkg1OnAhyAHP9QDR>GoKlF@S{*#OnlLE~vo{~XWT0Q`H=zvgm{!!TinjYyaI>t}Pz$6K@$dLfD z2#3ZLW^>Mq8R*P}GWg+R)4%!1A~|7JluAS{7%CX&jK+?#4_@;mjq4#0vfAD-qs3!8 zdiI+Rnb=hN&;@(SBIBZfvd-}S@l5~-j&nM$3jkbThY{FrEV&g&;n9rsI^aod_=}aA z@N`BKD@U_rCxQT}+T1Zk=Z3SUq!ZR89MJ=dQtQybQXYmRU&=~4=yT%Fa!&jRDOn{i zbzo-!K%0cJwi0bAMnK#2K|!68G(|KVynVE$Nm{Z^M6Ygwnx>@NFC`yh<6ty58OygI zfm&VD7OYZ@Y)aAF_Oh)LAu2%9Wl+H#h(J0zYqRgY06_MU$Rs)Ho;Kr5`&3Ox=jcAP z+fMcXKmXFpWA2KT@lOw2A4~O0*=y#nj0f(%CvLy_#+a=y`!SjHPyFz<$qNJh5g5TH zIrV#->Gp5j8Xx(q_qgwRl58?GxlCx1S-5m*yy^dWdn{PI#F9U$&jRyv!e@=mbNTMu zZnYQOr-8^0{O(i-VEA}cVQ|rkTm(F%4+r@sf^biIk}iC`boOvusAmv(;E&eozn5-1 zZR?B})ueo2?!vhJf|tZCm%lzXo_4Og)ZC5t#p$2^P%L=pfw<}QKN$yg8|IuZeCKrg-4| z7sWTvxF|NBb)kN``CzR1>gVF@&wn^pt-oHM9o8EKz8zEJ5;3EHT+h{lm3qzbJgp0_ z`{qISHGJK*)wghbwxm8A?axBxEuY3hv-vgval=`vlFKN^+Z;$P7OWcw6J?xsd3Kx( z-dmh<4qnM`S=gj6^)N<=5FAX@n*zLQ`zi^n9ALpM)_7_Lg_3m?y=4d{;v%!~q(uN5 z;`CSS@EZ)TaoUlLPa==I$!dF&LOPv+4?29t=B$c5!vR53=bS;Y_{75>zVjv&DHj6b zLAYe8*Fz;X#-F4?32H3cb|+04ge6Ahq6WHL+;?>bbR5!gT>#ke_J9UiJ5o++tKVv* zy1t&y$3b-#;2uJ;Io{rv5I4LLG!d<(e~{W+N5TYvS-b3P#<$j}h6a{qAjHxPN_pr~ zvGG8g3T#8y;7wMuvpQx^KjdjgvXgIeo2>~;Tc8)5`j{|xbjY5qg)kj3iY(Q(-nG!|R+9mX-TU$K|sZ#|k}p{mGlZruY5##q4?WY-YPm?LI{N zbQ?1C4S79{zh(30M>nFdd_l`ODYl#EQRgv1}Pqo-8Mb*{o_;!MSQOTVLC|NR#sC z9?&Okbv1xz1fJ}~z&TTbFVrRQ+1=zXpULm(xAYmRM>SdBclHb7ORxKh*mU|iG4r9V zar#vsj5RlXE>=Bod(6`W%bO72c=cQ3;K;(*ziMp^En69%{NbOE^%q{Ir}p>7i$C!0 zxb&8*V|4Z$P4>EVphdvFdVuetm1|b1ia?G zzZsvH@s8MZ!6oreKl+RMj=-!~b>FSAQ@;^FI`O`5#3fh#b?m(6?_#Ik3b;=Tf%`9h zS=@Q?%i}I>r+wvwcXN=dg25tn}f|C!mg5C;^Q|9w#z;LYJcIa{43Xr$l zW-NGlBcMO2In_@@!KGwg2b507kbFYR6j9ZG>&xBAQvIU2SLSW z_N+uO*+K3xL-@qOQwp)E>9i8~pvu40f$YXoa-k)QY!SIef|XPOK?pAh{izvi7U?v+ z2{2P~_9kcKrnTOKh7SSc(=e7xN;&y5fupL=nWoP(cu6T9i)gYCXt)^_m-Q-Xrw0ub zwAoi2bh@f7y@~(mM|m~Cu0+&vO2=^lKtrq6cz^?~R1I&};&3uJ(g5;m6v!J&^zJO6 zI!}U>v#XKJiY(-itRu5s2av!V#EJ&Ad6Eu&Z9+_W{j!>D!Thf>I%JPku_HAbY!?7J zSn)y&#C*_AVH^zEF%yJnNaTsqZAOH#2ez#kGvZ{QxnnoI`f~S(_n01@~2Ig zt~?=5S@WFu=>8qCQexYNdc2S_RQ34hD(;Ohznl$qBvjQ5tz4Np+#-g58V9G z!}rD;=dX^n`VIi;+Ry6sHZ3IlH9SM`Puio5y0#5BhBm@Zsfoq9G=07v47_eLw^9;b z>`%&pF2X~9%Vz7AhIBSR^{xQOr=mHm5Ab~H6>p8NeD{yU=&l`c{s;aj&b;obSiWPk zKC7$`;mH3p^b^Yrf@AWR#=+R4%k-ak{lAIZ&c94&)!wAQ)h1K$_8o$`-$f{Aau)(K555u=RM&Eq&ONQc>Wnb!2@~2PA22*$mhy`fSo9 zK=!(bT#2(hb}CRe<5WhT3KUIZ1u%%l0Pn<-G!SN+!l8|_g^)=aTjpZfn2{s;r#~IX z1%M*o{*eRmp%3Nw{-7YTgiKeN!4A&JLS+jPGYuoY!*%Hlr+csj&t@I$R08Czftr+x z#>j+`b%WU!q=}})WXp@rGE6C%#Rs@H6Ck<~8euWT1cpCIU_t>5%9lJZWI&n3d*wyr zN;E#;?!Vvf))S!JCf=5(GA++>OdsC4^~USt?%UVLy0g!DG;@6W;Oq-83buXv?*GFN zJ>*{qglXZDCEexzCggsd!T#Bf`{L5si{j<;@;QU84{eSQ{>dM8_ww5U0v=iBc4Dd1 zh9mOS9e?BMQ}p4Q&HCMddw1$fgz%^i-*%EM)uX#(Xxar!s{C&R@CvJNnX3m)#Gjuh?rg}nyaz-rOcxP-qX>Hu63I4ue zy=kFS>q|cR=kffneI`cqnPmFL2EDrXzPJ3RI5<}iNMeW{8mub&xMSG~@tN2BNKEJo zz;}K6ulfjCLwX4G%+Gx!xaH94L_P7K_~fC$^OlXo)eq?LRV@}D ztG}U})K5g`GcQxG0!X}NJN~W55R_Uko^yMv&7CmC#(@_Ep1zc4$o&B2MK@(KrSp&w zU>O`F71`cA;`DIPFg`U^A~G8w7U9K6`$5xe&Os^VvasPwLYp{qxa(Vp_}V(XKI;u{ z(#jU=mK^kW!=999nKm!u1;c#CExc{ELB%V&b~PZ+$Qh%|AX@B9`%Q!Xs<7W=0+*FT zh3zziIwAJR#ToVqgUvP{Uy-5Ts5e?Kd{1+tH$5%Mjc3oGPMP#lSMlaVTxkyhaI)L* zR<^YUdHza3(o(9LBvyO(C?PCZyNr%h3t0FJ*k+Vy%mb}p-e6Xih698!caWl~dblA4 zr*XX%SIR?xnaxXclX@Uz6~GxfDim}SGRWnCcKx~IWw{U*hUu1#Dhl~8lF9&J>*Gf{ zJpF#KUj(;ovmnp_cBW4e)HUHI>-2~|1q&$*NZG?xFINYazI0fZReArvYp*`sv9i7w zJ!>e|F64LI)Bg7G9y|+|ER9i3IuGjd`Vw9GU#fTPw{O`Z8#FO$!lJ%y%X-R4`c=Uj zj3@X*->U!MpZ%ZMwR7jO%y|TS_S|`~dd*rt=*Po;?Os2G2Xwmr$=wgddv@L*uba0r zzIXl!=HH^%1%LNfe>t{2a9>`fX!XLTa;S4E)8A-f?BpQRofu+xJ#fB08|=Y1!Qa+i z%@#AI;9N~~BfhtgezI=q&&i+n_YcP{FZ|xP;Z<*rRo8z$Uj1jk7Hf8IiLv>*+QHBG z+SZ=$c{59=$#mTZmZ<2^_&Gt?4GA%%6X(5(Q();|IH^j1U-m9@f&kU$DB96qQHDhd6%+*Js z&R+kec=>PrY|MV}{`kV1{zGh9cafe6;OBZVQ#)nS1P$8~uw1vG=!c%KQru(O6Wf!A zSXKtPH)Pv%%T{uC}*dO{4k<$aSYi_ZqF`g4Mn$vr~QJ^sj<-t8y_-7VYuwJJ>Zn8 zKGey7Vx@MZe3J|SWzm-%Hd{1#Rg!TR{Y7Kju_5JHd=|uxEc7A^4N9hy<`#^W1rRzV zpJYOx<$_l50#894o~+nS#gD$PY4g#Eo(yd3NcI?&l*jVSlLp0qIHBCq94v(Wq8*q{ z26+5c4e1VSf|LW=1j*Djf*mU!{|T3!spOakV2aJ4P*HHpvyq8U<=RVDvPq)l!H$4b zj}?801X^CthE!leE3STkAoIG;WFfIKGAPRfF0gl~m$n>F)2E&8K6|KF`m4|8W)s3l zmJN_Rb!0-39^{}+aG!B|m0R>C01cC@fUkO&{e*p>j!2Vr`M(<^gtwX_=vtA~`oI{p0#ozP3=vzJyK3-l+dvoq67S z+c)A*fA3wfd*_a3#xaldu|1lE__E))Ry_xF+^OdQHt3B1^Lw|(dv@F(`*n}}rxve? zi*@!-+NdiNzx%7d65sgBmtq0m!mrfXCPT8_s!3GFm)duK0Px!aP5$fjOMLW+Z+9S} zN%8mEg~OWYI15H^P2!TDWnjAfp?CIg`mP`HW&aoa{h!A2iT%3NuS?wgnNLRzj+xK9 z-wXEZHy;jZ23J3szhz^*@Y;{XT-_#ML}r1oU+?Pg)K3C)f`qzbCgJxjS{QruNn!QW zv`d%#&%XbbSo^hWEFa!c^#`6ku<2zNb;u10^(EbQIA!xaaqcJH69<IOqq$>uh zGtPjb{GRsUh*%9wLEp6b*mHBS_V+Xdp6UlVui=hIeh4iVU_`i&qXZ z2~V{yq&&fr1??!MKOi=FvVtm#(SHz`oqCYz@x%Ufq#B~1I#tx)we(RXRo<6`@d*wC ziznIKVgL+H=c(w<%`y!zEoY$)bxkrVz{;QH7@0CGN93&`pn;ZJBMW+hgrsa#kXUo#N1J)HYm=>&BHKDrU+NI3uT89w z2b&;a>r1qY&w}U&CP?HFWPKbtA@NId{NRi)f2U#Q=j?u1XMcK=0j@;!JdZ=B9x z(|#tg+<<$dWeSEztECKEJb#|P9dLF0&tHD0z9aC}DfS#$K<{=<`1g+QjobBZ|1J8w z@AY~X;f4b{^sfF;ymjG8@p_&0FVXkt_v?YgPyXG9Z3mHlaE#nLQzlhkLjBLy2oQ5a#?k+ek7?$pZ2ltxq;Zq-Fl(psfM4LANK;hCP*C!VOvd=EpgU2ra#vYJ}E(--O*&BSUA_;ebtQRH!}%| zaq#N^tpp&K|6YA4Kv83*`cSe|8@Pf9fJRA-_?{xVEh~2*f!YRTp3?M`J_A7Cq3s+= zb`BjY>(gt~1`s@naiM)+j0wqEfDSZ}5>9g}Cw9dqFL@H2G|0EJiw`H;%N$C#xn;PI zhAG!{$#~n39P9y=lqmGQ0x+NcoLl-p7BH}%HDtnS8hkU9P7zSf$TwFm1##;%)Z0Egab2P66qIw z58#C5%VOi*cg6qwm3PK-FS|Tme8nr{R9)U*q)EF!@u}Vu^?L)np>T-%9!g9oveROZpfC67$AS*cniJQ2_m9O2 z-Fi4_{f+ujpj<5ABe#@n9FqU{E?OR6fB75j*J1riv@qfJ=|mGFao!LI0> zqaa$Fbo}x?{Hm6m4fumR%!Qt%W+Gx@c3gbX!2#1f>};3L_-HuMR-P&It~IiKHXb z;r8(#mh%0{diw#H=a+ET=*Mst>Ha_UYnMIEO<9u$4*_o9x-~fe??-;;m%`M8~ONz8p_R%ag6FFNS(dC^Iqjn zIBWOzxa|GEAJ@L&r(@peS&zx{#M^neP^h>cIYETpVPMp9ys^; z{!H=euYVzC?cJ#bh(3JeZcang*y1+PPPXtsAP-^QyagQbL;D;%(bxF;99O`GX5_7s ze(E-vxxEpE?xvqCHYC7o$a9iz6RMaHmexs&T}Ff9KPyyx9OzpdwL`uIzzqmX62*ab z_rX|E@J~NA5L)LTG_K=^t@91`h&Gu_nuVq-d9mJNRGd;z8z@@KLrB%H?8rq&&yKbT zNLgv2_sN>J%9zeC$Po_xR?%m->jR%)m|+_!W`PXGPO;arMBj-Ky%^yVIrJ%o+BaLj zRX>9J+euH!0-zTFs+9ln1QmB}RXLUM4n?ldG#Z?sf+#h{KtoEr=>=~SrfDE=$s&^n z{Un98*_z%?XCh6JD?-dDVQwACv8dGTTNdVNIV(&1vCoaoEs2r=2>Q}*yvu^R?yx2i z_2~5o!7Kup7;Foa@Bsn{IC+bxc+6-X(_2Ks(%I&(R7K7xG&kw2a^d2|{vn{6_)K!APa8~N&)?mx^QMm9bHdg%3wpblX8Oj62BojgVjP~^}4ljntr$7 z6Yu^1wAdNbyXwR7klqSFhR7dR;v|~0+Bu^zO27PSA=qMJ2_vhj$D9NE;&~tc)41v< z{&O5yFfTsw!#^7vo^xSbqSy0QZPHI8%Lw9eyME61bKj-2Yuz(ncE@e;imU!I?pXJ{ z`1r{`FXxTKwJ-RdI9)&CyGjr1P3ShsOf6_$aQl~I?cF!WJ*S=(TUVSKhjf2`SZDM+ z(SNGG_P1i+ju_LudoK$40MX3Z@tK#uCC1fOOwQ+C{de*Fo37G_h8D-QZ~pi3;2Gz~ z*Dm{>xctiZ=nI1Kwfw(-*1TAM`OE!D;_WA{p~|u3tJlR@pZ=g;ZOqS0^I9mkx7;Rp zQ|&cF{adYTAFWZ}ymR|R?AJ>5vAA0v6esWdbGA2inFc>sdANK(V@MesZN-vJJZbBC z1pS8I;dWMIK&SuQ87NKqgU&dPU}@77O`k9qE~M1)Nls7d0>G7*wP`4obrrB&|Ei3QXJ6GcfKC9S;d3B0v%yAMhG8nw_}N+T ziZQDX$A&4wjEfeI{bEnm1$w8o3Z_1~L_7OHLC;SJ&(*I9a;bkpll!DzVH?*Oac)T0sowK);Y2E%(HYA zU{qHW0>_!;&OeEXNmgG zd3RhFw|xD}{zUKYg^S}KU;fYHEr0Vn`c*)^Dks^)dMjYH{B^=TH^t=b*U6Tga)-DY zz$JhE4nVexdWQV)`Io#Q?mhi{S9a;$x5mX^`gjcMR~?^w{XfOMvS-spFNhmn@`JJJ z-dp9j$++)~OJe;+FOyxTs2*a|V(R3pKOUF9|94~I0e)gw^^;HBAFD}xU`IRH|5^m; zgG{T(_QWk4xB0e@4bTp9qb|A%5Pb8XmuN0-E%+e=<^p(f7{ft1o*++w4J(ACz)vD$RqAUxCaIZKaLGVo%1K0)ZQA55 zE)=?*Qb-De%cGq$3A3Cs!1ZxmMJ2Qs%1NMtn2>pd9mr#h^ITE(Hyd&xAOXnIF6E`1 z0!ki2t;BN35of6e1k9o#hfx&810?NL2E1S$kBVMQm=-Fi0rq4--=rjahHPp?uQJE}ZDmCvWf1G3(wA7gMFFfJB=o&ux-O|G2R69|5Q&Xe=-JY$kNgBrC51#?i2##gl*Nf|q23 zX^@|O0jj?g3}ezkYqsQdoyv}~TKJ+hZ%;?c^&Tmuw#kJ~o5>TFzBd`vX^&-75@BQQ zGQ}@ARbylPoRSRB_n_TnI%Kxtq5Zowp&nFq8)M2mW$|oJILxBi#vIE8d@A~3U5eeJ zGxHr=b!m9j;uzaL6gTTZyqC^h7Uy1aX?*?@AG1-7-`vIPLBaA;KCMtS)`2_;T>6i_ zCw2||dU{QlpmnC`_Dp-pGr{ChFim29w?7?hS(fWg0Z+bL8x@7s6Kod?}3U5(aY*|KEG69#Osjbnoi1{1)vc7TKe zg)XuJX_ID^tQMM;W@XVfYo$rkVYMqENn6r{A#}iu#x`Js4YmQ#vMo!NENi&B(w*n2 z-_Q5^?0wGf_r9<0y^>A(hxhyb&e{7JzR$Ctz0cYE%vb4UJ7-SorZ}B$xaI0C?WvP+d-~CKN>2}L(#?La`@LUm2cCCF zJHF@o_P`5Y)_(6b-_yQT&-Jg@6BQRZZ9?1XG`uPopB-D`D=_*Bvld-$_{6=h)x8AY zDI4-f*YCgaw|~Cv(YGM@vY@N8tAd9m%j z|GxI3cm11o_aFaO+s@Ix&Pt?T5OXEsFL#`n;Bu4-LH3EuExWh0&pf6Hp(caGq^I+$ z#|1qJvVpG`&Qb=9JPqLX>^!P0lT4sV)YCZ@0~en}_X;oMj|#yoe-WpDxu}KpSsBgx z>7U9%mQ6b zRdK|w@l{9Ht?FYx%Nwy0CyeJz^Kc2s=a9ZE69C+bL&{Yn5JvB)U0VrIIZGi;wobm5 ze4-$k-awX5Fbh0trVGOcgXx_>xPpOJHjuR()ZDZU@hY2i;mWC)*`Qk%8%muDL(--~;Uyx4*Gnw_$U8@A0SF z59?FFH$VRlA0gkbR|2osX?P;xrWcs|kZ}CUUD_Qx4uaMU1eNbc(&-L(kvh|!$%Wz& zi7>)S4NJgUvgONM0C95zYn0g6Deu$5=qQ=xh>|baq7!3ex9jVMx8L>Rc2Ji%=wsL* zE;sGo(LVk7L7kbc4Ie-F9#LoNfqwOn3L6)Ls5h-gs-(ueJTRzqtL}PyC~{>&U^jOJ{p_J^i?@wIA06 zKzIWE;H$o)ZP9?aPxlsV)*Jpd^E5!kKmrw4VsW9J)Z>C@b-CcA2J?5n@%w$xfrRxr z;Dhb{uYXhfxZd!0NE3@=dZdt-0O>T5{W!TRk6~`!e?XTbKH6^i@O#>ApZG&R#X$dX zQ+Ru!(o!MTTDv`9lIMpTT5GD;cIm9p-tAl46Gu+8jqY4Xi7(~z`q0sOO#l{JK?T1Q zNZPvHG{W;G695@xKj6NUg=9siJ?Rhb6LEq*%b$CrRh84)7-ULc8S7ix*yzVbKS;{H zM|5PZ8)W-}1-E}Nr@>U^@(Vd{7t+l{0Gp!WFEYkVQ1Lh<#)V9p?K83Pfk648dw6&$t;?p>y4{Xt^O7l@;WK9V>vgn0Ce{K4DGNJsgN*O;itU;ot{7LmN(@*$|DSc=|&Wz_@nD*0w`$=F5O2I(F)Gv~k!mAg;wGT{r&7AHKi6`iG z=~SGi4)%FSDLBG%Y>5{}OFazXv9E%r#EIgxOZj4A6wc{r^X_|J()QhSbK9?*3$f*+ z5M_4jD1Ohj&F%5S8hkjCzC>c@ca@%dzi!ty?a)G*B&FWY%ips)D{x*<7Py<%>3U*&^v0Xpea{niPr4sslWtDD zN*taPWu4nGUAzSC6Nr2SeukGl?ry+4I_wpqGjJRQK}XS=(AWp z=LrDQ6T+3sYl+wTK}&s7QAfo!LQ*sW)dOKV7)ogYt*9;k`ZKNgg%1h=u|(;Q4HQLm z+!Bby8$uQmycr*}1ROmHSehB7aWH}};+YROzTj7MV1*VP$xuINItqv;OO-8#9dtr7 zsjy;Olx`2f2-yB&d}sAR4tvXfxJ;dZM1~xI23_#SF)zAnMhv^GbyWF&Hh@>hIo z2-=S~I|fh|6G#8t1HjBS(Fxy2NqUAH&*n#~97u8fAJayYK&ldKZ0D}@_`x0f_kZ%^ z?P(2$-+j$Z?YH#iyGXHG-APnLhFm88M8mSjo*EdD&K!$$xqXSgX$wyG^X^QSFvh{+SH znGGf~U;9mO^b-Jlg7};UOY2LBCk(EwBhvYRgtgTY_Zr-|bGsi+#3jcC|L~2Zd`|yo zLeR-(A!Yv~$3$Se)OMXd()R1<{NiSvPS>T0*Zk@~ZCC4Zz~O6dY$tWi|Jd$*?bxns zbvk~BpSeFH+2eY}FZJbdz_WTw-+6717j#BqIdMM#GCEyhdHmUO`02Lo(35T3k*7V_ zZzm5;XBoB~KG1d@e6qd!$NsDK@O8sTuB%|~X#SYDzc5l~x08hCrhFvBu7j!A&g3e}a*reAQhip5U+;K^4<+lNh zd0u@%Ri_W4Mt`FH@yXkuvJN{Ay3cfGifS?UB@alwPvx*OF#`wy{k$q%+qOa4x-e~& zDv8#e5YOEc`=Xg{9*)H)`z{(}zhA^QB?~?a;F;YkGiZ=(4<(6Fd&`#`1!u7zA9}l$ zAt3-?dP3vA3fc@cA5GhsrKZqHoJ#_sO42q8Lv{uSR@F1&sw={xIb4#oUj~pp2T3Ak zQqLeEpI9gU!2qgigS>uN#+>&DnsoZSh5G-%!Qm@R&uIdH)2RcM#$SSj(<(SoL4Lgq zQDti3Y~%-@0GX~uWkZxN#*B4lwEbi$(Bm+-QK5W4{D04fJNkSn3JsXY25Wwr2sJFCYp zKl}36>xR8`ZO=mwx0ik4W9@29^v*x^u>8{zJcIl?y$e7ps2|f;`hMdbf2-}kQ{P|E zrF1^e`^w+_<@SR6J~SQaOK^iGI!E^GYwvsOkG5miXu_aDa_du1w(tD8zuT^P>Pw2# z1;1Emqi)jN$XO+|>pJdTP(QolTvuj*tGnoaG4<{3dQhueKsr zicm>0lrZRQYhRmLV zztCl`*O|KD3oQNe^*-f=<+#pmOF8>HaU>hCGC4DyEZP>502B;VRvA<9*Z5+PhiJLz zSq2g`@vSa-CNPmO^I0tvfoGT8;c(WDvcz!(iy(^X4(BZery<}t0V}>`OCJ}igR=5K zELs1#w$TS8Ng*xy?0|Y0tPGfK_QBtlO%fjr!xXS^@W_6f6}v!m9Q$tDk_1OO{H1^# zfclAtT3iFuQsNZDwxeg6(z7#bQJR3HgU)xQ>lGh$#4AyY>vB z?jTJ2x)^VKo?%)Si&85H*Q#(6Hy8*=PCwc><5$tcjfjr?FY4X@-R8v7-T&G-W+ymN z{mEYsNVBidX-B~|vtG9qYpHM6<$^zW*Kf7`k3HIcaL+C6CVda!=MO*9KCTbN@U_72 z`H>%MTlG~qcFM$IUMH-(u5JMOT7D)vFTQ1p2S%4M2PP<$ln-9w*vT~H&A$$huB13DAK2!D%S!s9#Z^{C!@-Mzn2uRh+U zBmUi6HtW3w`Q4_^IKTD(`X_DQ1NV87!%Kob@!G%Gj_JOEd!K%|-ShMp+e@GPLff-R z&)vWNd)hJ17HChlbC;gh*rE^qY|zJu*6Gy#MNaYS^1|~! z|7U&)5rfWydJ4d25pbA_>$h0vs-ODyd~@?Y&N^Cj9j$!{Wv3oX>A$QP$#WEru{w~F{SqLpzdqe=l?7mzrx z(QIaa|_?jGy_#UwcJ-g+zo&dN}DzH@xt?ZT^4$ZZ< zmvK1!slwuu()tx3G^@g}34((`CObVJA&C~85_0b#La|As*NtM4kIrOT% z7g=Nb#w99XL_>HXQoj7BBY`Cz&&i+X^uJ`%w@OU}j{Z3d0G`_%mR+H&NNXofeO+gc z@|54GBe0Wt|NpQ5@-MbqHf(8s_3GRGir#?3jgXsE#2ThTT_*Yp)o{XAkFO_Qv5l__jzu^&(NV(OIvsgGtsC%8>8S#J9HHIvg--}izAIKd zZNOyZJb6X-oaFhc9yjXUdg5UFj(_{#x4jSPehqc4liPQ-Uw`Y5>Arv;@LK^Nx%IC0 z%WwZ%?TatC*Zgfy?Qd_=wfuV?{Tw%ez8(R}8_ z>OvN#_cJt#227?Fs>-eaa4~jvF#nhw|6siESfWKV(F6tVMFHOFlTD z%zSsTdcm-XE$W5mWW^sCHVE}uC7S(;Qu>tLz;7jj!zv9$Ilt~0-GQ_Q-^!&@uof?^ z2`|+7k`6Q_l*>{N4mM2^ue;S1x+((0t}n2ja00u>VS`Y9y_Rw+2?Srwg# zTF{G52)4Gci8Zr7Fs%+=Yz;gY@lhG+8C5=KL!ngo1IP+-yVpxv?pDQ`I&SoF2V^kW z$=FE8r7*B1SQt9!lRMZhf^sBidH;FY4B5*IdRY%o0ND2#eWL~>o&capjpj`JiBI<4 z&1PSWk_}qQEVQlfr-bM`!+zc3WP}fe}#I{8r%dODBF*X!CpmlhIJVp6eHJ!v&*EH3H{*m=F2DvE&}NW)Xkq`$ z$by~!!R=q%Nj6c|wi6JRcp4HlI2VnUGZb5*V;UO58o&=yl>Nb@v*g!7X zn2Dkj7rP8hB`bngnD!mAB4AN1T&J|)K3OmN_E}j5&n^!_PdXlxw%&+`&O*}8 z&qx0&Z)o8Yv^#XSw&RAm;Y&d9rVl{NYo8U+nT22YXa8$EeBi0}SNA@@y-Du_c#mEV z^xrb zUr!URJ{gcFOqg^%{Ca&<={tVqe{3&)-~X%k^q(=#LwDTU4(qW(()FMJc>9k3?eDj{ zAG^P;)1`vB57QZ(rFhC|?km{B*9g^(I3sXU?@my|F6iT*oV6Vm_E);&4|e}s$Y0bO z6gTQU42$t5mKe;LuD%ZqJZoKJ3iW{l4s>q7(V!wY~SY^ADI|0;Y+WsU;;o;Yyn&TB^bEL zk6M*M#Q2%ht04mVrk5NA{ZI85iVJ1S_9B~li7(o8**3dlk}*DX z`NaxFem!s|f)Jgl(PAUsFe{DBfHP9ztYX_ykg)%-P2|g8ferhKY3g8+ZU7%=mmR=M zU8){F2S{BoZU->npPz%J7rUe*`F{GZ_w3#g0|q|%@Q$iM zTTK1azjmv$u%*G1$NyH-xk`i9c1-|Wr5R>#F4}4SXE`z1VRDLjvyPIV{NlsypZ}A8 ztgp+RYyZW*yV|#I-`C!K{6PEZ{rBmseJAyXz?Zfk{i&aBFVzzQd`sXQ69MUaFcBaF zi6;W88`s=5G}&j<8Tf6h27Z-smO5ns%AjJr*#IK}%S0~zf|IilDkG~O$!)E=_wDWM z>C^4rSA9eKOF!{9+N10A*c+((EEN@r=NAVe3}|BFk{SZdOM)+1AwqbqCXL9 zCQb=>tx&PQYFF0io5m_Ofc2mqio~I-J}Pq-fHwD+{fHm3@Raf3PYjVX2DH>&OLeRD z?FQWwaL=bc&^GB3hx^WK?7ZoLPwGrT-n^HInQ)9t+`&yUwidRlHIEl=;8d0Tf`=dE zsd>*32KqM`Zr0j{P(TN|lQ#lrY?Go0YpW&zoB^Qi=7~Pe&92Lr0W2f@oFN;?A=CEQ zRK2@@#>K(xBqWEUD%clFk`P|MjD);>v)7WPO{|Lvaizz8p(hWn;2RfgI4oxS1xTW0 zKU82=i5&hAGNU>pAB>3_G9@Qk+`&t1arUATdc%+CA>(}oqS&*J4Lh5CyQN$&B;;jq z7VMXdRgoBgsLbRghq}G0I@qp=cEE+iyL=t7rrdv6kUW2+;d_rJyr4mH#IG9$U3)KHc{*n8ohQf(dO?bx05EoEprg~=8UQ#Y-OYMODEi_W@9R&z z=_rtWv7UwZ=X~GSe(rzJBtT!t`#bwy)V^=`&Fy3QOz+=*;*;$?dQ5Qdb=S2Y_{smI zz5U1knxCgXuRF}`vj!ty4q#Am9TX4cGsrMl@k53ICw^rupR5yF_gA1Z->GBj+4*iV zhgq$ahONGuxSTz6w%wzN$`AeRpK0s2Z)+bscA$Ojw!Q5S-u>I{QN8APgJR`q7?&K0 z0ck_d0L(jtd9#I_L5_r8_bKa?8GA{cHwJLU#&zkj>Gf1OU<#XVzEkZpz?-j_5j*7_ zM-9q69?BGp80xxAJ9*WX_It1Y_uFs$mH)h*+O22k?O1$Ze(+~+`b+KK{@~BFhi|=G z26TqW?H~sF{M$~CdB`%>&gh8$cmp1>EV+R<>3Py(cdBmW@vZB)h@$sq zl(6pgyx!57Tv?Da7K#&&{gcm*=hzQnS8`@*tGyP~JGYCB3CuTKz z0$HwCg%S+JBA;0%nj;)yD)kO0yxy_W*=$?_y|OAh8$5TJ@-IQ0Rz+B=G&~8ToD*(e0Dy##+KjLs4UFlrGkbo$}ekp!C-p+BHwGr zeEET>e&|STDi5r~aC!#iKIysJl_^8aMKK9Xe z@Zh2L>Q{eb`vyH4xLr4X{o%=j?cFC1w8I+k@7%V#-Fe3g+e^OgRsO2qfyWvD`i)RwKBcj2O;7T+Tz-L991Ikqfuj(9CQs@=X68eD_-~d z_QOB*GkTKY`u5HvkGE^}bi?ycUuggM@BNqU^pQilm#w}_Pn-ZGK57>{df=(U?abNp zI;b`W?n2VA+g^0t-nM(YPKPV?_%5s$G%U45DQp>Z+~oJex82kBKmTrhe)p>Ol8^jO z+p4eY`8jLC#iYu0)#~*CRUlWBBy5|2U`X0dPomaOl zM-R1^zxS8g2EILDpCV^j5xPDV9T-(>dOq8kBTTIQ!>x7g{wEK&+fL^~r zvu3ByZB7j1c3qQ8yYS;E0+VUehON$t!ob6ssKqT9RqktBg4TaPsW7LzKbu|);Y>Cn z@8tsa4A68fXm{G7CxfIgw-IcVN|tu)vc`&s)|{0QLBm=q1g8kS-BGd*HHkX^~ZmwnNc>~U}jrj_-I*Sbc?V-tF{%m`RdIJcjOs}e4IK^Hvq^CD6Q1L1u4^Kw*oYBZ5m#xbN)9q& zoo#z%gE}djwhxVnm5P;o^sl27$7O)niU$AF`tg4M_!Fv@+8Lic@`R4|cupJK#l$J; z7hcPICk(T}#r^l0GAU-`=RwR%I{OE>Ro51u{V ze)IT~?L#LIwJnP2-B(}N?$Vp}Uar&ZoAheiLwdC^pBU!jJ+>nQIm*|NCF2avi6euB z1~iR6{m3>097nks=+O6or*iihUZ;naLrt0#*)yk4*^f8B{rlSY|K#6nJM~q=-_s?G z{kkUpUAt~*zwpohY5S1Q0BqBZXXzuvN!sooZkoou6rbOJsGZU!j-2A}QJU8Hefz#$ zx?zyV0DH^QFO=7>x;0f@Bc)B?_qwgu<&?uauW1jx^fh`5;KsH^la$*&`zIReHK7uq zs;-|-#cS|gr%N>KZyve*p7#E4`GNMnH~p1%__{pew^676?|#=Wv~SYjf5+nwv|B&< z!M0I%{vW*Y_I6fJ7@X7f|3{vGZ+qZHuXKCt-v5YS0z|*+@y2o5YQw1$?SXr~v3>IO z-zCDjwok7CzV`#a?t1~c-?WJ;!M}Z??)b)^f-!QAx0uwNZ3C{i4$(fVc%Nj#Mf{c$ zj{CqN&FEVMCThaW0cGh;-~gAsiGuxC{ZD_1r}H3xsKhLnDT9r+X`gH8S{EGlcu zvzFH`hL4;R%9dBzej=&7v0#CNq<0OX$J)?|v_zs~;h}>fbs!m4YUN+i!jznSKq}JU zdEiH`-#^gnV_V276`pY^JH>9YlEO6>V6t3_H#is0Fz~5emj-fnY8?Gv)b;Acqao4t zj`wrNo*F*b-fXc;H?Q5XZ}*Hc+nDW%{7Q8rBj@lC67)W}vOlNmZqYOGpZ>%r+GjrX zsrLLA-q~J!!_DoD+pf`(^rrSvy|L~$bvfWeC!cPcG2^)>BYeL?UQI%B|h1bAHV zl&-ZOKc@E;XdoGbh4Ly@S!X(QR)G5th!}F?5&=5;o%g9~oMTcjO$@;Egre5q&?a}i z;%nOX|MmY=&-=g4ud4kuz1sLQ`eNdb?76*tNS`A9xqtZIv~8Po=YEenecjQ>k}QMJ z=QJRlSmlTmeg>Y_?$Bh5XY%oWIrT6v#Cs-0zvE9}sz)$kZ#;fP&)R=|JG*Ol+kgG@ z+t#B`HwNg9`h+l#37*xNfkS(4Xb;}~b?yCc{=xRgZ+v@u;?_Imv2v<-A928cujM=IeuiFrAC3Ecu z`zyBDS$o4YuY~EB>JQObK(G&UdtIh#*o9YJuiJ6cy?C~IvQgk9;(z6FYQBT6==cFIn@C58W&BaDd=v$$glHlq?SS$}K@`_tS=)}?!~iMCqLE3-IFzQz3#HVg z$H(=X>BL>3ie^+YPS_^{Lv_VgCHvUh263xYhPset!M}8gRFVh-vuGx1A*ocS)2(bZ z2LAIWdC5=k3M@Rm_y6p9ec^AtCIGWe4$7IsPqec~55$L2uV}O5y;)zAd&6C~gkXLq zmG+qpf&l@)sDppugWYMJ4+u1TJfKSfTQnej-;e%S`}Xhp9=#Fps`ijx((=w@Pqbe> z`b2wLN7wi2bHaQ-;M;VRy{F#L_Si#TXrI6D)9sUg^5OR2efPB!Ix;=2L5iS_FXZ8q z<6z6OSCa)M02qe}pM?^GK2Gs21n%yKxmn-0zw@OpYp;9DTiYvj+JB=4xBVKx{`W%< zx83VEwjbGhdwb+_pJ{*RCw{!0KJ=77Piz>%A$_nj1<7uO(EZxSA8b#bIOTf*keVkZ zDa7WDiuLmpbMED&tcCt7=1edsFU8w9MUT9lD6;aZ*N60lzK{Inzd=`T>oq9e^x!Aj zc1;9Gr?&2D2XrKVeD6NZ7EEgEPMm4ied;6auHXNac8AUw?9erJ?(*k3l36#`y9Lg) zlV{Gfhi|#7efBTBtv&L}H?#|SZ-iWQj5i!V)%HE|xwiA^{o16@w=$1lbO1g-WzKyVTgC-BzmqIZkOsUEf z>!c5W<)496m<5jmEb8Rhn(G4?%B3{ZW#3|1M1VogHeDz^c#`6W98$xcC=j#bu^&OK zdPryCKrq7AiJ!n#oqz^s$-eQR>EC9(Z?I7`R8Q3xzV_`)$Z$qIk%*b9*KGWm`XB1$kM)7V-sF!q zDocL&Y}M$e?$LoC9F)3@gZKNVd z#SXx$wk_+9b5y*vU8G6p&vGY!2DpVY0Kz+WQAha~^T<{A4@2BhfBL`|{dP3Rb@&-f zHbPGTUi7?j3+)<&kkzjrC3%p7r9b=)9yl4ig4pTt|LE}(?WhLtSAN55+B<&ehub|m z(k4BscM|+RM;>eM)#HK>YEp26t}VZ6>z?)oohkU*?R(oc;j_~?c~nQXpZi?9|GrPP zM<0HuJ@KVS+SB?JG4~DF6T2vXB+Cxp*TfYM`diu*Kgbg|y|M4=J?(k7KfgWyo_pHY z=p6+wc(Gn`qi5fb>U8mM9o^sl_|&2H&3cUSEt-@(_}Tl~&;DnBvmMl%|90qRK$0N* zV@VWJjt%y0zxMGjT=oQjm-3)FV(eHaey&?T+t6c;H2)=+K2v2ePU;4~55Msp?K9u` zAL#SD8lc(l+WKZ?T$bCt#*?J?j70@uGh2u_|XRz)QBY&91uFv zKcOH#e&ZeO^RN20_QXqG-H!Vn0SR+oBlZXg30r#i)80?~aeM8*`1|epBm4c?Uj#fr z2qyzTYB6Z|00@mmUG)cKk2KIJ=N^D}c>-`^)d_$nT)JOl%Qd%ZBCr)zC$O-mw=uM< z*6YiGvN=yov^Q+hi>@|PDXfW)KP3ESZ9h$jhapBB2}4FFgRAn=HF+#T0|gaJV=B4q zU%FjrGrh#C>r7Fafdo|h7jSJE`yJ0%7*-N3HxA+pH( zU%P1NV4(;xWnzbf{~*VDm&jv?1R;-umOG{rm&RsmJ-uQI+pFIMOQZYu*w@|696}a8r1zm=6x!Z zBUJu?pk8>&I)qw>H{iuX>#R=eA3SwWZ3>OO;~ zo_L}ieDXj$rkl);9XcF8R41ZFKi_-pwQbj)YudgWZ)!K*c5A!g=3Cme`>xXw-d4sZ zO+JpdKhReUKYjXWyZx$d?Ynp0&~B3b59+l4|MateuN^zEUpMUOBRg(?Di3z>6#)H} zEv-2seWnQjJ8jNHyiu{fW$#X(0g#&esw3)+NH&Q1EVe!)Mp=JiRIKqOa`?eNZG1*Y z>JQ!i()Q4+-`o!AO@8O~I^cDh1a3Nd*f;lGd;iDUHILrk_8fW2-y&GYcN&CAyhied zsCubi8CHzcllIguP-hoT>nzGaz1-)}^|!PqbSdD_Z7R?ecB#CM7xu_MC#@Z|r7|@3SKdUtk1D@hRcl1Oyydk2yFS|J5L^HNAOJ~3K~$wl z;n9<;P5_8Ef1CA!s*O9YC3GXj)_R=<&^-c6A3&nt(C0Y|Fbztm3ILzWZ)%f$wsVe^ zU2_Ex4;@V+*#~Wx>!Liia}X`bQCFPGKHatOexAKRVNg$!8zc3Egk2A+aZUs@%wQ>b z246;t&~&O(1vutf-|sOk>=8xoYaSY(l@HyLO1bRGGLci<{1pK3)Ak2cY z3lJ95+7ke42;4r=@NC@kz#G{+N+8XVlTf|mtsvT*PumM4Eg~8H^&mz8Eu(M>1O42o zoPZ<%AgL^|F&S|sMPL?&dIgXIjYh-c2KFpKz)2?3B~!*1%UG=2R6%shfZ_TeCB8*W z6eIGfKUVYy4JAK;c(UBLw z<(*vD<|v6ztA5Mfx5aleusipIc!OK(VS_$IzvwnqCa+%*kf*4H2*-6M;Ly>dZTrsM z?dx9qy7m{}{*HFe4gA^Z!|kXh13Pspo`IQ(z+Jjr@O*vi z{Z^Iv;(NDh<;z$obnOX!BjG-M58*Q>kF@)BW8x9nc;%MedW+!=?G{Zm_`uP>)(wBZ z@_+oxwn=?|*ABhgUY6XlYTv5Lu-5wq_1mBUoC&~FCv-i0X;A43=X9$6jd$Im3BWF$ zwZ|h;Vg|PJtW3)q`@}G@E}jEiG)PXwU;RNx>Sr}TpVKvl(|R}m2Ia5P84e!zY0*6RzL*#DndCEyLe!Z5vH6Ho=sj-L7qxPIa8x>F z#rqxGGkqq5PlzIEpH(1He|#%>NL3}%DW~q1$QUi1b+bVoRLz(z?@3Xe32^_hnMIqP zyi|;)ZApS)IOV2T0s4O$A16M20;VYfNqa`#{`liS@HKu&HqjGbvQQm|ves9N&zf{< zOr(T0kcgQax9Z*b;(OX(_|~_ySA6}e+U>XB-fq`tT)#_4;YalC_Rr|- z#m98h;QhK8k4eGr=&taZ zs!#2D_vD~>p*Y9_G3WuY&20P(xQR#VFV@P0x~SP1RxhnRBajI+5-P}++;zep@7%X? z7Oo$3i@L zm!vZY>o;;FsP{=obgM4yT+~gV>$tYAbdIBqz5_-F92lZ`kb|V6zYJG-*rrz99SRom zEu@MYVqJ#(8tJ0ip3ekt&_rM^kA1eC^%rv%WKtKX>g;VUuY8D;wiQ1@kOt0s5l1N6 zJKEH-g8+|qqRx?nMf#4xmI){2)Cp!}A|Dhl zhut8sBn7MNEns!qB9=q;FKTi>*ml&}DpL!)Ks{0ytRzWh=!r(L0MMSU$*DBzRJzhb z)<;IXphSO*clZlShIQh%+8)FyUEroGziej)J+YnhAgKv}HI3E%20Oy6eC-VX@QIa( zeXzF}JZ%Vk!`+n(x_$0Iv>tWbq9f4Fd#={$>a*>WANjDqBXHyMZf$qo^WyfJH@vaE z9ZXA3}gACy^qkO*D zZqz`3jUM-UxsFV4)O`lm>GVD{x~UG4+m{}GxV`f|zti6HYwv6i=*Gj%di?9!t956) zCfVromm^l%g2Xbp-ma7w0ER$$zg&+g)(m*AC!(t)`p}7b6b~HQFY(g4!*;#SQ`ku9 z3-pH~$kKYn8!@XY(|MFF#X>fz1MdYeBw(U@kQqLxT)6&*J8C7&M6wL{EQBF#Q$tSK z^sYk;>{?HBpGwD8MZ|O_0}=+hM-+)77taW zL6ggPI7#Q*0BW<@CxQtBcKpUo<;H{;J2>H5;!|+kKU^Vdq@P(O=ZytDWX)ARil`)h z1|BlTcbgdq4}^(s^i)Jq^3jXG;)_N+dOI2i;RrJDhkvIevFHUEV$qy+v819wmC!LwFMAzS}_5b z8VG(mjO*i)l<73xh#}l0$w41ZA!{YA$dG6jgm6%6vQ9V~Zs?^5&#GQ1JJW|}jKV9h zNWw#aq)c^+J_8v3&=By4Y?o&(Bx=EZzxf+&hn^gG!CiN? zyY-%cJMMgu&l22r+imT-t-7oHIi}OcjmTy!#5MkR_ew&^>HYaCDx7+%|hK(?K8aMxCd!1KP7uy->~nK3xX_b!WTv* zA9)f^{kcsC51RwSr(?ko~7y)vfKMXuggqmmSs|rHub;{av4C6BYhXO zrtCgnGIVh+DaE;X>0Z?RM@N6i8C0TGu#UwPKf*~KIg5H}O;-_{+@8nde_VdB0+4GY zne}V1c^5)|q6Ja6q3%}HxfK}_A{DEI4Zm}PQ!1R=5EC5x?ggIVWE93E06FQJ+vTW? zD}*fZ1E^!FUM?0MBCsGT(+5>YPIzujWFfmFsPsu8X)V` zx3FbtY@4NpiIK}?BuS_rnGzu>g^%yVV8qk9-Jh~o{vew%#YSaE80C8~yz$45Cn71^ z?b%{!0)QjhTUZS#T+v3SoXoiFoQ+XVXF`sO_jM>)sw@$M9;y{pR4D}UiY7hF!qShs z|6%o=fiY{5Pyd$QjB$bMv;HC)7{kC!V#=P?hIK+a(;XTFwbk1Tx*r*@T%a5~Sq9TP zR1xH%lg5rpB2o|6k9^eQir!|ZLBC%E$G`1*G0rwU8_%=-++g-8Jp%Y=fAqn2l}<5l z(Rb!|=y&7IH@Dkf@WOVT-q5%2`WtjF!OpgGmyXtT`aix6|G}mQc)w!7xdv{dR20E)P#k=NJ2W@B1MigOonP6o&ekF$*(k1cwkt=Xv#@D zRWv75XQxFGnQM|_Nz0<6&V;8Y!BpN76?YXR zGm}%ri8m8~X}=&>R!LxUHtd2f1>QhfHrUt7Qy;m&;r46<7N~NRF_89P%9WF}L|QgBxEk%OI{4IIwaUTLUBWw)= z&h(H&rq{=|EKeQRwXJ%kFh7ox&+4f9g6?cTynlZ?@aUJ?pMLNIo+R)BAJUGUyL3~V zuKxo{DnG$z0&q$<^8LD-}VjS3<|C2Fuw%-x7E2vnjY}>#NZa5p z{Y6FE#{E`Sh2?gcITj5F((8TAinL9ya&~XD1)#K#-9oLO?kpY*`>t{(hS|?q9%CeA zQ*jr|z0e0E!XBtx2Sib#r*z)>cI4z4O#&``hKqVLap8>E@?`+p!^hy`L=C+7m70W*?laE0Te-ocYGR~K3RhyjwugvP%X$j{o? zI&ehyc#G3f)Kantq&Z!-XC>nS8kwP^tlBsA#YeQ^mrZc(uO(oXJL;D{vO_@0r{!e{ zT&q?LZ3jZ(sVoV{0y`Hy@c}@5$JtyLDcg7Ptkr$8oM^&=1NL+_LFM988T%u2-jta( z178V$(KQAtns$|M&>TRY<+PN-DgP`_J;+kO@U(JTm;g*H3~?tq&Ok*?iQr{iq@bVp zRD^W|ky4Tp!PAyX2ND-bRM1Y4voFd` zB?j4}Ix4+cj{|CVDs^>w1|3AyO*!%albs6j$EOh^#l&PdVq{FHdLUQ{9&v(VUFmHY zcgjPJj>W+Q3muWKV&L`%baIr2Zyc$gXXDg*o$il-MpDj5+%eA?jomuJr)%cvgas=@ z$BNWZ5X6e@iLJxVdX4WY+QnWAl|}GiD;_uKF(9GT- z4IF&(5)h@7oweRLf)bw?ftiHQHO`5;l)}>umr9uN zCxUle6O&~#bKGpWBmqvN$MVTUx(8sBreEQgzWt!Q+2hhFlB>yxTb1r zhogK;fqoeo$Z3&yV7@m^FKiEVj|b{RmI@%${3yq)%kfiLD-K4b$scTD*1D+?~lT=CuU zSDjPL;D~6tg@JI2sAMcei4={g(}X%W7L$yjD5N6UPpNE{nWZS2djK@tNLx6bri+OG zal$fo7HEO_&#DkQuGTY}MMDtO3~OK_QGRxaLh}wtI))Q%B&l%ipE%^YX6LZe(#>f4 z`d{EzXm-J|X25w`k5X~^9i7}jBX({0Y!?i)cu7hu$rY{Q#DHxjOp>K+^DOjp9jDGrk&I5*LvfTvIW222D8jO_X$UbKhkgQ}sq=yau#A1M^cc&i?3vRL~PJ*@?%s#;)Mm zwtDQi@u}x+cNP1_=90pU2X24SkB!XScD%*!xP2{xE|ud8!ZV*#qTc+OYClsFYqt5s z|Go`$6z?94=<18 zLLPJ+ue&Vb!ov)I%Ev8e6c3yBhx#BJlq$F!`n+CI={vPV0NuhE4nV_%{I;8OjG1o;**2@0Z;lU4 zQVB?nC{X9BcGxTl5~=iJAvJYu!?kX*Rd-{CLR~=dj$S*TzQgRQtcj36{j2qg)Bk66 zidlEb~#g1#C&My;=pIb%s>nzI7vy7NMi+@eC>;21X+ng{h ziBGnPF18D2?g&_>Qy)xd;q52!PytQF8w|Iu-*K@2n7(shp2(L-*yZCu+zT+j51^~% zG623~Yf9GhB{*3YhHLH(L^;a69@GI{S3p_O;bs41EwM_5Rj=br&#<8QNHleJ97H4T z>ge`?5@+QcOShePcDwLL6=YwHZn3ZY){>!FfdB}sjKU) zG9-MnaLU1voR~dc?i+Txu-MOd+`%tQmxR?!2*YuMpZa^30*-yJwafHj^nfC6v7dNG z4nEs}l#wcYiqKL<0`_D_EJ`C7=$5UD>#%{S((DWX!X)6d2eD%|B^xpbsE^)}i!Aif z&?ezrbo*+OE;Vo*MU|D3DTsb5J~T7DV6gMu|I1k7a`PWg2RzfM=m|+) z%1w@@xDjx-zIK-y5(WM!rDF6W;^7qzDU(5E#+N@mF7$Fz`tO9=>z9GM20+>HP9rL1 zQ3as&fg@7dPXyOFR_q%yc*}`KhBhq)d!r&g<44>^m~vvBmdr*SdGQq!n=u>!z)D8h z?x#^y<_&-cj-T}V6#5R%2G&@B`;;aCOd9AR9`t3vb#Z)&Ne%L*9GK%Z_7d7ZO8)MUmvS8$@|z z^%n$Oq^wfOM>a}KsHlPgdK)qrLh@`&NTOr=uqInvN*OzLORc>?hi!?=02{YoZHyR- z4wus|>YV_s-e1s>9Bb)$AgvcxWl-=keZfBCXO93`<(Wun4SVAC3W`J>t&$j#x4oJ4 z&~qFtEW99s8hsSWPd?aciOnopCF;S7cOJ5h(JcfxB?jBHa+Tdtl<#e1)T)CdJ%@-T zEz5~gb+-@+)%ZoGWUN#DNOf^fQI!bg%GBdpoB`2==_lcNZZXKp5GLX&flkH+%iDRV zWtg)K=3$_ud%Jazw3D|x{Zh5JwU^DX(ii(k0AwHE8mD{dNqms7p+>c;bNZ3G3 zHihB)9=bd>Q-8Zb9Y)h0|0 zkYCoBv=?*Kg`>SM9Xj5w<}8Ygl^1XDk?t!iH%2vtu!3P2u z{>cYyJ#z4v2bgEN0WhAabtS+5=m~vb=bY|S$ninq+T**lcHBpl5_k7qdnHHkL`lBH zXR_g?Tw7b0i?o+$BGc_tE5v%=Ddd?3+0+@H+oXh|Bc4rzGet3ZD~#BIZspO9=0 ztKI)d^q5id*%ir6$ML4xU+R&k3S!@|qCt-he4!kE!c}}|Jq9B6SdPm872D_nQU2G2 z!MI(&c$N@tF@Dl5A7*C&a00r5Fpl(5t36MUB7>NI{b<7?=7?$rO%jvtHikB1_>Le$ zvMXs;@d-kg*Wn*1BwuE5rBaTNe3QQ+qcqz~(oxW5cJ5s9d(dp8V<8}aB!WNo8Ktxy zxshBi=p+Z540e@lQ+aIYKOP`kzL4z=guId?g-v))$W|ISq1m%xTQXMaisk>T&Os4> zsU95-{%~gr%evCbX+lb)3#pp2#mj%RUik12QtFKT@xKvAgJ~ew>vXvXAaOSFvKILJ z*x}>t?i==2`!ET>mVB5G{G$1eaQSK;(M5)zEzRpt`gVqV#nEL>>GrsaH}i7gUI5W2 zxoSi2A!iE8rWvO;P9Fm|G`zzaezLY{$3A(>l@qQBK3Xz5DC87*8F)j?g6=h3;d z-#*Ohgy?Ds-?)bT`6myxSKfM^Ctqwr+z&8pkAR2*T?!6QJZMTw>vhNS4OXKf@AK?+}U>ai|&UJn)IwC;o_A%Zfsf9(cAb zPLHbX*+91<1qIEXdV2xDAhB(h^ zAHl}FlW>7D9~wTHX^Qgl0t_NvQV$gTk~i!StBhAP1RHdw zJjysfIoXwH3`toO%kj?Qw1Vhq3^-k<#4HMpG~GEdb2F^ITu>*H0)Q4bm6-{YQ|U|{ zfb~pfA>U=hx5Kk~%#657Vuj06KiT32z}0qeo;&jr9{D(Ld%U=yN1e3ySXHlkv)Y;? zSB^^g-KcK^FbJ~)9&Q6}pUKeksw6)%@PwMYyi&jk7e7}_8-@K=5u!IZH*n-2_rwGv zu?XcNHvy6bivj938D}!z@ zAu~BUpli_#NSAZ;AM08Q?@8&ouJ{I+h%BiZ`NT3lS;1MNsFHli&%$27hDKkfK9rru zZ`+WLshy61l_XCl$-aO?ae-a}kPYcbxPYu%3ERX6eG#qB0%vs4gC5D-5Pl&mzWs6$ zJw#4IOkjW~CXhx-gSco>%Sdhb zQqo}BT%4IuM7K!E;jA&ce5aSiDrTzy5Os)ME_Et~SA*vcA-OI(GMy&fQqKgyjzG~* zc`Bd%Pa#-1yp9S9*=!ILph&BNI?+1|edIt+s%=a=MRZ~6S1<`qr;2D?@r{9gWJB)F zHJD-}oAN+k$P~uFp)NCc908n>#xOKRMWvI>FcYw$jG0K5!HP*LhkSHK{TFbsEA8?< zu-OT@16Z|iVOBC0J2B}Mx;V*MgluhbnVL}q2YOancAqQcCNA3R&;EOdKJydN3wrhK zc&kMA|Vj}$={eWt?k z6Sif*RURATCsA<3zwhxwWX&6Rm&h=9J*^urAJ<^UgzJnZToX1%1xUU5cYJCsPLEfo zV=5s^9DO8$V@m8Ik)s~q6B{t6q<)X@9DVgf9hJ9U<*6Y0rirI4ORsrqfT{Kc-bx7F zL32ihGKRiQSDBSDkWeOoLtK!ci|pl)Wh?#k<4?Q3c_KhKSCAY7oh9QY*>(C*QBR2t zr_1$HAblI4`v$+)`=TxbXa)jBKfIpy8Dm1@dQ{~`oru3^Dn|;^QrY%h7MUUqQC}#tmxMww*rpW`w6Mf#=~!d6F)lqRRj=1{y7ReyCypf}hA=-56eWB47 z>O5G=&aT_ku2eW&bL=}{Q0B>}|E0Nn_x}aGBmV+Bwgp>r&1cSYboKcs59>0(9)CHG zOAX%mgvVgb%-uf)m8#lfW$@EK!Lx>AegsO+)G6Nu*nlcY%X%)tm))RsiL875Qcd|( zv8VmW!)HK)>^y5!0i$!3U*1^Dj=O7Zdl4`YS_3mEu|bd7s6qUTy7tc<{nKR%t6Xw{ zUz}z6?EZu8hFyABfnwj|?csENc0P>D_)cs{J{>KeN6hhG5?*zw;#=N%i_8Z9Li9=o zGzhsF0%9!3m=Hko+R=qzPf`kwDpKQEc7IS;Cj4aUshX(%*_LL~*pZZN8^EQ+UmPY) zkLohjet-UVrnl1AniR*~Z^=Bd;xYhrdZw2GUC?EK_2V)??0cxDE%AE{=4rd(MD<51 zLKM1@E*HmIpfU8Kubc`_gA7z}Gj_o0b_ks19O<}Wp0G!o2eVsFeb~qQMqhhYR_FO5^%aIH z*}f_>QD7{Vx@^|gn8|c!X$;ac>CX7T%#+ks*IyQ#DVep>UMO9UHQb6 zGU@3HG&;V`l`x=R+35}6BZc(JBpi2yIZjCpf62gKMP>m|{1T0COL}sg)BmKtk$3eA zdXz~Y29|}DHqM_ss{X&+$-Cy|t$Df1XP-Ev&!h&QB|b2~d63f@pRsQV^8RU)mu-H2 za)HSMf6%n!=y$a{&!}czh68FUG0T#%4m8R6nk|^nJDz1YssUST;YTMi8*`*z$xZcE;en2r;kLkuqKJmNUP961`)(rYj96q5p2%d9n!SGM} z4R{<`i@<;R?T~<3q%X^1TH1tOtg)!pnSS{j?HeANB?ZN@e zt{D{+C<|+1LP)ue?Q7YiepP?U$PjCO;IR<#F~y4)S3R3}W0!>P`BT%2vO*2rFW1r; zw$%~`$4(AJ=P7r21ayp_|N%L6+Zw+3<-}T4{l~gtbP| z8=w&A=L;e;+Y9twkhDZN=1@YFA4*-Z;FifWXH}gFscy! z>bfgk8&xH6u$SyD_9lmy+2NY@)B&>%%e7J6Ny8~-lo)aI(@W}=tMa_QiHodr0iiNFTl2_QgdyljV4u6dl49SXjCksZE#qRzy2 z8jNa?7B93Kc&G<;fL?>QBx?ZDT4z5vI_@}PC?9?wxH@lnJthOgX16_G<7fP(4%08~ zk#gl#AL`{_$@;8_C`V79(HQ`JQ=leGRR2m7F9rJC{zEkZNK6y&_?4h0&JH?+ihFpn zNG#O}mSeF{t~g7|G50{<2mM-m!ZnLqpAZn!d3#K_QyWdRYFB*fzY5AchK{i+kiT9f zbR?yf=}YlGp;s+G_|)O&6mMMN5>L*Sohr|!l}ziPj+3(wRGIg_(_#H+hB4Sp_4YC73gMTq-JsB3NW5hrW0o54%24{FcN_Sf&rz zm67fkh*%dqV@@DU<3%lkD;@D+9a8E~%dCsWhP=8`7cR_RT(J(&FtNgia3(85 zGDrk_mRy>IXPlmOR8;7CS}&6$N^Y7rVnNjrR}F92HM z%pBk{@*L$K*TD9~5xp=)c@IW95*=p%UK|-ojyGAU%#mB{mIYDtiF(AXgZ+Avd(HJ)ixxgT!HkHoi*G zB$xU^Ynna67=!>!+J-YFoH1E$Cp0cMq069lRD&CrV2C-7s}e_I>o!oK$C!5TO>v%- zA%whslI?2`UaB{=9&g8uc|U7$CtP}#=Q(azo~3lf;1Ao zbst&dXPCt?-!Y~h=Cc3;L1=uba-A-h98%vrt8xJh8&{S={h}@daKmh(H0d+6@qGzTxY_^wRCoM2b77XeFjHJt(N`OS0|cg$^>Vfor}cttk)e4f;Y{!b4VmmCXVR6OuT}vbPS54OlKEA9z#M+SqUje>#c!gC zza%nvuFP7@F4b#%DY-6xx$9*|pTSQc*D}8reHAxWiuSs#BD_S>e%Cwc)pl~;nfq=1 zix!~g_~qjHC;V!H2T~J#{*~>4$9OlVKq18$kw6_5&iCatraRr_K9`n?04@oFfHSDO5QlY z=|{YI%7Xh-d?qSDG5IW(*v0kpr}V@OAKF+*)R771%F6(bwkJ@1J9C8=v{x_4m{2cQ zdI95EDS@!8h!0=BlpckRXTXI`TdgIs>>}L%*&JHmF8A@Q(mlOOwjCQyl3nFz$!iYIOS$440Ifdt&%QW zJgps*c34Xr6>t6H<3HZ3`TFiE%2z-l>Q5g(p?d+IYA?U}T9vpmnjM&Hq8kEz3R(5z zh!DH{`Nkp%P_v>~j^?0jI^y~>t@J#Wi3FKE8L!Ai6k?LgHK0k#g9tQ@6j0M+>Si>7 zY>=-$Y8GGPsRmdE6y%u*kOw3Bot{ZSj>5%~jIceD2}3&gf8S#VG;s6iA2;uH=bqh~ zxP0Nj!FKDO?YbdwTVgFty>w5Hoq@?sX0j?8N9DLeAMw2a=Bli_s_@H$vi!v*58mV* z=lJcjM`GG%;UnkzI`Gk>&hQ-E= z`*T#co*WS^*c9l4NjO>gidh6YziXG+xS4FyLvku14}}(cHmU2f=11!2DHHcO)rExx za*H}sS*#A*b$Yq0nBIw9XlV@_Hl#I%@kp=m=9`SziyyCs5zrq)} zFGG@#8`tr*$fXH@ocA65tC(=iH33+^G5vBblG=32yj1yq>w6cOuZQ@^n41!X@rjyOm|`a=FXR)|VkNq>){Ab1=UW85x{~cP&?;BX(seXp0ko%SOQ5 zm5j2N4gA~%*NW0}M}B66wd}4%f6g1t%$+rD%w$$%uS|(SfNPBX2y_{4!-lQPuPBL# zM(9m@_AHBkS<0V1u6|e>$mQ0?a$VSa@&fp>cyu`+*h_l0M~f3eN7A~8RB6lZFMqsG z3ID#MT2$)w#48dx{6zaeD@3g?>6n*grz?D!)@#{ai{3}B=WJe;wT(3mtzqGE zy-Z7me0xeB`@b#Ux9c7zj2j; zXUU686#pH?8L#H?xrCRO#U6NHx&D1we$0fJ1aKCBGj;RJ05g$i$kH~WQqLeKmYb0U zzvtK~jD$<42*XV|*z@IE`o7U3^5=$8^(!KYnkZF}jUU9rLhi7F1P zaAFc!$X%A)ve0sQLcDy=l{z}vSkA@fJiz6}+Ri9GU4AY!<)<7w6eS9(<}R1J z+-!XrB10P4Wj6=&E0FPJ+6i|pSJ$FXnyclawKxIjm0J~YBBtRfPqeuSVAkf&C7)Y< zRqLx7UsW>3d!3)rl`hnARxwf=+_K~pqGir17|-a#+D!Tho^|g=FMTEx{dDZYj$-n$ z=e(gyCfEPDK00yM_UNmeuSVdj5%_l#0S(ML1JEY`-Y;m8t+wwaX4^2^KfkrMYg9ZC zIg=`(0(qf=P@YAy+8m9%eq%zCa#5FT&g~)5J-W2?*kN{+In-MDxrvz!#k}}vxg5eA{71t|Np1>MpA^+ zQ`H4Q)DZLDg5h#ZptH% zFS;Vifa+2YCzq$sg(BDw8f_J3a2F@XM7gj3z@Fp1>(1{KNYmJ3_Iw|E+H$X5n-#*x-a z-+D44#Se7N--lm`iT;XdNZ#5U=Yt*YBR&>4{gK@pm#?e!sz-A%Gp4I|$1ZBMFN|l- zV}t6@g8%M|`5l0jj`2x;FvYd8KGM60=uBCfbb;RC3+XjLX8x0a5*<2lbST7 zKsmpwYwz`mR`eT=LR(8JPaPc3cTn2FJydIVGaU;)AbX2PIX0>vWYz84d2ly+EKB)n zgIUI(d{isgxuo7Q3_xK;IiCjCte6I+~d+k4#nrCfa}MaiM^88)I!iV+$Rws|!;b#yy0 z7rA41Kv8W>>4OJLIs9Y(Mh<`SX6k6;wVaL-8f}JmgK=yqQ|5wY`y-geD@8R| zIOwM64<8Y60nb0J`&<4qAO0d<&yYmZ#+rRxKQi!W!7|j^g?ay925rME9}1@wu@KmFGGfn~SuGCxKK- zzp_FWS9j>VAFe${H5>pJ1c&gFAMD#q*Q7bt_PC7^!3Drux-@u=$Iis%V1v>a3}_~- zY^{+-hwR+<(X5thZ7XBJ@v$;?U3{qArw&*_x)!ZGGx)RF*MH%@`dm2^xUqPj zf{*j2zSZdg{wcxxpV-8vA1Ky`{@3o@^Ttje!SN}i1)KWy%(~yW(I0o<@`suxCVEG8 zYhhCVAp4g_XV5pFAo6txCI$v>K>?ync)jPQ7_`$O55_(Am*L?!(V|;7m`^^w%Rje1 z;b>KE>@c}>$kTJ4^Dlb}>y4}7-l1ca`VwE$9@7?vV~*5bi2s3hULOAY z)LnLMt&ZhnTdpPCK+@-F3URBsA{Y#D%|ASchnu*eM!gGJBnv7w<_jIY{B82<;fNvX zD4LJ*k%5m4{1!9tZT=U?{L$cSUUqQzu}2y0H2nWVI0NjDo*sCB{z=ERgrj@@+WE-# zPL#HGcP(eg{MAHg-Yvy*{*;M6T)AE@Ijth+%u4;{?0I50&Wixsi)=h}G?%#14U{)< z57ir=g9a zSuVzP!bJ!;g8ffd(Cwee#hZR3^v|hkh^P6|4qINYf0JDDkLn`>9~tqg*%%z?7MIJegkRIXmHNY>SP$3YcX7S#tB6);W#KG4pqdYtVSh_P- z1n(8%;Ji+*9*&lvHssPT{7AL>8j|-Rh4fjhHyr!=bXmo6lh{Asq~T?WL1> zjU73pg6BHvMr2@DbdeMq(HVlagE`Rk3s*{FyoEU=C{osSnzIa!kLLXbNHU3?m%$}} z{NbMCmj3C@JA){ZaR89-J`i9I&tmfDUh{6^qkLrGBLlym4DdSuo}upLIT!o{aQAty z?0?Ryo*Vq14Vd*j;D5HX&znVL>3Ph7H1#>YFRlgUIyag!_MGoPE{g5%kCNB=hB!@KCHUSR=-rCRoM05M{(c=j z7v|?ZXLC~^JNqS_PRD-TrdtXLJKh)0T8tj_=;ucO^iWcAWpK0vk^bp)#PnJmY?=TC zQRNj17{2xIOSi3F7bpc|*maeDJwiKrFq0f~E)?uf3~+#@4#F4!P$EPvq@`4nka16nO^I(Qg=zjQ+Y za;18hOg_~ugxwo^p`)PhS5*3_JE%k?4@IWd7aSkuBLg29_`PI+PwjZuZ<%e({`SbG ze;>%%_?{G=3F;#+2j@qPI61B|hNDC7j~51$ldDkAn7bWZIkofJ-zAFx>wM>|q&esO zbxuiM%+MAe1ZJwa6KFhw!XI1#^Z$o1(g%ohF5kQ>=RPnj2>Qar(un-U#i;o2ugf#) zMv~f}{6{EhAmAu4^NJo-^pBjbzur7BFa-YJ5F0l+G{O^ab3KB+-vrRFM4?+^pmCMk zj~+x6nI;AeZRA`cDS;g)57$N^XXW~c82iJ4DWoS62r%7AvzJQ4;sPf*u$Fo3?Oqi2+JjMoFz5wOZ1MSk`=ZPQXBLg29 z`2A$yJN7L5-p!m1&8LB0xTdk62Dsnd^^xZte{^jBo*i?3^i&u-Y10l!9vZYcvvQd) z&#T3t_dL7KteOU;=*FQ9codvll6D*ziLVY?V&MElt|~URqy#^GrD^N9NcdaEIJ)cR zADP&(IXB)!gh&(Y_XVD=nH%Zkf8#QbYXluWtZCDFEiRFnD-0$EVFV$GQbhiO2Q-K3G_*kBxa=+0V#-zH$X0A) zJGJSj2|ybE0WZaPd-X8lUd-d&52L$Ts7kyfFR#v6<5(Gf&lebR(0B3VVyV15ePEDM z+Z{oXAN5BDJ~HrI&VYO00B7fCTXSmoFmTR^838&T2IgGw9N-w>V3@O7zH}+dZS*X` z4rsBt=m|gya`f_C2j8BFnhCsB!ZfV8jIlWPjpZqZ^SzSkum6LumuiDub6wJjW=y?| z{%}4FHlNW3{7~J7fO2RmJsmty$X)7Jj?L8&gXU%T*%$=`#B>}q*JAP0+^9YIpa-C3 zegr^gNpj_*`(PmMZ(ZUjkp9|w+9iRWMb&@ywj5yd^3$i>I?^t4Y9E{CV=1NZ=N;x? zk1wePPZTu4r}5?f8@91GP*fA!!yg!uI()Iai__&Wd}w$F5XYgP z>ZU_vhhuzTgS2DH2lG7?L>7F1`f&S~3u1#KNy`E*arx2tgCh_y@^sL8Hjbbb z4G%F34b$VF|3&Y;mmd#wJb3Gvauti8;PAuPay7j1?F0zH&W65>#dr;5bTXfIC@{)P zOc#p@Ub%cIi?fxgH>JyA36^Kk(>K}6F}~AnvTkyk6wTl!x}X?DyOCX>4)CVZaP^pD zRQ-9HlxH#N&`f-C=?{wtl^>@F2b!3qy>X~afBXqfb-~h-N>VjWAeAbWV-^{(8g!F} z_n4>UyYeU_sle-QUa-doICQUJUS;Ke8Vfp`a&4&u*yMo z`vidQ217fOo^GG}Z~_5N1~ZevQ^;3-gf#Z5gG0|HV&9zSstNW^-U^Bd)S@2;L^oIn zT1|88HMr@)jlY3om@;_uDo8@#(e|A;@|W`9UL8EsmaA<=$L~$y_{YG3qZ^<(NZ-X$ z%ueG%o?{56-#R@DekiYe1_qs28YvT!Qx^qW*%Ecb5OF{}ZB_du!DNBxn3j|}_{ zGT?c_cJ`P#yMFe6_c`a!zFXg)qxbM|*T=ZGi(GnN%HiVaK{YoUkGb#+;~Z(re@_&c zd<|EB`3&4(_r8#Kx&10aH4qQ0R=S3=M>KIP z{%$tb4P^X3;#>gNi_cqVy6Z`li2>733m6ms2E#Y~=;TG8l1m>Vg77aWArD&*`2qrB zw$SXaBffZy<{F)yD9AP0*-lw^ZarSI?Pl1^v83|13Geqgv@n*`G+X^G6&(*v)ueMK$hC2 z2cu8u_n#Bt_M?1c;3EUSiwtl+@J|7+ecey{c=L0~*yo%HJu5h?JXaPGIcI_ANMZhX zbZs<5o^wcL)*Bh_O&pF5$D_V~^TE{ns)wuxM_wLq z@a!0a8mC@TwO=f; z&qN%S(cgTTjPy%e)|=N3WPC8?r<}mjXvTu7zhm!>HTuDB+Uz>G!i~9J^}AJDt_$d##*l7!2tgR z^6+wI3ALs6Q zBkFj-;BVOE?fv5r@VOpcs!lO_+F!5TB=DoZm6Nc@Bm#iF!BjRj zozhYqs8n}Sa@3JGTL4xcPMcJDo#293j^C)fM1WA3RZ>$~>d1HFAVZL{dLGm5r;_8! zBoJRQYMl7)Tyz0#P^I{&KQi!}mJ=Y-^4RP@D@KwQcs3 z0)YS0c%rOYN4LN>j>3x?qBp_6{0LxOI8x}bO9D$tjk77^w^#-haIhCb<+34M!_jQU5nDq+ z7X5}-PIU9Cr}n{ql#dL2WZ-v|f%o?E?(?1_v;R4}=2+>q9ZwPtl^!fc1w@Aj?70vp%sLn!$cG0Ua5WthHlE|k(FG%Z zPE>qrF&uOhU_gTl7+BKhz_l!%KJq$fjVvv()i>_(rMyU8kOSCHhji`yF_!( z3%-P4Ss(tW0wLTFZ0v94<(B|gGr`d%C=zCAkmWL-ZBd;ZTe|#}9 zA#Iea$5i568`pWzG4Z1}olp!n5(C+3|$Ou(sNF@}rjzb4qw8)O66m z)5<8Lw2v#a+tEM$d=EkG1|m~VWVN8c7jitjbe+`f>LUE1* zp32$?CRqO0zny^yAO}>RvFFQ}j~so7!r3tek@!0PvFG0}Qq~{;yW+90YLweK*ReeP zt04i2fOP}aL;Fb(Vqf(fXcMu49;aYacHkW*GWgL{U&JBJfY%?;!6&XO-PopRKKc=e zA!!$2d<{N|vIldUY!ZD2Ml)k_sPS7aWO-2#DD24a=GTe)0LF&Ny=$4jmq=h1}sC~Y(=9hgI^pf1am+!#*r+Am)e#Y|lC1g!JoxsQ1c zN7hlbZXkmROJ@Sp=oOc_K~=A~!7#!b#p++U=@Qc?%BLRyaH3tV{e~%D9q@xs2cwzb z9xe$2vV8YRaIBF7^hFhY>~(#DUXW@K#cPzN{$jg4=qYpIPU@U2VB)KACj@*Gs4WxF zhVnxeBEIYk!SDEvLo*Y(q3k5CUjiB%adJ&Acd@`Vcs~8m7ks)wmm&vTHe6@6LrT z4&!2hdlRKkJj!tdget`@8o^LkXk#!l*v3i^G)@y8jnAtj=i&m!BCyKF_LHX=?4ID!&2`K zx{;ua5XUBU`q~uchzWS3*rdn>reEsCjY53+&J9W4=x_dJs;_WtEl2HLC}}FatK{1X zMUgI2Vwp)BOG7k#RDNNb?2=&EwW&;|fMIp=X|$KC2E`*zVeyN`0gK68tY$1CZ<@!K zmZ`L0U{s~CCpFTHrpx5@$6@GjoFO%Kh{<+3;LjYb;O>v!TpWL)Zk)}T^sys?|7 zJ5%)XV7ZxyUJeLpP#QDXzS*r*Te0}7k=b^Dm?8Ut+xrh9xbg4ki!FhUSlI4nAn(8`QTg| z?BHVwU<;rxpD5|`dl-nUu%j74ULq4$rS?V#7xEuoNG1HJKQi!d|u~^_R-jL>T~oy)D;$N9rjNyeAcUl-OI=uIE$5oEzxp<(Y;J&XCF^ z$Nenq`3Q~|7jS8CmUE>nmvUgm?Aho^<~a)=&ZwynlGl zsm+OtF?ePMW31$WvFQwOV;}x^-~Gp)ct2&|xq*Xac5hf=y0(#1}nHcs zZ+Zyg8GAV}BogjwB#}!heAQ|DMo|CME|37E7Y|QfsdfXnKsvzSK#otFk)+!xi7GNN z3RR3yZ^q?Qq_LvXS!2^jV?pW|jDyY!7~A!4Y<PL0Ety47TyXA_%h<&$7srBSHfnJ9_Ca z4+5d(Dc4}cqoiQd_RuKnO?xnoLo!p-jHEt1dEk;`c_u#zU~_ITQc&dv9lSBsThx*J zUaR`%fi?g}Hf?YMb3Jiq43RtZHnq|Ad#WFN0KnEk@-HfJpFYt?0XZ+q`VgN!Vr8ob ziw*L;PPrQ(Y~K+AADiZCj2^yAMouAbW@uJkU*sK4waf`^iurNj*qhkO#blk~i7x{n zAD=Roa>X_#V}-B+hWxj`<}msnNyTx3qaQ3jSmZ|wJOF%@j|_Zd;PW%Up8b{w@BjEq z_Feb+=URI+{N|spJ&fT}xUUh+=`q_Jwdd0S5p(|VTk9=B9FCD7%8OWg#sJtG)y*zV z-0m-{>lyVzpqsPr5;huq!fNq6yc_l`bi9ixF!hobqgbNDc3F&XPE@Vd&&d@w(eyiM zSq=nPjD8sV&~wqZ6%7A^3po7uqck$#{p)Y|xB#73*TD3!rx}h)@J|%)1q)kSGlyiRzPC`)87C?4V7$1IN07n^a?uB)Z;67(x3E zyAIMc3UjI#d=rBq1td>o;(<>CoRq1>cMN?Zj!$CBHy26Tm?k!SgR2WCXnC-~p+1V~ zLjWT@q{XD)cwr--jYpYHEH+lK2*I(K$Oo@9q0N=3EZ`hraDE(AIT3VF7AQ$N$97L5cXR>f662wtR~5<=3AD{{Vet;3EUs#rzrHZ~wzR_ha`R=Ov%K zaXwhQ+3X(Aj_2G!k^S8LPqXI(wXFc$?i?)KX*8f+&Ym|{JBpr7h~VN||8venhP9+I z_I$Iyl?HUQ6CExitRV`t#Wc8xumjgv_G}wx+AJ4_$FE!nunQu6navG^_5jFH-)Yj# zmnjv3eO~^_#57Zksjbo<4u!$?OxL5X;CT8hM`Q4eN53)a4_#vhdp)O>>vPwPd?yx`c%4bT zbF5EeN{rIikrSeRd`c@1eE1~5i3=M5rU6;?;_#bq2e3BjH4h>J#|DU%+F2!`jf`)3 z9Eo(;Xs6!*a_xez?|Xh4071adB}ni$w`&buAqHI&Wuw4*48Q)Tyn~O(Jk;c~Y8Ih$ z_P4)$7XAbDk%5m4Gy~sd&-~c^h9x%aJNGP`-mN|RyN631us6>E(EZN2us&gn%#sKvysQj?^AU`(M*Q%7Y=VhR zxo}e7;{<_Rkc*QZCJ5=IFop(&G~LGAb2^fN9XuGvt+8h=t>v&y?BO@A*!za=?vn^6 zZs~(JCgXsM7-B6)`wbT|`ZE`4eopxj4*;Pfc%$kQp^np^sk$ZZa@}yjOgWAB`;Ui! z%jzVvlhuik)gaOj@AVLnt`LK}IgigHuZdYK-bSV@(( zlV&HP^wV_e6P#{Z#Rjv%jeq`^Cq8rGxA&@{IV~?Pdl7ma6>W=sHBiWbi~8@V!Hrq+ zwXKI##FyXvQ{Dvpw0H2#*SGl?^TY-HNBPLWM+QEb0ryOP?6zmoCxP!Mu>CT7^~0;soI4!>;G$8SdE=Sp>c5L~%}to)3F++>eXZoOi)Jd}F&O*znMu^KH*N zG{_M5K9WYx^m3xy7V_-_&g*Dt&r31USN}LNwU}xK0ItZn(e`dSplGVp_pLed1Y}Ir z^o<(r#D5F>#1?Sf=abP1dhS&0-1quVKHuUt|!w_f!7xcvwY>*fognwUJn7`6B4~X1KF6v zqc?n_-spF53h~7R5bi{VXk*95c!EJT|EWf~(tpP{KK+q~eD&S&NgNxE!bg0#4<;|| za7}Cd>wDeQ>-sF)#4tF+l@jLhjlu9o=+MkPK6n9*;a6XM^TpTS{3*V}%m@oK_8a)66NXt|Dp0VW-FkBLzP!M{5ktQ7L7q-M=Twn~# z3PridM(}*`?ZcNmc5te^v8Npp@>gLmsr9MU{4^sD64kgA_nFm?egG)1k&j1`5~&Fw z+zA?BBb|XvS40%(D4WDhl&Y|75|v9-xbo;DKQ}|j}v6o5_a;lXd5vv*;eUH-EF`2}Ck1t0)D3OEbqtUQ| zN8SK6Lg^!gwwM@)A45V)2_`;#&`Dre06LyFSOezo6V#5edH%$pqo4s71SvK-e~}{y z>cOQ*V7X|*1b#?vcqDdnCEn}ipT2nFK@|pL4QBjCstu;ZQ66NN1~mA_8Hn&J_8GBq zjissnnA(6IbO?Sz`H2qz9k7EoQlpRihJBK`eFjZ%Gm#9w;V!EzA7ldZFoX%#LOcDKOT zpx`DyzQhq(8vOqWjR`53lm^zOF))UWVizKQX8LkDCWK0?7CU&l0H_#Z;?zdoa%0!8 zV330al*ZS8`qvyP93%)ozxV(^K0baA;PaFAf&4>ffW5-m`eWby*XHXlzWMXNUHNl= z_x!qVUH+*c=K?;E&;2ZRbhzx9a8cRf?4Tj0x}HPfA?AoYt8|8}7@ctNQ07eITrmm> zSC@|ZaU_rbq8&rX$N%UhOqKH(2G4N$z#*A46`WkfpkWYVt{@|erb@@y5p}qghx{Hd z3={9rUmU~pc;~P2DCB7zNY-r~q<4hXJoVVU+En&q>d*UE0PisNU?(K*KDkLI3FN_q zk5IuLU@H4qK5y~Ig(7;=V ztJ;16RhI{x+6Wt0Ft~#J3R>SA1`AOpAh9;S8MFPHoj5Br5Mz^a=#k;u5jlowWtaiQ z>9}c3fkWr=9>uzDo+30qdeKi8F>zkHVKs-}{OP}Z@%2CdmoL8k_y4!t;6AgsR(|54 z_L(j|U>_OyhsXf?@VlS*Pyev}=Fk7?r*)n_*`w^z)|(zr7(49C)AQg8n(c3e<(x$v zCMifP)99Jf&hmI92C1}w%W(QDmUa&0xp*$E-#K-Azlh_5DS2ZFN%=D3V&x<9<$q{{-4rg75(S^WO#-~PLQ58&JUOkV_J`iufMHec|20AK&KUncwv zHy@CX4E*jhz(4={Ha{-oT=UHMj1lz=%sKq^KYj7%?9uao0A!c$Ij|=H8<$WfHN!rUg>(n6pM^TFzm?0F$0_Ueo2*vxM}jrHDpoDa#5y!@vg0Ptn{60pH%z@*M#ov^gX zAZ-SNMl7NZhJNRE^n0nWY$mc)lK1Y4`>r{XI6mI{BmlooDL%)oH&0`ztagM*08{W| zg2#x7NnxzCd^oXDnG?r&4@DYzC?W@8ia1~BhNnVg#Ykl{AY|acpBNA$uZ$cL$!<6w z1k_;5jmQ}@yP$iPPi$N+zID;p*Imwh`M^9ND`?yLOapMS~T?CCr-^&Jzew?p1J3IX)xf+Y1J1oO5Wf+96LrcHBYy zy(qehqp*<POp^W%W@ zT`)6o#_G+riEz9flLM27MD0YMd}XjZ6EX5;M3U-J=iKZ_h+>nCI2fG*^){%@c~T|1 z8bm&Rkxfi}pt#3+6u}R5z$dojZn$z0=fn|hC)1c1NBRbg3k#bq7~Ie|SNItKd~yO9 zTm0t{tT+1|Ph_YW2ql-c%0!-MDVxg3Xq%_Tu~u@3jy$%1`d|LH{F2eXeDT-+@qhcL zN@Emlo|SWGbpkrhO*I9X001BWNklvhmlm5#q+I0Mge-dA%o$Z&g4j!_!X28XGyG-EoeOI;!4r z#;8*r@Qhm?IV!RrohSJGQMXSmkH+x%_0RGEfV-xSAhUAvv_uj+o?T!~ViSPHyt`(l ziN%&ONhk4`n81n=(0x1vXjC6gwr=RdMaKr6TVVo_Pg2KbCwnLpRx!vcOYNXEDBmnL z7h}YPZP5S$y~Kk&73P@0=wfV=G!ZAT<23xlP#pG<9fHt73N~``7+cKQyQ<=Yk=|3t z0|T;gQyXJ!OuHzfkoz1&8+dHL$sY###=kUHZjsTOrHLuVFC}{aDPVbzvVmqb@F`Bc zR@bp@@UrtGris-&q(j~v3!}m$*Ea=GL8=T{CH>YpWa? zT|LY@Xy79+CIUf78!;3u7+>$aS6WXu`$f@z$~Oi)~*KlL0Ql8#x9b)Bp+BM_eI?Y0pzh7 z=vXOBl@Q=!p%;gYGHiI50%qH>nRpb2106Q_0=DC5yjAXII-c+?X^Ah6Whp0GIfcRB z?2e--)#AKsfx8)WFaelK5bp#Ya6WqoLKTttsp zNHpNX?^!k6wJk#A*sf2zs4eWyVvh*g# zJ46HhIWE7@0{{zTl9++H1k&C3T~-bl;fy>=aSj;l8jRkF3kEzYs+5yxx;mhd6bb_v zvQ;v%5g|E{8x3s) zwl_BVV?Qdoox4~*sEf6BtYc7dX<>_QG|D84050jG_ex*jD}F;-mg=$DVqQ=`g{qA` z#P6vYzb3|iH^vm3)l2osO7o-LI1#*hJ)mE(@f?TC{rkKHZj?^Q-FC*|dhFU+t{oxh z^I*5i^)*93dlPJ4mxr`&Hgb*rdPoCOi-+y8b5%ch*8O@~uH$zbF6Nu*aS#9tF?wge zi!yQ7kh=1EVC}6=-vL0i{>4Y2wbi!ObPor8=UfI^CQf8+KJ6M_JvN`yPF%Je#|EI6 zP?ci<22@RKYGeqGYsP;9CDy@gJf3SeI|*Y~(O!4lN}C^=k`+_F;E)NMIJrbnzwtIU zT?SE3e{I;;<5iv=!W=OAhNC=m87V$>nrr>;`MC6k0WNsw{j5Xc`+3UG_9K9MINnqy zp~UPj+~v0~yXa8N!sxgIsP%R=W!y9PlT~C%mgzRjkRy}wB8iZjz6qCX5)P1n7N0&M z^1n}l`wp_irL2Rr`M0M2{OcwDnLuoIj`%YHUon&TB1p$#r_?%4jK=Awdc_&g1f_Au z0?Tn@1DfEVrZ_I_5?k6XxLn6`^o`jYHfH$MkQ@Xbp#9hrHhQg%r@9`FwX3_@Nka%B z0luXR8d=DX;zSgG{Qg2z8Zep~Zy&F>5uBa|22iffH9Q6mYg&9^9oha*8L0C$?&_Gq zPAMCmSn_ieu&9M-Je{x%4Je9Z1;RLEylOf1!7uHM)Qg(omO-9DG&Ut$5yWaYQzJpu zAbUCdYx{Ftb#mi}Gmi2-8lyY;Rl4zx|1$*gH=P$qk+=Nn;sSMlDvZBN?h-rQG+2v; zoh13GSA@VeX8eKMm8O5});2tx4ffd^H=k>#1ICkY+0%A-V!Iai!D9Wb4Kevp12chT z^c)r=<`cg3nd|iFxF3Fz$_o$SlNN=k3Q9jaaUBhIehm4=R^( z6I43-E|r0npn^b%jGDhi5U4$CI?E55ar%`{>KMCU1My!#xk>e>UCjA?!rlLp!$UE^ zjthqy!`qubF@W!DGtujdxYo7#gWXCBMG}mOi(PyEiZ?@Bk#aF_(__V=z$cTX1+#^T%`${2_GNu z^xzrHP7Yir!EkkXFj?igd{+}W@pGxe31)r6M_X$r5!@Na=+p){QOb8M^!VH{;X`K? zSnB}JiB)G1=T(3u6&t8p-i z8Mj>%Tv4roL}Rt>=x+I`Qi6y(7R*frO8MMTh3cUEG{<>?)`>^OazIwotJW~`TnUS^ zHhIc3jShOo7lKmU#xN$DFNZ{u)n|;%;?B#_59Zz?~# zd2-_Ve)xHG4!!e_4Qe4b+{U_Btrplhr#=r5JNeAPJ$Kq;XIATGxtyT20`#}jqB-T$=HIriz_ibGE2-T_0b#K^dy96Orm znza%vZo)5KRsDh14nAU#ySBzWYu!x;w=meSA5RjD{jf<_)bN&bRMu{;5d%%QGNRJ zotJc}(43?yEH+M?^RUbUsBdiY!e$J+K=5Xu<9E4++yz>hIGd>`vk0Mu`z$zm>T;bJ z76Y#C66bJjd>eE^~0-w*eX z&IECj(d3|0R5?r+A}u;@+L126^;^pIPES+`t337CpFRzIBj24si+&g*fAFT$Jv=@z zrwlE7Nc_#sHnqExVZ>UFIpX?+ETyWpk07{NzsF&rB>)$@b+LSBFX<@|9ByH+xNjoR zFzDS}!FLagH}fCdA;1=PY�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 literal 0 HcmV?d00001 diff --git a/Lesson5/orgin/box-img-sm.png b/Lesson5/orgin/box-img-sm.png new file mode 100644 index 0000000000000000000000000000000000000000..466e7097e3d2a107209588dc65c5412000467e1a GIT binary patch literal 5412 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 literal 0 HcmV?d00001 diff --git a/Lesson5/orgin/config/env.js b/Lesson5/orgin/config/env.js new file mode 100644 index 000000000..5d0ab7b79 --- /dev/null +++ b/Lesson5/orgin/config/env.js @@ -0,0 +1,28 @@ +// Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be +// injected into the application via DefinePlugin in Webpack configuration. + +var REACT_APP = /^REACT_APP_/i; + +function getClientEnvironment(publicUrl) { + var processEnv = Object + .keys(process.env) + .filter(key => REACT_APP.test(key)) + .reduce((env, key) => { + env[key] = JSON.stringify(process.env[key]); + return env; + }, { + // Useful for determining whether we’re running in production mode. + // Most importantly, it switches React into the correct mode. + 'NODE_ENV': JSON.stringify( + process.env.NODE_ENV || 'development' + ), + // Useful for resolving the correct path to static assets in `public`. + // For example, . + // This should only be used as an escape hatch. Normally you would put + // images into the `src` and `import` them in code to get their paths. + 'PUBLIC_URL': JSON.stringify(publicUrl) + }); + return {'process.env': processEnv}; +} + +module.exports = getClientEnvironment; diff --git a/Lesson5/orgin/config/jest/cssTransform.js b/Lesson5/orgin/config/jest/cssTransform.js new file mode 100644 index 000000000..aa17d127a --- /dev/null +++ b/Lesson5/orgin/config/jest/cssTransform.js @@ -0,0 +1,12 @@ +// This is a custom Jest transformer turning style imports into empty objects. +// http://facebook.github.io/jest/docs/tutorial-webpack.html + +module.exports = { + process() { + return 'module.exports = {};'; + }, + getCacheKey(fileData, filename) { + // The output is always the same. + return 'cssTransform'; + }, +}; diff --git a/Lesson5/orgin/config/jest/fileTransform.js b/Lesson5/orgin/config/jest/fileTransform.js new file mode 100644 index 000000000..927eb305a --- /dev/null +++ b/Lesson5/orgin/config/jest/fileTransform.js @@ -0,0 +1,10 @@ +const path = require('path'); + +// This is a custom Jest transformer turning file imports into filenames. +// http://facebook.github.io/jest/docs/tutorial-webpack.html + +module.exports = { + process(src, filename) { + return 'module.exports = ' + JSON.stringify(path.basename(filename)) + ';'; + }, +}; diff --git a/Lesson5/orgin/config/paths.js b/Lesson5/orgin/config/paths.js new file mode 100644 index 000000000..96c3dfb11 --- /dev/null +++ b/Lesson5/orgin/config/paths.js @@ -0,0 +1,46 @@ +var path = require('path'); +var fs = require('fs'); + +// Make sure any symlinks in the project folder are resolved: +// https://github.com/facebookincubator/create-react-app/issues/637 +var appDirectory = fs.realpathSync(process.cwd()); +function resolveApp(relativePath) { + return path.resolve(appDirectory, relativePath); +} + +// We support resolving modules according to `NODE_PATH`. +// This lets you use absolute paths in imports inside large monorepos: +// https://github.com/facebookincubator/create-react-app/issues/253. + +// It works similar to `NODE_PATH` in Node itself: +// https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders + +// We will export `nodePaths` as an array of absolute paths. +// It will then be used by Webpack configs. +// Jest doesn’t need this because it already handles `NODE_PATH` out of the box. + +// Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored. +// Otherwise, we risk importing Node.js core modules into an app instead of Webpack shims. +// https://github.com/facebookincubator/create-react-app/issues/1023#issuecomment-265344421 + +var nodePaths = (process.env.NODE_PATH || '') + .split(process.platform === 'win32' ? ';' : ':') + .filter(Boolean) + .filter(folder => !path.isAbsolute(folder)) + .map(resolveApp); + +// config after eject: we're in ./config/ +module.exports = { + // Changed from build to build_webpack so smart contract compilations are not overwritten. + appBuild: resolveApp('build_webpack'), + appPublic: resolveApp('public'), + appHtml: resolveApp('public/index.html'), + appIndexJs: resolveApp('src/index.js'), + appPackageJson: resolveApp('package.json'), + appSrc: resolveApp('src'), + yarnLockFile: resolveApp('yarn.lock'), + testsSetup: resolveApp('src/setupTests.js'), + appNodeModules: resolveApp('node_modules'), + ownNodeModules: resolveApp('node_modules'), + nodePaths: nodePaths +}; diff --git a/Lesson5/orgin/config/polyfills.js b/Lesson5/orgin/config/polyfills.js new file mode 100644 index 000000000..7e601502b --- /dev/null +++ b/Lesson5/orgin/config/polyfills.js @@ -0,0 +1,14 @@ +if (typeof Promise === 'undefined') { + // Rejection tracking prevents a common issue where React gets into an + // inconsistent state due to an error, but it gets swallowed by a Promise, + // and the user has no idea what causes React's erratic future behavior. + require('promise/lib/rejection-tracking').enable(); + window.Promise = require('promise/lib/es6-extensions.js'); +} + +// fetch() polyfill for making API calls. +require('whatwg-fetch'); + +// Object.assign() is commonly used with React. +// It will use the native implementation if it's present and isn't buggy. +Object.assign = require('object-assign'); diff --git a/Lesson5/orgin/config/webpack.config.dev.js b/Lesson5/orgin/config/webpack.config.dev.js new file mode 100644 index 000000000..821743a2e --- /dev/null +++ b/Lesson5/orgin/config/webpack.config.dev.js @@ -0,0 +1,242 @@ +var autoprefixer = require('autoprefixer'); +var webpack = require('webpack'); +var HtmlWebpackPlugin = require('html-webpack-plugin'); +var CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +var InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin'); +var WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin'); +var getClientEnvironment = require('./env'); +var paths = require('./paths'); + + + +// Webpack uses `publicPath` to determine where the app is being served from. +// In development, we always serve from the root. This makes config easier. +var publicPath = '/'; +// `publicUrl` is just like `publicPath`, but we will provide it to our app +// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript. +// Omit trailing slash as %PUBLIC_PATH%/xyz looks better than %PUBLIC_PATH%xyz. +var publicUrl = ''; +// Get environment variables to inject into our app. +var env = getClientEnvironment(publicUrl); + +// This is the development configuration. +// It is focused on developer experience and fast rebuilds. +// The production configuration is different and lives in a separate file. +module.exports = { + // You may want 'eval' instead if you prefer to see the compiled output in DevTools. + // See the discussion in https://github.com/facebookincubator/create-react-app/issues/343. + devtool: 'cheap-module-source-map', + // These are the "entry points" to our application. + // This means they will be the "root" imports that are included in JS bundle. + // The first two entry points enable "hot" CSS and auto-refreshes for JS. + entry: [ + // Include an alternative client for WebpackDevServer. A client's job is to + // connect to WebpackDevServer by a socket and get notified about changes. + // When you save a file, the client will either apply hot updates (in case + // of CSS changes), or refresh the page (in case of JS changes). When you + // make a syntax error, this client will display a syntax error overlay. + // Note: instead of the default WebpackDevServer client, we use a custom one + // to bring better experience for Create React App users. You can replace + // the line below with these two lines if you prefer the stock client: + // require.resolve('webpack-dev-server/client') + '?/', + // require.resolve('webpack/hot/dev-server'), + require.resolve('react-dev-utils/webpackHotDevClient'), + // We ship a few polyfills by default: + require.resolve('./polyfills'), + // Finally, this is your app's code: + paths.appIndexJs + // We include the app code last so that if there is a runtime error during + // initialization, it doesn't blow up the WebpackDevServer client, and + // changing JS code would still trigger a refresh. + ], + output: { + // Next line is not used in dev but WebpackDevServer crashes without it: + path: paths.appBuild, + // Add /* filename */ comments to generated require()s in the output. + pathinfo: true, + // This does not produce a real file. It's just the virtual path that is + // served by WebpackDevServer in development. This is the JS bundle + // containing code from all our entry points, and the Webpack runtime. + filename: 'static/js/bundle.js', + // This is the URL that app is served from. We use "/" in development. + publicPath: publicPath + }, + resolve: { + // This allows you to set a fallback for where Webpack should look for modules. + // We read `NODE_PATH` environment variable in `paths.js` and pass paths here. + // We use `fallback` instead of `root` because we want `node_modules` to "win" + // if there any conflicts. This matches Node resolution mechanism. + // https://github.com/facebookincubator/create-react-app/issues/253 + fallback: paths.nodePaths, + // These are the reasonable defaults supported by the Node ecosystem. + // We also include JSX as a common component filename extension to support + // some tools, although we do not recommend using it, see: + // https://github.com/facebookincubator/create-react-app/issues/290 + extensions: ['.js', '.json', '.jsx', ''], + alias: { + // Support React Native Web + // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/ + 'react-native': 'react-native-web' + } + }, + + module: { + // First, run the linter. + // It's important to do this before Babel processes the JS. + preLoaders: [ + { + test: /\.(js|jsx)$/, + loader: 'eslint', + include: paths.appSrc, + } + ], + loaders: [ + // Default loader: load all assets that are not handled + // by other loaders with the url loader. + // Note: This list needs to be updated with every change of extensions + // the other loaders match. + // E.g., when adding a loader for a new supported file extension, + // we need to add the supported extension to this loader too. + // Add one new line in `exclude` for each loader. + // + // "file" loader makes sure those assets get served by WebpackDevServer. + // When you `import` an asset, you get its (virtual) filename. + // In production, they would get copied to the `build` folder. + // "url" loader works like "file" loader except that it embeds assets + // smaller than specified limit in bytes as data URLs to avoid requests. + // A missing `test` is equivalent to a match. + { + exclude: [ + /\.html$/, + /\.(js|jsx)$/, + /\.css$/, + /\.json$/, + /\.woff$/, + /\.woff2$/, + /\.(ttf|svg|eot)$/ + ], + loader: 'url', + query: { + limit: 10000, + name: 'static/media/[name].[hash:8].[ext]' + } + }, + // Process JS with Babel. + { + test: /\.(js|jsx)$/, + include: paths.appSrc, + loader: 'babel', + query: { + + // This is a feature of `babel-loader` for webpack (not Babel itself). + // It enables caching results in ./node_modules/.cache/babel-loader/ + // directory for faster rebuilds. + cacheDirectory: true + } + }, + // "postcss" loader applies autoprefixer to our CSS. + // "css" loader resolves paths in CSS and adds assets as dependencies. + // "style" loader turns CSS into JS modules that inject