Overview
ETH Balance
0.0851 ETH
Eth Value
$224.76 (@ $2,641.08/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 16 from a total of 16 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Host | 18313400 | 493 days ago | IN | 0.013 ETH | 0.00148321 | ||||
Host | 16962963 | 682 days ago | IN | 0.012 ETH | 0.00275232 | ||||
Host | 16940820 | 686 days ago | IN | 0.011 ETH | 0.00552094 | ||||
Set Approval For... | 16889990 | 693 days ago | IN | 0 ETH | 0.00070835 | ||||
Host | 16889144 | 693 days ago | IN | 0.01 ETH | 0.00133367 | ||||
Host | 16888461 | 693 days ago | IN | 0.009 ETH | 0.00139632 | ||||
Host | 16885433 | 693 days ago | IN | 0.008 ETH | 0.00565846 | ||||
Host | 16884948 | 693 days ago | IN | 0.007 ETH | 0.00295765 | ||||
Withdraw | 16877568 | 694 days ago | IN | 0 ETH | 0.00167898 | ||||
Host | 16720806 | 717 days ago | IN | 0.006 ETH | 0.00406004 | ||||
Host | 16618838 | 731 days ago | IN | 0.005 ETH | 0.00188368 | ||||
Host | 16605896 | 733 days ago | IN | 0.004 ETH | 0.00172778 | ||||
Host | 16591871 | 735 days ago | IN | 0.003 ETH | 0.00401707 | ||||
Host | 16562295 | 739 days ago | IN | 0.002 ETH | 0.00203897 | ||||
Host | 16139588 | 798 days ago | IN | 0.001 ETH | 0.00173834 | ||||
Host | 16113276 | 801 days ago | IN | 0.0001 ETH | 0.0014733 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16877568 | 694 days ago | 0.006 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
TOW3
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-03 */ // SPDX-License-Identifier: MIT // Sources flattened with hardhat v2.11.2 https://hardhat.org // File contracts/Base64.sol pragma solidity >=0.6.0; /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides functions for encoding/decoding base64 library Base64 { string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE_ENCODE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { // read 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // write 4 characters mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and( input, 0x3F)))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } } // File contracts/Trigonometry.sol // Thanks to https://github.com/mds1/solidity-trigonometry pragma solidity ^0.8.0; library Trigonometry { // Table index into the trigonometric table uint256 constant INDEX_WIDTH = 8; // Interpolation between successive entries in the table uint256 constant INTERP_WIDTH = 16; uint256 constant INDEX_OFFSET = 28 - INDEX_WIDTH; uint256 constant INTERP_OFFSET = INDEX_OFFSET - INTERP_WIDTH; uint32 constant ANGLES_IN_CYCLE = 1073741824; uint32 constant QUADRANT_HIGH_MASK = 536870912; uint32 constant QUADRANT_LOW_MASK = 268435456; uint256 constant SINE_TABLE_SIZE = 256; uint256 internal constant PI = 3141592653589793238; uint256 constant TWO_PI = 2 * PI; uint256 constant PI_OVER_TWO = PI / 2; uint8 constant entry_bytes = 4; // each entry in the lookup table is 4 bytes uint256 constant entry_mask = ((1 << 8*entry_bytes) - 1); // mask used to cast bytes32 -> lookup table entry bytes constant sin_table = hex"00_00_00_00_00_c9_0f_88_01_92_1d_20_02_5b_26_d7_03_24_2a_bf_03_ed_26_e6_04_b6_19_5d_05_7f_00_35_06_47_d9_7c_07_10_a3_45_07_d9_5b_9e_08_a2_00_9a_09_6a_90_49_0a_33_08_bc_0a_fb_68_05_0b_c3_ac_35_0c_8b_d3_5e_0d_53_db_92_0e_1b_c2_e4_0e_e3_87_66_0f_ab_27_2b_10_72_a0_48_11_39_f0_cf_12_01_16_d5_12_c8_10_6e_13_8e_db_b1_14_55_76_b1_15_1b_df_85_15_e2_14_44_16_a8_13_05_17_6d_d9_de_18_33_66_e8_18_f8_b8_3c_19_bd_cb_f3_1a_82_a0_25_1b_47_32_ef_1c_0b_82_6a_1c_cf_8c_b3_1d_93_4f_e5_1e_56_ca_1e_1f_19_f9_7b_1f_dc_dc_1b_20_9f_70_1c_21_61_b3_9f_22_23_a4_c5_22_e5_41_af_23_a6_88_7e_24_67_77_57_25_28_0c_5d_25_e8_45_b6_26_a8_21_85_27_67_9d_f4_28_26_b9_28_28_e5_71_4a_29_a3_c4_85_2a_61_b1_01_2b_1f_34_eb_2b_dc_4e_6f_2c_98_fb_ba_2d_55_3a_fb_2e_11_0a_62_2e_cc_68_1e_2f_87_52_62_30_41_c7_60_30_fb_c5_4d_31_b5_4a_5d_32_6e_54_c7_33_26_e2_c2_33_de_f2_87_34_96_82_4f_35_4d_90_56_36_04_1a_d9_36_ba_20_13_37_6f_9e_46_38_24_93_b0_38_d8_fe_93_39_8c_dd_32_3a_40_2d_d1_3a_f2_ee_b7_3b_a5_1e_29_3c_56_ba_70_3d_07_c1_d5_3d_b8_32_a5_3e_68_0b_2c_3f_17_49_b7_3f_c5_ec_97_40_73_f2_1d_41_21_58_9a_41_ce_1e_64_42_7a_41_d0_43_25_c1_35_43_d0_9a_ec_44_7a_cd_50_45_24_56_bc_45_cd_35_8f_46_75_68_27_47_1c_ec_e6_47_c3_c2_2e_48_69_e6_64_49_0f_57_ee_49_b4_15_33_4a_58_1c_9d_4a_fb_6c_97_4b_9e_03_8f_4c_3f_df_f3_4c_e1_00_34_4d_81_62_c3_4e_21_06_17_4e_bf_e8_a4_4f_5e_08_e2_4f_fb_65_4c_50_97_fc_5e_51_33_cc_94_51_ce_d4_6e_52_69_12_6e_53_02_85_17_53_9b_2a_ef_54_33_02_7d_54_ca_0a_4a_55_60_40_e2_55_f5_a4_d2_56_8a_34_a9_57_1d_ee_f9_57_b0_d2_55_58_42_dd_54_58_d4_0e_8c_59_64_64_97_59_f3_de_12_5a_82_79_99_5b_10_35_ce_5b_9d_11_53_5c_29_0a_cc_5c_b4_20_df_5d_3e_52_36_5d_c7_9d_7b_5e_50_01_5d_5e_d7_7c_89_5f_5e_0d_b2_5f_e3_b3_8d_60_68_6c_ce_60_ec_38_2f_61_6f_14_6b_61_f1_00_3e_62_71_fa_68_62_f2_01_ac_63_71_14_cc_63_ef_32_8f_64_6c_59_bf_64_e8_89_25_65_63_bf_91_65_dd_fb_d2_66_57_3c_bb_66_cf_81_1f_67_46_c7_d7_67_bd_0f_bc_68_32_57_aa_68_a6_9e_80_69_19_e3_1f_69_8c_24_6b_69_fd_61_4a_6a_6d_98_a3_6a_dc_c9_64_6b_4a_f2_78_6b_b8_12_d0_6c_24_29_5f_6c_8f_35_1b_6c_f9_34_fb_6d_62_27_f9_6d_ca_0d_14_6e_30_e3_49_6e_96_a9_9c_6e_fb_5f_11_6f_5f_02_b1_6f_c1_93_84_70_23_10_99_70_83_78_fe_70_e2_cb_c5_71_41_08_04_71_9e_2c_d1_71_fa_39_48_72_55_2c_84_72_af_05_a6_73_07_c3_cf_73_5f_66_25_73_b5_eb_d0_74_0b_53_fa_74_5f_9d_d0_74_b2_c8_83_75_04_d3_44_75_55_bd_4b_75_a5_85_ce_75_f4_2c_0a_76_41_af_3c_76_8e_0e_a5_76_d9_49_88_77_23_5f_2c_77_6c_4e_da_77_b4_17_df_77_fa_b9_88_78_40_33_28_78_84_84_13_78_c7_ab_a1_79_09_a9_2c_79_4a_7c_11_79_8a_23_b0_79_c8_9f_6d_7a_05_ee_ac_7a_42_10_d8_7a_7d_05_5a_7a_b6_cb_a3_7a_ef_63_23_7b_26_cb_4e_7b_5d_03_9d_7b_92_0b_88_7b_c5_e2_8f_7b_f8_88_2f_7c_29_fb_ed_7c_5a_3d_4f_7c_89_4b_dd_7c_b7_27_23_7c_e3_ce_b1_7d_0f_42_17_7d_39_80_eb_7d_62_8a_c5_7d_8a_5f_3f_7d_b0_fd_f7_7d_d6_66_8e_7d_fa_98_a7_7e_1d_93_e9_7e_3f_57_fe_7e_5f_e4_92_7e_7f_39_56_7e_9d_55_fb_7e_ba_3a_38_7e_d5_e5_c5_7e_f0_58_5f_7f_09_91_c3_7f_21_91_b3_7f_38_57_f5_7f_4d_e4_50_7f_62_36_8e_7f_75_4e_7f_7f_87_2b_f2_7f_97_ce_bc_7f_a7_36_b3_7f_b5_63_b2_7f_c2_55_95_7f_ce_0c_3d_7f_d8_87_8d_7f_e1_c7_6a_7f_e9_cb_bf_7f_f0_94_77_7f_f6_21_81_7f_fa_72_d0_7f_fd_88_59_7f_ff_62_15_7f_ff_ff_ff"; function sin(uint256 _angle) internal pure returns (int256) { unchecked { _angle = ANGLES_IN_CYCLE * (_angle % TWO_PI) / TWO_PI; uint256 interp = (_angle >> INTERP_OFFSET) & ((1 << INTERP_WIDTH) - 1); uint256 index = (_angle >> INDEX_OFFSET) & ((1 << INDEX_WIDTH) - 1); bool is_odd_quadrant = (_angle & QUADRANT_LOW_MASK) == 0; bool is_negative_quadrant = (_angle & QUADRANT_HIGH_MASK) != 0; if (!is_odd_quadrant) { index = SINE_TABLE_SIZE - 1 - index; } bytes memory table = sin_table; uint256 offset1_2 = (index + 2) * entry_bytes; uint256 x1_2; assembly { x1_2 := mload(add(table, offset1_2)) } uint256 x1 = x1_2 >> 8*entry_bytes & entry_mask; uint256 x2 = x1_2 & entry_mask; uint256 approximation = ((x2 - x1) * interp) >> INTERP_WIDTH; int256 sine = is_odd_quadrant ? int256(x1) + int256(approximation) : int256(x2) - int256(approximation); if (is_negative_quadrant) { sine *= -1; } return sine * 1e18 / 2_147_483_647; } } function cos(uint256 _angle) internal pure returns (int256) { unchecked { return sin(_angle + PI_OVER_TWO); } } } // File contracts/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } } // File contracts/Images.sol //Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) pragma solidity ^0.8.12; library Images { using Strings for uint256; function getToWMetadata() internal pure returns(string memory) { return b64(abi.encodePacked( '{"name":"The Tree","description":"The Tree will spread wealth to whoever may have ever owned it."', ',"image":"', getSVG(getToWSVG()), '","attributes":[', getTrait(0, "Infinity"), ",", getTrait(1, "All"), ",", getTrait(2, "All"), "]}" )); } function getHostTokenMetadata(uint tokenId) internal pure returns(string memory){ string memory color1; string memory color2; string memory wealth; (color1, color2, wealth) = getColors(tokenId); return b64(abi.encodePacked( '{"name":"Host token #', tokenId.toString(), '","description":"Honor to the ', tokenId.toString(), getOrdinal(tokenId), ' host of The Tree of Wealth"', ',"image":"', getSVG(getHostSVG(tokenId, color1, color2)), '", "attributes":[', getTrait(0, wealth ), ",", getTrait(1, color1), ",", getTrait(2, color2), ']}' )); } function b64(bytes memory meta) private pure returns(string memory) { return string.concat( "data:application/json;base64,", Base64.encode(meta) ); } function getTrait(uint t, string memory v) private pure returns(string memory){ string memory tt = t == 0 ? 'Wealth' : (t == 1 ? 'Primary Color' : 'Secondary Color') ; return string.concat( '{"trait_type":"', tt, '","value":"', v, '"}' ); } function getSVG( bytes memory content ) private pure returns(string memory){ return string.concat( "data:image/svg+xml;base64,", Base64.encode(content) ); } function getToWSVG() private pure returns(bytes memory){ return abi.encodePacked( openDefsSVG(), getCoinSVG("#fd6", "#db5"), getCoinsSVG(), getHalfTree(), getGradientSVG(), getTreeSVG('url(#c)'), getWaveSVG(), closeDefsSVG(), "<path fill='#412' d='M0 0h1000v698H0z'/><use xlink:href='#e' fill='#825' transform='rotate(-2 27339 -14967.1) scale(7)'/><use xlink:href='#e' fill='#938' transform='rotate(-10 4026 -2573.2) scale(4)'/><use xlink:href='#e' fill='#d8b' transform='rotate(10 -3082.2 3145.6) scale(2.2)'/><circle fill='#023' cx='500' cy='1365' r='714'/><use xlink:href='#f'/></svg>" ); } function getHostSVG( uint tokenId, string memory color1, string memory color2 ) private pure returns(bytes memory) { return abi.encodePacked( // We need to call 2 nested encodePacked in order to avoid // the Stack too deep error string(abi.encodePacked( openDefsSVG(), getCoinSVG(color1, color2), getCoinsSVG(), getHalfTree(), getTreeSVG(color1), getNumberDefinitions(tokenId), closeDefsSVG() )), string(abi.encodePacked( "<circle cx='500' cy='500' r='500' fill='", color1, "'/>", // external circle "<circle cx='500' cy='500' r='370' fill='", color2, "'/>", // private circle "<use xlink:href='#f' transform='matrix(.68 0 0 .68 160.5 183)'/>", // tree "<g fill='", color2, "' transform='translate(476 32)'><path d='m-79 82-6-30 28-6 6 31 11-3-15-69-11 2 6 30-27 6-6-30-11 2 15 70z'/><use xlink:href='#0' transform='scale(1.3 1) rotate(-3 -11.5 440.6)'/><path d='M64 73c31 4 37-36 7-41-26-3-20-22-6-20 7 0 12 2 18 6l6-9a40 40 0 0 0-23-8c-34 0-31 38-2 41 22 2 21 21 0 21a31 31 0 0 1-20-8l-7 8a46 46 0 0 0 27 10Zm60 10 13-60 19 5 3-10-49-11-2 9 19 5-14 60z'/></g>", // HOST getHostNumberSVG(tokenId, color2), "</svg>" )) ); } // #f function getTreeSVG(string memory treeColor ) private pure returns(string memory){ return string.concat( "<g id='f'><use xlink:href='#b' fill='", treeColor, "'/><use xlink:href='#b' fill='", treeColor, "' transform='matrix(-1 0 0 1 992 0)'/><use xlink:href='#d' transform='matrix(-1 0 0 1 1021 -25)'/><use xlink:href='#d' transform='translate(-25 -25)'/></g>" ); } // #b function getHalfTree() private pure returns(string memory){ return "<path d='M424 219c32 29 61 70 74 134v306c-15 0-41 9-45 17-46 84-62 161-62 264 0 19 1 41 3 60H275c5-130 47-239 130-328 8-9-15-9-28-7a786 786 0 0 0-34 7 518 518 0 0 0-219 328H3a519 519 0 0 1 246-300C157 735 64 798-6 865v-11l2-2a732 732 0 0 1 345-212c29-8 49-59 49-90 0-53-20-103-93-103-72 0-129 103-77 148-88-32-15-167 85-167 62 0 98 19 116 49v-1c3-16 3-33 3-39-1-44-27-88-84-93s-146 13-192 94c27-99 133-128 192-125 54 2 108 37 125 92-4-72-34-135-59-164-29-33-106-54-181 7 21-56 133-90 199-29Z' id='b'/>"; } // #c function getGradientSVG() private pure returns(string memory) { return "<radialGradient cx='50%' cy='26.4%' fx='50%' fy='26.4%' r='83.3%' gradientTransform='matrix(-.20706 .96593 -1.08184 -.36235 .9 -.1)' id='c'><stop stop-color='#FFF' offset='0%'/><stop stop-color='#FFF' offset='60%'/><stop stop-color='#023' offset='100%'/></radialGradient>"; } // #a function getCoinSVG( string memory color1, string memory color2 ) private pure returns(string memory) { return string.concat( "<g id='a'><circle fill='", color1, "' cx='25' cy='25' r='25'/><circle fill='", color2, "' cx='25' cy='25' r='19'/><path d='m30 36-5-5-4 5c-2 2-8-5-7-6l5-5-5-4c-1-2 5-8 7-7l4 5 5-5c1-1 8 5 6 7l-5 4 5 5c2 1-5 8-6 6Z' fill='", color1, "'/></g>" ); } // #d function getCoinsSVG() private pure returns(string memory) { return "<g id='d'><use xlink:href='#a' transform='translate(498 279)'/><use xlink:href='#a' transform='translate(528 227)'/><use xlink:href='#a' transform='translate(572 186)'/><use xlink:href='#a' transform='translate(629 163)'/><use xlink:href='#a' transform='translate(688 164)'/><use xlink:href='#a' transform='translate(749 186)'/><use xlink:href='#a' transform='translate(683 235)'/><use xlink:href='#a' transform='translate(623 246)'/><use xlink:href='#a' transform='translate(742 257)'/><use xlink:href='#a' transform='translate(585 296)'/><use xlink:href='#a' transform='translate(649 370)'/><use xlink:href='#a' transform='translate(714 373)'/><use xlink:href='#a' transform='translate(774 397)'/><use xlink:href='#a' transform='translate(844 374)'/><use xlink:href='#a' transform='translate(786 321)'/><use xlink:href='#a' transform='translate(823 447)'/><use xlink:href='#a' transform='translate(694 472)'/><use xlink:href='#a' transform='translate(750 499)'/><use xlink:href='#a' transform='translate(771 553)'/><use xlink:href='#a' transform='translate(838 524)'/></g>"; } // #e function getWaveSVG() private pure returns(string memory) { return "<path id='e' d='M0 150c57 0 52-30 86-65 35-34 64-33 64-85s-30-52-64-86c-34-33-32-64-86-64s-52 31-86 64c-33 34-64 27-64 86s31 52 64 86c34 34 29 64 86 64Z'/>"; } function openDefsSVG() private pure returns(string memory){ return "<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='1000' height='1000'><defs>"; } function closeDefsSVG() private pure returns(string memory){ return "</defs>"; } function getOrdinal( uint n ) private pure returns(string memory){ if( n % 10 == 1 && n != 11 ) return 'st'; if( n % 10 == 2 && n != 12 ) return 'nd'; if( n % 10 == 3 && n != 13 ) return 'rd'; return 'th'; } function getColors( uint n ) private pure returns(string memory, string memory, string memory) { uint h = n*41 % 360; uint s = (n*n+69) % 100; uint l = n*61 % 100; uint factor = ((n+150) * 3 % 100); uint diff = l < 50 ? (100 - (l + 50)) * factor / 100 : (l - 50) * factor / 100 ; uint altL = l < 50 ? l + 50 + diff : l - 50 - diff ; return ( getColorCode( h, s, l ), getColorCode( h, s, altL), diff.toString() ); } function getColorCode( uint h, uint s, uint l ) private pure returns (string memory) { return string.concat( 'hsl(', h.toString(), ",", s.toString(), '%,', l.toString(), '%)' ); } function getNumberDefinitions( uint n ) private pure returns (string memory) { bytes memory b = bytes(n.toString()); // 0 is always defined as the O from HOST string memory definitions = getNumberSVG(0); uint isDefined = 0; for(uint i; i < b.length; i++){ uint digit = uint(uint8(b[i])) - 48; if( digit != 0 ){ // 9 image will just be 6 upside down uint position = digit == 9 ? 6 : digit; bool alreadyDefined = ((isDefined >> position) & 1) == 1; if( !alreadyDefined ){ definitions = string.concat( definitions, getNumberSVG(position)); isDefined = isDefined | uint(1) << position; } } } return definitions; } function getNumberSVG(uint n) private pure returns (string memory) { if( n == 0 ){ return "<path id='0' d='M20 72c17 0 20-14 20-20V21c0-7-3-21-20-21S0 14 0 21v31c0 6 3 21 20 20Z'/>"; } if( n == 1 ){ return "<path id='1' d='M20 71V0H0l10 11v60z'/>"; } if( n == 2 ){ return "<path id='2' d='M41 70V60H14l23-28C58-2 0-13 0 19h10c0-17 32-8 18 7C8 48-2 63 0 70h41Z'/>"; } if( n == 3 ){ return "<path id='3' d='M33 34C58-5 0-10 0 18h11c-1-16 39-8 5 16 34 14 2 40-6 19H0c1 30 62 19 33-19Z'/>"; } if( n == 4 ){ return "<path id='4' d='M40 71V46l-29 5L35 0H24L0 51v10h30v10z'/>"; } if( n == 5 ){ return "<path id='5' d='M41 47c0-3 2-32-30-21V10h28V0H1v40c20-11 30-9 29 6 0 23-20 17-20 7H0c0 25 41 27 41-6Z'/>"; } if( n == 6 ){ return "<path id='6' d='M33 0H21L5 33l-1 3-1 1c-3 8-6 18 1 27 3 6 17 13 30 2 10-8 8-24 5-29-8-11-20-8-21-7v-1L33 0Z'/>"; } if( n == 7 ){ return "<path id='7' d='M16 71 45 0H0l10 10h19L5 71z'/>"; } if( n == 8 ){ return "<path id='8' d='M21 72c22 0 27-27 13-37 8-6 10-35-13-35C-3 0-1 29 7 35-6 45-2 72 21 72Z'/>"; } return string.concat("<g id='error", n.toString(), "'/>" ); } function getDigit(bytes1 b) private pure returns(uint) { return uint(uint8(b)) - 48; } function getHostNumberSVG(uint n, string memory color) private pure returns(string memory) { bytes memory b = bytes(n.toString()); uint angle = 0; //int r = 424; // We are going to replace this to save one var // We always need the # symbol string memory output = "<path d='m14 71 3-22h10l-3 22h7l4-22h10v-6H35l2-15h10v-6h-9l3-22h-8l-3 22h-9l3-22h-8l-3 22H3v6h9l-2 15H0v6h9L6 71z'/>"; for(uint i; i < b.length; i++){ // uint digit = uint(uint8(b[i])) - 48; if( i > 0 && getDigit(b[i-1]) == 1 ){ angle += Trigonometry.PI / 32; } else { angle += Trigonometry.PI / 25; } string memory translateX = uint( 424 * Trigonometry.sin(angle) / 1 ether).toString(); int y = ((424 * Trigonometry.cos(angle)) - (424 * 1 ether)) / 1 ether; string memory translateY = y < 0 ? string.concat( "-", uint(y * -1).toString() ) : uint(y).toString() ; if( getDigit(b[i]) == 9 ){ output = string.concat( output, "<use xlink:href='#6' transform='translate(", translateX, " ", translateY, ") rotate(-", toDegrees( angle + Trigonometry.PI ), ") translate(-40 -70)'/>" ); } else { output = string.concat( output, "<use xlink:href='#", getDigit(b[i]).toString(), "' transform='translate(", translateX, " ", translateY, ") rotate(-", toDegrees(angle), ")'/>" ); } } return string.concat( getNumberGroupSVG(angle, color), output, "</g>" ); } function getNumberGroupSVG(uint angle, string memory color) private pure returns (string memory) { uint idAngle = (angle + (Trigonometry.PI/32)) / 2; //int r = 424; // We are going to replace this to save one var uint x = uint( (500 * 1 ether) - Trigonometry.sin(idAngle) * 424); uint y = uint( (476 * 1 ether) + Trigonometry.cos(idAngle) * 424); return string.concat( "<g fill='", color, "' transform='translate(", ( x / 1 ether ).toString(), ",", ( y / 1 ether ).toString(), ") rotate(", toDegrees(idAngle), ")'>" ); } function toDegrees(uint angle) private pure returns ( string memory ) { return (angle * 180 / Trigonometry.PI).toString(); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File contracts/TOW_ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC165).interfaceId; // Use IERC165 directly } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { /* Overriden by the TOW contract */ } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( msg.sender == owner || isApprovedForAll(owner, msg.sender), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(msg.sender, operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * _burn removed :) */ /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /* Removed _beforeTokenTransfer _afterTokenTransfer as they are not used */ } // File contracts/TOW3.sol //Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) pragma solidity ^0.8.12; contract TOW3 is ERC721 { // Number of tokens minted // It will be used to calculate the current price // and also as token id of the next token uint256 private tokensMinted; // Different type of NFTs within our collection // type 0 is none, so we can detect unexistant tokens enum TokenType { NONE, TOW, HOST } // The Tree token metadata and id string private towMetadata; // How much to pay more on each buy uint256 public priceRaise; // At what transfer number when last withdrawal was made by a former host // Needed to calculated the amount to refund mapping(address => uint256) private lastWithdrawAt; // amount already withdrawn by addresses mapping(address => uint256) private alreadyWithdrawn; constructor(uint256 _priceRaise) ERC721("The Tree of Wealth", "TTOW") { priceRaise = _priceRaise; // First mint would be The Tree // And it's for the contract mint(address(this)); } function mint(address _owner) private { uint256 newItemId = tokensMinted; // now mint _safeMint(_owner, newItemId); // Increase the token ids tokensMinted = tokensMinted + 1; } function getTokenType(uint256 tokenId) public view returns (TokenType) { if (tokenId == 0) return TokenType.TOW; if (tokenId >= tokensMinted) return TokenType.NONE; return TokenType.HOST; } function tokenURI(uint256 tokenId) public view override returns (string memory) { _requireMinted(tokenId); if (getTokenType(tokenId) == TokenType.TOW) { return Images.getToWMetadata(); } return Images.getHostTokenMetadata(tokenId); } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public onlyNotToW(tokenId) override { return super.transferFrom(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public onlyNotToW(tokenId) override { return super.safeTransferFrom(from, to, tokenId, _data); } /** * Modifier to check that a token is not the ToW */ modifier onlyNotToW(uint256 tokenId) { require(tokenId != 0, "ToW: Can only transfer by using the host method"); _; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { require(tokenId != 0, "ToW: Can't approve transactions for The Tree"); super.approve(to, tokenId); } /** * Transfers the token to the caller, if it's sending the correct value */ function host() public payable { address currentHost = ownerOf(0); // Always need to pay one ether more than the previous owner require(lastWithdrawAt[msg.sender] == 0, "ToW: You've already hosted The Tree" ); // Always need to pay one ether more than the previous owner require(msg.value == currentPrice(), "ToW: The price is not right" ); // Mint the token mint(msg.sender); // Set up the last withdraw for the sender to this token. lastWithdrawAt[msg.sender] = tokensMinted; // now transfer The Tree _transfer(currentHost, msg.sender, 0); } /** * Any holder might have some value hold in the contract * call withdraw to get that value */ function withdraw() public { uint256 toWithdraw = availableToWithdraw(); require( toWithdraw > 0, "ToW: No funds to withdraw"); // Set the last withdraw to the current transfer lastWithdrawAt[msg.sender] = tokensMinted; // Update the value already withdrawn alreadyWithdrawn[msg.sender] += toWithdraw; // Transfer the funds payable(msg.sender).transfer(toWithdraw); // Emit event emit Withdraw(msg.sender, toWithdraw); } //////////////////// // Info methods //////////////////// function availableToWithdraw() public view returns(uint256) { uint256 lastWithdraw = lastWithdrawAt[msg.sender]; require( lastWithdraw != 0, "ToW: You've never been a host"); return (tokensMinted - lastWithdraw) * priceRaise; } function currentPrice() public view returns(uint256) { if( tokensMinted == 1 ) return (priceRaise / 10); return (tokensMinted - 1) * priceRaise; } function hasBeenHost( address addr ) public view returns(bool) { return lastWithdrawAt[addr] > 0; } function getWithdrawnValue() public view returns(uint256) { return alreadyWithdrawn[msg.sender]; } // Events event Withdraw(address owner, uint256 value); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_priceRaise","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableToWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenType","outputs":[{"internalType":"enum TOW3.TokenType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawnValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"hasBeenHost","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"host","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceRaise","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004f1938038062004f19833981016040819052620000349162000431565b604051806040016040528060128152602001710a8d0ca40a8e4caca40decc40aecac2d8e8d60731b8152506040518060400160405280600481526020016354544f5760e01b81525081600090816200008d9190620004ef565b5060016200009c8282620004ef565b5050506008819055620000af30620000b6565b5062000689565b600654620000c58282620000dc565b600654620000d5906001620005bb565b6006555050565b620000fe8282604051806020016040528060008152506200010260201b60201c565b5050565b6200010e83836200017e565b6200011d6000848484620002c6565b620001795760405162461bcd60e51b8152602060048201526032602482015260008051602062004ef983398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084015b60405180910390fd5b505050565b6001600160a01b038216620001d65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640162000170565b6000818152600260205260409020546001600160a01b0316156200023d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640162000170565b6001600160a01b038216600090815260036020526040812080546001929062000268908490620005bb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000620002e7846001600160a01b03166200042260201b62000a391760201c565b156200041657604051630a85bd0160e11b81526001600160a01b0385169063150b7a029062000321903390899088908890600401620005e3565b6020604051808303816000875af19250505080156200035f575060408051601f3d908101601f191682019092526200035c9181019062000656565b60015b620003fb573d80801562000390576040519150601f19603f3d011682016040523d82523d6000602084013e62000395565b606091505b508051600003620003f35760405162461bcd60e51b8152602060048201526032602482015260008051602062004ef983398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840162000170565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506200041a565b5060015b949350505050565b6001600160a01b03163b151590565b6000602082840312156200044457600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200047657607f821691505b6020821081036200049757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200017957600081815260208120601f850160051c81016020861015620004c65750805b601f850160051c820191505b81811015620004e757828155600101620004d2565b505050505050565b81516001600160401b038111156200050b576200050b6200044b565b62000523816200051c845462000461565b846200049d565b602080601f8311600181146200055b5760008415620005425750858301515b600019600386901b1c1916600185901b178555620004e7565b600085815260208120601f198616915b828110156200058c578886015182559484019460019091019084016200056b565b5085821015620005ab5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115620005dd57634e487b7160e01b600052601160045260246000fd5b92915050565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b82811015620006325785810182015185820160a00152810162000614565b5050600060a0828501015260a0601f19601f83011684010191505095945050505050565b6000602082840312156200066957600080fd5b81516001600160e01b0319811681146200068257600080fd5b9392505050565b61486080620006996000396000f3fe60806040526004361061012a5760003560e01c806370a08231116100ab578063b88d4fde1161006f578063b88d4fde14610348578063c87b56dd14610368578063cb3f4cd714610388578063e322ad2b146103aa578063e985e9c5146103bf578063f437bc59146103df57600080fd5b806370a08231146102b157806376aed2e1146102d157806395d89b41146102fe5780639d1b464a14610313578063a22cb4651461032857600080fd5b806323b872dd116100f257806323b872dd146102045780633ccfd60b1461022457806342842e0e146102395780634465e7fa146102595780636352211e1461029157600080fd5b806301ffc9a71461012f57806306fdde0314610164578063081812fc14610186578063095ea7b3146101be5780630a8b866a146101e0575b600080fd5b34801561013b57600080fd5b5061014f61014a366004612286565b6103e7565b60405190151581526020015b60405180910390f35b34801561017057600080fd5b50610179610439565b60405161015b91906122fa565b34801561019257600080fd5b506101a66101a136600461230d565b6104cb565b6040516001600160a01b03909116815260200161015b565b3480156101ca57600080fd5b506101de6101d9366004612342565b6104f2565b005b3480156101ec57600080fd5b506101f660085481565b60405190815260200161015b565b34801561021057600080fd5b506101de61021f36600461236c565b61056a565b34801561023057600080fd5b506101de61059c565b34801561024557600080fd5b506101de61025436600461236c565b610697565b34801561026557600080fd5b5061014f6102743660046123a8565b6001600160a01b0316600090815260096020526040902054151590565b34801561029d57600080fd5b506101a66102ac36600461230d565b6106b7565b3480156102bd57600080fd5b506101f66102cc3660046123a8565b610717565b3480156102dd57600080fd5b506102f16102ec36600461230d565b61079d565b60405161015b91906123d9565b34801561030a57600080fd5b506101796107c8565b34801561031f57600080fd5b506101f66107d7565b34801561033457600080fd5b506101de610343366004612401565b610813565b34801561035457600080fd5b506101de610363366004612453565b61081e565b34801561037457600080fd5b5061017961038336600461230d565b610852565b34801561039457600080fd5b50336000908152600a60205260409020546101f6565b3480156103b657600080fd5b506101f661088f565b3480156103cb57600080fd5b5061014f6103da36600461252f565b61090f565b6101de61093d565b60006001600160e01b031982166380ac58cd60e01b148061041857506001600160e01b03198216635b5e139f60e01b145b8061043357506001600160e01b031982166301ffc9a760e01b145b92915050565b60606000805461044890612562565b80601f016020809104026020016040519081016040528092919081815260200182805461047490612562565b80156104c15780601f10610496576101008083540402835291602001916104c1565b820191906000526020600020905b8154815290600101906020018083116104a457829003601f168201915b5050505050905090565b60006104d682610a48565b506000908152600460205260409020546001600160a01b031690565b8060000361055c5760405162461bcd60e51b815260206004820152602c60248201527f546f573a2043616e277420617070726f7665207472616e73616374696f6e732060448201526b666f7220546865205472656560a01b60648201526084015b60405180910390fd5b6105668282610aa7565b5050565b808060000361058b5760405162461bcd60e51b81526004016105539061259c565b610596848484610bb7565b50505050565b60006105a661088f565b9050600081116105f85760405162461bcd60e51b815260206004820152601960248201527f546f573a204e6f2066756e647320746f207769746864726177000000000000006044820152606401610553565b60065433600090815260096020908152604080832093909355600a90529081208054839290610628908490612601565b9091555050604051339082156108fc029083906000818181858888f1935050505015801561065a573d6000803e3d6000fd5b5060408051338152602081018390527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364910160405180910390a150565b6106b28383836040518060200160405280600081525061081e565b505050565b6000818152600260205260408120546001600160a01b0316806104335760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610553565b60006001600160a01b0382166107815760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610553565b506001600160a01b031660009081526003602052604090205490565b6000816000036107af57506001919050565b60065482106107c057506000919050565b506002919050565b60606001805461044890612562565b60006006546001036107f757600a6008546107f2919061262a565b905090565b6008546001600654610809919061263e565b6107f29190612651565b610566338383610be8565b818060000361083f5760405162461bcd60e51b81526004016105539061259c565b61084b85858585610cb6565b5050505050565b606061085d82610a48565b60016108688361079d565b6002811115610879576108796123c3565b0361088657610433610ce8565b61043382610d9b565b336000908152600960205260408120548082036108ee5760405162461bcd60e51b815260206004820152601d60248201527f546f573a20596f75277665206e65766572206265656e206120686f73740000006044820152606401610553565b600854816006546108ff919061263e565b6109099190612651565b91505090565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600061094960006106b7565b33600090815260096020526040902054909150156109b55760405162461bcd60e51b815260206004820152602360248201527f546f573a20596f7527766520616c726561647920686f7374656420546865205460448201526272656560e81b6064820152608401610553565b6109bd6107d7565b3414610a0b5760405162461bcd60e51b815260206004820152601b60248201527f546f573a20546865207072696365206973206e6f7420726967687400000000006044820152606401610553565b610a1433610e1d565b60065433600081815260096020526040812092909255610a3691839190610e3f565b50565b6001600160a01b03163b151590565b6000818152600260205260409020546001600160a01b0316610a365760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610553565b6000610ab2826106b7565b9050806001600160a01b0316836001600160a01b031603610b1f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610553565b336001600160a01b0382161480610b3b5750610b3b813361090f565b610bad5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610553565b6106b28383610fdb565b610bc13382611049565b610bdd5760405162461bcd60e51b815260040161055390612668565b6106b2838383610e3f565b816001600160a01b0316836001600160a01b031603610c495760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610553565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610cc03383611049565b610cdc5760405162461bcd60e51b815260040161055390612668565b610596848484846110a8565b60606107f2610cfd610cf86110db565b6111b8565b610d28600060405180604001604052806008815260200167496e66696e69747960c01b8152506111e9565b610d4e600160405180604001604052806003815260200162105b1b60ea1b8152506111e9565b610d74600260405180604001604052806003815260200162105b1b60ea1b8152506111e9565b604051602001610d8794939291906126d2565b6040516020818303038152906040526112a0565b606080606080610daa856112bb565b91945092509050610e14610dbd86611410565b610dc687611410565b610dcf88611511565b610ddd610cf88a89896115eb565b610de86000876111e9565b610df360018a6111e9565b610dfe60028a6111e9565b604051602001610d879796959493929190612801565b95945050505050565b600654610e2a82826116ba565b600654610e38906001612601565b6006555050565b826001600160a01b0316610e52826106b7565b6001600160a01b031614610eb65760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610553565b6001600160a01b038216610f185760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610553565b610f23600082610fdb565b6001600160a01b0383166000908152600360205260408120805460019290610f4c90849061263e565b90915550506001600160a01b0382166000908152600360205260408120805460019290610f7a908490612601565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611010826106b7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611055836106b7565b9050806001600160a01b0316846001600160a01b0316148061107c575061107c818561090f565b806110a05750836001600160a01b0316611095846104cb565b6001600160a01b0316145b949350505050565b6110b3848484610e3f565b6110bf848484846116d4565b6105965760405162461bcd60e51b815260040161055390612936565b60606110e56117d5565b6111276040518060400160405280600481526020016311b3321b60e11b815250604051806040016040528060048152602001632364623560e01b8152506117f5565b61112f611823565b611137611846565b61113f611869565b6111676040518060400160405280600781526020016675726c2823632960c81b81525061188c565b61116f6118a1565b6040805180820190915260078152661e17b232b3399f60c91b60208201526040516020016111a4989796959493929190612988565b604051602081830303815290604052905090565b60606111c3826118c1565b6040516020016111d39190612be2565b6040516020818303038152906040529050919050565b6060600083156112535783600114611228576040518060400160405280600f81526020016e29b2b1b7b73230b93c9021b7b637b960891b815250611273565b6040518060400160405280600d81526020016c283934b6b0b93c9021b7b637b960991b815250611273565b604051806040016040528060068152602001650aecac2d8e8d60d31b8152505b90508083604051602001611288929190612c27565b60405160208183030381529060405291505092915050565b60606112ab826118c1565b6040516020016111d39190612c98565b6060808060006101686112cf866029612651565b6112d99190612cdd565b9050600060646112e98780612651565b6112f4906045612601565b6112fe9190612cdd565b90506000606461130f88603d612651565b6113199190612cdd565b90506000606461132a896096612601565b611335906003612651565b61133f9190612cdd565b90506000603283106113725760648261135960328661263e565b6113639190612651565b61136d919061262a565b61139f565b606482611380856032612601565b61138b90606461263e565b6113959190612651565b61139f919061262a565b90506000603284106113c657816113b760328661263e565b6113c1919061263e565b6113dc565b816113d2856032612601565b6113dc9190612601565b90506113e9868686611a26565b6113f4878784611a26565b6113fd84611410565b9850985098505050505050509193909250565b6060816000036114375750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611461578061144b81612cf1565b915061145a9050600a8361262a565b915061143b565b60008167ffffffffffffffff81111561147c5761147c61243d565b6040519080825280601f01601f1916602001820160405280156114a6576020820181803683370190505b5090505b84156110a0576114bb60018361263e565b91506114c8600a86612cdd565b6114d3906030612601565b60f81b8183815181106114e8576114e8612d0a565b60200101906001600160f81b031916908160001a90535061150a600a8661262a565b94506114aa565b606061151e600a83612cdd565b600114801561152e575081600b14155b156115515750506040805180820190915260028152611cdd60f21b602082015290565b61155c600a83612cdd565b600214801561156c575081600c14155b1561158f5750506040805180820190915260028152611b9960f21b602082015290565b61159a600a83612cdd565b60031480156115aa575081600d14155b156115cd5750506040805180820190915260028152611c9960f21b602082015290565b50506040805180820190915260028152610e8d60f31b602082015290565b60606115f56117d5565b6115ff84846117f5565b611607611823565b61160f611846565b6116188761188c565b61162189611a55565b6040805180820190915260078152661e17b232b3399f60c91b60208201526040516020016116559796959493929190612d20565b6040516020818303038152906040528383846116718887611b27565b6040516020016116849493929190612db2565b60408051601f19818403018152908290526116a292916020016130c9565b60405160208183030381529060405290509392505050565b610566828260405180602001604052806000815250611da0565b60006001600160a01b0384163b156117ca57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906117189033908990889088906004016130f8565b6020604051808303816000875af1925050508015611753575060408051601f3d908101601f1916820190925261175091810190613135565b60015b6117b0573d808015611781576040519150601f19603f3d011682016040523d82523d6000602084013e611786565b606091505b5080516000036117a85760405162461bcd60e51b815260040161055390612936565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110a0565b506001949350505050565b60606040518060a00160405280607481526020016146a860749139905090565b606082828460405160200161180c93929190613152565b604051602081830303815290604052905092915050565b606060405180610460016040528061043281526020016138c56104329139905090565b60606040518061022001604052806101f581526020016141ed6101f59139905090565b606060405180610140016040528061010f815260200161471c61010f9139905090565b606081826040516020016111d39291906132aa565b60606040518060c00160405280609b815260200161453f609b9139905090565b606081516000036118e057505060408051602081019091526000815290565b60006040518060600160405280604081526020016144ff604091399050600060038451600261190f9190612601565b611919919061262a565b611924906004612651565b90506000611933826020612601565b67ffffffffffffffff81111561194b5761194b61243d565b6040519080825280601f01601f191660200182016040528015611975576020820181803683370190505b509050818152600183018586518101602084015b818310156119e1576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101611989565b6003895106600181146119fb5760028114611a0c57611a18565b613d3d60f01b600119830152611a18565b603d60f81b6000198301525b509398975050505050505050565b6060611a3184611410565b611a3a84611410565b611a4384611410565b6040516020016116a2939291906133fb565b60606000611a6283611410565b90506000611a706000611dd3565b90506000805b8351811015611b1d5760006030858381518110611a9557611a95612d0a565b0160200151611aa7919060f81c61263e565b90508015611b0a57600081600914611abf5781611ac2565b60065b9050600184821c81161480611b075785611adb83611dd3565b604051602001611aec9291906130c9565b6040516020818303038152906040529550816001901b851794505b50505b5080611b1581612cf1565b915050611a76565b5090949350505050565b60606000611b3484611410565b90506000806040518060a001604052806075815260200161463360759139905060005b8351811015611d6957600081118015611ba25750611b9e84611b7a60018461263e565b81518110611b8a57611b8a612d0a565b01602001516001600160f81b031916611f4d565b6001145b15611bcb57611bba6020672b992ddfa23249d661262a565b611bc49084612601565b9250611beb565b611bde6019672b992ddfa23249d661262a565b611be89084612601565b92505b6000611c1d670de0b6b3a7640000611c0286611f5e565b611c0e906101a861347a565b611c1891906134aa565b611410565b90506000670de0b6b3a76400006816fc2e998d3da00000611c3d87612028565b611c49906101a861347a565b611c5391906134d8565b611c5d91906134aa565b90506000808212611c7657611c7182611410565b611ca5565b611c85611c188360001961347a565b604051602001611c9591906134ff565b6040516020818303038152906040525b9050611cbc878581518110611b8a57611b8a612d0a565b600903611d0957848382611ce0611cdb672b992ddfa23249d68b612601565b61203d565b604051602001611cf39493929190613528565b6040516020818303038152906040529450611d53565b84611d22611c18898781518110611b8a57611b8a612d0a565b8483611d2d8a61203d565b604051602001611d4195949392919061360d565b60405160208183030381529060405294505b5050508080611d6190612cf1565b915050611b57565b50611d748286612060565b81604051602001611d869291906136f3565b604051602081830303815290604052935050505092915050565b611daa838361212e565b611db760008484846116d4565b6106b25760405162461bcd60e51b815260040161055390612936565b606081600003611dfc576040518060800160405280605981526020016145da6059913992915050565b81600103611e23576040518060600160405280602781526020016143e26027913992915050565b81600203611e4a576040518060800160405280605981526020016144096059913992915050565b81600303611e71576040518060800160405280605f8152602001613d8a605f913992915050565b81600403611e9857604051806060016040528060398152602001613d516039913992915050565b81600503611ebf576040518060a001604052806068815260200161385d6068913992915050565b81600603611ee6576040518060a00160405280606e8152602001614491606e913992915050565b81600703611f0d576040518060600160405280602f8152602001614462602f913992915050565b81600803611f34576040518060800160405280605a8152602001613cf7605a913992915050565b611f3d82611410565b6040516020016111d39190613731565b6000610433603060f884901c61263e565b6757325bbf446493ac9081900663400000000204600061ffff600483901c1660ff601484901c16631000000084161563200000008516151581611fa35760ff92909203915b60006040518061044001604052806104048152602001613de9610404913960046002860102818101519192509063ffffffff602082901c8116908216818103890260101c600088611ff657818303611ffa565b8184015b90508715612006576000035b637fffffff670de0b6b3a76400008202059d9c50505050505050505050505050565b60006104336715cc96efd11924eb8301611f5e565b6060610433672b992ddfa23249d66120568460b4612651565b611c18919061262a565b6060600060026120796020672b992ddfa23249d661262a565b6120839086612601565b61208d919061262a565b9050600061209a82611f5e565b6120a6906101a861347a565b6120b990681b1ae4d6e2ef5000006134d8565b905060006120c683612028565b6120d2906101a861347a565b6120e5906819cdd3b60b3df00000613772565b9050846120fd611c18670de0b6b3a76400008561262a565b612112611c18670de0b6b3a76400008561262a565b61211b8661203d565b604051602001611d86949392919061379a565b6001600160a01b0382166121845760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610553565b6000818152600260205260409020546001600160a01b0316156121e95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610553565b6001600160a01b0382166000908152600360205260408120805460019290612212908490612601565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610a3657600080fd5b60006020828403121561229857600080fd5b81356122a381612270565b9392505050565b60005b838110156122c55781810151838201526020016122ad565b50506000910152565b600081518084526122e68160208601602086016122aa565b601f01601f19169290920160200192915050565b6020815260006122a360208301846122ce565b60006020828403121561231f57600080fd5b5035919050565b80356001600160a01b038116811461233d57600080fd5b919050565b6000806040838503121561235557600080fd5b61235e83612326565b946020939093013593505050565b60008060006060848603121561238157600080fd5b61238a84612326565b925061239860208501612326565b9150604084013590509250925092565b6000602082840312156123ba57600080fd5b6122a382612326565b634e487b7160e01b600052602160045260246000fd5b60208101600383106123fb57634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561241457600080fd5b61241d83612326565b91506020830135801515811461243257600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561246957600080fd5b61247285612326565b935061248060208601612326565b925060408501359150606085013567ffffffffffffffff808211156124a457600080fd5b818701915087601f8301126124b857600080fd5b8135818111156124ca576124ca61243d565b604051601f8201601f19908116603f011681019083821181831017156124f2576124f261243d565b816040528281528a602084870101111561250b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561254257600080fd5b61254b83612326565b915061255960208401612326565b90509250929050565b600181811c9082168061257657607f821691505b60208210810361259657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602f908201527f546f573a2043616e206f6e6c79207472616e73666572206279207573696e672060408201526e1d1a19481a1bdcdd081b595d1a1bd9608a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610433576104336125eb565b634e487b7160e01b600052601260045260246000fd5b60008261263957612639612614565b500490565b81810381811115610433576104336125eb565b8082028115828204841417610433576104336125eb565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b600081516126c88185602086016122aa565b9290920192915050565b7f7b226e616d65223a225468652054726565222c226465736372697074696f6e2281527f3a2254686520547265652077696c6c20737072656164207765616c746820746f60208201527f2077686f65766572206d617920686176652065766572206f776e65642069742e6040820152601160f91b606082015269161134b6b0b3b2911d1160b11b60618201526000855161277381606b850160208a016122aa565b6f222c2261747472696275746573223a5b60801b606b9184019182015285516127a381607b840160208a016122aa565b600b60fa1b607b929091019182015284516127c581607c8401602089016122aa565b6127f56127e76127e1607c84860101600b60fa1b815260010190565b876126b6565b615d7d60f01b815260020190565b98975050505050505050565b747b226e616d65223a22486f737420746f6b656e202360581b81528751600090612832816015850160208d016122aa565b7f222c226465736372697074696f6e223a22486f6e6f7220746f20746865200000601591840191820152885161286f816033840160208d016122aa565b8851910190612885816033840160208c016122aa565b7f20686f7374206f66205468652054726565206f66205765616c746822000000006033929091019182015269161134b6b0b3b2911d1160b11b604f82015286516128d6816059840160208b016122aa565b70222c202261747472696275746573223a5b60781b605992909101918201526129286127e761292261290f61291c81606a87018c6126b6565b600b60fa1b815260010190565b896126b6565b866126b6565b9a9950505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008951602061299b8285838f016122aa565b8a51918401916129ae8184848f016122aa565b8a519201916129c08184848e016122aa565b89519201916129d28184848d016122aa565b88519201916129e48184848c016122aa565b87519201916129f68184848b016122aa565b8651920191612a088184848a016122aa565b8551920191612a1a81848489016122aa565b7f3c706174682066696c6c3d27233431322720643d274d3020306831303030763692019182527f393848307a272f3e3c75736520786c696e6b3a687265663d272365272066696c908201527f6c3d272338323527207472616e73666f726d3d27726f74617465282d3220323760408201527f333339202d31343936372e3129207363616c65283729272f3e3c75736520786c60608201527f696e6b3a687265663d272365272066696c6c3d272339333827207472616e736660808201527f6f726d3d27726f74617465282d31302034303236202d323537332e322920736360a08201527f616c65283429272f3e3c75736520786c696e6b3a687265663d2723652720666960c08201527f6c6c3d272364386227207472616e73666f726d3d27726f74617465283130202d60e08201527f333038322e3220333134352e3629207363616c6528322e3229272f3e3c6369726101008201527f636c652066696c6c3d2723303233272063783d27353030272063793d273133366101208201527f352720723d27373134272f3e3c75736520786c696e6b3a687265663d2723662761014082015267179f1e17b9bb339f60c11b610160820152610168019a9950505050505050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000815260008251612c1a81601a8501602087016122aa565b91909101601a0192915050565b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090612c5281600f8501602088016122aa565b6a1116113b30b63ab2911d1160a91b600f918401918201528351612c7d81601a8401602088016122aa565b61227d60f01b601a9290910191820152601c01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612cd081601d8501602087016122aa565b91909101601d0192915050565b600082612cec57612cec612614565b500690565b600060018201612d0357612d036125eb565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600088516020612d338285838e016122aa565b895191840191612d468184848e016122aa565b8951920191612d588184848d016122aa565b8851920191612d6a8184848c016122aa565b8751920191612d7c8184848b016122aa565b8651920191612d8e8184848a016122aa565b8551920191612da081848489016122aa565b919091019a9950505050505050505050565b7f3c636972636c652063783d27353030272063793d273530302720723d273530308152600067272066696c6c3d2760c01b8060208401528651612dfc816028860160208b016122aa565b80840190506213979f60e91b8060288301527f3c636972636c652063783d27353030272063793d273530302720723d27333730602b83015282604b83015287519250612e4f836053840160208b016122aa565b828201925080605384015250507f3c75736520786c696e6b3a687265663d27236627207472616e73666f726d3d2760568201527f6d6174726978282e363820302030202e3638203136302e352031383329272f3e6076820152683c672066696c6c3d2760b81b60968201526130be6130ac612922612ed0609f8501896126b6565b7f27207472616e73666f726d3d277472616e736c6174652834373620333229273e81527f3c7061746820643d276d2d37392038322d362d33302032382d3620362033312060208201527f31312d332d31352d36392d3131203220362033302d323720362d362d33302d3160408201527f3120322031352037307a272f3e3c75736520786c696e6b3a687265663d27233060608201527f27207472616e73666f726d3d277363616c6528312e3320312920726f7461746560808201527f282d33202d31312e35203434302e3629272f3e3c7061746820643d274d36342060a08201527f373363333120342033372d333620372d34312d32362d332d32302d32322d362d60c08201527f323020372030203132203220313820366c362d3961343020343020302030203060e08201527f2d32332d38632d333420302d33312033382d32203431203232203220323120326101008201527f3120302032316133312033312030203020312d32302d386c2d372038613436206101208201527f34362030203020302032372031305a6d36302031302031332d363020313920356101408201527f20332d31302d34392d31312d32203920313920352d31342036307a272f3e3c2f61016082015261339f60f11b6101808201526101820190565b651e17b9bb339f60d11b815260060190565b979650505050505050565b600083516130db8184602088016122aa565b8351908301906130ef8183602088016122aa565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061312b908301846122ce565b9695505050505050565b60006020828403121561314757600080fd5b81516122a381612270565b7f3c672069643d2761273e3c636972636c652066696c6c3d27000000000000000081526000845161318a8160188501602089016122aa565b7f272063783d273235272063793d2732352720723d273235272f3e3c636972636c60189184019182015267652066696c6c3d2760c01b603882015284516131d88160408401602089016122aa565b7f272063783d273235272063793d2732352720723d273139272f3e3c7061746820604092909101918201527f643d276d33302033362d352d352d342035632d3220322d382d352d372d366c3560608201527f2d352d352d34632d312d3220352d3820372d376c34203520352d3563312d312060808201527f382035203620376c2d35203420352035633220312d3520382d3620365a27206660a082015264696c6c3d2760d81b60c082015261329060c58201856126b6565b6613979f1e17b39f60c91b81526007019695505050505050565b7f3c672069643d2766273e3c75736520786c696e6b3a687265663d272362272066815264696c6c3d2760d81b6020820152600083516132f08160258501602088016122aa565b7f272f3e3c75736520786c696e6b3a687265663d272362272066696c6c3d270000602591840191820152835161332d8160438401602088016122aa565b7f27207472616e73666f726d3d276d6174726978282d3120302030203120393932604392909101918201527f203029272f3e3c75736520786c696e6b3a687265663d27236427207472616e7360638201527f666f726d3d276d6174726978282d312030203020312031303231202d3235292760838201527f2f3e3c75736520786c696e6b3a687265663d27236427207472616e73666f726d60a38201527f3d277472616e736c617465282d3235202d323529272f3e3c2f673e000000000060c382015260de01949350505050565b630d0e6d8560e31b81526000845161341a8160048501602089016122aa565b600b60fa1b600491840191820152845161343b8160058401602089016122aa565b61094b60f21b60059290910191820152835161345e8160078401602088016122aa565b61252960f01b6007929091019182015260090195945050505050565b80820260008212600160ff1b84141615613496576134966125eb565b8181058314821517610433576104336125eb565b6000826134b9576134b9612614565b600160ff1b8214600019841416156134d3576134d36125eb565b500590565b81810360008312801583831316838312821617156134f8576134f86125eb565b5092915050565b602d60f81b81526000825161351b8160018501602087016122aa565b9190910160010192915050565b6000855161353a818460208a016122aa565b80830190507f3c75736520786c696e6b3a687265663d27233627207472616e73666f726d3d278152690e8e4c2dce6d8c2e8ca560b31b6020820152855161358881602a840160208a016122aa565b600160fd1b602a929091019182015284516135aa81602b8401602089016122aa565b692920726f74617465282d60b01b602b929091019182015283516135d58160358401602088016122aa565b7f29207472616e736c617465282d3430202d373029272f3e00000000000000000060359290910191820152604c019695505050505050565b6000865161361f818460208b016122aa565b713c75736520786c696e6b3a687265663d272360701b908301908152865161364e816012840160208b016122aa565b7604e40e8e4c2dce6ccdee4da7a4ee8e4c2dce6d8c2e8ca5604b1b601292909101918201528551613686816029840160208a016122aa565b600160fd1b6029929091019182015284516136a881602a8401602089016122aa565b692920726f74617465282d60b01b602a929091019182015283516136d38160348401602088016122aa565b631493979f60e11b60349290910191820152603801979650505050505050565b600083516137058184602088016122aa565b8351908301906137198183602088016122aa565b631e17b39f60e11b9101908152600401949350505050565b6b1e339034b21e93b2b93937b960a11b81526000825161375881600c8501602087016122aa565b6213979f60e91b600c939091019283015250600f01919050565b8082018281126000831280158216821582161715613792576137926125eb565b505092915050565b683c672066696c6c3d2760b81b81526000855160206137bf8260098601838b016122aa565b7604e40e8e4c2dce6ccdee4da7a4ee8e4c2dce6d8c2e8ca5604b1b60099285019283015286516137f481838501848b016122aa565b600b60fa1b920181810192909252855161381481602185018985016122aa565b6805240e4dee8c2e8ca560bb1b60219390910192830152845161383d81602a85018489016122aa565b6214939f60e91b602a939091019283015250602d01969550505050505056fe3c706174682069643d27352720643d274d343120343763302d3320322d33322d33302d3231563130683238563048317634306332302d31312033302d39203239203620302032332d32302031372d32302037483063302032352034312032372034312d365a272f3e3c672069643d2764273e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283439382032373929272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283532382032323729272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283537322031383629272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283632392031363329272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283638382031363429272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283734392031383629272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283638332032333529272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283632332032343629272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283734322032353729272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283538352032393629272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283634392033373029272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283731342033373329272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283737342033393729272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283834342033373429272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283738362033323129272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283832332034343729272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283639342034373229272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283735302034393929272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283737312035353329272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283833382035323429272f3e3c2f673e3c706174682069643d27382720643d274d323120373263323220302032372d32372031332d333720382d362031302d33352d31332d3335432d3320302d3120323920372033352d362034352d322037322032312037325a272f3e3c706174682069643d27342720643d274d34302037315634366c2d323920354c333520304832344c302035317631306833307631307a272f3e3c706174682069643d27332720643d274d33332033344335382d3520302d31302030203138683131632d312d31362033392d38203520313620333420313420322034302d36203139483063312033302036322031392033332d31395a272f3e0000000000c90f8801921d20025b26d703242abf03ed26e604b6195d057f00350647d97c0710a34507d95b9e08a2009a096a90490a3308bc0afb68050bc3ac350c8bd35e0d53db920e1bc2e40ee387660fab272b1072a0481139f0cf120116d512c8106e138edbb1145576b1151bdf8515e2144416a81305176dd9de183366e818f8b83c19bdcbf31a82a0251b4732ef1c0b826a1ccf8cb31d934fe51e56ca1e1f19f97b1fdcdc1b209f701c2161b39f2223a4c522e541af23a6887e2467775725280c5d25e845b626a8218527679df42826b92828e5714a29a3c4852a61b1012b1f34eb2bdc4e6f2c98fbba2d553afb2e110a622ecc681e2f8752623041c76030fbc54d31b54a5d326e54c73326e2c233def2873496824f354d905636041ad936ba2013376f9e46382493b038d8fe93398cdd323a402dd13af2eeb73ba51e293c56ba703d07c1d53db832a53e680b2c3f1749b73fc5ec974073f21d4121589a41ce1e64427a41d04325c13543d09aec447acd50452456bc45cd358f46756827471cece647c3c22e4869e664490f57ee49b415334a581c9d4afb6c974b9e038f4c3fdff34ce100344d8162c34e2106174ebfe8a44f5e08e24ffb654c5097fc5e5133cc9451ced46e5269126e53028517539b2aef5433027d54ca0a4a556040e255f5a4d2568a34a9571deef957b0d2555842dd5458d40e8c5964649759f3de125a8279995b1035ce5b9d11535c290acc5cb420df5d3e52365dc79d7b5e50015d5ed77c895f5e0db25fe3b38d60686cce60ec382f616f146b61f1003e6271fa6862f201ac637114cc63ef328f646c59bf64e889256563bf9165ddfbd266573cbb66cf811f6746c7d767bd0fbc683257aa68a69e806919e31f698c246b69fd614a6a6d98a36adcc9646b4af2786bb812d06c24295f6c8f351b6cf934fb6d6227f96dca0d146e30e3496e96a99c6efb5f116f5f02b16fc1938470231099708378fe70e2cbc571410804719e2cd171fa394872552c8472af05a67307c3cf735f662573b5ebd0740b53fa745f9dd074b2c8837504d3447555bd4b75a585ce75f42c0a7641af3c768e0ea576d9498877235f2c776c4eda77b417df77fab988784033287884841378c7aba17909a92c794a7c11798a23b079c89f6d7a05eeac7a4210d87a7d055a7ab6cba37aef63237b26cb4e7b5d039d7b920b887bc5e28f7bf8882f7c29fbed7c5a3d4f7c894bdd7cb727237ce3ceb17d0f42177d3980eb7d628ac57d8a5f3f7db0fdf77dd6668e7dfa98a77e1d93e97e3f57fe7e5fe4927e7f39567e9d55fb7eba3a387ed5e5c57ef0585f7f0991c37f2191b37f3857f57f4de4507f62368e7f754e7f7f872bf27f97cebc7fa736b37fb563b27fc255957fce0c3d7fd8878d7fe1c76a7fe9cbbf7ff094777ff621817ffa72d07ffd88597fff62157fffffff3c7061746820643d274d343234203231396333322032392036312037302037342031333476333036632d313520302d343120392d34352031372d34362038342d3632203136312d3632203236342030203139203120343120332036304832373563352d3133302034372d323339203133302d33323820382d392d31352d392d32382d3761373836203738362030203020302d3334203720353138203531382030203020302d3231392033323848336135313920353139203020302031203234362d3330304331353720373335203634203739382d3620383635762d31316c322d326137333220373332203020302031203334352d3231326332392d382034392d35392034392d393020302d35332d32302d3130332d39332d3130332d373220302d313239203130332d3737203134382d38382d33322d31352d3136372038352d313637203632203020393820313920313136203439762d3163332d313620332d333320332d33392d312d34342d32372d38382d38342d3933732d3134362031332d3139322039346332372d3939203133332d313238203139322d313235203534203220313038203337203132352039322d342d37322d33342d3133352d35392d3136342d32392d33332d3130362d35342d31383120372032312d3536203133332d3930203139392d32395a272069643d2762272f3e3c706174682069643d27312720643d274d3230203731563048306c31302031317636307a272f3e3c706174682069643d27322720643d274d34312037305636304831346c32332d32384335382d3220302d3133203020313968313063302d31372033322d38203138203743382034382d3220363320302037306834315a272f3e3c706174682069643d27372720643d274d3136203731203435203048306c31302031306831394c352037317a272f3e3c706174682069643d27362720643d274d333320304832314c352033336c2d3120332d312031632d3320382d3620313820312032372033203620313720313320333020322031302d3820382d323420352d32392d382d31312d32302d382d32312d37762d314c333320305a272f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c706174682069643d27652720643d274d302031353063353720302035322d33302038362d36352033352d33342036342d33332036342d3835732d33302d35322d36342d3836632d33342d33332d33322d36342d38362d3634732d35322033312d3836203634632d33332033342d36342032372d36342038367333312035322036342038366333342033342032392036342038362036345a272f3e3c706174682069643d27302720643d274d323020373263313720302032302d31342032302d323056323163302d372d332d32312d32302d3231533020313420302032317633316330203620332032312032302032305a272f3e3c7061746820643d276d313420373120332d32326831306c2d3320323268376c342d3232683130762d364833356c322d3135683130762d36682d396c332d3232682d386c2d33203232682d396c332d3232682d386c2d332032324833763668396c2d322031354830763668394c362037317a272f3e3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b272077696474683d273130303027206865696768743d2731303030273e3c646566733e3c72616469616c4772616469656e742063783d27353025272063793d2732362e3425272066783d27353025272066793d2732362e34252720723d2738332e332527206772616469656e745472616e73666f726d3d276d6174726978282d2e3230373036202e3936353933202d312e3038313834202d2e3336323335202e39202d2e3129272069643d2763273e3c73746f702073746f702d636f6c6f723d272346464627206f66667365743d273025272f3e3c73746f702073746f702d636f6c6f723d272346464627206f66667365743d27363025272f3e3c73746f702073746f702d636f6c6f723d272330323327206f66667365743d2731303025272f3e3c2f72616469616c4772616469656e743ea26469706673582212201394907f3e8a330a7bdbfff9b75955872ccea8afd0d751659f1e2080db39c6ba64736f6c634300081100334552433732313a207472616e7366657220746f206e6f6e20455243373231526500000000000000000000000000000000000000000000000000038d7ea4c68000
Deployed Bytecode
0x60806040526004361061012a5760003560e01c806370a08231116100ab578063b88d4fde1161006f578063b88d4fde14610348578063c87b56dd14610368578063cb3f4cd714610388578063e322ad2b146103aa578063e985e9c5146103bf578063f437bc59146103df57600080fd5b806370a08231146102b157806376aed2e1146102d157806395d89b41146102fe5780639d1b464a14610313578063a22cb4651461032857600080fd5b806323b872dd116100f257806323b872dd146102045780633ccfd60b1461022457806342842e0e146102395780634465e7fa146102595780636352211e1461029157600080fd5b806301ffc9a71461012f57806306fdde0314610164578063081812fc14610186578063095ea7b3146101be5780630a8b866a146101e0575b600080fd5b34801561013b57600080fd5b5061014f61014a366004612286565b6103e7565b60405190151581526020015b60405180910390f35b34801561017057600080fd5b50610179610439565b60405161015b91906122fa565b34801561019257600080fd5b506101a66101a136600461230d565b6104cb565b6040516001600160a01b03909116815260200161015b565b3480156101ca57600080fd5b506101de6101d9366004612342565b6104f2565b005b3480156101ec57600080fd5b506101f660085481565b60405190815260200161015b565b34801561021057600080fd5b506101de61021f36600461236c565b61056a565b34801561023057600080fd5b506101de61059c565b34801561024557600080fd5b506101de61025436600461236c565b610697565b34801561026557600080fd5b5061014f6102743660046123a8565b6001600160a01b0316600090815260096020526040902054151590565b34801561029d57600080fd5b506101a66102ac36600461230d565b6106b7565b3480156102bd57600080fd5b506101f66102cc3660046123a8565b610717565b3480156102dd57600080fd5b506102f16102ec36600461230d565b61079d565b60405161015b91906123d9565b34801561030a57600080fd5b506101796107c8565b34801561031f57600080fd5b506101f66107d7565b34801561033457600080fd5b506101de610343366004612401565b610813565b34801561035457600080fd5b506101de610363366004612453565b61081e565b34801561037457600080fd5b5061017961038336600461230d565b610852565b34801561039457600080fd5b50336000908152600a60205260409020546101f6565b3480156103b657600080fd5b506101f661088f565b3480156103cb57600080fd5b5061014f6103da36600461252f565b61090f565b6101de61093d565b60006001600160e01b031982166380ac58cd60e01b148061041857506001600160e01b03198216635b5e139f60e01b145b8061043357506001600160e01b031982166301ffc9a760e01b145b92915050565b60606000805461044890612562565b80601f016020809104026020016040519081016040528092919081815260200182805461047490612562565b80156104c15780601f10610496576101008083540402835291602001916104c1565b820191906000526020600020905b8154815290600101906020018083116104a457829003601f168201915b5050505050905090565b60006104d682610a48565b506000908152600460205260409020546001600160a01b031690565b8060000361055c5760405162461bcd60e51b815260206004820152602c60248201527f546f573a2043616e277420617070726f7665207472616e73616374696f6e732060448201526b666f7220546865205472656560a01b60648201526084015b60405180910390fd5b6105668282610aa7565b5050565b808060000361058b5760405162461bcd60e51b81526004016105539061259c565b610596848484610bb7565b50505050565b60006105a661088f565b9050600081116105f85760405162461bcd60e51b815260206004820152601960248201527f546f573a204e6f2066756e647320746f207769746864726177000000000000006044820152606401610553565b60065433600090815260096020908152604080832093909355600a90529081208054839290610628908490612601565b9091555050604051339082156108fc029083906000818181858888f1935050505015801561065a573d6000803e3d6000fd5b5060408051338152602081018390527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364910160405180910390a150565b6106b28383836040518060200160405280600081525061081e565b505050565b6000818152600260205260408120546001600160a01b0316806104335760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610553565b60006001600160a01b0382166107815760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610553565b506001600160a01b031660009081526003602052604090205490565b6000816000036107af57506001919050565b60065482106107c057506000919050565b506002919050565b60606001805461044890612562565b60006006546001036107f757600a6008546107f2919061262a565b905090565b6008546001600654610809919061263e565b6107f29190612651565b610566338383610be8565b818060000361083f5760405162461bcd60e51b81526004016105539061259c565b61084b85858585610cb6565b5050505050565b606061085d82610a48565b60016108688361079d565b6002811115610879576108796123c3565b0361088657610433610ce8565b61043382610d9b565b336000908152600960205260408120548082036108ee5760405162461bcd60e51b815260206004820152601d60248201527f546f573a20596f75277665206e65766572206265656e206120686f73740000006044820152606401610553565b600854816006546108ff919061263e565b6109099190612651565b91505090565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600061094960006106b7565b33600090815260096020526040902054909150156109b55760405162461bcd60e51b815260206004820152602360248201527f546f573a20596f7527766520616c726561647920686f7374656420546865205460448201526272656560e81b6064820152608401610553565b6109bd6107d7565b3414610a0b5760405162461bcd60e51b815260206004820152601b60248201527f546f573a20546865207072696365206973206e6f7420726967687400000000006044820152606401610553565b610a1433610e1d565b60065433600081815260096020526040812092909255610a3691839190610e3f565b50565b6001600160a01b03163b151590565b6000818152600260205260409020546001600160a01b0316610a365760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610553565b6000610ab2826106b7565b9050806001600160a01b0316836001600160a01b031603610b1f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610553565b336001600160a01b0382161480610b3b5750610b3b813361090f565b610bad5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610553565b6106b28383610fdb565b610bc13382611049565b610bdd5760405162461bcd60e51b815260040161055390612668565b6106b2838383610e3f565b816001600160a01b0316836001600160a01b031603610c495760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610553565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610cc03383611049565b610cdc5760405162461bcd60e51b815260040161055390612668565b610596848484846110a8565b60606107f2610cfd610cf86110db565b6111b8565b610d28600060405180604001604052806008815260200167496e66696e69747960c01b8152506111e9565b610d4e600160405180604001604052806003815260200162105b1b60ea1b8152506111e9565b610d74600260405180604001604052806003815260200162105b1b60ea1b8152506111e9565b604051602001610d8794939291906126d2565b6040516020818303038152906040526112a0565b606080606080610daa856112bb565b91945092509050610e14610dbd86611410565b610dc687611410565b610dcf88611511565b610ddd610cf88a89896115eb565b610de86000876111e9565b610df360018a6111e9565b610dfe60028a6111e9565b604051602001610d879796959493929190612801565b95945050505050565b600654610e2a82826116ba565b600654610e38906001612601565b6006555050565b826001600160a01b0316610e52826106b7565b6001600160a01b031614610eb65760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610553565b6001600160a01b038216610f185760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610553565b610f23600082610fdb565b6001600160a01b0383166000908152600360205260408120805460019290610f4c90849061263e565b90915550506001600160a01b0382166000908152600360205260408120805460019290610f7a908490612601565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611010826106b7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611055836106b7565b9050806001600160a01b0316846001600160a01b0316148061107c575061107c818561090f565b806110a05750836001600160a01b0316611095846104cb565b6001600160a01b0316145b949350505050565b6110b3848484610e3f565b6110bf848484846116d4565b6105965760405162461bcd60e51b815260040161055390612936565b60606110e56117d5565b6111276040518060400160405280600481526020016311b3321b60e11b815250604051806040016040528060048152602001632364623560e01b8152506117f5565b61112f611823565b611137611846565b61113f611869565b6111676040518060400160405280600781526020016675726c2823632960c81b81525061188c565b61116f6118a1565b6040805180820190915260078152661e17b232b3399f60c91b60208201526040516020016111a4989796959493929190612988565b604051602081830303815290604052905090565b60606111c3826118c1565b6040516020016111d39190612be2565b6040516020818303038152906040529050919050565b6060600083156112535783600114611228576040518060400160405280600f81526020016e29b2b1b7b73230b93c9021b7b637b960891b815250611273565b6040518060400160405280600d81526020016c283934b6b0b93c9021b7b637b960991b815250611273565b604051806040016040528060068152602001650aecac2d8e8d60d31b8152505b90508083604051602001611288929190612c27565b60405160208183030381529060405291505092915050565b60606112ab826118c1565b6040516020016111d39190612c98565b6060808060006101686112cf866029612651565b6112d99190612cdd565b9050600060646112e98780612651565b6112f4906045612601565b6112fe9190612cdd565b90506000606461130f88603d612651565b6113199190612cdd565b90506000606461132a896096612601565b611335906003612651565b61133f9190612cdd565b90506000603283106113725760648261135960328661263e565b6113639190612651565b61136d919061262a565b61139f565b606482611380856032612601565b61138b90606461263e565b6113959190612651565b61139f919061262a565b90506000603284106113c657816113b760328661263e565b6113c1919061263e565b6113dc565b816113d2856032612601565b6113dc9190612601565b90506113e9868686611a26565b6113f4878784611a26565b6113fd84611410565b9850985098505050505050509193909250565b6060816000036114375750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611461578061144b81612cf1565b915061145a9050600a8361262a565b915061143b565b60008167ffffffffffffffff81111561147c5761147c61243d565b6040519080825280601f01601f1916602001820160405280156114a6576020820181803683370190505b5090505b84156110a0576114bb60018361263e565b91506114c8600a86612cdd565b6114d3906030612601565b60f81b8183815181106114e8576114e8612d0a565b60200101906001600160f81b031916908160001a90535061150a600a8661262a565b94506114aa565b606061151e600a83612cdd565b600114801561152e575081600b14155b156115515750506040805180820190915260028152611cdd60f21b602082015290565b61155c600a83612cdd565b600214801561156c575081600c14155b1561158f5750506040805180820190915260028152611b9960f21b602082015290565b61159a600a83612cdd565b60031480156115aa575081600d14155b156115cd5750506040805180820190915260028152611c9960f21b602082015290565b50506040805180820190915260028152610e8d60f31b602082015290565b60606115f56117d5565b6115ff84846117f5565b611607611823565b61160f611846565b6116188761188c565b61162189611a55565b6040805180820190915260078152661e17b232b3399f60c91b60208201526040516020016116559796959493929190612d20565b6040516020818303038152906040528383846116718887611b27565b6040516020016116849493929190612db2565b60408051601f19818403018152908290526116a292916020016130c9565b60405160208183030381529060405290509392505050565b610566828260405180602001604052806000815250611da0565b60006001600160a01b0384163b156117ca57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906117189033908990889088906004016130f8565b6020604051808303816000875af1925050508015611753575060408051601f3d908101601f1916820190925261175091810190613135565b60015b6117b0573d808015611781576040519150601f19603f3d011682016040523d82523d6000602084013e611786565b606091505b5080516000036117a85760405162461bcd60e51b815260040161055390612936565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110a0565b506001949350505050565b60606040518060a00160405280607481526020016146a860749139905090565b606082828460405160200161180c93929190613152565b604051602081830303815290604052905092915050565b606060405180610460016040528061043281526020016138c56104329139905090565b60606040518061022001604052806101f581526020016141ed6101f59139905090565b606060405180610140016040528061010f815260200161471c61010f9139905090565b606081826040516020016111d39291906132aa565b60606040518060c00160405280609b815260200161453f609b9139905090565b606081516000036118e057505060408051602081019091526000815290565b60006040518060600160405280604081526020016144ff604091399050600060038451600261190f9190612601565b611919919061262a565b611924906004612651565b90506000611933826020612601565b67ffffffffffffffff81111561194b5761194b61243d565b6040519080825280601f01601f191660200182016040528015611975576020820181803683370190505b509050818152600183018586518101602084015b818310156119e1576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101611989565b6003895106600181146119fb5760028114611a0c57611a18565b613d3d60f01b600119830152611a18565b603d60f81b6000198301525b509398975050505050505050565b6060611a3184611410565b611a3a84611410565b611a4384611410565b6040516020016116a2939291906133fb565b60606000611a6283611410565b90506000611a706000611dd3565b90506000805b8351811015611b1d5760006030858381518110611a9557611a95612d0a565b0160200151611aa7919060f81c61263e565b90508015611b0a57600081600914611abf5781611ac2565b60065b9050600184821c81161480611b075785611adb83611dd3565b604051602001611aec9291906130c9565b6040516020818303038152906040529550816001901b851794505b50505b5080611b1581612cf1565b915050611a76565b5090949350505050565b60606000611b3484611410565b90506000806040518060a001604052806075815260200161463360759139905060005b8351811015611d6957600081118015611ba25750611b9e84611b7a60018461263e565b81518110611b8a57611b8a612d0a565b01602001516001600160f81b031916611f4d565b6001145b15611bcb57611bba6020672b992ddfa23249d661262a565b611bc49084612601565b9250611beb565b611bde6019672b992ddfa23249d661262a565b611be89084612601565b92505b6000611c1d670de0b6b3a7640000611c0286611f5e565b611c0e906101a861347a565b611c1891906134aa565b611410565b90506000670de0b6b3a76400006816fc2e998d3da00000611c3d87612028565b611c49906101a861347a565b611c5391906134d8565b611c5d91906134aa565b90506000808212611c7657611c7182611410565b611ca5565b611c85611c188360001961347a565b604051602001611c9591906134ff565b6040516020818303038152906040525b9050611cbc878581518110611b8a57611b8a612d0a565b600903611d0957848382611ce0611cdb672b992ddfa23249d68b612601565b61203d565b604051602001611cf39493929190613528565b6040516020818303038152906040529450611d53565b84611d22611c18898781518110611b8a57611b8a612d0a565b8483611d2d8a61203d565b604051602001611d4195949392919061360d565b60405160208183030381529060405294505b5050508080611d6190612cf1565b915050611b57565b50611d748286612060565b81604051602001611d869291906136f3565b604051602081830303815290604052935050505092915050565b611daa838361212e565b611db760008484846116d4565b6106b25760405162461bcd60e51b815260040161055390612936565b606081600003611dfc576040518060800160405280605981526020016145da6059913992915050565b81600103611e23576040518060600160405280602781526020016143e26027913992915050565b81600203611e4a576040518060800160405280605981526020016144096059913992915050565b81600303611e71576040518060800160405280605f8152602001613d8a605f913992915050565b81600403611e9857604051806060016040528060398152602001613d516039913992915050565b81600503611ebf576040518060a001604052806068815260200161385d6068913992915050565b81600603611ee6576040518060a00160405280606e8152602001614491606e913992915050565b81600703611f0d576040518060600160405280602f8152602001614462602f913992915050565b81600803611f34576040518060800160405280605a8152602001613cf7605a913992915050565b611f3d82611410565b6040516020016111d39190613731565b6000610433603060f884901c61263e565b6757325bbf446493ac9081900663400000000204600061ffff600483901c1660ff601484901c16631000000084161563200000008516151581611fa35760ff92909203915b60006040518061044001604052806104048152602001613de9610404913960046002860102818101519192509063ffffffff602082901c8116908216818103890260101c600088611ff657818303611ffa565b8184015b90508715612006576000035b637fffffff670de0b6b3a76400008202059d9c50505050505050505050505050565b60006104336715cc96efd11924eb8301611f5e565b6060610433672b992ddfa23249d66120568460b4612651565b611c18919061262a565b6060600060026120796020672b992ddfa23249d661262a565b6120839086612601565b61208d919061262a565b9050600061209a82611f5e565b6120a6906101a861347a565b6120b990681b1ae4d6e2ef5000006134d8565b905060006120c683612028565b6120d2906101a861347a565b6120e5906819cdd3b60b3df00000613772565b9050846120fd611c18670de0b6b3a76400008561262a565b612112611c18670de0b6b3a76400008561262a565b61211b8661203d565b604051602001611d86949392919061379a565b6001600160a01b0382166121845760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610553565b6000818152600260205260409020546001600160a01b0316156121e95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610553565b6001600160a01b0382166000908152600360205260408120805460019290612212908490612601565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610a3657600080fd5b60006020828403121561229857600080fd5b81356122a381612270565b9392505050565b60005b838110156122c55781810151838201526020016122ad565b50506000910152565b600081518084526122e68160208601602086016122aa565b601f01601f19169290920160200192915050565b6020815260006122a360208301846122ce565b60006020828403121561231f57600080fd5b5035919050565b80356001600160a01b038116811461233d57600080fd5b919050565b6000806040838503121561235557600080fd5b61235e83612326565b946020939093013593505050565b60008060006060848603121561238157600080fd5b61238a84612326565b925061239860208501612326565b9150604084013590509250925092565b6000602082840312156123ba57600080fd5b6122a382612326565b634e487b7160e01b600052602160045260246000fd5b60208101600383106123fb57634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561241457600080fd5b61241d83612326565b91506020830135801515811461243257600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561246957600080fd5b61247285612326565b935061248060208601612326565b925060408501359150606085013567ffffffffffffffff808211156124a457600080fd5b818701915087601f8301126124b857600080fd5b8135818111156124ca576124ca61243d565b604051601f8201601f19908116603f011681019083821181831017156124f2576124f261243d565b816040528281528a602084870101111561250b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561254257600080fd5b61254b83612326565b915061255960208401612326565b90509250929050565b600181811c9082168061257657607f821691505b60208210810361259657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602f908201527f546f573a2043616e206f6e6c79207472616e73666572206279207573696e672060408201526e1d1a19481a1bdcdd081b595d1a1bd9608a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610433576104336125eb565b634e487b7160e01b600052601260045260246000fd5b60008261263957612639612614565b500490565b81810381811115610433576104336125eb565b8082028115828204841417610433576104336125eb565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b600081516126c88185602086016122aa565b9290920192915050565b7f7b226e616d65223a225468652054726565222c226465736372697074696f6e2281527f3a2254686520547265652077696c6c20737072656164207765616c746820746f60208201527f2077686f65766572206d617920686176652065766572206f776e65642069742e6040820152601160f91b606082015269161134b6b0b3b2911d1160b11b60618201526000855161277381606b850160208a016122aa565b6f222c2261747472696275746573223a5b60801b606b9184019182015285516127a381607b840160208a016122aa565b600b60fa1b607b929091019182015284516127c581607c8401602089016122aa565b6127f56127e76127e1607c84860101600b60fa1b815260010190565b876126b6565b615d7d60f01b815260020190565b98975050505050505050565b747b226e616d65223a22486f737420746f6b656e202360581b81528751600090612832816015850160208d016122aa565b7f222c226465736372697074696f6e223a22486f6e6f7220746f20746865200000601591840191820152885161286f816033840160208d016122aa565b8851910190612885816033840160208c016122aa565b7f20686f7374206f66205468652054726565206f66205765616c746822000000006033929091019182015269161134b6b0b3b2911d1160b11b604f82015286516128d6816059840160208b016122aa565b70222c202261747472696275746573223a5b60781b605992909101918201526129286127e761292261290f61291c81606a87018c6126b6565b600b60fa1b815260010190565b896126b6565b866126b6565b9a9950505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008951602061299b8285838f016122aa565b8a51918401916129ae8184848f016122aa565b8a519201916129c08184848e016122aa565b89519201916129d28184848d016122aa565b88519201916129e48184848c016122aa565b87519201916129f68184848b016122aa565b8651920191612a088184848a016122aa565b8551920191612a1a81848489016122aa565b7f3c706174682066696c6c3d27233431322720643d274d3020306831303030763692019182527f393848307a272f3e3c75736520786c696e6b3a687265663d272365272066696c908201527f6c3d272338323527207472616e73666f726d3d27726f74617465282d3220323760408201527f333339202d31343936372e3129207363616c65283729272f3e3c75736520786c60608201527f696e6b3a687265663d272365272066696c6c3d272339333827207472616e736660808201527f6f726d3d27726f74617465282d31302034303236202d323537332e322920736360a08201527f616c65283429272f3e3c75736520786c696e6b3a687265663d2723652720666960c08201527f6c6c3d272364386227207472616e73666f726d3d27726f74617465283130202d60e08201527f333038322e3220333134352e3629207363616c6528322e3229272f3e3c6369726101008201527f636c652066696c6c3d2723303233272063783d27353030272063793d273133366101208201527f352720723d27373134272f3e3c75736520786c696e6b3a687265663d2723662761014082015267179f1e17b9bb339f60c11b610160820152610168019a9950505050505050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000815260008251612c1a81601a8501602087016122aa565b91909101601a0192915050565b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090612c5281600f8501602088016122aa565b6a1116113b30b63ab2911d1160a91b600f918401918201528351612c7d81601a8401602088016122aa565b61227d60f01b601a9290910191820152601c01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612cd081601d8501602087016122aa565b91909101601d0192915050565b600082612cec57612cec612614565b500690565b600060018201612d0357612d036125eb565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600088516020612d338285838e016122aa565b895191840191612d468184848e016122aa565b8951920191612d588184848d016122aa565b8851920191612d6a8184848c016122aa565b8751920191612d7c8184848b016122aa565b8651920191612d8e8184848a016122aa565b8551920191612da081848489016122aa565b919091019a9950505050505050505050565b7f3c636972636c652063783d27353030272063793d273530302720723d273530308152600067272066696c6c3d2760c01b8060208401528651612dfc816028860160208b016122aa565b80840190506213979f60e91b8060288301527f3c636972636c652063783d27353030272063793d273530302720723d27333730602b83015282604b83015287519250612e4f836053840160208b016122aa565b828201925080605384015250507f3c75736520786c696e6b3a687265663d27236627207472616e73666f726d3d2760568201527f6d6174726978282e363820302030202e3638203136302e352031383329272f3e6076820152683c672066696c6c3d2760b81b60968201526130be6130ac612922612ed0609f8501896126b6565b7f27207472616e73666f726d3d277472616e736c6174652834373620333229273e81527f3c7061746820643d276d2d37392038322d362d33302032382d3620362033312060208201527f31312d332d31352d36392d3131203220362033302d323720362d362d33302d3160408201527f3120322031352037307a272f3e3c75736520786c696e6b3a687265663d27233060608201527f27207472616e73666f726d3d277363616c6528312e3320312920726f7461746560808201527f282d33202d31312e35203434302e3629272f3e3c7061746820643d274d36342060a08201527f373363333120342033372d333620372d34312d32362d332d32302d32322d362d60c08201527f323020372030203132203220313820366c362d3961343020343020302030203060e08201527f2d32332d38632d333420302d33312033382d32203431203232203220323120326101008201527f3120302032316133312033312030203020312d32302d386c2d372038613436206101208201527f34362030203020302032372031305a6d36302031302031332d363020313920356101408201527f20332d31302d34392d31312d32203920313920352d31342036307a272f3e3c2f61016082015261339f60f11b6101808201526101820190565b651e17b9bb339f60d11b815260060190565b979650505050505050565b600083516130db8184602088016122aa565b8351908301906130ef8183602088016122aa565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061312b908301846122ce565b9695505050505050565b60006020828403121561314757600080fd5b81516122a381612270565b7f3c672069643d2761273e3c636972636c652066696c6c3d27000000000000000081526000845161318a8160188501602089016122aa565b7f272063783d273235272063793d2732352720723d273235272f3e3c636972636c60189184019182015267652066696c6c3d2760c01b603882015284516131d88160408401602089016122aa565b7f272063783d273235272063793d2732352720723d273139272f3e3c7061746820604092909101918201527f643d276d33302033362d352d352d342035632d3220322d382d352d372d366c3560608201527f2d352d352d34632d312d3220352d3820372d376c34203520352d3563312d312060808201527f382035203620376c2d35203420352035633220312d3520382d3620365a27206660a082015264696c6c3d2760d81b60c082015261329060c58201856126b6565b6613979f1e17b39f60c91b81526007019695505050505050565b7f3c672069643d2766273e3c75736520786c696e6b3a687265663d272362272066815264696c6c3d2760d81b6020820152600083516132f08160258501602088016122aa565b7f272f3e3c75736520786c696e6b3a687265663d272362272066696c6c3d270000602591840191820152835161332d8160438401602088016122aa565b7f27207472616e73666f726d3d276d6174726978282d3120302030203120393932604392909101918201527f203029272f3e3c75736520786c696e6b3a687265663d27236427207472616e7360638201527f666f726d3d276d6174726978282d312030203020312031303231202d3235292760838201527f2f3e3c75736520786c696e6b3a687265663d27236427207472616e73666f726d60a38201527f3d277472616e736c617465282d3235202d323529272f3e3c2f673e000000000060c382015260de01949350505050565b630d0e6d8560e31b81526000845161341a8160048501602089016122aa565b600b60fa1b600491840191820152845161343b8160058401602089016122aa565b61094b60f21b60059290910191820152835161345e8160078401602088016122aa565b61252960f01b6007929091019182015260090195945050505050565b80820260008212600160ff1b84141615613496576134966125eb565b8181058314821517610433576104336125eb565b6000826134b9576134b9612614565b600160ff1b8214600019841416156134d3576134d36125eb565b500590565b81810360008312801583831316838312821617156134f8576134f86125eb565b5092915050565b602d60f81b81526000825161351b8160018501602087016122aa565b9190910160010192915050565b6000855161353a818460208a016122aa565b80830190507f3c75736520786c696e6b3a687265663d27233627207472616e73666f726d3d278152690e8e4c2dce6d8c2e8ca560b31b6020820152855161358881602a840160208a016122aa565b600160fd1b602a929091019182015284516135aa81602b8401602089016122aa565b692920726f74617465282d60b01b602b929091019182015283516135d58160358401602088016122aa565b7f29207472616e736c617465282d3430202d373029272f3e00000000000000000060359290910191820152604c019695505050505050565b6000865161361f818460208b016122aa565b713c75736520786c696e6b3a687265663d272360701b908301908152865161364e816012840160208b016122aa565b7604e40e8e4c2dce6ccdee4da7a4ee8e4c2dce6d8c2e8ca5604b1b601292909101918201528551613686816029840160208a016122aa565b600160fd1b6029929091019182015284516136a881602a8401602089016122aa565b692920726f74617465282d60b01b602a929091019182015283516136d38160348401602088016122aa565b631493979f60e11b60349290910191820152603801979650505050505050565b600083516137058184602088016122aa565b8351908301906137198183602088016122aa565b631e17b39f60e11b9101908152600401949350505050565b6b1e339034b21e93b2b93937b960a11b81526000825161375881600c8501602087016122aa565b6213979f60e91b600c939091019283015250600f01919050565b8082018281126000831280158216821582161715613792576137926125eb565b505092915050565b683c672066696c6c3d2760b81b81526000855160206137bf8260098601838b016122aa565b7604e40e8e4c2dce6ccdee4da7a4ee8e4c2dce6d8c2e8ca5604b1b60099285019283015286516137f481838501848b016122aa565b600b60fa1b920181810192909252855161381481602185018985016122aa565b6805240e4dee8c2e8ca560bb1b60219390910192830152845161383d81602a85018489016122aa565b6214939f60e91b602a939091019283015250602d01969550505050505056fe3c706174682069643d27352720643d274d343120343763302d3320322d33322d33302d3231563130683238563048317634306332302d31312033302d39203239203620302032332d32302031372d32302037483063302032352034312032372034312d365a272f3e3c672069643d2764273e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283439382032373929272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283532382032323729272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283537322031383629272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283632392031363329272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283638382031363429272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283734392031383629272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283638332032333529272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283632332032343629272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283734322032353729272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283538352032393629272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283634392033373029272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283731342033373329272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283737342033393729272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283834342033373429272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283738362033323129272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283832332034343729272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283639342034373229272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283735302034393929272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283737312035353329272f3e3c75736520786c696e6b3a687265663d27236127207472616e73666f726d3d277472616e736c617465283833382035323429272f3e3c2f673e3c706174682069643d27382720643d274d323120373263323220302032372d32372031332d333720382d362031302d33352d31332d3335432d3320302d3120323920372033352d362034352d322037322032312037325a272f3e3c706174682069643d27342720643d274d34302037315634366c2d323920354c333520304832344c302035317631306833307631307a272f3e3c706174682069643d27332720643d274d33332033344335382d3520302d31302030203138683131632d312d31362033392d38203520313620333420313420322034302d36203139483063312033302036322031392033332d31395a272f3e0000000000c90f8801921d20025b26d703242abf03ed26e604b6195d057f00350647d97c0710a34507d95b9e08a2009a096a90490a3308bc0afb68050bc3ac350c8bd35e0d53db920e1bc2e40ee387660fab272b1072a0481139f0cf120116d512c8106e138edbb1145576b1151bdf8515e2144416a81305176dd9de183366e818f8b83c19bdcbf31a82a0251b4732ef1c0b826a1ccf8cb31d934fe51e56ca1e1f19f97b1fdcdc1b209f701c2161b39f2223a4c522e541af23a6887e2467775725280c5d25e845b626a8218527679df42826b92828e5714a29a3c4852a61b1012b1f34eb2bdc4e6f2c98fbba2d553afb2e110a622ecc681e2f8752623041c76030fbc54d31b54a5d326e54c73326e2c233def2873496824f354d905636041ad936ba2013376f9e46382493b038d8fe93398cdd323a402dd13af2eeb73ba51e293c56ba703d07c1d53db832a53e680b2c3f1749b73fc5ec974073f21d4121589a41ce1e64427a41d04325c13543d09aec447acd50452456bc45cd358f46756827471cece647c3c22e4869e664490f57ee49b415334a581c9d4afb6c974b9e038f4c3fdff34ce100344d8162c34e2106174ebfe8a44f5e08e24ffb654c5097fc5e5133cc9451ced46e5269126e53028517539b2aef5433027d54ca0a4a556040e255f5a4d2568a34a9571deef957b0d2555842dd5458d40e8c5964649759f3de125a8279995b1035ce5b9d11535c290acc5cb420df5d3e52365dc79d7b5e50015d5ed77c895f5e0db25fe3b38d60686cce60ec382f616f146b61f1003e6271fa6862f201ac637114cc63ef328f646c59bf64e889256563bf9165ddfbd266573cbb66cf811f6746c7d767bd0fbc683257aa68a69e806919e31f698c246b69fd614a6a6d98a36adcc9646b4af2786bb812d06c24295f6c8f351b6cf934fb6d6227f96dca0d146e30e3496e96a99c6efb5f116f5f02b16fc1938470231099708378fe70e2cbc571410804719e2cd171fa394872552c8472af05a67307c3cf735f662573b5ebd0740b53fa745f9dd074b2c8837504d3447555bd4b75a585ce75f42c0a7641af3c768e0ea576d9498877235f2c776c4eda77b417df77fab988784033287884841378c7aba17909a92c794a7c11798a23b079c89f6d7a05eeac7a4210d87a7d055a7ab6cba37aef63237b26cb4e7b5d039d7b920b887bc5e28f7bf8882f7c29fbed7c5a3d4f7c894bdd7cb727237ce3ceb17d0f42177d3980eb7d628ac57d8a5f3f7db0fdf77dd6668e7dfa98a77e1d93e97e3f57fe7e5fe4927e7f39567e9d55fb7eba3a387ed5e5c57ef0585f7f0991c37f2191b37f3857f57f4de4507f62368e7f754e7f7f872bf27f97cebc7fa736b37fb563b27fc255957fce0c3d7fd8878d7fe1c76a7fe9cbbf7ff094777ff621817ffa72d07ffd88597fff62157fffffff3c7061746820643d274d343234203231396333322032392036312037302037342031333476333036632d313520302d343120392d34352031372d34362038342d3632203136312d3632203236342030203139203120343120332036304832373563352d3133302034372d323339203133302d33323820382d392d31352d392d32382d3761373836203738362030203020302d3334203720353138203531382030203020302d3231392033323848336135313920353139203020302031203234362d3330304331353720373335203634203739382d3620383635762d31316c322d326137333220373332203020302031203334352d3231326332392d382034392d35392034392d393020302d35332d32302d3130332d39332d3130332d373220302d313239203130332d3737203134382d38382d33322d31352d3136372038352d313637203632203020393820313920313136203439762d3163332d313620332d333320332d33392d312d34342d32372d38382d38342d3933732d3134362031332d3139322039346332372d3939203133332d313238203139322d313235203534203220313038203337203132352039322d342d37322d33342d3133352d35392d3136342d32392d33332d3130362d35342d31383120372032312d3536203133332d3930203139392d32395a272069643d2762272f3e3c706174682069643d27312720643d274d3230203731563048306c31302031317636307a272f3e3c706174682069643d27322720643d274d34312037305636304831346c32332d32384335382d3220302d3133203020313968313063302d31372033322d38203138203743382034382d3220363320302037306834315a272f3e3c706174682069643d27372720643d274d3136203731203435203048306c31302031306831394c352037317a272f3e3c706174682069643d27362720643d274d333320304832314c352033336c2d3120332d312031632d3320382d3620313820312032372033203620313720313320333020322031302d3820382d323420352d32392d382d31312d32302d382d32312d37762d314c333320305a272f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c706174682069643d27652720643d274d302031353063353720302035322d33302038362d36352033352d33342036342d33332036342d3835732d33302d35322d36342d3836632d33342d33332d33322d36342d38362d3634732d35322033312d3836203634632d33332033342d36342032372d36342038367333312035322036342038366333342033342032392036342038362036345a272f3e3c706174682069643d27302720643d274d323020373263313720302032302d31342032302d323056323163302d372d332d32312d32302d3231533020313420302032317633316330203620332032312032302032305a272f3e3c7061746820643d276d313420373120332d32326831306c2d3320323268376c342d3232683130762d364833356c322d3135683130762d36682d396c332d3232682d386c2d33203232682d396c332d3232682d386c2d332032324833763668396c2d322031354830763668394c362037317a272f3e3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b272077696474683d273130303027206865696768743d2731303030273e3c646566733e3c72616469616c4772616469656e742063783d27353025272063793d2732362e3425272066783d27353025272066793d2732362e34252720723d2738332e332527206772616469656e745472616e73666f726d3d276d6174726978282d2e3230373036202e3936353933202d312e3038313834202d2e3336323335202e39202d2e3129272069643d2763273e3c73746f702073746f702d636f6c6f723d272346464627206f66667365743d273025272f3e3c73746f702073746f702d636f6c6f723d272346464627206f66667365743d27363025272f3e3c73746f702073746f702d636f6c6f723d272330323327206f66667365743d2731303025272f3e3c2f72616469616c4772616469656e743ea26469706673582212201394907f3e8a330a7bdbfff9b75955872ccea8afd0d751659f1e2080db39c6ba64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000038d7ea4c68000
-----Decoded View---------------
Arg [0] : _priceRaise (uint256): 1000000000000000
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Deployed Bytecode Sourcemap
50510:4784:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39557:325;;;;;;;;;;-1:-1:-1;39557:325:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;39557:325:0;;;;;;;;40504:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41529:171::-;;;;;;;;;;-1:-1:-1;41529:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1719:32:1;;;1701:51;;1689:2;1674:18;41529:171:0;1555:203:1;53011:177:0;;;;;;;;;;-1:-1:-1;53011:177:0;;;;;:::i;:::-;;:::i;:::-;;50985:25;;;;;;;;;;;;;;;;;;;2346::1;;;2334:2;2319:18;50985:25:0;2200:177:1;52330:160:0;;;;;;;;;;-1:-1:-1;52330:160:0;;;;;:::i;:::-;;:::i;54023:483::-;;;;;;;;;;;;;:::i;42632:185::-;;;;;;;;;;-1:-1:-1;42632:185:0;;;;;:::i;:::-;;:::i;55006:107::-;;;;;;;;;;-1:-1:-1;55006:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;55083:20:0;55063:4;55083:20;;;:14;:20;;;;;;:24;;;55006:107;40215:222;;;;;;;;;;-1:-1:-1;40215:222:0;;;;;:::i;:::-;;:::i;39946:207::-;;;;;;;;;;-1:-1:-1;39946:207:0;;;;;:::i;:::-;;:::i;51744:213::-;;;;;;;;;;-1:-1:-1;51744:213:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40673:104::-;;;;;;;;;;;;;:::i;54841:159::-;;;;;;;;;;;;;:::i;41772:153::-;;;;;;;;;;-1:-1:-1;41772:153:0;;;;;:::i;:::-;;:::i;52555:195::-;;;;;;;;;;-1:-1:-1;52555:195:0;;;;;:::i;:::-;;:::i;51963:306::-;;;;;;;;;;-1:-1:-1;51963:306:0;;;;;:::i;:::-;;:::i;55119:106::-;;;;;;;;;;-1:-1:-1;55208:10:0;55168:7;55191:28;;;:16;:28;;;;;;55119:106;;54579:256;;;;;;;;;;;;;:::i;41996:164::-;;;;;;;;;;-1:-1:-1;41996:164:0;;;;;:::i;:::-;;:::i;53285:615::-;;;:::i;39557:325::-;39651:4;-1:-1:-1;;;;;;39688:40:0;;-1:-1:-1;;;39688:40:0;;:105;;-1:-1:-1;;;;;;;39745:48:0;;-1:-1:-1;;;39745:48:0;39688:105;:162;;;-1:-1:-1;;;;;;;39810:40:0;;-1:-1:-1;;;39810:40:0;39688:162;39668:182;39557:325;-1:-1:-1;;39557:325:0:o;40504:100::-;40558:13;40591:5;40584:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40504:100;:::o;41529:171::-;41605:7;41625:23;41640:7;41625:14;:23::i;:::-;-1:-1:-1;41668:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;41668:24:0;;41529:171::o;53011:177::-;53088:7;53099:1;53088:12;53080:69;;;;-1:-1:-1;;;53080:69:0;;5864:2:1;53080:69:0;;;5846:21:1;5903:2;5883:18;;;5876:30;5942:34;5922:18;;;5915:62;-1:-1:-1;;;5993:18:1;;;5986:42;6045:19;;53080:69:0;;;;;;;;;53156:26;53170:2;53174:7;53156:13;:26::i;:::-;53011:177;;:::o;52330:160::-;52415:7;52876;52887:1;52876:12;52868:73;;;;-1:-1:-1;;;52868:73:0;;;;;;;:::i;:::-;52447:37:::1;52466:4;52472:2;52476:7;52447:18;:37::i;:::-;52330:160:::0;;;;:::o;54023:483::-;54057:18;54078:21;:19;:21::i;:::-;54057:42;;54130:1;54117:10;:14;54108:53;;;;-1:-1:-1;;;54108:53:0;;6693:2:1;54108:53:0;;;6675:21:1;6732:2;6712:18;;;6705:30;6771:27;6751:18;;;6744:55;6816:18;;54108:53:0;6491:349:1;54108:53:0;54253:12;;54239:10;54224:26;;;;:14;:26;;;;;;;;:41;;;;54317:16;:28;;;;;:42;;54349:10;;54224:26;54317:42;;54349:10;;54317:42;:::i;:::-;;;;-1:-1:-1;;54395:40:0;;54403:10;;54395:40;;;;;54424:10;;54395:40;;;;54424:10;54403;54395:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54468:32:0;;;54477:10;7281:51:1;;7363:2;7348:18;;7341:34;;;54468:32:0;;7254:18:1;54468:32:0;;;;;;;54050:456;54023:483::o;42632:185::-;42770:39;42787:4;42793:2;42797:7;42770:39;;;;;;;;;;;;:16;:39::i;:::-;42632:185;;;:::o;40215:222::-;40287:7;40323:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40323:16:0;;40350:56;;;;-1:-1:-1;;;40350:56:0;;7588:2:1;40350:56:0;;;7570:21:1;7627:2;7607:18;;;7600:30;-1:-1:-1;;;7646:18:1;;;7639:54;7710:18;;40350:56:0;7386:348:1;39946:207:0;40018:7;-1:-1:-1;;;;;40046:19:0;;40038:73;;;;-1:-1:-1;;;40038:73:0;;7941:2:1;40038:73:0;;;7923:21:1;7980:2;7960:18;;;7953:30;8019:34;7999:18;;;7992:62;-1:-1:-1;;;8070:18:1;;;8063:39;8119:19;;40038:73:0;7739:405:1;40038:73:0;-1:-1:-1;;;;;;40129:16:0;;;;;:9;:16;;;;;;;39946:207::o;51744:213::-;51804:9;51828:7;51839:1;51828:12;51824:38;;-1:-1:-1;51849:13:0;;51744:213;-1:-1:-1;51744:213:0:o;51824:38::-;51886:12;;51875:7;:23;51871:50;;-1:-1:-1;51907:14:0;;51744:213;-1:-1:-1;51744:213:0:o;51871:50::-;-1:-1:-1;51937:14:0;;51744:213;-1:-1:-1;51744:213:0:o;40673:104::-;40729:13;40762:7;40755:14;;;;;:::i;54841:159::-;54885:7;54905:12;;54921:1;54905:17;54901:48;;54946:2;54933:10;;:15;;;;:::i;:::-;54925:24;;54841:159;:::o;54901:48::-;54984:10;;54979:1;54964:12;;:16;;;;:::i;:::-;54963:31;;;;:::i;41772:153::-;41867:50;41886:10;41898:8;41908;41867:18;:50::i;52555:195::-;52664:7;52876;52887:1;52876:12;52868:73;;;;-1:-1:-1;;;52868:73:0;;;;;;;:::i;:::-;52696:48:::1;52719:4;52725:2;52729:7;52738:5;52696:22;:48::i;:::-;52555:195:::0;;;;;:::o;51963:306::-;52056:13;52081:23;52096:7;52081:14;:23::i;:::-;52142:13;52117:21;52130:7;52117:12;:21::i;:::-;:38;;;;;;;;:::i;:::-;;52113:97;;52177:23;:21;:23::i;52113:97::-;52227:36;52255:7;52227:27;:36::i;54579:256::-;54684:10;54630:7;54669:26;;;:14;:26;;;;;;54713:17;;;54704:61;;;;-1:-1:-1;;;54704:61:0;;8914:2:1;54704:61:0;;;8896:21:1;8953:2;8933:18;;;8926:30;8992:31;8972:18;;;8965:59;9041:18;;54704:61:0;8712:353:1;54704:61:0;54819:10;;54803:12;54788;;:27;;;;:::i;:::-;54787:42;;;;:::i;:::-;54780:49;;;54579:256;:::o;41996:164::-;-1:-1:-1;;;;;42117:25:0;;;42093:4;42117:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;41996:164::o;53285:615::-;53323:19;53345:10;53353:1;53345:7;:10::i;:::-;53453;53438:26;;;;:14;:26;;;;;;53323:32;;-1:-1:-1;53438:31:0;53430:80;;;;-1:-1:-1;;;53430:80:0;;9272:2:1;53430:80:0;;;9254:21:1;9311:2;9291:18;;;9284:30;9350:34;9330:18;;;9323:62;-1:-1:-1;;;9401:18:1;;;9394:33;9444:19;;53430:80:0;9070:399:1;53430:80:0;53606:14;:12;:14::i;:::-;53593:9;:27;53585:68;;;;-1:-1:-1;;;53585:68:0;;9676:2:1;53585:68:0;;;9658:21:1;9715:2;9695:18;;;9688:30;9754:29;9734:18;;;9727:57;9801:18;;53585:68:0;9474:351:1;53585:68:0;53689:16;53694:10;53689:4;:16::i;:::-;53806:12;;53792:10;53777:26;;;;:14;:26;;;;;:41;;;;53857:37;;53867:11;;53792:10;53857:9;:37::i;:::-;53316:584;53285:615::o;25176:326::-;-1:-1:-1;;;;;25471:19:0;;:23;;;25176:326::o;48676:135::-;44781:4;44805:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44805:16:0;48750:53;;;;-1:-1:-1;;;48750:53:0;;7588:2:1;48750:53:0;;;7570:21:1;7627:2;7607:18;;;7600:30;-1:-1:-1;;;7646:18:1;;;7639:54;7710:18;;48750:53:0;7386:348:1;41050:413:0;41131:13;41147:23;41162:7;41147:14;:23::i;:::-;41131:39;;41195:5;-1:-1:-1;;;;;41189:11:0;:2;-1:-1:-1;;;;;41189:11:0;;41181:57;;;;-1:-1:-1;;;41181:57:0;;10032:2:1;41181:57:0;;;10014:21:1;10071:2;10051:18;;;10044:30;10110:34;10090:18;;;10083:62;-1:-1:-1;;;10161:18:1;;;10154:31;10202:19;;41181:57:0;9830:397:1;41181:57:0;41273:10;-1:-1:-1;;;;;41273:19:0;;;;:58;;;41296:35;41313:5;41320:10;41296:16;:35::i;:::-;41251:170;;;;-1:-1:-1;;;41251:170:0;;10434:2:1;41251:170:0;;;10416:21:1;10473:2;10453:18;;;10446:30;10512:34;10492:18;;;10485:62;10583:32;10563:18;;;10556:60;10633:19;;41251:170:0;10232:426:1;41251:170:0;41434:21;41443:2;41447:7;41434:8;:21::i;42227:334::-;42422:39;42441:10;42453:7;42422:18;:39::i;:::-;42414:98;;;;-1:-1:-1;;;42414:98:0;;;;;;;:::i;:::-;42525:28;42535:4;42541:2;42545:7;42525:9;:28::i;48272:315::-;48427:8;-1:-1:-1;;;;;48418:17:0;:5;-1:-1:-1;;;;;48418:17:0;;48410:55;;;;-1:-1:-1;;;48410:55:0;;11280:2:1;48410:55:0;;;11262:21:1;11319:2;11299:18;;;11292:30;11358:27;11338:18;;;11331:55;11403:18;;48410:55:0;11078:349:1;48410:55:0;-1:-1:-1;;;;;48476:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;48476:46:0;;;;;;;;;;48538:41;;540::1;;;48538::0;;513:18:1;48538:41:0;;;;;;;48272:315;;;:::o;42888:321::-;43062:39;43081:10;43093:7;43062:18;:39::i;:::-;43054:98;;;;-1:-1:-1;;;43054:98:0;;;;;;;:::i;:::-;43163:38;43177:4;43183:2;43187:7;43196:4;43163:13;:38::i;9151:390::-;9199:13;9228:307;9379:19;9386:11;:9;:11::i;:::-;9379:6;:19::i;:::-;9434:23;9443:1;9434:23;;;;;;;;;;;;;-1:-1:-1;;;9434:23:0;;;:8;:23::i;:::-;9471:18;9480:1;9471:18;;;;;;;;;;;;;-1:-1:-1;;;9471:18:0;;;:8;:18::i;:::-;9503;9512:1;9503:18;;;;;;;;;;;;;-1:-1:-1;;;9503:18:0;;;:8;:18::i;:::-;9232:302;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9228:3;:307::i;9547:624::-;9613:13;9634:20;9661;9688;9742:18;9752:7;9742:9;:18::i;:::-;9715:45;;-1:-1:-1;9715:45:0;-1:-1:-1;9715:45:0;-1:-1:-1;9776:389:0;9830:18;:7;:16;:18::i;:::-;9891;:7;:16;:18::i;:::-;9911:19;9922:7;9911:10;:19::i;:::-;9985:43;9992:35;10003:7;10012:6;10020;9992:10;:35::i;9985:43::-;10065:20;10074:1;10077:6;10065:8;:20::i;:::-;10099:19;10108:1;10111:6;10099:8;:19::i;:::-;10132;10141:1;10144:6;10132:8;:19::i;:::-;9780:384;;;;;;;;;;;;;;:::i;9776:389::-;9769:396;9547:624;-1:-1:-1;;;;;9547:624:0:o;51520:218::-;51587:12;;51629:28;51639:6;51587:12;51629:9;:28::i;:::-;51716:12;;:16;;51731:1;51716:16;:::i;:::-;51701:12;:31;-1:-1:-1;;51520:218:0:o;47314:522::-;47473:4;-1:-1:-1;;;;;47446:31:0;:23;47461:7;47446:14;:23::i;:::-;-1:-1:-1;;;;;47446:31:0;;47438:81;;;;-1:-1:-1;;;47438:81:0;;16494:2:1;47438:81:0;;;16476:21:1;16533:2;16513:18;;;16506:30;16572:34;16552:18;;;16545:62;-1:-1:-1;;;16623:18:1;;;16616:35;16668:19;;47438:81:0;16292:401:1;47438:81:0;-1:-1:-1;;;;;47538:16:0;;47530:65;;;;-1:-1:-1;;;47530:65:0;;16900:2:1;47530:65:0;;;16882:21:1;16939:2;16919:18;;;16912:30;16978:34;16958:18;;;16951:62;-1:-1:-1;;;17029:18:1;;;17022:34;17073:19;;47530:65:0;16698:400:1;47530:65:0;47660:29;47677:1;47681:7;47660:8;:29::i;:::-;-1:-1:-1;;;;;47702:15:0;;;;;;:9;:15;;;;;:20;;47721:1;;47702:15;:20;;47721:1;;47702:20;:::i;:::-;;;;-1:-1:-1;;;;;;;47733:13:0;;;;;;:9;:13;;;;;:18;;47750:1;;47733:13;:18;;47750:1;;47733:18;:::i;:::-;;;;-1:-1:-1;;47762:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;47762:21:0;-1:-1:-1;;;;;47762:21:0;;;;;;;;;47801:27;;47762:16;;47801:27;;;;;;;47314:522;;;:::o;47955:174::-;48030:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;48030:29:0;-1:-1:-1;;;;;48030:29:0;;;;;;;;:24;;48084:23;48030:24;48084:14;:23::i;:::-;-1:-1:-1;;;;;48075:46:0;;;;;;;;;;;47955:174;;:::o;45010:264::-;45103:4;45120:13;45136:23;45151:7;45136:14;:23::i;:::-;45120:39;;45189:5;-1:-1:-1;;;;;45178:16:0;:7;-1:-1:-1;;;;;45178:16:0;;:52;;;;45198:32;45215:5;45222:7;45198:16;:32::i;:::-;45178:87;;;;45258:7;-1:-1:-1;;;;;45234:31:0;:20;45246:7;45234:11;:20::i;:::-;-1:-1:-1;;;;;45234:31:0;;45178:87;45170:96;45010:264;-1:-1:-1;;;;45010:264:0:o;44090:313::-;44246:28;44256:4;44262:2;44266:7;44246:9;:28::i;:::-;44293:47;44316:4;44322:2;44326:7;44335:4;44293:22;:47::i;:::-;44285:110;;;;-1:-1:-1;;;44285:110:0;;;;;;;:::i;10847:669::-;10889:12;10941:13;:11;:13::i;:::-;10963:26;;;;;;;;;;;;;;-1:-1:-1;;;10963:26:0;;;;;;;;;;;;;;;;-1:-1:-1;;;10963:26:0;;;:10;:26::i;:::-;10998:13;:11;:13::i;:::-;11020;:11;:13::i;:::-;11042:16;:14;:16::i;:::-;11067:21;;;;;;;;;;;;;;-1:-1:-1;;;11067:21:0;;;:10;:21::i;:::-;11097:12;:10;:12::i;:::-;16418:16;;;;;;;;;;;;-1:-1:-1;;;16418:16:0;;;;10916:594;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10909:601;;10847:669;:::o;10658:183::-;10719:13;10806:22;10820:7;10806:13;:22::i;:::-;10747:88;;;;;;;;:::i;:::-;;;;;;;;;;;;;10740:95;;10658:183;;;:::o;10359:293::-;10423:13;10444:16;10463:6;;:73;;10491:1;10496;10491:6;:44;;;;;;;;;;;;;;;-1:-1:-1;;;10491:44:0;;;10463:73;;10491:44;;;;;;;;;;;;;;-1:-1:-1;;;10491:44:0;;;10463:73;;;;;;;;;;;;;;;;-1:-1:-1;;;10463:73:0;;;;10444:92;;10599:2;10625:1;10558:88;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10551:95;;;10359:293;;;;:::o;10177:176::-;10230:13;10321:19;10335:4;10321:13;:19::i;:::-;10259:88;;;;;;;;:::i;16682:528::-;16732:13;;;16784:6;16800:3;16793:4;:1;16795:2;16793:4;:::i;:::-;:10;;;;:::i;:::-;16784:19;-1:-1:-1;16810:6:0;16830:3;16820;16822:1;;16820:3;:::i;:::-;:6;;16824:2;16820:6;:::i;:::-;16819:14;;;;:::i;:::-;16810:23;-1:-1:-1;16840:6:0;16856:3;16849:4;:1;16851:2;16849:4;:::i;:::-;:10;;;;:::i;:::-;16840:19;-1:-1:-1;16872:11:0;16901:3;16888:5;:1;16890:3;16888:5;:::i;:::-;16887:11;;16897:1;16887:11;:::i;:::-;:17;;;;:::i;:::-;16872:33;;16912:9;16928:2;16924:1;:6;:82;;17003:3;16994:6;16984;16988:2;16984:1;:6;:::i;:::-;16983:17;;;;:::i;:::-;:23;;;;:::i;:::-;16924:82;;;16969:3;16960:6;16949;:1;16953:2;16949:6;:::i;:::-;16942:14;;:3;:14;:::i;:::-;16941:25;;;;:::i;:::-;:31;;;;:::i;:::-;16912:94;;17021:9;17037:2;17033:1;:6;:52;;17081:4;17072:6;17076:2;17072:1;:6;:::i;:::-;:13;;;;:::i;:::-;17033:52;;;17058:4;17049:6;:1;17053:2;17049:6;:::i;:::-;:13;;;;:::i;:::-;17021:64;;17116:23;17130:1;17133;17136;17116:12;:23::i;:::-;17148:25;17162:1;17165;17168:4;17148:12;:25::i;:::-;17182:15;:4;:13;:15::i;:::-;17100:104;;;;;;;;;;;;16682:528;;;;;:::o;8175:723::-;8231:13;8452:5;8461:1;8452:10;8448:53;;-1:-1:-1;;8479:10:0;;;;;;;;;;;;-1:-1:-1;;;8479:10:0;;;;;8175:723::o;8448:53::-;8526:5;8511:12;8567:78;8574:9;;8567:78;;8600:8;;;;:::i;:::-;;-1:-1:-1;8623:10:0;;-1:-1:-1;8631:2:0;8623:10;;:::i;:::-;;;8567:78;;;8655:19;8687:6;8677:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8677:17:0;;8655:39;;8705:154;8712:10;;8705:154;;8739:11;8749:1;8739:11;;:::i;:::-;;-1:-1:-1;8808:10:0;8816:2;8808:5;:10;:::i;:::-;8795:24;;:2;:24;:::i;:::-;8782:39;;8765:6;8772;8765:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8765:56:0;;;;;;;;-1:-1:-1;8836:11:0;8845:2;8836:11;;:::i;:::-;;;8705:154;;16446:230;16497:13;16522:6;16526:2;16522:1;:6;:::i;:::-;16532:1;16522:11;:22;;;;;16537:1;16542:2;16537:7;;16522:22;16518:40;;;-1:-1:-1;;16547:11:0;;;;;;;;;;;;-1:-1:-1;;;16547:11:0;;;;;16446:230::o;16518:40::-;16569:6;16573:2;16569:1;:6;:::i;:::-;16579:1;16569:11;:22;;;;;16584:1;16589:2;16584:7;;16569:22;16565:40;;;-1:-1:-1;;16594:11:0;;;;;;;;;;;;-1:-1:-1;;;16594:11:0;;;;;16446:230::o;16565:40::-;16616:6;16620:2;16616:1;:6;:::i;:::-;16626:1;16616:11;:22;;;;;16631:1;16636:2;16631:7;;16616:22;16612:40;;;-1:-1:-1;;16641:11:0;;;;;;;;;;;;-1:-1:-1;;;16641:11:0;;;;;16446:230::o;16612:40::-;-1:-1:-1;;16659:11:0;;;;;;;;;;;;-1:-1:-1;;;16659:11:0;;;;;16446:230::o;11522:1359::-;11623:12;11821:13;:11;:13::i;:::-;11849:26;11860:6;11868;11849:10;:26::i;:::-;11890:13;:11;:13::i;:::-;11918;:11;:13::i;:::-;11946:18;11957:6;11946:10;:18::i;:::-;11979:29;12000:7;11979:20;:29::i;:::-;16418:16;;;;;;;;;;;;-1:-1:-1;;;16418:16:0;;;;11790:258;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12142:6;12233;12381;12800:33;12817:7;12826:6;12800:16;:33::i;:::-;12067:800;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;12067:800:0;;;;;;;;;;11651:1224;;;12067:800;11651:1224;;:::i;:::-;;;;;;;;;;;;;11644:1231;;11522:1359;;;;;:::o;45616:110::-;45692:26;45702:2;45706:7;45692:26;;;;;;;;;;;;:9;:26::i;49375:851::-;49529:4;-1:-1:-1;;;;;49550:13:0;;25471:19;:23;49546:673;;49586:69;;-1:-1:-1;;;49586:69:0;;-1:-1:-1;;;;;49586:36:0;;;;;:69;;49623:10;;49635:4;;49641:7;;49650:4;;49586:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49586:69:0;;;;;;;;-1:-1:-1;;49586:69:0;;;;;;;;;;;;:::i;:::-;;;49582:582;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49825:6;:13;49842:1;49825:18;49821:328;;49868:60;;-1:-1:-1;;;49868:60:0;;;;;;;:::i;49821:328::-;50099:6;50093:13;50084:6;50080:2;50076:15;50069:38;49582:582;-1:-1:-1;;;;;;49706:51:0;-1:-1:-1;;;49706:51:0;;-1:-1:-1;49699:58:0;;49546:673;-1:-1:-1;50203:4:0;49375:851;;;;;;:::o;16152:196::-;16196:13;16217:125;;;;;;;;;;;;;;;;;;;16152:196;:::o;14289:436::-;14376:13;14462:6;14528;14687;14405:314;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14398:321;;14289:436;;;;:::o;14740:1155::-;14784:13;14806:1083;;;;;;;;;;;;;;;;;;;14740:1155;:::o;13323:581::-;13367:13;13388:510;;;;;;;;;;;;;;;;;;;13323:581;:::o;13919:355::-;13966:13;13988:280;;;;;;;;;;;;;;;;;;;13919:355;:::o;12896:412::-;12963:13;13061:9;13120;12991:311;;;;;;;;;:::i;15910:236::-;15953:13;15976:164;;;;;;;;;;;;;;;;;;;15910:236;:::o;425:1912::-;483:13;513:4;:11;528:1;513:16;509:31;;-1:-1:-1;;531:9:0;;;;;;;;;-1:-1:-1;531:9:0;;;425:1912::o;509:31::-;592:19;614:12;;;;;;;;;;;;;;;;;592:34;;678:18;724:1;705:4;:11;719:1;705:15;;;;:::i;:::-;704:21;;;;:::i;:::-;699:27;;:1;:27;:::i;:::-;678:48;-1:-1:-1;809:20:0;843:15;678:48;856:2;843:15;:::i;:::-;832:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;832:27:0;;809:50;;956:10;948:6;941:26;1051:1;1044:5;1040:13;1110:4;1161;1155:11;1146:7;1142:25;1257:2;1249:6;1245:15;1330:754;1349:6;1340:7;1337:19;1330:754;;;1449:1;1440:7;1436:15;1425:26;;1488:7;1482:14;1614:4;1606:5;1602:2;1598:14;1594:25;1584:8;1580:40;1574:47;1563:9;1555:67;1668:1;1657:9;1653:17;1640:30;;1747:4;1739:5;1735:2;1731:14;1727:25;1717:8;1713:40;1707:47;1696:9;1688:67;1801:1;1790:9;1786:17;1773:30;;1880:4;1872:5;1869:1;1864:14;1860:25;1850:8;1846:40;1840:47;1829:9;1821:67;1934:1;1923:9;1919:17;1906:30;;2013:4;2005:5;1993:25;1983:8;1979:40;1973:47;1962:9;1954:67;-1:-1:-1;2067:1:0;2052:17;1330:754;;;2157:1;2150:4;2144:11;2140:19;2178:1;2173:54;;;;2246:1;2241:52;;;;2133:160;;2173:54;-1:-1:-1;;;;;2189:17:0;;2182:43;2173:54;;2241:52;-1:-1:-1;;;;;2257:17:0;;2250:41;2133:160;-1:-1:-1;2323:6:0;;425:1912;-1:-1:-1;;;;;;;;425:1912:0:o;17216:199::-;17286:13;17345:12;:1;:10;:12::i;:::-;17364;:1;:10;:12::i;:::-;17384;:1;:10;:12::i;:::-;17315:94;;;;;;;;;;:::i;17421:743::-;17483:13;17505:14;17528:12;:1;:10;:12::i;:::-;17505:36;;17597:25;17625:15;17638:1;17625:12;:15::i;:::-;17597:43;;17647:14;17678:6;17674:456;17690:1;:8;17686:1;:12;17674:456;;;17713:10;17746:2;17737:1;17739;17737:4;;;;;;;;:::i;:::-;;;;;17726:22;;;17737:4;;17726:22;:::i;:::-;17713:35;-1:-1:-1;17761:10:0;;17757:366;;17831:13;17847:5;17856:1;17847:10;:22;;17864:5;17847:22;;;17860:1;17847:22;17831:38;-1:-1:-1;17929:1:0;17904:21;;;17903:27;;17902:34;;17947:167;;18010:11;18023:22;18036:8;18023:12;:22::i;:::-;17995:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17981:65;;18094:8;18088:1;18083:19;;18071:9;:31;18059:43;;17947:167;17773:350;;17757:366;-1:-1:-1;17700:3:0;;;;:::i;:::-;;;;17674:456;;;-1:-1:-1;18147:11:0;;17421:743;-1:-1:-1;;;;17421:743:0:o;19536:1670::-;19612:13;19634:14;19657:12;:1;:10;:12::i;:::-;19634:36;;19679:10;19806:20;:142;;;;;;;;;;;;;;;;;;;19961:6;19957:1138;19973:1;:8;19969:1;:12;19957:1138;;;20058:1;20054;:5;:30;;;;-1:-1:-1;20063:16:0;20072:1;20074:3;20076:1;20074;:3;:::i;:::-;20072:6;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;20072:6:0;20063:8;:16::i;:::-;20083:1;20063:21;20054:30;20050:149;;;20106:20;20124:2;3065:19;20106:20;:::i;:::-;20097:29;;;;:::i;:::-;;;20050:149;;;20169:20;20187:2;3065:19;20169:20;:::i;:::-;20160:29;;;;:::i;:::-;;;20050:149;20209:24;20236:57;20274:7;20248:23;20265:5;20248:16;:23::i;:::-;20242:29;;:3;:29;:::i;:::-;:39;;;;:::i;:::-;20236:55;:57::i;:::-;20209:84;;20302:5;20364:7;20346:13;20318:23;20335:5;20318:16;:23::i;:::-;20312:29;;:3;:29;:::i;:::-;20311:49;;;;:::i;:::-;20310:61;;;;:::i;:::-;20302:69;;20382:24;20413:1;20409;:5;:93;;20484:18;20489:1;20484:16;:18::i;:::-;20409:93;;;20447:23;20452:6;:1;-1:-1:-1;;20452:6:0;:::i;20447:23::-;20427:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;20409:93;20382:120;;20523:14;20532:1;20534;20532:4;;;;;;;;:::i;20523:14::-;20541:1;20523:19;20519:569;;20590:6;20668:10;20698;20724:36;20735:23;3065:19;20735:5;:23;:::i;:::-;20724:9;:36::i;:::-;20564:248;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20555:257;;20519:569;;;20881:6;20923:25;:14;20932:1;20934;20932:4;;;;;;;;:::i;20923:25::-;20989:10;21006;21043:16;21053:5;21043:9;:16::i;:::-;20855:223;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20846:232;;20519:569;19987:1108;;;19983:3;;;;;:::i;:::-;;;;19957:1138;;;;21132:31;21150:5;21157;21132:17;:31::i;:::-;21172:6;21110:90;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21103:97;;;;;19536:1670;;;;:::o;45953:319::-;46082:18;46088:2;46092:7;46082:5;:18::i;:::-;46133:53;46164:1;46168:2;46172:7;46181:4;46133:22;:53::i;:::-;46111:153;;;;-1:-1:-1;;;46111:153:0;;;;;;;:::i;18170:1260::-;18222:13;18248:1;18253;18248:6;18244:127;;18265:98;;;;;;;;;;;;;;;;;;18170:1260;-1:-1:-1;;18170:1260:0:o;18244:127::-;18381:1;18386;18381:6;18377:77;;18398:48;;;;;;;;;;;;;;;;;;18170:1260;-1:-1:-1;;18170:1260:0:o;18377:77::-;18464:1;18469;18464:6;18460:127;;18481:98;;;;;;;;;;;;;;;;;;18170:1260;-1:-1:-1;;18170:1260:0:o;18460:127::-;18597:1;18602;18597:6;18593:133;;18614:104;;;;;;;;;;;;;;;;;;18170:1260;-1:-1:-1;;18170:1260:0:o;18593:133::-;18736:1;18741;18736:6;18732:95;;18753:66;;;;;;;;;;;;;;;;;;18170:1260;-1:-1:-1;;18170:1260:0:o;18732:95::-;18837:1;18842;18837:6;18833:142;;18854:113;;;;;;;;;;;;;;;;;;18170:1260;-1:-1:-1;;18170:1260:0:o;18833:142::-;18985:1;18990;18985:6;18981:148;;19002:119;;;;;;;;;;;;;;;;;;18170:1260;-1:-1:-1;;18170:1260:0:o;18981:148::-;19139:1;19144;19139:6;19135:85;;19156:56;;;;;;;;;;;;;;;;;;18170:1260;-1:-1:-1;;18170:1260:0:o;19135:85::-;19230:1;19235;19230:6;19226:128;;19247:99;;;;;;;;;;;;;;;;;;18170:1260;-1:-1:-1;;18170:1260:0:o;19226:128::-;19403:12;:1;:10;:12::i;:::-;19373:51;;;;;;;;:::i;19436:94::-;19485:4;19505:19;19522:2;19510:8;;;;19505:19;:::i;6494:1128::-;3120:6;6608:15;;;;2860:10;6589:35;:44;6546:6;6688:23;2790:27;6660:23;;;6659:53;6767:23;2731:16;6739:22;;;6738:53;2965:9;6837:26;;6836:34;2913:9;6908:27;;6907:34;;6836;6952:78;;6993:19;:27;;;;;6952:78;7040:18;7061:9;;;;;;;;;;;;;;;;;3204:1;7108;7100:9;;7099:25;7183:21;;;7177:28;7183:21;;-1:-1:-1;7099:25:0;3287:24;3293:13;7237:21;;;:34;;;7293:17;;7347:7;;;7346:18;;2686:2;7345:36;7079:17;7404:15;:89;;7479:13;7466:2;7459:34;7404:89;;;7442:13;7429:2;7422:34;7404:89;7390:103;;7506:20;7502:57;;;7539:10;;7502:57;7596:13;7589:4;7582:11;;:27;;6494:1128;-1:-1:-1;;;;;;;;;;;;;6494:1128:0:o;7628:131::-;7680:6;7721:25;3162:6;7725:20;;7721:3;:25::i;21809:132::-;21863:13;21893:42;3065:19;21894:11;:5;21902:3;21894:11;:::i;:::-;:29;;;;:::i;21212:591::-;21294:13;21316:12;21364:1;21341:18;21357:2;3065:19;21341:18;:::i;:::-;21332:28;;:5;:28;:::i;:::-;21331:34;;;;:::i;:::-;21316:49;;21442:6;21475:25;21492:7;21475:16;:25::i;:::-;:31;;21503:3;21475:31;:::i;:::-;21457:49;;21458:13;21457:49;:::i;:::-;21442:65;;21514:6;21547:25;21564:7;21547:16;:25::i;:::-;:31;;21575:3;21547:31;:::i;:::-;21529:49;;21530:13;21529:49;:::i;:::-;21514:65;-1:-1:-1;21630:5:0;21673:26;21675:11;21679:7;21675:1;:11;:::i;21673:26::-;21715;21717:11;21721:7;21717:1;:11;:::i;21715:26::-;21765:18;21775:7;21765:9;:18::i;:::-;21595:202;;;;;;;;;;;:::i;46608:324::-;-1:-1:-1;;;;;46688:16:0;;46680:61;;;;-1:-1:-1;;;46680:61:0;;40173:2:1;46680:61:0;;;40155:21:1;;;40192:18;;;40185:30;40251:34;40231:18;;;40224:62;40303:18;;46680:61:0;39971:356:1;46680:61:0;44781:4;44805:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44805:16:0;:30;46752:58;;;;-1:-1:-1;;;46752:58:0;;40534:2:1;46752:58:0;;;40516:21:1;40573:2;40553:18;;;40546:30;40612;40592:18;;;40585:58;40660:18;;46752:58:0;40332:352:1;46752:58:0;-1:-1:-1;;;;;46823:13:0;;;;;;:9;:13;;;;;:18;;46840:1;;46823:13;:18;;46840:1;;46823:18;:::i;:::-;;;;-1:-1:-1;;46852:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;46852:21:0;-1:-1:-1;;;;;46852:21:0;;;;;;;;46891:33;;46852:16;;;46891:33;;46852:16;;46891:33;46608:324;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:282::-;900:3;938:5;932:12;965:6;960:3;953:19;981:76;1050:6;1043:4;1038:3;1034:14;1027:4;1020:5;1016:16;981:76;:::i;:::-;1111:2;1090:15;-1:-1:-1;;1086:29:1;1077:39;;;;1118:4;1073:50;;847:282;-1:-1:-1;;847:282:1:o;1134:231::-;1283:2;1272:9;1265:21;1246:4;1303:56;1355:2;1344:9;1340:18;1332:6;1303:56;:::i;1370:180::-;1429:6;1482:2;1470:9;1461:7;1457:23;1453:32;1450:52;;;1498:1;1495;1488:12;1450:52;-1:-1:-1;1521:23:1;;1370:180;-1:-1:-1;1370:180:1:o;1763:173::-;1831:20;;-1:-1:-1;;;;;1880:31:1;;1870:42;;1860:70;;1926:1;1923;1916:12;1860:70;1763:173;;;:::o;1941:254::-;2009:6;2017;2070:2;2058:9;2049:7;2045:23;2041:32;2038:52;;;2086:1;2083;2076:12;2038:52;2109:29;2128:9;2109:29;:::i;:::-;2099:39;2185:2;2170:18;;;;2157:32;;-1:-1:-1;;;1941:254:1:o;2382:328::-;2459:6;2467;2475;2528:2;2516:9;2507:7;2503:23;2499:32;2496:52;;;2544:1;2541;2534:12;2496:52;2567:29;2586:9;2567:29;:::i;:::-;2557:39;;2615:38;2649:2;2638:9;2634:18;2615:38;:::i;:::-;2605:48;;2700:2;2689:9;2685:18;2672:32;2662:42;;2382:328;;;;;:::o;2715:186::-;2774:6;2827:2;2815:9;2806:7;2802:23;2798:32;2795:52;;;2843:1;2840;2833:12;2795:52;2866:29;2885:9;2866:29;:::i;2906:127::-;2967:10;2962:3;2958:20;2955:1;2948:31;2998:4;2995:1;2988:15;3022:4;3019:1;3012:15;3038:342;3184:2;3169:18;;3217:1;3206:13;;3196:144;;3262:10;3257:3;3253:20;3250:1;3243:31;3297:4;3294:1;3287:15;3325:4;3322:1;3315:15;3196:144;3349:25;;;3038:342;:::o;3385:347::-;3450:6;3458;3511:2;3499:9;3490:7;3486:23;3482:32;3479:52;;;3527:1;3524;3517:12;3479:52;3550:29;3569:9;3550:29;:::i;:::-;3540:39;;3629:2;3618:9;3614:18;3601:32;3676:5;3669:13;3662:21;3655:5;3652:32;3642:60;;3698:1;3695;3688:12;3642:60;3721:5;3711:15;;;3385:347;;;;;:::o;3737:127::-;3798:10;3793:3;3789:20;3786:1;3779:31;3829:4;3826:1;3819:15;3853:4;3850:1;3843:15;3869:1138;3964:6;3972;3980;3988;4041:3;4029:9;4020:7;4016:23;4012:33;4009:53;;;4058:1;4055;4048:12;4009:53;4081:29;4100:9;4081:29;:::i;:::-;4071:39;;4129:38;4163:2;4152:9;4148:18;4129:38;:::i;:::-;4119:48;;4214:2;4203:9;4199:18;4186:32;4176:42;;4269:2;4258:9;4254:18;4241:32;4292:18;4333:2;4325:6;4322:14;4319:34;;;4349:1;4346;4339:12;4319:34;4387:6;4376:9;4372:22;4362:32;;4432:7;4425:4;4421:2;4417:13;4413:27;4403:55;;4454:1;4451;4444:12;4403:55;4490:2;4477:16;4512:2;4508;4505:10;4502:36;;;4518:18;;:::i;:::-;4593:2;4587:9;4561:2;4647:13;;-1:-1:-1;;4643:22:1;;;4667:2;4639:31;4635:40;4623:53;;;4691:18;;;4711:22;;;4688:46;4685:72;;;4737:18;;:::i;:::-;4777:10;4773:2;4766:22;4812:2;4804:6;4797:18;4852:7;4847:2;4842;4838;4834:11;4830:20;4827:33;4824:53;;;4873:1;4870;4863:12;4824:53;4929:2;4924;4920;4916:11;4911:2;4903:6;4899:15;4886:46;4974:1;4969:2;4964;4956:6;4952:15;4948:24;4941:35;4995:6;4985:16;;;;;;;3869:1138;;;;;;;:::o;5012:260::-;5080:6;5088;5141:2;5129:9;5120:7;5116:23;5112:32;5109:52;;;5157:1;5154;5147:12;5109:52;5180:29;5199:9;5180:29;:::i;:::-;5170:39;;5228:38;5262:2;5251:9;5247:18;5228:38;:::i;:::-;5218:48;;5012:260;;;;;:::o;5277:380::-;5356:1;5352:12;;;;5399;;;5420:61;;5474:4;5466:6;5462:17;5452:27;;5420:61;5527:2;5519:6;5516:14;5496:18;5493:38;5490:161;;5573:10;5568:3;5564:20;5561:1;5554:31;5608:4;5605:1;5598:15;5636:4;5633:1;5626:15;5490:161;;5277:380;;;:::o;6075:411::-;6277:2;6259:21;;;6316:2;6296:18;;;6289:30;6355:34;6350:2;6335:18;;6328:62;-1:-1:-1;;;6421:2:1;6406:18;;6399:45;6476:3;6461:19;;6075:411::o;6845:127::-;6906:10;6901:3;6897:20;6894:1;6887:31;6937:4;6934:1;6927:15;6961:4;6958:1;6951:15;6977:125;7042:9;;;7063:10;;;7060:36;;;7076:18;;:::i;8149:127::-;8210:10;8205:3;8201:20;8198:1;8191:31;8241:4;8238:1;8231:15;8265:4;8262:1;8255:15;8281:120;8321:1;8347;8337:35;;8352:18;;:::i;:::-;-1:-1:-1;8386:9:1;;8281:120::o;8406:128::-;8473:9;;;8494:11;;;8491:37;;;8508:18;;:::i;8539:168::-;8612:9;;;8643;;8660:15;;;8654:22;;8640:37;8630:71;;8681:18;;:::i;10663:410::-;10865:2;10847:21;;;10904:2;10884:18;;;10877:30;10943:34;10938:2;10923:18;;10916:62;-1:-1:-1;;;11009:2:1;10994:18;;10987:44;11063:3;11048:19;;10663:410::o;11432:198::-;11474:3;11512:5;11506:12;11527:65;11585:6;11580:3;11573:4;11566:5;11562:16;11527:65;:::i;:::-;11608:16;;;;;11432:198;-1:-1:-1;;11432:198:1:o;11874:1927::-;12785:66;12780:3;12773:79;12882:66;12877:2;12872:3;12868:12;12861:88;12979:34;12974:2;12969:3;12965:12;12958:56;13053:2;13048:3;13044:12;13039:2;13034:3;13030:12;13023:34;13096:22;13091:3;13087:32;13082:2;13077:3;13073:12;13066:54;12755:3;13149:6;13143:13;13165:74;13232:6;13226:3;13221;13217:13;13212:2;13204:6;13200:15;13165:74;:::i;:::-;-1:-1:-1;;;13298:3:1;13258:16;;;13290:12;;;13283:66;13374:13;;13396:75;13374:13;13456:3;13448:12;;13443:2;13431:15;;13396:75;:::i;:::-;-1:-1:-1;;;13531:3:1;13490:17;;;;13523:12;;;13516:25;13566:13;;13588:75;13566:13;13648:3;13640:12;;13635:2;13623:15;;13588:75;:::i;:::-;13679:116;13709:85;13735:58;13788:3;13777:8;13773:2;13769:17;13765:27;-1:-1:-1;;;11700:16:1;;11741:1;11732:11;;11635:114;13735:58;13727:6;13709:85;:::i;:::-;-1:-1:-1;;;11819:17:1;;11861:1;11852:11;;11754:115;13679:116;13672:123;11874:1927;-1:-1:-1;;;;;;;;11874:1927:1:o;13806:2481::-;-1:-1:-1;;;15051:66:1;;15140:13;;15033:3;;15162:75;15140:13;15225:2;15216:12;;15209:4;15197:17;;15162:75;:::i;:::-;15301:66;15296:2;15256:16;;;15288:11;;;15281:87;15393:13;;15415:76;15393:13;15477:2;15469:11;;15462:4;15450:17;;15415:76;:::i;:::-;15552:13;;15510:17;;;15574:76;15552:13;15636:2;15628:11;;15621:4;15609:17;;15574:76;:::i;:::-;15715:66;15710:2;15669:17;;;;15702:11;;;15695:87;-1:-1:-1;;;15806:2:1;15798:11;;15791:53;15869:13;;15891:76;15869:13;15953:2;15945:11;;15938:4;15926:17;;15891:76;:::i;:::-;-1:-1:-1;;;16027:2:1;15986:17;;;;16019:11;;;16012:67;16095:186;16125:155;16151:128;16181:97;16207:70;16181:97;16271:3;16263:12;;16255:6;16237:39;:::i;:::-;-1:-1:-1;;;11700:16:1;;11741:1;11732:11;;11635:114;16207:70;16199:6;16181:97;:::i;16151:128::-;16143:6;16125:155;:::i;16095:186::-;16088:193;13806:2481;-1:-1:-1;;;;;;;;;;13806:2481:1:o;17103:414::-;17305:2;17287:21;;;17344:2;17324:18;;;17317:30;17383:34;17378:2;17363:18;;17356:62;-1:-1:-1;;;17449:2:1;17434:18;;17427:48;17507:3;17492:19;;17103:414::o;17522:2620::-;18090:3;18128:6;18122:13;18154:4;18167:64;18224:6;18219:3;18214:2;18206:6;18202:15;18167:64;:::i;:::-;18294:13;;18253:16;;;;18316:68;18294:13;18253:16;18351:15;;;18316:68;:::i;:::-;18451:13;;18406:20;;;18473:68;18451:13;18406:20;18508:15;;;18473:68;:::i;:::-;18608:13;;18563:20;;;18630:68;18608:13;18563:20;18665:15;;;18630:68;:::i;:::-;18765:13;;18720:20;;;18787:68;18765:13;18720:20;18822:15;;;18787:68;:::i;:::-;18922:13;;18877:20;;;18944:68;18922:13;18877:20;18979:15;;;18944:68;:::i;:::-;19079:13;;19034:20;;;19101:68;19079:13;19034:20;19136:15;;;19101:68;:::i;:::-;19236:13;;19191:20;;;19258:68;19236:13;19191:20;19293:15;;;19258:68;:::i;:::-;19385:34;19345:20;;19374:46;;;19449:34;19436:11;;;19429:55;19513:34;19508:2;19500:11;;19493:55;19577:34;19572:2;19564:11;;19557:55;19642:34;19636:3;19628:12;;19621:56;19707:34;19701:3;19693:12;;19686:56;19772:34;19766:3;19758:12;;19751:56;19837:34;19831:3;19823:12;;19816:56;19902:34;19896:3;19888:12;;19881:56;19967:34;19961:3;19953:12;;19946:56;20032:34;20026:3;20018:12;;20011:56;-1:-1:-1;;;20091:3:1;20083:12;;20076:32;20132:3;20124:12;;17522:2620;-1:-1:-1;;;;;;;;;;17522:2620:1:o;20147:448::-;20399:28;20394:3;20387:41;20369:3;20457:6;20451:13;20473:75;20541:6;20536:2;20531:3;20527:12;20520:4;20512:6;20508:17;20473:75;:::i;:::-;20568:16;;;;20586:2;20564:25;;20147:448;-1:-1:-1;;20147:448:1:o;20600:979::-;-1:-1:-1;;;21069:55:1;;21147:13;;21051:3;;21169:75;21147:13;21232:2;21223:12;;21216:4;21204:17;;21169:75;:::i;:::-;-1:-1:-1;;;21303:2:1;21263:16;;;21295:11;;;21288:55;21368:13;;21390:76;21368:13;21452:2;21444:11;;21437:4;21425:17;;21390:76;:::i;:::-;-1:-1:-1;;;21526:2:1;21485:17;;;;21518:11;;;21511:35;21570:2;21562:11;;20600:979;-1:-1:-1;;;;20600:979:1:o;21584:451::-;21836:31;21831:3;21824:44;21806:3;21897:6;21891:13;21913:75;21981:6;21976:2;21971:3;21967:12;21960:4;21952:6;21948:17;21913:75;:::i;:::-;22008:16;;;;22026:2;22004:25;;21584:451;-1:-1:-1;;21584:451:1:o;22040:112::-;22072:1;22098;22088:35;;22103:18;;:::i;:::-;-1:-1:-1;22137:9:1;;22040:112::o;22157:135::-;22196:3;22217:17;;;22214:43;;22237:18;;:::i;:::-;-1:-1:-1;22284:1:1;22273:13;;22157:135::o;22297:127::-;22358:10;22353:3;22349:20;22346:1;22339:31;22389:4;22386:1;22379:15;22413:4;22410:1;22403:15;22429:1540;22848:3;22886:6;22880:13;22912:4;22925:64;22982:6;22977:3;22972:2;22964:6;22960:15;22925:64;:::i;:::-;23052:13;;23011:16;;;;23074:68;23052:13;23011:16;23109:15;;;23074:68;:::i;:::-;23209:13;;23164:20;;;23231:68;23209:13;23164:20;23266:15;;;23231:68;:::i;:::-;23366:13;;23321:20;;;23388:68;23366:13;23321:20;23423:15;;;23388:68;:::i;:::-;23523:13;;23478:20;;;23545:68;23523:13;23478:20;23580:15;;;23545:68;:::i;:::-;23680:13;;23635:20;;;23702:68;23680:13;23635:20;23737:15;;;23702:68;:::i;:::-;23837:13;;23792:20;;;23859:68;23837:13;23792:20;23894:15;;;23859:68;:::i;:::-;23943:20;;;;;22429:1540;-1:-1:-1;;;;;;;;;;22429:1540:1:o;25009:2025::-;26122:34;26117:3;26110:47;26092:3;-1:-1:-1;;;26216:2:1;26211;26206:3;26202:12;26195:24;26248:6;26242:13;26264:73;26330:6;26325:2;26320:3;26316:12;26311:2;26303:6;26299:15;26264:73;:::i;:::-;26365:6;26360:3;26356:16;26346:26;;-1:-1:-1;;;26425:2:1;26420;26416;26412:11;26405:23;26457:34;26452:2;26448;26444:11;26437:55;26521:2;26516;26512;26508:11;26501:23;26555:6;26549:13;26533:29;;26571:74;26636:8;26631:2;26627;26623:11;26618:2;26610:6;26606:15;26571:74;:::i;:::-;26672:8;26668:2;26664:17;26654:27;;26710:2;26705;26701;26697:11;26690:23;;;26742:34;26737:2;26733;26729:11;26722:55;26807:34;26801:3;26797:2;26793:12;26786:56;-1:-1:-1;;;26866:3:1;26862:2;26858:12;26851:33;26900:128;26930:97;26956:70;26986:39;27020:3;27016:2;27012:12;27004:6;26986:39;:::i;:::-;24051:34;24039:47;;24116:34;24111:2;24102:12;;24095:56;24181:34;24176:2;24167:12;;24160:56;24246:34;24241:2;24232:12;;24225:56;24312:34;24306:3;24297:13;;24290:57;24378:34;24372:3;24363:13;;24356:57;24444:34;24438:3;24429:13;;24422:57;24510:34;24504:3;24495:13;;24488:57;24576:34;24570:3;24561:13;;24554:57;24642:34;24636:3;24627:13;;24620:57;24708:34;24702:3;24693:13;;24686:57;24774:34;24768:3;24759:13;;24752:57;-1:-1:-1;;;24834:3:1;24825:13;;24818:27;24870:3;24861:13;;23974:906;26930:97;-1:-1:-1;;;24950:21:1;;24996:1;24987:11;;24885:119;26900:128;26893:135;25009:2025;-1:-1:-1;;;;;;;25009:2025:1:o;27039:496::-;27218:3;27256:6;27250:13;27272:66;27331:6;27326:3;27319:4;27311:6;27307:17;27272:66;:::i;:::-;27401:13;;27360:16;;;;27423:70;27401:13;27360:16;27470:4;27458:17;;27423:70;:::i;:::-;27509:20;;27039:496;-1:-1:-1;;;;27039:496:1:o;27540:500::-;-1:-1:-1;;;;;27809:15:1;;;27791:34;;27861:15;;27856:2;27841:18;;27834:43;27908:2;27893:18;;27886:34;;;27956:3;27951:2;27936:18;;27929:31;;;27734:4;;27977:57;;28014:19;;28006:6;27977:57;:::i;:::-;27969:65;27540:500;-1:-1:-1;;;;;;27540:500:1:o;28045:249::-;28114:6;28167:2;28155:9;28146:7;28142:23;28138:32;28135:52;;;28183:1;28180;28173:12;28135:52;28215:9;28209:16;28234:30;28258:5;28234:30;:::i;28378:1522::-;29018:26;29013:3;29006:39;28988:3;29074:6;29068:13;29090:75;29158:6;29153:2;29148:3;29144:12;29137:4;29129:6;29125:17;29090:75;:::i;:::-;29229:34;29224:2;29184:16;;;29216:11;;;29209:55;-1:-1:-1;;;29288:2:1;29280:11;;29273:31;29329:13;;29351:76;29329:13;29413:2;29405:11;;29398:4;29386:17;;29351:76;:::i;:::-;29492:34;29487:2;29446:17;;;;29479:11;;;29472:55;29556:34;29551:2;29543:11;;29536:55;29621:34;29615:3;29607:12;;29600:56;29686:34;29680:3;29672:12;;29665:56;-1:-1:-1;;;29745:3:1;29737:12;;29730:29;29781:39;29815:3;29807:12;;29799:6;29781:39;:::i;:::-;-1:-1:-1;;;28349:22:1;;29892:1;29881:13;;;-1:-1:-1;;;;;;28378:1522:1:o;29905:1299::-;30407:34;30402:3;30395:47;-1:-1:-1;;;30467:2:1;30462:3;30458:12;30451:29;30377:3;30509:6;30503:13;30525:73;30591:6;30586:2;30581:3;30577:12;30572:2;30564:6;30560:15;30525:73;:::i;:::-;30662:32;30657:2;30617:16;;;30649:11;;;30642:53;30720:13;;30742:74;30720:13;30802:2;30794:11;;30789:2;30777:15;;30742:74;:::i;:::-;30881:34;30876:2;30835:17;;;;30868:11;;;30861:55;30945:34;30940:2;30932:11;;30925:55;31010:34;31004:3;30996:12;;30989:56;31075:34;31069:3;31061:12;;31054:56;31140:29;31134:3;31126:12;;31119:51;31194:3;31186:12;;29905:1299;-1:-1:-1;;;;29905:1299:1:o;31209:1224::-;-1:-1:-1;;;31821:3:1;31814:19;31796:3;31862:6;31856:13;31878:74;31945:6;31941:1;31936:3;31932:11;31925:4;31917:6;31913:17;31878:74;:::i;:::-;-1:-1:-1;;;32011:1:1;31971:16;;;32003:10;;;31996:23;32044:13;;32066:75;32044:13;32128:1;32120:10;;32113:4;32101:17;;32066:75;:::i;:::-;-1:-1:-1;;;32201:1:1;32160:17;;;;32193:10;;;32186:24;32235:13;;32257:75;32235:13;32319:1;32311:10;;32304:4;32292:17;;32257:75;:::i;:::-;-1:-1:-1;;;32392:1:1;32351:17;;;;32384:10;;;32377:24;32425:1;32417:10;;31209:1224;-1:-1:-1;;;;;31209:1224:1:o;32438:237::-;32510:9;;;32477:7;32535:9;;-1:-1:-1;;;32546:18:1;;32531:34;32528:60;;;32568:18;;:::i;:::-;32641:1;32632:7;32627:16;32624:1;32621:23;32617:1;32610:9;32607:38;32597:72;;32649:18;;:::i;32680:193::-;32719:1;32745;32735:35;;32750:18;;:::i;:::-;-1:-1:-1;;;32786:18:1;;-1:-1:-1;;32806:13:1;;32782:38;32779:64;;;32823:18;;:::i;:::-;-1:-1:-1;32857:10:1;;32680:193::o;32878:200::-;32944:9;;;32917:4;32972:9;;33000:10;;33012:12;;;32996:29;33035:12;;;33027:21;;32993:56;32990:82;;;33052:18;;:::i;:::-;32990:82;32878:200;;;;:::o;33083:420::-;-1:-1:-1;;;33329:3:1;33322:16;33304:3;33367:6;33361:13;33383:74;33450:6;33446:1;33441:3;33437:11;33430:4;33422:6;33418:17;33383:74;:::i;:::-;33477:16;;;;33495:1;33473:24;;33083:420;-1:-1:-1;;33083:420:1:o;33508:1557::-;34156:3;34194:6;34188:13;34210:66;34269:6;34264:3;34257:4;34249:6;34245:17;34210:66;:::i;:::-;34307:6;34302:3;34298:16;34285:29;;34337:34;34330:5;34323:49;-1:-1:-1;;;34399:4:1;34392:5;34388:16;34381:38;34450:6;34444:13;34466:79;34536:8;34531:2;34524:5;34520:14;34513:4;34505:6;34501:17;34466:79;:::i;:::-;-1:-1:-1;;;34608:2:1;34564:20;;;;34600:11;;;34593:24;34642:13;;34664:76;34642:13;34726:2;34718:11;;34711:4;34699:17;;34664:76;:::i;:::-;-1:-1:-1;;;34800:2:1;34759:17;;;;34792:11;;;34785:33;34843:13;;34865:76;34843:13;34927:2;34919:11;;34912:4;34900:17;;34865:76;:::i;:::-;35006:25;35001:2;34960:17;;;;34993:11;;;34986:46;35056:2;35048:11;;33508:1557;-1:-1:-1;;;;;;33508:1557:1:o;35070:1819::-;35846:3;35884:6;35878:13;35900:66;35959:6;35954:3;35947:4;35939:6;35935:17;35900:66;:::i;:::-;-1:-1:-1;;;35988:16:1;;;36013:35;;;36073:13;;36095:79;36073:13;36160:2;36149:14;;36142:4;36130:17;;36095:79;:::i;:::-;-1:-1:-1;;;36237:2:1;36193:20;;;;36229:11;;;36222:46;36293:13;;36315:76;36293:13;36377:2;36369:11;;36362:4;36350:17;;36315:76;:::i;:::-;-1:-1:-1;;;36451:2:1;36410:17;;;;36443:11;;;36436:24;36485:13;;36507:76;36485:13;36569:2;36561:11;;36554:4;36542:17;;36507:76;:::i;:::-;-1:-1:-1;;;36643:2:1;36602:17;;;;36635:11;;;36628:33;36686:13;;36708:76;36686:13;36770:2;36762:11;;36755:4;36743:17;;36708:76;:::i;:::-;-1:-1:-1;;;36844:2:1;36803:17;;;;36836:11;;;36829:27;36880:2;36872:11;;35070:1819;-1:-1:-1;;;;;;;35070:1819:1:o;36894:651::-;37163:3;37201:6;37195:13;37217:66;37276:6;37271:3;37264:4;37256:6;37252:17;37217:66;:::i;:::-;37346:13;;37305:16;;;;37368:70;37346:13;37305:16;37415:4;37403:17;;37368:70;:::i;:::-;-1:-1:-1;;;37460:20:1;;37489:21;;;37537:1;37526:13;;36894:651;-1:-1:-1;;;;36894:651:1:o;37550:580::-;-1:-1:-1;;;37887:3:1;37880:27;37862:3;37936:6;37930:13;37952:75;38020:6;38015:2;38010:3;38006:12;37999:4;37991:6;37987:17;37952:75;:::i;:::-;-1:-1:-1;;;38086:2:1;38046:16;;;;38078:11;;;38071:26;-1:-1:-1;38121:2:1;38113:11;;37550:580;-1:-1:-1;37550:580:1:o;38135:216::-;38199:9;;;38227:11;;;38174:3;38257:9;;38285:10;;38281:19;;38310:10;;38302:19;;38278:44;38275:70;;;38325:18;;:::i;:::-;38275:70;;38135:216;;;;:::o;38356:1610::-;-1:-1:-1;;;39107:3:1;39100:24;39082:3;39153:6;39147:13;39179:4;39192:72;39257:6;39253:1;39248:3;39244:11;39239:2;39231:6;39227:15;39192:72;:::i;:::-;-1:-1:-1;;;39323:1:1;39283:16;;;39315:10;;;39308:45;39378:13;;39400:74;39378:13;39452:11;;;39435:15;;;39400:74;:::i;:::-;-1:-1:-1;;;39493:17:1;;39526:11;;;39519:24;;;;39568:13;;39590:74;39568:13;39650:2;39642:11;;39625:15;;;39590:74;:::i;:::-;-1:-1:-1;;;39724:2:1;39683:17;;;;39716:11;;;39709:32;39766:13;;39788:74;39766:13;39848:2;39840:11;;39823:15;;;39788:74;:::i;:::-;-1:-1:-1;;;39922:2:1;39881:17;;;;39914:11;;;39907:26;-1:-1:-1;39957:2:1;39949:11;;38356:1610;-1:-1:-1;;;;;;38356:1610:1:o
Swarm Source
ipfs://1394907f3e8a330a7bdbfff9b75955872ccea8afd0d751659f1e2080db39c6ba
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2,641.08 | 0.0851 | $224.76 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.