Contract 0x87f0f4b7e0fab14a565c87babba6c40c92281b51 3

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xee8d4a20b3787407151b96275d98b836b2c81194a05bedcd7fdf9fce82f59ebbRegister Identit...335193292022-09-24 19:32:025 mins ago0x8726555bf586da8ed1d5a1975f784c45896df8f4 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010769186618 33.474514919
0x692b6f4b7088a6a43667fe57e3b1eabb73e35e426a09ce20f0bc513349342c6cRegister Identit...335192382022-09-24 19:28:568 mins ago0xbdb04284f87a89b26de8587895a41bcdda431408 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.01023600541 31.815217619
0x691f633676491a6f4dc43c4725a10cfd4683f5ca1f5dc7027cb5da27e3f8a125Register Identit...335191202022-09-24 19:24:5212 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010362672125 32.210921305
0xf5eb22662bfc592c90a8e22dab631e08bf63210ef59d6ecf870e557a737ddbcbRegister Identit...335187462022-09-24 19:12:0025 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010685165019 35.407603718
0x9dc263d00d8aa50378929c19ddf9c6b2d56960cdba4307ce950eadef6006d960Register Identit...335184742022-09-24 19:02:3934 mins ago0xbdb04284f87a89b26de8587895a41bcdda431408 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.011367450161 35.331937233
0x2dfc1feddeb7e9a43f95e386e81eb43725fd1d78d4fe9b39320932551db6c0f7Register Identit...335184082022-09-24 19:00:2337 mins ago0x8726555bf586da8ed1d5a1975f784c45896df8f4 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.01132400257 35.19689485
0x0caa2b61aed97262c65586b185d5cadde99a0446ca40f1714e3fb6df1b3e372bRegister Identit...335183972022-09-24 18:59:5737 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010454546749 32.495692696
0xa04c478ccfe954b99601ef70355fe8524b54dbd9ebb7fa7ffea5c6786f44b129Register Identit...335183052022-09-24 18:56:4940 mins ago0x8726555bf586da8ed1d5a1975f784c45896df8f4 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010078776817 31.328472325
0x5eac0f7c0bcda9613090a40059a6d9071847d27776cbf395e4cc8819fd1eb973Register Identit...335181582022-09-24 18:51:4745 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.009435730786 31.26733334
0x4a20b48b95a67be5446f35b5ca2dd961a04f6ac94361c0d358fb4c137d3a6f9bRegister Identit...335180442022-09-24 18:47:5049 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.00996593426 30.976946673
0x492f11931f340c7e6700f8c4564899e4585a03463478907cb052f5709d97f0afRegister Identit...335178962022-09-24 18:42:4654 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.011635759594 36.169485311
0xf5992d9a20d738a62559876375f63480ece52531e9c1eb01ed40ec22beaa1e0dRegister Identit...335178272022-09-24 18:40:2457 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010755605433 33.433546784
0xe9cdea3e98cac784f950a2883ff75b545b48853d4d8cdb51b67c2b187f48c9cbRegister Identit...335178252022-09-24 18:40:2057 mins ago0xbdb04284f87a89b26de8587895a41bcdda431408 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010173426669 31.623857774
0x701edcba77452deccd9eaf8905ad284eeb880b6b39fabbe72efa6203fe5c0480Register Identit...335176572022-09-24 18:34:321 hr 3 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.009972749428 33.044670665
0x275a2f64cfe45a53ed98d9e9f4cdb0210684991ec2bcaa4715e8155875d0fa9cRegister Identit...335175052022-09-24 18:29:201 hr 8 mins ago0x8726555bf586da8ed1d5a1975f784c45896df8f4 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.009423032007 31.223183896
0x557e526742c992d38e6f8ef4b2f2e205d28a0f15485ef5144f980a92ccc72f7aRegister Identit...335174732022-09-24 18:28:121 hr 9 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010171375831 31.61630345
0x290c8d4ba2ee1dd3ac5eb83b48136048ff53344dd17754c45f19225e3d96f7daRegister Identit...335172432022-09-24 18:20:161 hr 17 mins ago0xbdb04284f87a89b26de8587895a41bcdda431408 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010072391291 31.306677561
0x0b2da3b9d4427d3f8386e27c4949cda47748a7c37bdb1a1c0e7399c0e23791fbRegister Identit...335170962022-09-24 18:15:141 hr 22 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010309132092 32.042507583
0x43c0a5d46b1ffe13dc6af6c0a8d4cb84f8d74e3d68154e615bc68123f3104372Open Consumer Ch...335170052022-09-24 18:12:081 hr 25 mins ago0x8726555bf586da8ed1d5a1975f784c45896df8f4 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.014377815932 51.490205105
0xdf71aadbefd2eabb05d82e4453da33453e6c02107c785a26caa869cadb9a3977Register Identit...335168442022-09-24 18:06:341 hr 31 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010411467345 32.365008893
0x0c7b46d59f8113605b865ea83b4e26213159b74dc1979d4553a867ba60da7c47Register Identit...335165652022-09-24 17:57:001 hr 40 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.011583470607 36.006050832
0x6e013aaecb6d631e209dcf9f3d8c35de2d129d488d5f250880f1cff5551d9ed6Register Identit...335164062022-09-24 17:51:301 hr 46 mins ago0x8726555bf586da8ed1d5a1975f784c45896df8f4 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010234404483 31.813405874
0xcf2381ae7b770ea73b4c0acd6500a8f25c32aecc107b8e7b1360068fc2da8711Register Identit...335160492022-09-24 17:39:161 hr 58 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010525119414 32.717086408
0xd4bae0d56d72a0758877512f64112ff086573fcf6dc4f6e754e4e6270735230dRegister Identit...335158852022-09-24 17:33:362 hrs 4 mins ago0x8726555bf586da8ed1d5a1975f784c45896df8f4 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.011109363284 34.531047973
0xb46c08f97902cde4f67e1d3b78f3ab7a3f7a3eb47018956967b4beae3a2833b9Register Identit...335157082022-09-24 17:27:302 hrs 10 mins ago0x48d001ee74f3a736a7ebcc9160044d1a4e63bdb0 IN  0x87f0f4b7e0fab14a565c87babba6c40c92281b510 MATIC0.010028160965 31.171140008
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xee8d4a20b3787407151b96275d98b836b2c81194a05bedcd7fdf9fce82f59ebb335193292022-09-24 19:32:025 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x692b6f4b7088a6a43667fe57e3b1eabb73e35e426a09ce20f0bc513349342c6c335192382022-09-24 19:28:568 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x691f633676491a6f4dc43c4725a10cfd4683f5ca1f5dc7027cb5da27e3f8a125335191202022-09-24 19:24:5212 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0xf5eb22662bfc592c90a8e22dab631e08bf63210ef59d6ecf870e557a737ddbcb335187462022-09-24 19:12:0025 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x9dc263d00d8aa50378929c19ddf9c6b2d56960cdba4307ce950eadef6006d960335184742022-09-24 19:02:3934 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x2dfc1feddeb7e9a43f95e386e81eb43725fd1d78d4fe9b39320932551db6c0f7335184082022-09-24 19:00:2337 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x0caa2b61aed97262c65586b185d5cadde99a0446ca40f1714e3fb6df1b3e372b335183972022-09-24 18:59:5737 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0xa04c478ccfe954b99601ef70355fe8524b54dbd9ebb7fa7ffea5c6786f44b129335183052022-09-24 18:56:4940 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x5eac0f7c0bcda9613090a40059a6d9071847d27776cbf395e4cc8819fd1eb973335181582022-09-24 18:51:4745 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x4a20b48b95a67be5446f35b5ca2dd961a04f6ac94361c0d358fb4c137d3a6f9b335180442022-09-24 18:47:5049 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x492f11931f340c7e6700f8c4564899e4585a03463478907cb052f5709d97f0af335178962022-09-24 18:42:4654 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0xf5992d9a20d738a62559876375f63480ece52531e9c1eb01ed40ec22beaa1e0d335178272022-09-24 18:40:2457 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0xe9cdea3e98cac784f950a2883ff75b545b48853d4d8cdb51b67c2b187f48c9cb335178252022-09-24 18:40:2057 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x701edcba77452deccd9eaf8905ad284eeb880b6b39fabbe72efa6203fe5c0480335176572022-09-24 18:34:321 hr 3 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x275a2f64cfe45a53ed98d9e9f4cdb0210684991ec2bcaa4715e8155875d0fa9c335175052022-09-24 18:29:201 hr 8 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x557e526742c992d38e6f8ef4b2f2e205d28a0f15485ef5144f980a92ccc72f7a335174732022-09-24 18:28:121 hr 9 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x290c8d4ba2ee1dd3ac5eb83b48136048ff53344dd17754c45f19225e3d96f7da335172432022-09-24 18:20:161 hr 17 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x0b2da3b9d4427d3f8386e27c4949cda47748a7c37bdb1a1c0e7399c0e23791fb335170962022-09-24 18:15:141 hr 22 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x43c0a5d46b1ffe13dc6af6c0a8d4cb84f8d74e3d68154e615bc68123f3104372335170052022-09-24 18:12:081 hr 25 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0xdf71aadbefd2eabb05d82e4453da33453e6c02107c785a26caa869cadb9a3977335168442022-09-24 18:06:341 hr 31 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x0c7b46d59f8113605b865ea83b4e26213159b74dc1979d4553a867ba60da7c47335165652022-09-24 17:57:001 hr 40 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0x6e013aaecb6d631e209dcf9f3d8c35de2d129d488d5f250880f1cff5551d9ed6335164062022-09-24 17:51:301 hr 46 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0xcf2381ae7b770ea73b4c0acd6500a8f25c32aecc107b8e7b1360068fc2da8711335160492022-09-24 17:39:161 hr 58 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0xd4bae0d56d72a0758877512f64112ff086573fcf6dc4f6e754e4e6270735230d335158852022-09-24 17:33:362 hrs 4 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
0xb46c08f97902cde4f67e1d3b78f3ab7a3f7a3eb47018956967b4beae3a2833b9335157082022-09-24 17:27:302 hrs 10 mins ago 0x87f0f4b7e0fab14a565c87babba6c40c92281b51  Contract Creation0 MATIC
[ Download CSV Export 
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
Registry

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-11-28
*/

/**
 *Submitted for verification at polygonscan.com on 2021-10-18
*/

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


abstract contract IERC20Token is IERC20 {
    function upgrade(uint256 value) public virtual;
}

interface IHermesContract {
    enum Status { Active, Paused, Punishment, Closed }
    function initialize(address _token, address _operator, uint16 _hermesFee, uint256 _minStake, uint256 _maxStake, address payable _routerAddress) external;
    function openChannel(address _party, uint256 _amountToLend) external;
    function getOperator() external view returns (address);
    function getStake() external view returns (uint256);
    function getStatus() external view returns (Status);
}


contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == msg.sender || _owner == address(0x0), "Ownable: caller is not the owner");
        _;
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


contract FundsRecovery is Ownable, ReentrancyGuard {
    address payable internal fundsDestination;
    IERC20Token public token;

    event DestinationChanged(address indexed previousDestination, address indexed newDestination);

    /**
     * Setting new destination of funds recovery.
     */
    function setFundsDestination(address payable _newDestination) public virtual onlyOwner {
        require(_newDestination != address(0));
        emit DestinationChanged(fundsDestination, _newDestination);
        fundsDestination = _newDestination;
    }

    /**
     * Getting funds destination address.
     */
    function getFundsDestination() public view returns (address) {
        return fundsDestination;
    }

    /**
     * Possibility to recover funds in case they were sent to this address before smart contract deployment
     */
    function claimEthers() public nonReentrant {
        require(fundsDestination != address(0));
        fundsDestination.transfer(address(this).balance);
    }

    /**
       Transfers selected tokens into owner address.
    */
    function claimTokens(address _token) public nonReentrant {
        require(fundsDestination != address(0));
        require(_token != address(token), "native token funds can't be recovered");
        uint256 _amount = IERC20Token(_token).balanceOf(address(this));
        IERC20Token(_token).transfer(fundsDestination, _amount);
    }
}

contract Utils {
    function getChainID() internal view returns (uint256) {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }
        return chainID;
    }

    function max(uint a, uint b) internal pure returns (uint) {
        return a > b ? a : b;
    }

    function min(uint a, uint b) internal pure returns (uint) {
        return a < b ? a : b;
    }

    function round(uint a, uint m) internal pure returns (uint ) {
        return ((a + m - 1) / m) * m;
    }
}



interface Channel {
    function initialize(address _token, address _dex, address _identityHash, address _hermesId, uint256 _fee) external;
}

contract Registry is FundsRecovery, Utils {
    using ECDSA for bytes32;

    uint256 public lastNonce;
    address payable public dex;     // Any uniswap v2 compatible DEX router address
    uint256 public minimalHermesStake;
    Registry public parentRegistry; // If there is parent registry, we will check for

    struct Implementation {
        address channelImplAddress;
        address hermesImplAddress;
    }
    Implementation[] internal implementations;

    struct Hermes {
        address operator;   // hermes operator who will sign promises
        uint256 implVer;    // version of hermes implementation smart contract
        function() external view returns(uint256) stake;
        bytes url;          // hermes service URL
    }
    mapping(address => Hermes) private hermeses;

    mapping(address => address) private identities;   // key: identity, value: beneficiary wallet address

    event RegisteredIdentity(address indexed identity, address beneficiary);
    event RegisteredHermes(address indexed hermesId, address hermesOperator, bytes ur);
    event HermesURLUpdated(address indexed hermesId, bytes newURL);
    event ConsumerChannelCreated(address indexed identity, address indexed hermesId, address channelAddress);
    event BeneficiaryChanged(address indexed identity, address newBeneficiary);
    event MinimalHermesStakeChanged(uint256 newMinimalStake);

    // Reject any ethers sent to this smart-contract
    receive() external payable {
        revert("Registry: Rejecting tx with ethers sent");
    }

    // We're using `initialize` instead of `constructor` to ensure easy way to deploy Registry into
    // deterministic address on any EVM compatible chain. Registry should be first be deployed using
    // `deployRegistry` scripts and then initialized with wanted token and implementations.
    function initialize(address _tokenAddress, address payable _dexAddress, uint256 _minimalHermesStake, address _channelImplementation, address _hermesImplementation, address payable _parentRegistry) public onlyOwner {
        require(!isInitialized(), "Registry: is already initialized");

        minimalHermesStake = _minimalHermesStake;

        require(_tokenAddress != address(0));
        token = IERC20Token(_tokenAddress);

        require(_dexAddress != address(0));
        dex = _dexAddress;

        // Set initial channel implementations
        setImplementations(_channelImplementation, _hermesImplementation);

        // We set initial owner to be sure
        transferOwnership(msg.sender);

        // Set parent registry, if `0x0` then this is root registry
        parentRegistry = Registry(_parentRegistry);
    }

    function isInitialized() public view returns (bool) {
        return address(token) != address(0);
    }

    // Register provider and open his channel with given hermes
    // _stakeAmount - it's amount of tokens staked into hermes to guarantee incomming channel's balance.
    // _beneficiary - payout address during settlements in hermes channel, if provided 0x0 then will be set to consumer channel address.
    function registerIdentity(address _hermesId, uint256 _stakeAmount, uint256 _transactorFee, address _beneficiary, bytes memory _signature) public {
        require(isActiveHermes(_hermesId), "Registry: provided hermes have to be active");

        // Check if given signature is valid
        address _identity = keccak256(abi.encodePacked(getChainID(), address(this), _hermesId, _stakeAmount, _transactorFee, _beneficiary)).recover(_signature);
        require(_identity != address(0), "Registry: wrong identity signature");

        // Tokens amount to get from channel to cover tx fee and provider's stake
        uint256 _totalFee = _stakeAmount + _transactorFee;
        require(_totalFee <= token.balanceOf(getChannelAddress(_identity, _hermesId)), "Registry: not enought funds in channel to cover fees");

        // Open consumer channel
        _openChannel(_identity, _hermesId, _beneficiary, _totalFee);

        // If stake is provided we additionally are opening channel with hermes (a.k.a provider channel)
        if (_stakeAmount > 0) {
            IHermesContract(_hermesId).openChannel(_identity, _stakeAmount);
        }

        // Pay fee for transaction maker
        if (_transactorFee > 0) {
            token.transfer(msg.sender, _transactorFee);
        }
    }

    // Deploys consumer channel and sets beneficiary as newly created channel address
    function openConsumerChannel(address _hermesId, uint256 _transactorFee, bytes memory _signature) public {
        require(isActiveHermes(_hermesId), "Registry: provided hermes have to be active");

        // Check if given signature is valid
        address _identity = keccak256(abi.encodePacked(getChainID(), address(this), _hermesId, _transactorFee)).recover(_signature);
        require(_identity != address(0), "Registry: wrong channel openinig signature");

        require(_transactorFee <= token.balanceOf(getChannelAddress(_identity, _hermesId)), "Registry: not enought funds in channel to cover fees");

        _openChannel(_identity, _hermesId, address(0), _transactorFee);
    }

    // Allows to securely deploy channel's smart contract without consumer signature
    function openConsumerChannel(address _identity, address _hermesId) public {
        require(isActiveHermes(_hermesId), "Registry: provided hermes have to be active");
        require(!isChannelOpened(_identity, _hermesId), "Registry: such consumer channel is already opened");

        _openChannel(_identity, _hermesId, address(0), 0);
    }

    // Deploy payment channel for given consumer identity
    // We're using minimal proxy (EIP1167) to save on gas cost and blockchain space.
    function _openChannel(address _identity, address _hermesId, address _beneficiary, uint256 _fee) internal returns (address) {
        bytes32 _salt = keccak256(abi.encodePacked(_identity, _hermesId));
        bytes memory _code = getProxyCode(getChannelImplementation(hermeses[_hermesId].implVer));
        Channel _channel = Channel(deployMiniProxy(uint256(_salt), _code));
        _channel.initialize(address(token), dex, _identity, _hermesId, _fee);

        emit ConsumerChannelCreated(_identity, _hermesId, address(_channel));

        // If beneficiary was not provided, then we're going to use consumer channel for that
        if (_beneficiary == address(0)) {
            _beneficiary = address(_channel);
        }

        // Mark identity as registered (only during first channel opening)
        if (!isRegistered(_identity)) {
            identities[_identity] = _beneficiary;
            emit RegisteredIdentity(_identity, _beneficiary);
        }

        return address(_channel);
    }

    function registerHermes(address _hermesOperator, uint256 _hermesStake, uint16 _hermesFee, uint256 _minChannelStake, uint256 _maxChannelStake, bytes memory _url) public {
        require(isInitialized(), "Registry: only initialized registry can register hermeses");
        require(_hermesOperator != address(0), "Registry: hermes operator can't be zero address");
        require(_hermesStake >= minimalHermesStake, "Registry: hermes have to stake at least minimal stake amount");

        address _hermesId = getHermesAddress(_hermesOperator);
        require(!isHermes(_hermesId), "Registry: hermes already registered");

        // Deploy hermes contract (mini proxy which is pointing to implementation)
        IHermesContract _hermes = IHermesContract(deployMiniProxy(uint256(uint160(_hermesOperator)), getProxyCode(getHermesImplementation())));

        // Transfer stake into hermes smart contract
        token.transferFrom(msg.sender, address(_hermes), _hermesStake);

        // Initialise hermes
        _hermes.initialize(address(token), _hermesOperator, _hermesFee, _minChannelStake, _maxChannelStake, dex);

        // Save info about newly created hermes
        hermeses[_hermesId] = Hermes(_hermesOperator, getLastImplVer(), _hermes.getStake, _url);

        // Approve hermes contract to `transferFrom` registry (used during hermes channel openings)
        token.approve(_hermesId, type(uint256).max);

        emit RegisteredHermes(_hermesId, _hermesOperator, _url);
    }

    function getChannelAddress(address _identity, address _hermesId) public view returns (address) {
        bytes32 _code = keccak256(getProxyCode(getChannelImplementation(hermeses[_hermesId].implVer)));
        bytes32 _salt = keccak256(abi.encodePacked(_identity, _hermesId));
        return getCreate2Address(_salt, _code);
    }

    function getHermes(address _hermesId) public view returns (Hermes memory) {
        return isHermes(_hermesId) || !hasParentRegistry() ? hermeses[_hermesId] : parentRegistry.getHermes(_hermesId);
    }

    function getHermesAddress(address _hermesOperator) public view returns (address) {
        bytes32 _code = keccak256(getProxyCode(getHermesImplementation()));
        return getCreate2Address(bytes32(uint256(uint160(_hermesOperator))), _code);
    }

    function getHermesAddress(address _hermesOperator, uint256 _implVer) public view returns (address) {
        bytes32 _code = keccak256(getProxyCode(getHermesImplementation(_implVer)));
        return getCreate2Address(bytes32(uint256(uint160(_hermesOperator))), _code);
    }

    function getHermesURL(address _hermesId) public view returns (bytes memory) {
        return hermeses[_hermesId].url;
    }

    function updateHermesURL(address _hermesId, bytes memory _url, bytes memory _signature) public {
        require(isActiveHermes(_hermesId), "Registry: provided hermes has to be active");

        // Check if given signature is valid
        address _operator = keccak256(abi.encodePacked(address(this), _hermesId, _url, lastNonce++)).recover(_signature);
        require(_operator == hermeses[_hermesId].operator, "wrong signature");

        // Update URL
        hermeses[_hermesId].url = _url;

        emit HermesURLUpdated(_hermesId, _url);
    }

    // ------------ UTILS ------------
    function getCreate2Address(bytes32 _salt, bytes32 _code) internal view returns (address) {
        return address(uint160(uint256(keccak256(abi.encodePacked(
            bytes1(0xff),
            address(this),
            bytes32(_salt),
            bytes32(_code)
        )))));
    }

    function getProxyCode(address _implementation) public pure returns (bytes memory) {
        // `_code` is EIP 1167 - Minimal Proxy Contract
        // more information: https://eips.ethereum.org/EIPS/eip-1167
        bytes memory _code = hex"3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3";

        bytes20 _targetBytes = bytes20(_implementation);
        for (uint8 i = 0; i < 20; i++) {
            _code[20 + i] = _targetBytes[i];
        }

        return _code;
    }

    function deployMiniProxy(uint256 _salt, bytes memory _code) internal returns (address payable) {
        address payable _addr;

        assembly {
            _addr := create2(0, add(_code, 0x20), mload(_code), _salt)
            if iszero(extcodesize(_addr)) {
                revert(0, 0)
            }
        }

        return _addr;
    }

    function getBeneficiary(address _identity) public view returns (address) {
        if (hasParentRegistry())
            return parentRegistry.getBeneficiary(_identity);

        return identities[_identity];
    }

    function setBeneficiary(address _identity, address _newBeneficiary, bytes memory _signature) public {
        require(_newBeneficiary != address(0), "Registry: beneficiary can't be zero address");

        // Always set beneficiary into root registry
        if (hasParentRegistry()) {
            parentRegistry.setBeneficiary(_identity, _newBeneficiary, _signature);
        } else {
            lastNonce = lastNonce + 1;

            // In signatures we should always use root registry (for backward compatibility)
            address _rootRegistry = hasParentRegistry() ? address(parentRegistry) : address(this);
            address _signer = keccak256(abi.encodePacked(getChainID(), _rootRegistry, _identity, _newBeneficiary, lastNonce)).recover(_signature);
            require(_signer == _identity, "Registry: have to be signed by identity owner");

            identities[_identity] = _newBeneficiary;

            emit BeneficiaryChanged(_identity, _newBeneficiary);
        }
    }

    function setMinimalHermesStake(uint256 _newMinimalStake) public onlyOwner {
        require(isInitialized(), "Registry: only initialized registry can set new minimal hermes stake");
        minimalHermesStake = _newMinimalStake;
        emit MinimalHermesStakeChanged(_newMinimalStake);
    }

    // -------- UTILS TO WORK WITH CHANNEL AND HERMES IMPLEMENTATIONS ---------

    function getChannelImplementation() public view returns (address) {
        return implementations[getLastImplVer()].channelImplAddress;
    }

    function getChannelImplementation(uint256 _implVer) public view returns (address) {
        return implementations[_implVer].channelImplAddress;
    }

    function getHermesImplementation() public view returns (address) {
        return implementations[getLastImplVer()].hermesImplAddress;
    }

    function getHermesImplementation(uint256 _implVer) public view returns (address) {
        return implementations[_implVer].hermesImplAddress;
    }

    function setImplementations(address _newChannelImplAddress, address _newHermesImplAddress) public onlyOwner {
        require(isInitialized(), "Registry: only initialized registry can set new implementations");
        require(isSmartContract(_newChannelImplAddress) && isSmartContract(_newHermesImplAddress), "Registry: implementations have to be smart contracts");
        implementations.push(Implementation(_newChannelImplAddress, _newHermesImplAddress));
    }

    // Version of latest hermes and channel implementations
    function getLastImplVer() public view returns (uint256) {
        return implementations.length-1;
    }

    // ------------------------------------------------------------------------

    function isSmartContract(address _addr) internal view returns (bool) {
        uint _codeLength;

        assembly {
            _codeLength := extcodesize(_addr)
        }

        return _codeLength != 0;
    }

    // If `parentRegistry` is not set, this is root registry and should return false
    function hasParentRegistry() public view returns (bool) {
        return address(parentRegistry) != address(0);
    }

    function isRegistered(address _identity) public view returns (bool) {
        if (hasParentRegistry())
            return parentRegistry.isRegistered(_identity);

        // If we know its beneficiary address it is registered identity
        return identities[_identity] != address(0);
    }

    function isHermes(address _hermesId) public view returns (bool) {
        // To check if it actually properly created hermes address, we need to check if he has operator
        // and if with that operator we'll get proper hermes address which has code deployed there.
        address _hermesOperator = hermeses[_hermesId].operator;
        uint256 _implVer = hermeses[_hermesId].implVer;
        address _addr = getHermesAddress(_hermesOperator, _implVer);
        if (_addr != _hermesId)
            return false; // hermesId should be same as generated address

        return isSmartContract(_addr) || parentRegistry.isHermes(_hermesId);
    }

    function isActiveHermes(address _hermesId) internal view returns (bool) {
        // First we have to ensure that given address is registered hermes and only then check its status
        require(isHermes(_hermesId), "Registry: hermes have to be registered");

        IHermesContract.Status status = IHermesContract(_hermesId).getStatus();
        return status == IHermesContract.Status.Active;
    }

    function isChannelOpened(address _identity, address _hermesId) public view returns (bool) {
        return isSmartContract(getChannelAddress(_identity, _hermesId)) || isSmartContract(parentRegistry.getChannelAddress(_identity, _hermesId));
    }

    function transferCollectedFeeTo(address _beneficiary) public onlyOwner{
        uint256 _collectedFee = token.balanceOf(address(this));
        require(_collectedFee > 0, "collected fee cannot be less than zero");
        token.transfer(_beneficiary, _collectedFee);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":false,"internalType":"address","name":"newBeneficiary","type":"address"}],"name":"BeneficiaryChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":true,"internalType":"address","name":"hermesId","type":"address"},{"indexed":false,"internalType":"address","name":"channelAddress","type":"address"}],"name":"ConsumerChannelCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousDestination","type":"address"},{"indexed":true,"internalType":"address","name":"newDestination","type":"address"}],"name":"DestinationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"hermesId","type":"address"},{"indexed":false,"internalType":"bytes","name":"newURL","type":"bytes"}],"name":"HermesURLUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinimalStake","type":"uint256"}],"name":"MinimalHermesStakeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"hermesId","type":"address"},{"indexed":false,"internalType":"address","name":"hermesOperator","type":"address"},{"indexed":false,"internalType":"bytes","name":"ur","type":"bytes"}],"name":"RegisteredHermes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"}],"name":"RegisteredIdentity","type":"event"},{"inputs":[],"name":"claimEthers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dex","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"}],"name":"getBeneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_hermesId","type":"address"}],"name":"getChannelAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_implVer","type":"uint256"}],"name":"getChannelImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChannelImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundsDestination","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"}],"name":"getHermes","outputs":[{"components":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"implVer","type":"uint256"},{"internalType":"function () view external returns (uint256)","name":"stake","type":"function"},{"internalType":"bytes","name":"url","type":"bytes"}],"internalType":"struct Registry.Hermes","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesOperator","type":"address"},{"internalType":"uint256","name":"_implVer","type":"uint256"}],"name":"getHermesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesOperator","type":"address"}],"name":"getHermesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_implVer","type":"uint256"}],"name":"getHermesImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHermesImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"}],"name":"getHermesURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastImplVer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"getProxyCode","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"hasParentRegistry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address payable","name":"_dexAddress","type":"address"},{"internalType":"uint256","name":"_minimalHermesStake","type":"uint256"},{"internalType":"address","name":"_channelImplementation","type":"address"},{"internalType":"address","name":"_hermesImplementation","type":"address"},{"internalType":"address payable","name":"_parentRegistry","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_hermesId","type":"address"}],"name":"isChannelOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"}],"name":"isHermes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimalHermesStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"openConsumerChannel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_hermesId","type":"address"}],"name":"openConsumerChannel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentRegistry","outputs":[{"internalType":"contract Registry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesOperator","type":"address"},{"internalType":"uint256","name":"_hermesStake","type":"uint256"},{"internalType":"uint16","name":"_hermesFee","type":"uint16"},{"internalType":"uint256","name":"_minChannelStake","type":"uint256"},{"internalType":"uint256","name":"_maxChannelStake","type":"uint256"},{"internalType":"bytes","name":"_url","type":"bytes"}],"name":"registerHermes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"},{"internalType":"uint256","name":"_stakeAmount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"registerIdentity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_newBeneficiary","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newDestination","type":"address"}],"name":"setFundsDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newChannelImplAddress","type":"address"},{"internalType":"address","name":"_newHermesImplAddress","type":"address"}],"name":"setImplementations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMinimalStake","type":"uint256"}],"name":"setMinimalHermesStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"transferCollectedFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"},{"internalType":"bytes","name":"_url","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"updateHermesURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b5060018055613725806100246000396000f3fe6080604052600436106102295760003560e01c8063acc831d011610123578063d16f38c8116100ab578063e617aaac1161006f578063e617aaac146106c5578063f2fde38b146106e5578063f58c5b6e14610705578063fc0c546a14610723578063ff9935cb1461074357600080fd5b8063d16f38c814610618578063d5929fe314610638578063df8de3e714610658578063e0b6c32314610678578063e3252537146106a557600080fd5b8063c957543b116100f2578063c957543b14610578578063c9b84d4d14610598578063cdd596e0146105b8578063cf10c969146105d8578063d0171d79146105f857600080fd5b8063acc831d0146104f8578063add10dda14610518578063bf1eb88a14610538578063c3c5a5471461055857600080fd5b80636332b080116101b157806385bff3411161017557806385bff341146104585780638cfef547146104785780638da5cb5b146104985780639936a87b146104b6578063ab867213146104cb57600080fd5b80636332b080146103e357806366cf5875146103f8578063692058c21461040e5780636931b5501461042e5780637c671a211461044357600080fd5b806341ca71ab116101f857806341ca71ab146103275780634787d09c1461035f5780634b6bd6be1461037f578063505a1b311461039f57806352631ab4146103bf57600080fd5b806304614e0b146102905780631de9db40146102b2578063238e130a146102e7578063392e53cd1461030757600080fd5b3661028b5760405162461bcd60e51b815260206004820152602760248201527f52656769737472793a2052656a656374696e67207478207769746820657468656044820152661c9cc81cd95b9d60ca1b60648201526084015b60405180910390fd5b600080fd5b34801561029c57600080fd5b506102b06102ab366004612f01565b610763565b005b3480156102be57600080fd5b506102d26102cd366004612f5a565b61091c565b60405190151581526020015b60405180910390f35b3480156102f357600080fd5b506102b0610302366004612f93565b6109c5565b34801561031357600080fd5b506003546001600160a01b031615156102d2565b34801561033357600080fd5b50610347610342366004612fb0565b610a72565b6040516001600160a01b0390911681526020016102de565b34801561036b57600080fd5b506102b061037a366004612f5a565b610aa7565b34801561038b57600080fd5b5061034761039a366004612fc9565b610b4f565b3480156103ab57600080fd5b506103476103ba366004612f93565b610b83565b3480156103cb57600080fd5b506103d560045481565b6040519081526020016102de565b3480156103ef57600080fd5b506103d5610c40565b34801561040457600080fd5b506103d560065481565b34801561041a57600080fd5b50600554610347906001600160a01b031681565b34801561043a57600080fd5b506102b0610c57565b34801561044f57600080fd5b50610347610d04565b34801561046457600080fd5b506102b0610473366004612f5a565b610d3f565b34801561048457600080fd5b50610347610493366004612fb0565b610f16565b3480156104a457600080fd5b506000546001600160a01b0316610347565b3480156104c257600080fd5b50610347610f4e565b3480156104d757600080fd5b506104eb6104e6366004612f93565b610f8c565b6040516102de9190613051565b34801561050457600080fd5b50610347610513366004612f93565b611029565b34801561052457600080fd5b506102b0610533366004613064565b611054565b34801561054457600080fd5b506104eb610553366004612f93565b6111c7565b34801561056457600080fd5b506102d2610573366004612f93565b611276565b34801561058457600080fd5b506102b0610593366004612fb0565b61132f565b3480156105a457600080fd5b50600754610347906001600160a01b031681565b3480156105c457600080fd5b506102d26105d3366004612f93565b611434565b3480156105e457600080fd5b506102b06105f33660046130d0565b61151a565b34801561060457600080fd5b506102b0610613366004613146565b6117c2565b34801561062457600080fd5b506007546001600160a01b031615156102d2565b34801561064457600080fd5b506102b0610653366004613192565b611a10565b34801561066457600080fd5b506102b0610673366004612f93565b611ebc565b34801561068457600080fd5b50610698610693366004612f93565b6120a0565b6040516102de9190613217565b3480156106b157600080fd5b506102b06106c0366004612f93565b612264565b3480156106d157600080fd5b506103476106e0366004612f5a565b612405565b3480156106f157600080fd5b506102b0610700366004612f93565b61248e565b34801561071157600080fd5b506002546001600160a01b0316610347565b34801561072f57600080fd5b50600354610347906001600160a01b031681565b34801561074f57600080fd5b506102b061075e366004613263565b61258c565b61076c836126bb565b6107885760405162461bcd60e51b8152600401610282906132dc565b60006107ec82466040805160208101929092526001600160601b031930606090811b8216928401929092529088901b166054820152606881018690526088015b604051602081830303815290604052805190602001206127b290919063ffffffff16565b90506001600160a01b0381166108575760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2077726f6e67206368616e6e656c206f70656e696e6967604482015269207369676e617475726560b01b6064820152608401610282565b6003546001600160a01b03166370a082316108728387612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156108b157600080fd5b505afa1580156108c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e99190613327565b8311156109085760405162461bcd60e51b815260040161028290613340565b61091581856000866127d6565b5050505050565b600061093161092b8484612405565b3b151590565b806109be5750600754604051633985eaab60e21b81526001600160a01b03858116600483015284811660248301526109be92169063e617aaac9060440160206040518083038186803b15801561098657600080fd5b505afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092b9190613394565b9392505050565b6000546001600160a01b03163314806109e757506000546001600160a01b0316155b610a035760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b038116610a1657600080fd5b6002546040516001600160a01b038084169216907fe1a66d77649cf0a57b9937073549f30f1c82bb865aaf066d2f299e37a62c6aad90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b600060088281548110610a8757610a876133e6565b60009182526020909120600290910201546001600160a01b031692915050565b610ab0816126bb565b610acc5760405162461bcd60e51b8152600401610282906132dc565b610ad6828261091c565b15610b3d5760405162461bcd60e51b815260206004820152603160248201527f52656769737472793a207375636820636f6e73756d6572206368616e6e656c206044820152701a5cc8185b1c9958591e481bdc195b9959607a1b6064820152608401610282565b610b4a82826000806127d6565b505050565b600080610b5e6104e684610f16565b80516020909101209050610b7b6001600160a01b038516826129b0565b949350505050565b6000610b996007546001600160a01b0316151590565b15610c215760075460405163505a1b3160e01b81526001600160a01b0384811660048301529091169063505a1b319060240160206040518083038186803b158015610be357600080fd5b505afa158015610bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613394565b92915050565b506001600160a01b039081166000908152600a60205260409020541690565b600854600090610c5290600190613412565b905090565b60026001541415610caa5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316610cc457600080fd5b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610cfd573d6000803e3d6000fd5b5060018055565b60006008610d10610c40565b81548110610d2057610d206133e6565b60009182526020909120600290910201546001600160a01b0316919050565b6000546001600160a01b0316331480610d6157506000546001600160a01b0316155b610d7d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316610dfb5760405162461bcd60e51b815260206004820152603f60248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e20736574206e657720696d706c656d656e746174696f6e73006064820152608401610282565b813b15158015610e0b5750803b15155b610e745760405162461bcd60e51b815260206004820152603460248201527f52656769737472793a20696d706c656d656e746174696f6e73206861766520746044820152736f20626520736d61727420636f6e74726163747360601b6064820152608401610282565b604080518082019091526001600160a01b0392831681529082166020820190815260088054600181018255600091909152915160029092027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3810180549385166001600160a01b031994851617905590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee49091018054919093169116179055565b600060088281548110610f2b57610f2b6133e6565b60009182526020909120600160029092020101546001600160a01b031692915050565b60006008610f5a610c40565b81548110610f6a57610f6a6133e6565b60009182526020909120600160029092020101546001600160a01b0316919050565b606060006040518060600160405280603781526020016136b9603791399050606083901b60005b60148160ff16101561102057818160ff1660148110610fd457610fd46133e6565b1a60f81b83610fe4836014613429565b60ff1681518110610ff757610ff76133e6565b60200101906001600160f81b031916908160001a905350806110188161344e565b915050610fb3565b50909392505050565b6000806110376104e6610f4e565b805160209091012090506109be6001600160a01b038416826129b0565b61105d836126bb565b6110bc5760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2070726f7669646564206865726d65732068617320746f6044820152692062652061637469766560b01b6064820152608401610282565b60006110ef82308686600460008154809291906110d89061346e565b919050556040516020016107c89493929190613489565b6001600160a01b038086166000908152600960205260409020549192508083169116146111505760405162461bcd60e51b815260206004820152600f60248201526e77726f6e67207369676e617475726560881b6044820152606401610282565b6001600160a01b0384166000908152600960209081526040909120845161117f92600390920191860190612d65565b50836001600160a01b03167fd8c638c85547b8717e0d5ca292cff6dbe8fc02fa6e6863a047971c39511643c7846040516111b99190613051565b60405180910390a250505050565b6001600160a01b03811660009081526009602052604090206003018054606091906111f1906134d6565b80601f016020809104026020016040519081016040528092919081815260200182805461121d906134d6565b801561126a5780601f1061123f5761010080835404028352916020019161126a565b820191906000526020600020905b81548152906001019060200180831161124d57829003601f168201915b50505050509050919050565b600061128c6007546001600160a01b0316151590565b1561130e5760075460405163c3c5a54760e01b81526001600160a01b0384811660048301529091169063c3c5a5479060240160206040518083038186803b1580156112d657600080fd5b505afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613511565b506001600160a01b039081166000908152600a602052604090205416151590565b6000546001600160a01b031633148061135157506000546001600160a01b0316155b61136d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b03166113f95760405162461bcd60e51b8152602060048201526044602482018190527f52656769737472793a206f6e6c7920696e697469616c697a6564207265676973908201527f7472792063616e20736574206e6577206d696e696d616c206865726d6573207360648201526374616b6560e01b608482015260a401610282565b60068190556040518181527f645a9c74d34a0b1095b113252ad5e9afa0373f15b4b21760fb3a24b4b9d1ec309060200160405180910390a150565b6001600160a01b038082166000908152600960205260408120805460019091015491921690826114648383610b4f565b9050846001600160a01b0316816001600160a01b03161461148a57506000949350505050565b803b151580611511575060075460405163066eacb760e51b81526001600160a01b0387811660048301529091169063cdd596e09060240160206040518083038186803b1580156114d957600080fd5b505afa1580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115119190613511565b95945050505050565b611523856126bb565b61153f5760405162461bcd60e51b8152600401610282906132dc565b600061159482466040805160208101929092526001600160601b031930606090811b8216928401929092528a821b81166054840152606883018a9052608883018990529087901b1660a882015260bc016107c8565b90506001600160a01b0381166115f75760405162461bcd60e51b815260206004820152602260248201527f52656769737472793a2077726f6e67206964656e74697479207369676e617475604482015261726560f01b6064820152608401610282565b60006116038587613533565b6003549091506001600160a01b03166370a08231611621848a612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561166057600080fd5b505afa158015611674573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116989190613327565b8111156116b75760405162461bcd60e51b815260040161028290613340565b6116c3828886846127d6565b50851561172d576040516324f453d160e01b81526001600160a01b038381166004830152602482018890528816906324f453d190604401600060405180830381600087803b15801561171457600080fd5b505af1158015611728573d6000803e3d6000fd5b505050505b84156117b95760035460405163a9059cbb60e01b8152336004820152602481018790526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561177f57600080fd5b505af1158015611793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b79190613511565b505b50505050505050565b6001600160a01b03821661182c5760405162461bcd60e51b815260206004820152602b60248201527f52656769737472793a2062656e65666963696172792063616e2774206265207a60448201526a65726f206164647265737360a81b6064820152608401610282565b6007546001600160a01b03161561189f5760075460405163d0171d7960e01b81526001600160a01b039091169063d0171d79906118719086908690869060040161354b565b600060405180830381600087803b15801561188b57600080fd5b505af11580156117b9573d6000803e3d6000fd5b6004546118ad906001613533565b60045560006118c66007546001600160a01b0316151590565b6118d057306118dd565b6007546001600160a01b03165b9050600061192d83466004546040805160208101939093526001600160601b0319606088811b8216928501929092528a821b811660548501529089901b166068830152607c820152609c016107c8565b9050846001600160a01b0316816001600160a01b0316146119a65760405162461bcd60e51b815260206004820152602d60248201527f52656769737472793a206861766520746f206265207369676e6564206279206960448201526c3232b73a34ba3c9037bbb732b960991b6064820152608401610282565b6001600160a01b038581166000818152600a602090815260409182902080546001600160a01b0319169489169485179055905192835290917f768099735d1c322a05a5b9d7b76d99682a1833d3f7055e5ede25e0f2eeaa8c6d910160405180910390a25050505050565b6003546001600160a01b0316611a8e5760405162461bcd60e51b815260206004820152603960248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e207265676973746572206865726d65736573000000000000006064820152608401610282565b6001600160a01b038616611afc5760405162461bcd60e51b815260206004820152602f60248201527f52656769737472793a206865726d6573206f70657261746f722063616e27742060448201526e6265207a65726f206164647265737360881b6064820152608401610282565b600654851015611b745760405162461bcd60e51b815260206004820152603c60248201527f52656769737472793a206865726d6573206861766520746f207374616b65206160448201527f74206c65617374206d696e696d616c207374616b6520616d6f756e74000000006064820152608401610282565b6000611b7f87611029565b9050611b8a81611434565b15611be35760405162461bcd60e51b815260206004820152602360248201527f52656769737472793a206865726d657320616c726561647920726567697374656044820152621c995960ea1b6064820152608401610282565b6000611c02886001600160a01b0316611bfd6104e6610f4e565b612a01565b6003546040516323b872dd60e01b81523360048201526001600160a01b038084166024830152604482018b90529293509116906323b872dd90606401602060405180830381600087803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c909190613511565b5060035460055460405163699a088560e01b81526001600160a01b0392831660048201528a8316602482015261ffff89166044820152606481018890526084810187905290821660a48201529082169063699a08859060c401600060405180830381600087803b158015611d0357600080fd5b505af1158015611d17573d6000803e3d6000fd5b505050506040518060800160405280896001600160a01b03168152602001611d3d610c40565b815263fc0e3d90602084811b640100000000600160c01b0390811692909217604090811b828501529283018790526001600160a01b03868116600090815260098352849020855181546001600160a01b0319169216919091178155848201516001820155848401516002820180546001600160c01b03191663ffffffff9290961c91821691909416179390931790915560608301518051611de49260038501920190612d65565b505060035460405163095ea7b360e01b81526001600160a01b0385811660048301526000196024830152909116915063095ea7b390604401602060405180830381600087803b158015611e3657600080fd5b505af1158015611e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6e9190613511565b50816001600160a01b03167ff06d60cc2f463635fd237ad87f1d007af54840b82e7e4561707b1be63d91c2608985604051611eaa929190613577565b60405180910390a25050505050505050565b60026001541415611f0f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316611f2957600080fd5b6003546001600160a01b0382811691161415611f955760405162461bcd60e51b815260206004820152602560248201527f6e617469766520746f6b656e2066756e64732063616e2774206265207265636f6044820152641d995c995960da1b6064820152608401610282565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015611fd757600080fd5b505afa158015611feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200f9190613327565b60025460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561205f57600080fd5b505af1158015612073573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120979190613511565b50506001805550565b60408051608081018252600080825260208201819052918101919091526060808201526120cc82611434565b806120e057506007546001600160a01b0316155b61216a5760075460405163e0b6c32360e01b81526001600160a01b0384811660048301529091169063e0b6c3239060240160006040518083038186803b15801561212957600080fd5b505afa15801561213d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612165919081019061359b565b610c1b565b6001600160a01b038083166000908152600960209081526040918290208251608081018452815490941684526001810154918401919091526002810154640100000000600160c01b03811663ffffffff90911617821b918301919091526003810180546060840191906121dc906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612208906134d6565b80156122555780601f1061222a57610100808354040283529160200191612255565b820191906000526020600020905b81548152906001019060200180831161223857829003601f168201915b50505050508152505092915050565b6000546001600160a01b031633148061228657506000546001600160a01b0316155b6122a25760405162461bcd60e51b8152600401610282906133b1565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156122e657600080fd5b505afa1580156122fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231e9190613327565b90506000811161237f5760405162461bcd60e51b815260206004820152602660248201527f636f6c6c6563746564206665652063616e6e6f74206265206c657373207468616044820152656e207a65726f60d01b6064820152608401610282565b60035460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156123cd57600080fd5b505af11580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a9190613511565b6001600160a01b0381166000908152600960205260408120600101548190612430906104e690610a72565b8051906020012090506000848460405160200161246c929190606092831b6001600160601b031990811682529190921b16601482015260280190565b60405160208183030381529060405280519060200120905061151181836129b0565b6000546001600160a01b03163314806124b057506000546001600160a01b0316155b6124cc5760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b0381166125315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610282565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806125ae57506000546001600160a01b0316155b6125ca5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316156126235760405162461bcd60e51b815260206004820181905260248201527f52656769737472793a20697320616c726561647920696e697469616c697a65646044820152606401610282565b60068490556001600160a01b03861661263b57600080fd5b600380546001600160a01b0319166001600160a01b0388811691909117909155851661266657600080fd5b600580546001600160a01b0319166001600160a01b03871617905561268b8383610d3f565b6126943361248e565b600780546001600160a01b0319166001600160a01b03929092169190911790555050505050565b60006126c682611434565b6127215760405162461bcd60e51b815260206004820152602660248201527f52656769737472793a206865726d6573206861766520746f20626520726567696044820152651cdd195c995960d21b6064820152608401610282565b6000826001600160a01b0316634e69d5606040518163ffffffff1660e01b815260040160206040518083038186803b15801561275c57600080fd5b505afa158015612770573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127949190613681565b905060008160038111156127aa576127aa6136a2565b149392505050565b60008060006127c18585612a1b565b915091506127ce81612a8b565b509392505050565b6040516001600160601b0319606086811b8216602084015285901b1660348201526000908190604801604051602081830303815290604052805190602001209050600061284d6104e660096000896001600160a01b03166001600160a01b0316815260200190815260200160002060010154610a72565b9050600061285b8383612a01565b600354600554604051637b809f7b60e11b81526001600160a01b03928316600482015290821660248201528a8216604482015289821660648201526084810188905291925082169063f7013ef69060a401600060405180830381600087803b1580156128c657600080fd5b505af11580156128da573d6000803e3d6000fd5b50506040516001600160a01b038481168252808b1693508b1691507f2ed7bcf2ff03098102c7003d7ce2a633e4b49b8198b07de5383cdf4c0ab9228b9060200160405180910390a36001600160a01b038616612934578095505b61293d88611276565b6129a5576001600160a01b038881166000818152600a602090815260409182902080546001600160a01b031916948b169485179055905192835290917fefaf768237c22e140a862d5d375ad5c153479fac3f8bcf8b580a1651fd62c3ef910160405180910390a25b979650505050505050565b604080516001600160f81b03196020808301919091523060601b6001600160601b03191660218301526035820194909452605580820193909352815180820390930183526075019052805191012090565b600080838351602085016000f59050803b6109be57600080fd5b600080825160411415612a525760208301516040840151606085015160001a612a4687828585612c49565b94509450505050612a84565b825160401415612a7c5760208301516040840151612a71868383612d36565b935093505050612a84565b506000905060025b9250929050565b6000816004811115612a9f57612a9f6136a2565b1415612aa85750565b6001816004811115612abc57612abc6136a2565b1415612b0a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610282565b6002816004811115612b1e57612b1e6136a2565b1415612b6c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610282565b6003816004811115612b8057612b806136a2565b1415612bd95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610282565b6004816004811115612bed57612bed6136a2565b1415612c465760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610282565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c805750600090506003612d2d565b8460ff16601b14158015612c9857508460ff16601c14155b15612ca95750600090506004612d2d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612cfd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d2657600060019250925050612d2d565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612d5787828885612c49565b935093505050935093915050565b828054612d71906134d6565b90600052602060002090601f016020900481019282612d935760008555612dd9565b82601f10612dac57805160ff1916838001178555612dd9565b82800160010185558215612dd9579182015b82811115612dd9578251825591602001919060010190612dbe565b50612de5929150612de9565b5090565b5b80821115612de55760008155600101612dea565b6001600160a01b0381168114612c4657600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715612e4c57612e4c612e13565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e7b57612e7b612e13565b604052919050565b600067ffffffffffffffff821115612e9d57612e9d612e13565b50601f01601f191660200190565b600082601f830112612ebc57600080fd5b8135612ecf612eca82612e83565b612e52565b818152846020838601011115612ee457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215612f1657600080fd5b8335612f2181612dfe565b925060208401359150604084013567ffffffffffffffff811115612f4457600080fd5b612f5086828701612eab565b9150509250925092565b60008060408385031215612f6d57600080fd5b8235612f7881612dfe565b91506020830135612f8881612dfe565b809150509250929050565b600060208284031215612fa557600080fd5b81356109be81612dfe565b600060208284031215612fc257600080fd5b5035919050565b60008060408385031215612fdc57600080fd5b8235612fe781612dfe565b946020939093013593505050565b60005b83811015613010578181015183820152602001612ff8565b8381111561301f576000848401525b50505050565b6000815180845261303d816020860160208601612ff5565b601f01601f19169290920160200192915050565b6020815260006109be6020830184613025565b60008060006060848603121561307957600080fd5b833561308481612dfe565b9250602084013567ffffffffffffffff808211156130a157600080fd5b6130ad87838801612eab565b935060408601359150808211156130c357600080fd5b50612f5086828701612eab565b600080600080600060a086880312156130e857600080fd5b85356130f381612dfe565b94506020860135935060408601359250606086013561311181612dfe565b9150608086013567ffffffffffffffff81111561312d57600080fd5b61313988828901612eab565b9150509295509295909350565b60008060006060848603121561315b57600080fd5b833561316681612dfe565b9250602084013561317681612dfe565b9150604084013567ffffffffffffffff811115612f4457600080fd5b60008060008060008060c087890312156131ab57600080fd5b86356131b681612dfe565b955060208701359450604087013561ffff811681146131d457600080fd5b9350606087013592506080870135915060a087013567ffffffffffffffff8111156131fe57600080fd5b61320a89828a01612eab565b9150509295509295509295565b6020815260018060a01b0382511660208201526020820151604082015267ffffffffffffffff19604083015116606082015260006060830151608080840152610b7b60a0840182613025565b60008060008060008060c0878903121561327c57600080fd5b863561328781612dfe565b9550602087013561329781612dfe565b94506040870135935060608701356132ae81612dfe565b925060808701356132be81612dfe565b915060a08701356132ce81612dfe565b809150509295509295509295565b6020808252602b908201527f52656769737472793a2070726f7669646564206865726d65732068617665207460408201526a6f2062652061637469766560a81b606082015260800190565b60006020828403121561333957600080fd5b5051919050565b60208082526034908201527f52656769737472793a206e6f7420656e6f756768742066756e647320696e206360408201527368616e6e656c20746f20636f766572206665657360601b606082015260800190565b6000602082840312156133a657600080fd5b81516109be81612dfe565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015613424576134246133fc565b500390565b600060ff821660ff84168060ff03821115613446576134466133fc565b019392505050565b600060ff821660ff811415613465576134656133fc565b60010192915050565b6000600019821415613482576134826133fc565b5060010190565b60006bffffffffffffffffffffffff19808760601b168352808660601b1660148401525083516134c0816028850160208801612ff5565b6028920191820192909252604801949350505050565b600181811c908216806134ea57607f821691505b6020821081141561350b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561352357600080fd5b815180151581146109be57600080fd5b60008219821115613546576135466133fc565b500190565b6001600160a01b0384811682528316602082015260606040820181905260009061151190830184613025565b6001600160a01b0383168152604060208201819052600090610b7b90830184613025565b600060208083850312156135ae57600080fd5b825167ffffffffffffffff808211156135c657600080fd5b90840190608082870312156135da57600080fd5b6135e2612e29565b82516135ed81612dfe565b81528284015184820152604083015167ffffffffffffffff198116811461361357600080fd5b604082015260608301518281111561362a57600080fd5b80840193505086601f84011261363f57600080fd5b8251915061364f612eca83612e83565b828152878584860101111561366357600080fd5b61367283868301878701612ff5565b60608201529695505050505050565b60006020828403121561369357600080fd5b8151600481106109be57600080fd5b634e487b7160e01b600052602160045260246000fdfe3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3a264697066735822122036219ab918a429fdce341f2929073e190befbb7c069166e8b963bcc654c35c7664736f6c63430008090033

Deployed ByteCode Sourcemap

17846:16827:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19365:49;;-1:-1:-1;;;19365:49:0;;216:2:1;19365:49:0;;;198:21:1;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:1;;;338:37;392:19;;19365:49:0;;;;;;;;17846:16827;;;;22413:702;;;;;;;;;;-1:-1:-1;22413:702:0;;;;;:::i;:::-;;:::i;:::-;;34139:247;;;;;;;;;;-1:-1:-1;34139:247:0;;;;;:::i;:::-;;:::i;:::-;;;2972:14:1;;2965:22;2947:41;;2935:2;2920:18;34139:247:0;;;;;;;;16012:258;;;;;;;;;;-1:-1:-1;16012:258:0;;;;;:::i;:::-;;:::i;20586:106::-;;;;;;;;;;-1:-1:-1;20664:5:0;;-1:-1:-1;;;;;20664:5:0;20656:28;;20586:106;;31107:152;;;;;;;;;;-1:-1:-1;31107:152:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3608:32:1;;;3590:51;;3578:2;3563:18;31107:152:0;3444:203:1;23209:347:0;;;;;;;;;;-1:-1:-1;23209:347:0;;;;;:::i;:::-;;:::i;27075:278::-;;;;;;;;;;-1:-1:-1;27075:278:0;;;;;:::i;:::-;;:::i;29324:218::-;;;;;;;;;;-1:-1:-1;29324:218:0;;;;;:::i;:::-;;:::i;17927:24::-;;;;;;;;;;;;;;;;;;;4370:25:1;;;4358:2;4343:18;17927:24:0;4224:177:1;32113:106:0;;;;;;;;;;;;;:::i;18043:33::-;;;;;;;;;;;;;;;;17958:26;;;;;;;;;;-1:-1:-1;17958:26:0;;;;-1:-1:-1;;;;;17958:26:0;;;16577:160;;;;;;;;;;;;;:::i;30955:144::-;;;;;;;;;;;;;:::i;31575:469::-;;;;;;;;;;-1:-1:-1;31575:469:0;;;;;:::i;:::-;;:::i;31417:150::-;;;;;;;;;;-1:-1:-1;31417:150:0;;;;;:::i;:::-;;:::i;12613:79::-;;;;;;;;;;-1:-1:-1;12651:7:0;12678:6;-1:-1:-1;;;;;12678:6:0;12613:79;;31267:142;;;;;;;;;;;;;:::i;28405:548::-;;;;;;;;;;-1:-1:-1;28405:548:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26815:252::-;;;;;;;;;;-1:-1:-1;26815:252:0;;;;;:::i;:::-;;:::i;27494:562::-;;;;;;;;;;-1:-1:-1;27494:562:0;;;;;:::i;:::-;;:::i;27361:125::-;;;;;;;;;;-1:-1:-1;27361:125:0;;;;;:::i;:::-;;:::i;32751:298::-;;;;;;;;;;-1:-1:-1;32751:298:0;;;;;:::i;:::-;;:::i;30568:296::-;;;;;;;;;;-1:-1:-1;30568:296:0;;;;;:::i;:::-;;:::i;18083:30::-;;;;;;;;;;-1:-1:-1;18083:30:0;;;;-1:-1:-1;;;;;18083:30:0;;;33057:658;;;;;;;;;;-1:-1:-1;33057:658:0;;;;;:::i;:::-;;:::i;21009:1309::-;;;;;;;;;;-1:-1:-1;21009:1309:0;;;;;:::i;:::-;;:::i;29550:1010::-;;;;;;;;;;-1:-1:-1;29550:1010:0;;;;;:::i;:::-;;:::i;32624:119::-;;;;;;;;;;-1:-1:-1;32706:14:0;;-1:-1:-1;;;;;32706:14:0;32698:37;;32624:119;;24739:1516;;;;;;;;;;-1:-1:-1;24739:1516:0;;;;;:::i;:::-;;:::i;16816:339::-;;;;;;;;;;-1:-1:-1;16816:339:0;;;;;:::i;:::-;;:::i;26604:203::-;;;;;;;;;;-1:-1:-1;26604:203:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34394:276::-;;;;;;;;;;-1:-1:-1;34394:276:0;;;;;:::i;:::-;;:::i;26263:333::-;;;;;;;;;;-1:-1:-1;26263:333:0;;;;;:::i;:::-;;:::i;12851:244::-;;;;;;;;;;-1:-1:-1;12851:244:0;;;;;:::i;:::-;;:::i;16339:103::-;;;;;;;;;;-1:-1:-1;16418:16:0;;-1:-1:-1;;;;;16418:16:0;16339:103;;15808:24;;;;;;;;;;-1:-1:-1;15808:24:0;;;;-1:-1:-1;;;;;15808:24:0;;;19726:852;;;;;;;;;;-1:-1:-1;19726:852:0;;;;;:::i;:::-;;:::i;22413:702::-;22536:25;22551:9;22536:14;:25::i;:::-;22528:81;;;;-1:-1:-1;;;22528:81:0;;;;;;;:::i;:::-;22668:17;22688:103;22780:10;17310:9;22698:72;;;;;;10794:19:1;;;;-1:-1:-1;;;;;;22737:4:0;10901:2:1;10897:15;;;10893:24;;10879:12;;;10872:46;;;;10952:15;;;;10948:24;10934:12;;;10927:46;10989:12;;;10982:28;;;11026:13;;22698:72:0;;;;;;;;;;;;;22688:83;;;;;;:91;;:103;;;;:::i;:::-;22668:123;-1:-1:-1;;;;;;22810:23:0;;22802:78;;;;-1:-1:-1;;;22802:78:0;;11252:2:1;22802:78:0;;;11234:21:1;11291:2;11271:18;;;11264:30;11330:34;11310:18;;;11303:62;-1:-1:-1;;;11381:18:1;;;11374:40;11431:19;;22802:78:0;11050:406:1;22802:78:0;22919:5;;-1:-1:-1;;;;;22919:5:0;:15;22935:39;22953:9;22964;22935:17;:39::i;:::-;22919:56;;-1:-1:-1;;;;;;22919:56:0;;;;;;;-1:-1:-1;;;;;3608:32:1;;;22919:56:0;;;3590:51:1;3563:18;;22919:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22901:14;:74;;22893:139;;;;-1:-1:-1;;;22893:139:0;;;;;;;:::i;:::-;23045:62;23058:9;23069;23088:1;23092:14;23045:12;:62::i;:::-;;22517:598;22413:702;;;:::o;34139:247::-;34223:4;34247:56;34263:39;34281:9;34292;34263:17;:39::i;:::-;32458:18;32506:16;;;32310:220;34247:56;:131;;;-1:-1:-1;34323:14:0;;:54;;-1:-1:-1;;;34323:54:0;;-1:-1:-1;;;;;12301:15:1;;;34323:54:0;;;12283:34:1;12353:15;;;12333:18;;;12326:43;34307:71:0;;34323:14;;:32;;12218:18:1;;34323:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34307:71::-;34240:138;34139:247;-1:-1:-1;;;34139:247:0:o;16012:258::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16118:29:0;::::1;16110:38;;;::::0;::::1;;16183:16;::::0;16164:53:::1;::::0;-1:-1:-1;;;;;16164:53:0;;::::1;::::0;16183:16:::1;::::0;16164:53:::1;::::0;16183:16:::1;::::0;16164:53:::1;16228:16;:34:::0;;-1:-1:-1;;;;;;16228:34:0::1;-1:-1:-1::0;;;;;16228:34:0;;;::::1;::::0;;;::::1;::::0;;16012:258::o;31107:152::-;31180:7;31207:15;31223:8;31207:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:44;-1:-1:-1;;;;;31207:44:0;;31107:152;-1:-1:-1;;31107:152:0:o;23209:347::-;23302:25;23317:9;23302:14;:25::i;:::-;23294:81;;;;-1:-1:-1;;;23294:81:0;;;;;;;:::i;:::-;23395:37;23411:9;23422;23395:15;:37::i;:::-;23394:38;23386:100;;;;-1:-1:-1;;;23386:100:0;;13331:2:1;23386:100:0;;;13313:21:1;13370:2;13350:18;;;13343:30;13409:34;13389:18;;;13382:62;-1:-1:-1;;;13460:18:1;;;13453:47;13517:19;;23386:100:0;13129:413:1;23386:100:0;23499:49;23512:9;23523;23542:1;23546;23499:12;:49::i;:::-;;23209:347;;:::o;27075:278::-;27165:7;27185:13;27211:47;27224:33;27248:8;27224:23;:33::i;27211:47::-;27201:58;;;;;;;;-1:-1:-1;27277:68:0;-1:-1:-1;;;;;27303:33:0;;27201:58;27277:17;:68::i;:::-;27270:75;27075:278;-1:-1:-1;;;;27075:278:0:o;29324:218::-;29388:7;29412:19;32706:14;;-1:-1:-1;;;;;32706:14:0;32698:37;;;32624:119;29412:19;29408:85;;;29453:14;;:40;;-1:-1:-1;;;29453:40:0;;-1:-1:-1;;;;;3608:32:1;;;29453:40:0;;;3590:51:1;29453:14:0;;;;:29;;3563:18:1;;29453:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29446:47;29324:218;-1:-1:-1;;29324:218:0:o;29408:85::-;-1:-1:-1;;;;;;29513:21:0;;;;;;;:10;:21;;;;;;;;29324:218::o;32113:106::-;32187:15;:22;32160:7;;32187:24;;32210:1;;32187:24;:::i;:::-;32180:31;;32113:106;:::o;16577:160::-;14755:1;15351:7;;:19;;15343:63;;;;-1:-1:-1;;;15343:63:0;;14011:2:1;15343:63:0;;;13993:21:1;14050:2;14030:18;;;14023:30;14089:33;14069:18;;;14062:61;14140:18;;15343:63:0;13809:355:1;15343:63:0;14755:1;15484:7;:18;;;16639:16;-1:-1:-1;;;;;16639:16:0::1;16631:39;;;::::0;::::1;;16681:16;::::0;:48:::1;::::0;-1:-1:-1;;;;;16681:16:0;;::::1;::::0;16707:21:::1;16681:48:::0;::::1;;;::::0;:16:::1;:48:::0;:16;:48;16707:21;16681:16;:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;14711:1:0;15663:22;;16577:160::o;30955:144::-;31012:7;31039:15;31055:16;:14;:16::i;:::-;31039:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:52;-1:-1:-1;;;;;31039:52:0;;30955:144;-1:-1:-1;30955:144:0:o;31575:469::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;20664:5;;-1:-1:-1;;;;;20664:5:0;31694:91:::1;;;::::0;-1:-1:-1;;;31694:91:0;;14371:2:1;31694:91:0::1;::::0;::::1;14353:21:1::0;14410:2;14390:18;;;14383:30;14449:34;14429:18;;;14422:62;14520:33;14500:18;;;14493:61;14571:19;;31694:91:0::1;14169:427:1::0;31694:91:0::1;32458:18:::0;;32506:16;;31804:81:::1;;;;-1:-1:-1::0;32458:18:0;;32506:16;;31847:38:::1;31796:146;;;::::0;-1:-1:-1;;;31796:146:0;;14803:2:1;31796:146:0::1;::::0;::::1;14785:21:1::0;14842:2;14822:18;;;14815:30;14881:34;14861:18;;;14854:62;-1:-1:-1;;;14932:18:1;;;14925:50;14992:19;;31796:146:0::1;14601:416:1::0;31796:146:0::1;31974:61;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;31974:61:0;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;;31953:15:::1;:83:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;31953:83:0;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;31953:83:0;;::::1;;::::0;;;;;;;;;;;;;::::1;::::0;::::1;;::::0;;31575:469::o;31417:150::-;31489:7;31516:15;31532:8;31516:25;;;;;;;;:::i;:::-;;;;;;;;;:43;:25;;;;;:43;;-1:-1:-1;;;;;31516:43:0;;31417:150;-1:-1:-1;;31417:150:0:o;31267:142::-;31323:7;31350:15;31366:16;:14;:16::i;:::-;31350:33;;;;;;;;:::i;:::-;;;;;;;;;:51;:33;;;;;:51;;-1:-1:-1;;;;;31350:51:0;;31267:142;-1:-1:-1;31267:142:0:o;28405:548::-;28473:12;28625:18;:136;;;;;;;;;;;;;;;;;;-1:-1:-1;28797:24:0;;;;28774:20;28832:89;28854:2;28850:1;:6;;;28832:89;;;28894:12;28907:1;28894:15;;;;;;;;;:::i;:::-;;;;28878:5;28884:6;28889:1;28884:2;:6;:::i;:::-;28878:13;;;;;;;;;;:::i;:::-;;;;:31;-1:-1:-1;;;;;28878:31:0;;;;;;;;-1:-1:-1;28858:3:0;;;;:::i;:::-;;;;28832:89;;;-1:-1:-1;28940:5:0;;28405:548;-1:-1:-1;;;28405:548:0:o;26815:252::-;26887:7;26907:13;26933:39;26946:25;:23;:25::i;26933:39::-;26923:50;;;;;;;;-1:-1:-1;26991:68:0;-1:-1:-1;;;;;27017:33:0;;26923:50;26991:17;:68::i;27494:562::-;27608:25;27623:9;27608:14;:25::i;:::-;27600:80;;;;-1:-1:-1;;;27600:80:0;;15613:2:1;27600:80:0;;;15595:21:1;15652:2;15632:18;;;15625:30;15691:34;15671:18;;;15664:62;-1:-1:-1;;;15742:18:1;;;15735:40;15792:19;;27600:80:0;15411:406:1;27600:80:0;27739:17;27759:92;27840:10;27794:4;27801:9;27812:4;27818:9;;:11;;;;;;;;;:::i;:::-;;;;;27769:61;;;;;;;;;;;:::i;27759:92::-;-1:-1:-1;;;;;27883:19:0;;;;;;;:8;:19;;;;;:28;27739:112;;-1:-1:-1;27870:41:0;;;27883:28;;27870:41;27862:69;;;;-1:-1:-1;;;27862:69:0;;16753:2:1;27862:69:0;;;16735:21:1;16792:2;16772:18;;;16765:30;-1:-1:-1;;;16811:18:1;;;16804:45;16866:18;;27862:69:0;16551:339:1;27862:69:0;-1:-1:-1;;;;;27967:19:0;;;;;;:8;:19;;;;;;;;:30;;;;:23;;;;;:30;;;;:::i;:::-;;28032:9;-1:-1:-1;;;;;28015:33:0;;28043:4;28015:33;;;;;;:::i;:::-;;;;;;;;27589:467;27494:562;;;:::o;27361:125::-;-1:-1:-1;;;;;27455:19:0;;;;;;:8;:19;;;;;:23;;27448:30;;27423:12;;27455:23;27448:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27361:125;;;:::o;32751:298::-;32813:4;32834:19;32706:14;;-1:-1:-1;;;;;32706:14:0;32698:37;;;32624:119;32834:19;32830:83;;;32875:14;;:38;;-1:-1:-1;;;32875:38:0;;-1:-1:-1;;;;;3608:32:1;;;32875:38:0;;;3590:51:1;32875:14:0;;;;:27;;3563:18:1;;32875:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32830:83::-;-1:-1:-1;;;;;;33006:21:0;;;33039:1;33006:21;;;:10;:21;;;;;;;:35;;;32751:298::o;30568:296::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;20664:5;;-1:-1:-1;;;;;20664:5:0;30653:96:::1;;;::::0;-1:-1:-1;;;30653:96:0;;17764:2:1;30653:96:0::1;::::0;::::1;17746:21:1::0;17803:2;17783:18;;;17776:30;;;17842:34;17822:18;;;17815:62;17913:34;17893:18;;;17886:62;-1:-1:-1;;;17964:19:1;;;17957:35;18009:19;;30653:96:0::1;17562:472:1::0;30653:96:0::1;30760:18;:37:::0;;;30813:43:::1;::::0;4370:25:1;;;30813:43:0::1;::::0;4358:2:1;4343:18;30813:43:0::1;;;;;;;30568:296:::0;:::o;33057:658::-;-1:-1:-1;;;;;33364:19:0;;;33115:4;33364:19;;;:8;:19;;;;;:28;;;33422:27;;;;33115:4;;33364:28;;33115:4;33476:43;33364:28;33422:27;33476:16;:43::i;:::-;33460:59;;33543:9;-1:-1:-1;;;;;33534:18:0;:5;-1:-1:-1;;;;;33534:18:0;;33530:49;;-1:-1:-1;33574:5:0;;33057:658;-1:-1:-1;;;;33057:658:0:o;33530:49::-;32458:18;;32506:16;;33647:60;;;-1:-1:-1;33673:14:0;;:34;;-1:-1:-1;;;33673:34:0;;-1:-1:-1;;;;;3608:32:1;;;33673:34:0;;;3590:51:1;33673:14:0;;;;:23;;3563:18:1;;33673:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33640:67;33057:658;-1:-1:-1;;;;;33057:658:0:o;21009:1309::-;21173:25;21188:9;21173:14;:25::i;:::-;21165:81;;;;-1:-1:-1;;;21165:81:0;;;;;;;:::i;:::-;21305:17;21325:131;21445:10;17310:9;21335:100;;;;;;18308:19:1;;;;-1:-1:-1;;;;;;21374:4:0;18415:2:1;18411:15;;;18407:24;;18393:12;;;18386:46;;;;18466:15;;;18462:24;;18448:12;;;18441:46;18503:12;;;18496:28;;;18540:13;;;18533:29;;;18597:15;;;;18593:24;18578:13;;;18571:47;18634:13;;21335:100:0;18039:614:1;21325:131:0;21305:151;-1:-1:-1;;;;;;21475:23:0;;21467:70;;;;-1:-1:-1;;;21467:70:0;;18860:2:1;21467:70:0;;;18842:21:1;18899:2;18879:18;;;18872:30;18938:34;18918:18;;;18911:62;-1:-1:-1;;;18989:18:1;;;18982:32;19031:19;;21467:70:0;18658:398:1;21467:70:0;21633:17;21653:29;21668:14;21653:12;:29;:::i;:::-;21714:5;;21633:49;;-1:-1:-1;;;;;;21714:5:0;:15;21730:39;21748:9;21759;21730:17;:39::i;:::-;21714:56;;-1:-1:-1;;;;;;21714:56:0;;;;;;;-1:-1:-1;;;;;3608:32:1;;;21714:56:0;;;3590:51:1;3563:18;;21714:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21701:9;:69;;21693:134;;;;-1:-1:-1;;;21693:134:0;;;;;;;:::i;:::-;21874:59;21887:9;21898;21909:12;21923:9;21874:12;:59::i;:::-;-1:-1:-1;22056:16:0;;22052:112;;22089:63;;-1:-1:-1;;;22089:63:0;;-1:-1:-1;;;;;19386:32:1;;;22089:63:0;;;19368:51:1;19435:18;;;19428:34;;;22089:38:0;;;;;19341:18:1;;22089:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22052:112;22222:18;;22218:93;;22257:5;;:42;;-1:-1:-1;;;22257:42:0;;22272:10;22257:42;;;19368:51:1;19435:18;;;19428:34;;;-1:-1:-1;;;;;22257:5:0;;;;:14;;19341:18:1;;22257:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22218:93;21154:1164;;21009:1309;;;;;:::o;29550:1010::-;-1:-1:-1;;;;;29669:29:0;;29661:85;;;;-1:-1:-1;;;29661:85:0;;19675:2:1;29661:85:0;;;19657:21:1;19714:2;19694:18;;;19687:30;19753:34;19733:18;;;19726:62;-1:-1:-1;;;19804:18:1;;;19797:41;19855:19;;29661:85:0;19473:407:1;29661:85:0;32706:14;;-1:-1:-1;;;;;32706:14:0;32698:37;29813:740;;29853:14;;:69;;-1:-1:-1;;;29853:69:0;;-1:-1:-1;;;;;29853:14:0;;;;:29;;:69;;29883:9;;29894:15;;29911:10;;29853:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29813:740;29967:9;;:13;;29979:1;29967:13;:::i;:::-;29955:9;:25;30091:21;30115:19;32706:14;;-1:-1:-1;;;;;32706:14:0;32698:37;;;32624:119;30115:19;:61;;30171:4;30115:61;;;30145:14;;-1:-1:-1;;;;;30145:14:0;30115:61;30091:85;-1:-1:-1;30191:15:0;30209:115;30313:10;17310:9;30293;;30219:84;;;;;;20546:19:1;;;;-1:-1:-1;;;;;;20653:2:1;20649:15;;;20645:24;;20631:12;;;20624:46;;;;20704:15;;;20700:24;;20686:12;;;20679:46;20759:15;;;;20755:24;20741:12;;;20734:46;20796:12;;;20789:28;20833:13;;30219:84:0;20305:547:1;30209:115:0;30191:133;;30358:9;-1:-1:-1;;;;;30347:20:0;:7;-1:-1:-1;;;;;30347:20:0;;30339:78;;;;-1:-1:-1;;;30339:78:0;;21059:2:1;30339:78:0;;;21041:21:1;21098:2;21078:18;;;21071:30;21137:34;21117:18;;;21110:62;-1:-1:-1;;;21188:18:1;;;21181:43;21241:19;;30339:78:0;20857:409:1;30339:78:0;-1:-1:-1;;;;;30434:21:0;;;;;;;:10;:21;;;;;;;;;:39;;-1:-1:-1;;;;;;30434:39:0;;;;;;;;;30495:46;;3590:51:1;;;30434:21:0;;30495:46;;3563:18:1;30495:46:0;;;;;;;29940:613;;29550:1010;;;:::o;24739:1516::-;20664:5;;-1:-1:-1;;;;;20664:5:0;24918:85;;;;-1:-1:-1;;;24918:85:0;;21473:2:1;24918:85:0;;;21455:21:1;21512:2;21492:18;;;21485:30;21551:34;21531:18;;;21524:62;21622:27;21602:18;;;21595:55;21667:19;;24918:85:0;21271:421:1;24918:85:0;-1:-1:-1;;;;;25022:29:0;;25014:89;;;;-1:-1:-1;;;25014:89:0;;21899:2:1;25014:89:0;;;21881:21:1;21938:2;21918:18;;;21911:30;21977:34;21957:18;;;21950:62;-1:-1:-1;;;22028:18:1;;;22021:45;22083:19;;25014:89:0;21697:411:1;25014:89:0;25138:18;;25122:12;:34;;25114:107;;;;-1:-1:-1;;;25114:107:0;;22315:2:1;25114:107:0;;;22297:21:1;22354:2;22334:18;;;22327:30;22393:34;22373:18;;;22366:62;22464:30;22444:18;;;22437:58;22512:19;;25114:107:0;22113:424:1;25114:107:0;25234:17;25254:33;25271:15;25254:16;:33::i;:::-;25234:53;;25307:19;25316:9;25307:8;:19::i;:::-;25306:20;25298:68;;;;-1:-1:-1;;;25298:68:0;;22744:2:1;25298:68:0;;;22726:21:1;22783:2;22763:18;;;22756:30;22822:34;22802:18;;;22795:62;-1:-1:-1;;;22873:18:1;;;22866:33;22916:19;;25298:68:0;22542:399:1;25298:68:0;25463:23;25505:91;25537:15;-1:-1:-1;;;;;25521:33:0;25556:39;25569:25;:23;:25::i;25556:39::-;25505:15;:91::i;:::-;25664:5;;:62;;-1:-1:-1;;;25664:62:0;;25683:10;25664:62;;;23186:34:1;-1:-1:-1;;;;;23256:15:1;;;23236:18;;;23229:43;23288:18;;;23281:34;;;25463:134:0;;-1:-1:-1;25664:5:0;;;:18;;23121::1;;25664:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25796:5:0;;25869:3;;25769:104;;-1:-1:-1;;;25769:104:0;;-1:-1:-1;;;;;25796:5:0;;;25769:104;;;23665:34:1;23735:15;;;23715:18;;;23708:43;23799:6;23787:19;;23767:18;;;23760:47;23823:18;;;23816:34;;;23866:19;;;23859:35;;;25869:3:0;;;23910:19:1;;;23903:44;25769:18:0;;;;;;23599:19:1;;25769:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25957:65;;;;;;;;25964:15;-1:-1:-1;;;;;25957:65:0;;;;;25981:16;:14;:16::i;:::-;25957:65;;25999:16;25957:65;;;;-1:-1:-1;;;;;25957:65:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25935:19:0;;;-1:-1:-1;25935:19:0;;;:8;:19;;;;;:87;;;;-1:-1:-1;;;;;;25935:87:0;;;;;;;;;;;;;-1:-1:-1;25935:87:0;;;;;;;;;;;;-1:-1:-1;;;;;;25935:87:0;25957:65;25935:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;26136:5:0;;:43;;-1:-1:-1;;;26136:43:0;;-1:-1:-1;;;;;19386:32:1;;;26136:43:0;;;19368:51:1;-1:-1:-1;;19435:18:1;;;19428:34;26136:5:0;;;;-1:-1:-1;26136:13:0;;19341:18:1;;26136:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26214:9;-1:-1:-1;;;;;26197:50:0;;26225:15;26242:4;26197:50;;;;;;;:::i;:::-;;;;;;;;24907:1348;;24739:1516;;;;;;:::o;16816:339::-;14755:1;15351:7;;:19;;15343:63;;;;-1:-1:-1;;;15343:63:0;;14011:2:1;15343:63:0;;;13993:21:1;14050:2;14030:18;;;14023:30;14089:33;14069:18;;;14062:61;14140:18;;15343:63:0;13809:355:1;15343:63:0;14755:1;15484:7;:18;;;16892:16;-1:-1:-1;;;;;16892:16:0::1;16884:39;;;::::0;::::1;;16960:5;::::0;-1:-1:-1;;;;;16942:24:0;;::::1;16960:5:::0;::::1;16942:24;;16934:74;;;::::0;-1:-1:-1;;;16934:74:0;;24479:2:1;16934:74:0::1;::::0;::::1;24461:21:1::0;24518:2;24498:18;;;24491:30;24557:34;24537:18;;;24530:62;-1:-1:-1;;;24608:18:1;;;24601:35;24653:19;;16934:74:0::1;24277:401:1::0;16934:74:0::1;17037:44;::::0;-1:-1:-1;;;17037:44:0;;17075:4:::1;17037:44;::::0;::::1;3590:51:1::0;17019:15:0::1;::::0;-1:-1:-1;;;;;17037:29:0;::::1;::::0;::::1;::::0;3563:18:1;;17037:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17121:16;::::0;17092:55:::1;::::0;-1:-1:-1;;;17092:55:0;;-1:-1:-1;;;;;17121:16:0;;::::1;17092:55;::::0;::::1;19368:51:1::0;19435:18;;;19428:34;;;17019:62:0;;-1:-1:-1;17092:28:0;::::1;::::0;::::1;::::0;19341:18:1;;17092:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;14711:1:0;15663:22;;-1:-1:-1;16816:339:0:o;26604:203::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26696:19:0;26705:9;26696:8;:19::i;:::-;:43;;;-1:-1:-1;32706:14:0;;-1:-1:-1;;;;;32706:14:0;32698:37;26696:43;:103;;26764:14;;:35;;-1:-1:-1;;;26764:35:0;;-1:-1:-1;;;;;3608:32:1;;;26764:35:0;;;3590:51:1;26764:14:0;;;;:24;;3563:18:1;;26764:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26764:35:0;;;;;;;;;;;;:::i;:::-;26696:103;;;-1:-1:-1;;;;;26742:19:0;;;;;;;:8;:19;;;;;;;;;26696:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26696:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26689:110;26604:203;-1:-1:-1;;26604:203:0:o;34394:276::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;34499:5:::1;::::0;:30:::1;::::0;-1:-1:-1;;;34499:30:0;;34523:4:::1;34499:30;::::0;::::1;3590:51:1::0;34475:21:0::1;::::0;-1:-1:-1;;;;;34499:5:0::1;::::0;:15:::1;::::0;3563:18:1;;34499:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34475:54;;34564:1;34548:13;:17;34540:68;;;::::0;-1:-1:-1;;;34540:68:0;;26439:2:1;34540:68:0::1;::::0;::::1;26421:21:1::0;26478:2;26458:18;;;26451:30;26517:34;26497:18;;;26490:62;-1:-1:-1;;;26568:18:1;;;26561:36;26614:19;;34540:68:0::1;26237:402:1::0;34540:68:0::1;34619:5;::::0;:43:::1;::::0;-1:-1:-1;;;34619:43:0;;-1:-1:-1;;;;;19386:32:1;;;34619:43:0::1;::::0;::::1;19368:51:1::0;19435:18;;;19428:34;;;34619:5:0;;::::1;::::0;:14:::1;::::0;19341:18:1;;34619:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26263:333::-:0;-1:-1:-1;;;;;26433:19:0;;26349:7;26433:19;;;:8;:19;;;;;:27;;;26349:7;;26395:67;;26408:53;;:24;:53::i;26395:67::-;26385:78;;;;;;26369:94;;26474:13;26517:9;26528;26500:38;;;;;;;;26871:2:1;26867:15;;;-1:-1:-1;;;;;;26863:24:1;;;26851:37;;26922:15;;;;26918:24;26913:2;26904:12;;26897:46;26968:2;26959:12;;26644:333;26500:38:0;;;;;;;;;;;;;26490:49;;;;;;26474:65;;26557:31;26575:5;26582;26557:17;:31::i;12851:244::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12940:22:0;::::1;12932:73;;;::::0;-1:-1:-1;;;12932:73:0;;27184:2:1;12932:73:0::1;::::0;::::1;27166:21:1::0;27223:2;27203:18;;;27196:30;27262:34;27242:18;;;27235:62;-1:-1:-1;;;27313:18:1;;;27306:36;27359:19;;12932:73:0::1;26982:402:1::0;12932:73:0::1;13042:6;::::0;;13021:38:::1;::::0;-1:-1:-1;;;;;13021:38:0;;::::1;::::0;13042:6;::::1;::::0;13021:38:::1;::::0;::::1;13070:6;:17:::0;;-1:-1:-1;;;;;;13070:17:0::1;-1:-1:-1::0;;;;;13070:17:0;;;::::1;::::0;;;::::1;::::0;;12851:244::o;19726:852::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;20664:5;;-1:-1:-1;;;;;20664:5:0;20656:28;19951:61:::1;;;::::0;-1:-1:-1;;;19951:61:0;;27591:2:1;19951:61:0::1;::::0;::::1;27573:21:1::0;;;27610:18;;;27603:30;27669:34;27649:18;;;27642:62;27721:18;;19951:61:0::1;27389:356:1::0;19951:61:0::1;20025:18;:40:::0;;;-1:-1:-1;;;;;20086:27:0;::::1;20078:36;;;::::0;::::1;;20125:5;:34:::0;;-1:-1:-1;;;;;;20125:34:0::1;-1:-1:-1::0;;;;;20125:34:0;;::::1;::::0;;;::::1;::::0;;;20180:25;::::1;20172:34;;;::::0;::::1;;20217:3;:17:::0;;-1:-1:-1;;;;;;20217:17:0::1;-1:-1:-1::0;;;;;20217:17:0;::::1;;::::0;;20295:65:::1;20314:22:::0;20338:21;20295:18:::1;:65::i;:::-;20417:29;20435:10;20417:17;:29::i;:::-;20528:14;:42:::0;;-1:-1:-1;;;;;;20528:42:0::1;-1:-1:-1::0;;;;;20528:42:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;19726:852:0:o;33723:408::-;33789:4;33921:19;33930:9;33921:8;:19::i;:::-;33913:70;;;;-1:-1:-1;;;33913:70:0;;27952:2:1;33913:70:0;;;27934:21:1;27991:2;27971:18;;;27964:30;28030:34;28010:18;;;28003:62;-1:-1:-1;;;28081:18:1;;;28074:36;28127:19;;33913:70:0;27750:402:1;33913:70:0;33996:29;34044:9;-1:-1:-1;;;;;34028:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33996:70;-1:-1:-1;34094:29:0;34084:6;:39;;;;;;;;:::i;:::-;;;33723:408;-1:-1:-1;;;33723:408:0:o;4440:231::-;4518:7;4539:17;4558:18;4580:27;4591:4;4597:9;4580:10;:27::i;:::-;4538:69;;;;4618:18;4630:5;4618:11;:18::i;:::-;-1:-1:-1;4654:9:0;4440:231;-1:-1:-1;;;4440:231:0:o;23709:1022::-;23869:38;;-1:-1:-1;;;;;;26871:2:1;26867:15;;;26863:24;;23869:38:0;;;26851:37:1;26922:15;;;26918:24;26904:12;;;26897:46;23823:7:0;;;;26959:12:1;;23869:38:0;;;;;;;;;;;;23859:49;;;;;;23843:65;;23919:18;23940:67;23953:53;23978:8;:19;23987:9;-1:-1:-1;;;;;23978:19:0;-1:-1:-1;;;;;23978:19:0;;;;;;;;;;;;:27;;;23953:24;:53::i;23940:67::-;23919:88;-1:-1:-1;24018:16:0;24045:38;24069:5;23919:88;24045:15;:38::i;:::-;24123:5;;24131:3;;24095:68;;-1:-1:-1;;;24095:68:0;;-1:-1:-1;;;;;24123:5:0;;;24095:68;;;28869:34:1;24131:3:0;;;28919:18:1;;;28912:43;28991:15;;;28971:18;;;28964:43;29043:15;;;29023:18;;;29016:43;29075:19;;;29068:35;;;24018:66:0;;-1:-1:-1;24095:19:0;;;;;28803::1;;24095:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24181:63:0;;-1:-1:-1;;;;;3608:32:1;;;3590:51;;24181:63:0;;;;-1:-1:-1;24181:63:0;;;-1:-1:-1;24181:63:0;;3578:2:1;3563:18;24181:63:0;;;;;;;-1:-1:-1;;;;;24356:26:0;;24352:91;;24422:8;24399:32;;24352:91;24536:23;24549:9;24536:12;:23::i;:::-;24531:156;;-1:-1:-1;;;;;24576:21:0;;;;;;;:10;:21;;;;;;;;;:36;;-1:-1:-1;;;;;;24576:36:0;;;;;;;;;24632:43;;3590:51:1;;;24576:21:0;;24632:43;;3563:18:1;24632:43:0;;;;;;;24531:156;24714:8;23709:1022;-1:-1:-1;;;;;;;23709:1022:0:o;28104:293::-;28245:140;;;-1:-1:-1;;;;;;28245:140:0;;;;29325:39:1;;;;28311:4:0;29401:2:1;29397:15;-1:-1:-1;;;;;;29393:53:1;29380:11;;;29373:74;29463:12;;;29456:28;;;;29500:12;;;;29493:28;;;;28245:140:0;;;;;;;;;;29537:12:1;;28245:140:0;;28235:151;;;;;;28104:293::o;28961:355::-;29039:15;29067:21;29177:5;29169;29163:12;29156:4;29149:5;29145:16;29142:1;29134:49;29125:58;;29219:5;29207:18;29197:76;;29256:1;29253;29246:12;2330:1308;2411:7;2420:12;2645:9;:16;2665:2;2645:22;2641:990;;;2941:4;2926:20;;2920:27;2991:4;2976:20;;2970:27;3049:4;3034:20;;3028:27;2684:9;3020:36;3092:25;3103:4;3020:36;2920:27;2970;3092:10;:25::i;:::-;3085:32;;;;;;;;;2641:990;3139:9;:16;3159:2;3139:22;3135:496;;;3414:4;3399:20;;3393:27;3465:4;3450:20;;3444:27;3507:23;3518:4;3393:27;3444;3507:10;:23::i;:::-;3500:30;;;;;;;;3135:496;-1:-1:-1;3579:1:0;;-1:-1:-1;3583:35:0;3135:496;2330:1308;;;;;:::o;601:643::-;679:20;670:5;:29;;;;;;;;:::i;:::-;;666:571;;;601:643;:::o;666:571::-;777:29;768:5;:38;;;;;;;;:::i;:::-;;764:473;;;823:34;;-1:-1:-1;;;823:34:0;;29762:2:1;823:34:0;;;29744:21:1;29801:2;29781:18;;;29774:30;29840:26;29820:18;;;29813:54;29884:18;;823:34:0;29560:348:1;764:473:0;888:35;879:5;:44;;;;;;;;:::i;:::-;;875:362;;;940:41;;-1:-1:-1;;;940:41:0;;30115:2:1;940:41:0;;;30097:21:1;30154:2;30134:18;;;30127:30;30193:33;30173:18;;;30166:61;30244:18;;940:41:0;29913:355:1;875:362:0;1012:30;1003:5;:39;;;;;;;;:::i;:::-;;999:238;;;1059:44;;-1:-1:-1;;;1059:44:0;;30475:2:1;1059:44:0;;;30457:21:1;30514:2;30494:18;;;30487:30;30553:34;30533:18;;;30526:62;-1:-1:-1;;;30604:18:1;;;30597:32;30646:19;;1059:44:0;30273:398:1;999:238:0;1134:30;1125:5;:39;;;;;;;;:::i;:::-;;1121:116;;;1181:44;;-1:-1:-1;;;1181:44:0;;30878:2:1;1181:44:0;;;30860:21:1;30917:2;30897:18;;;30890:30;30956:34;30936:18;;;30929:62;-1:-1:-1;;;31007:18:1;;;31000:32;31049:19;;1181:44:0;30676:398:1;1121:116:0;601:643;:::o;5939:1632::-;6070:7;;7004:66;6991:79;;6987:163;;;-1:-1:-1;7103:1:0;;-1:-1:-1;7107:30:0;7087:51;;6987:163;7164:1;:7;;7169:2;7164:7;;:18;;;;;7175:1;:7;;7180:2;7175:7;;7164:18;7160:102;;;-1:-1:-1;7215:1:0;;-1:-1:-1;7219:30:0;7199:51;;7160:102;7376:24;;;7359:14;7376:24;;;;;;;;;31306:25:1;;;31379:4;31367:17;;31347:18;;;31340:45;;;;31401:18;;;31394:34;;;31444:18;;;31437:34;;;7376:24:0;;31278:19:1;;7376:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7376:24:0;;-1:-1:-1;;7376:24:0;;;-1:-1:-1;;;;;;;7415:20:0;;7411:103;;7468:1;7472:29;7452:50;;;;;;;7411:103;7534:6;-1:-1:-1;7542:20:0;;-1:-1:-1;5939:1632:0;;;;;;;;:::o;4934:391::-;5048:7;;-1:-1:-1;;;;;5149:75:0;;5251:3;5247:12;;;5261:2;5243:21;5292:25;5303:4;5243:21;5312:1;5149:75;5292:10;:25::i;:::-;5285:32;;;;;;4934:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;422:131:1;-1:-1:-1;;;;;497:31:1;;487:42;;477:70;;543:1;540;533:12;558:127;619:10;614:3;610:20;607:1;600:31;650:4;647:1;640:15;674:4;671:1;664:15;690:253;762:2;756:9;804:4;792:17;;839:18;824:34;;860:22;;;821:62;818:88;;;886:18;;:::i;:::-;922:2;915:22;690:253;:::o;948:275::-;1019:2;1013:9;1084:2;1065:13;;-1:-1:-1;;1061:27:1;1049:40;;1119:18;1104:34;;1140:22;;;1101:62;1098:88;;;1166:18;;:::i;:::-;1202:2;1195:22;948:275;;-1:-1:-1;948:275:1:o;1228:186::-;1276:4;1309:18;1301:6;1298:30;1295:56;;;1331:18;;:::i;:::-;-1:-1:-1;1397:2:1;1376:15;-1:-1:-1;;1372:29:1;1403:4;1368:40;;1228:186::o;1419:462::-;1461:5;1514:3;1507:4;1499:6;1495:17;1491:27;1481:55;;1532:1;1529;1522:12;1481:55;1568:6;1555:20;1599:48;1615:31;1643:2;1615:31;:::i;:::-;1599:48;:::i;:::-;1672:2;1663:7;1656:19;1718:3;1711:4;1706:2;1698:6;1694:15;1690:26;1687:35;1684:55;;;1735:1;1732;1725:12;1684:55;1800:2;1793:4;1785:6;1781:17;1774:4;1765:7;1761:18;1748:55;1848:1;1823:16;;;1841:4;1819:27;1812:38;;;;1827:7;1419:462;-1:-1:-1;;;1419:462:1:o;1886:523::-;1972:6;1980;1988;2041:2;2029:9;2020:7;2016:23;2012:32;2009:52;;;2057:1;2054;2047:12;2009:52;2096:9;2083:23;2115:31;2140:5;2115:31;:::i;:::-;2165:5;-1:-1:-1;2217:2:1;2202:18;;2189:32;;-1:-1:-1;2272:2:1;2257:18;;2244:32;2299:18;2288:30;;2285:50;;;2331:1;2328;2321:12;2285:50;2354:49;2395:7;2386:6;2375:9;2371:22;2354:49;:::i;:::-;2344:59;;;1886:523;;;;;:::o;2414:388::-;2482:6;2490;2543:2;2531:9;2522:7;2518:23;2514:32;2511:52;;;2559:1;2556;2549:12;2511:52;2598:9;2585:23;2617:31;2642:5;2617:31;:::i;:::-;2667:5;-1:-1:-1;2724:2:1;2709:18;;2696:32;2737:33;2696:32;2737:33;:::i;:::-;2789:7;2779:17;;;2414:388;;;;;:::o;2999:255::-;3066:6;3119:2;3107:9;3098:7;3094:23;3090:32;3087:52;;;3135:1;3132;3125:12;3087:52;3174:9;3161:23;3193:31;3218:5;3193:31;:::i;3259:180::-;3318:6;3371:2;3359:9;3350:7;3346:23;3342:32;3339:52;;;3387:1;3384;3377:12;3339:52;-1:-1:-1;3410:23:1;;3259:180;-1:-1:-1;3259:180:1:o;3652:315::-;3720:6;3728;3781:2;3769:9;3760:7;3756:23;3752:32;3749:52;;;3797:1;3794;3787:12;3749:52;3836:9;3823:23;3855:31;3880:5;3855:31;:::i;:::-;3905:5;3957:2;3942:18;;;;3929:32;;-1:-1:-1;;;3652:315:1:o;4630:258::-;4702:1;4712:113;4726:6;4723:1;4720:13;4712:113;;;4802:11;;;4796:18;4783:11;;;4776:39;4748:2;4741:10;4712:113;;;4843:6;4840:1;4837:13;4834:48;;;4878:1;4869:6;4864:3;4860:16;4853:27;4834:48;;4630:258;;;:::o;4893:257::-;4934:3;4972:5;4966:12;4999:6;4994:3;4987:19;5015:63;5071:6;5064:4;5059:3;5055:14;5048:4;5041:5;5037:16;5015:63;:::i;:::-;5132:2;5111:15;-1:-1:-1;;5107:29:1;5098:39;;;;5139:4;5094:50;;4893:257;-1:-1:-1;;4893:257:1:o;5155:217::-;5302:2;5291:9;5284:21;5265:4;5322:44;5362:2;5351:9;5347:18;5339:6;5322:44;:::i;5377:674::-;5472:6;5480;5488;5541:2;5529:9;5520:7;5516:23;5512:32;5509:52;;;5557:1;5554;5547:12;5509:52;5596:9;5583:23;5615:31;5640:5;5615:31;:::i;:::-;5665:5;-1:-1:-1;5721:2:1;5706:18;;5693:32;5744:18;5774:14;;;5771:34;;;5801:1;5798;5791:12;5771:34;5824:49;5865:7;5856:6;5845:9;5841:22;5824:49;:::i;:::-;5814:59;;5926:2;5915:9;5911:18;5898:32;5882:48;;5955:2;5945:8;5942:16;5939:36;;;5971:1;5968;5961:12;5939:36;;5994:51;6037:7;6026:8;6015:9;6011:24;5994:51;:::i;6289:734::-;6393:6;6401;6409;6417;6425;6478:3;6466:9;6457:7;6453:23;6449:33;6446:53;;;6495:1;6492;6485:12;6446:53;6534:9;6521:23;6553:31;6578:5;6553:31;:::i;:::-;6603:5;-1:-1:-1;6655:2:1;6640:18;;6627:32;;-1:-1:-1;6706:2:1;6691:18;;6678:32;;-1:-1:-1;6762:2:1;6747:18;;6734:32;6775:33;6734:32;6775:33;:::i;:::-;6827:7;-1:-1:-1;6885:3:1;6870:19;;6857:33;6913:18;6902:30;;6899:50;;;6945:1;6942;6935:12;6899:50;6968:49;7009:7;7000:6;6989:9;6985:22;6968:49;:::i;:::-;6958:59;;;6289:734;;;;;;;;:::o;7028:596::-;7114:6;7122;7130;7183:2;7171:9;7162:7;7158:23;7154:32;7151:52;;;7199:1;7196;7189:12;7151:52;7238:9;7225:23;7257:31;7282:5;7257:31;:::i;:::-;7307:5;-1:-1:-1;7364:2:1;7349:18;;7336:32;7377:33;7336:32;7377:33;:::i;:::-;7429:7;-1:-1:-1;7487:2:1;7472:18;;7459:32;7514:18;7503:30;;7500:50;;;7546:1;7543;7536:12;7629:830;7741:6;7749;7757;7765;7773;7781;7834:3;7822:9;7813:7;7809:23;7805:33;7802:53;;;7851:1;7848;7841:12;7802:53;7890:9;7877:23;7909:31;7934:5;7909:31;:::i;:::-;7959:5;-1:-1:-1;8011:2:1;7996:18;;7983:32;;-1:-1:-1;8067:2:1;8052:18;;8039:32;8115:6;8102:20;;8090:33;;8080:61;;8137:1;8134;8127:12;8080:61;8160:7;-1:-1:-1;8214:2:1;8199:18;;8186:32;;-1:-1:-1;8265:3:1;8250:19;;8237:33;;-1:-1:-1;8321:3:1;8306:19;;8293:33;8349:18;8338:30;;8335:50;;;8381:1;8378;8371:12;8335:50;8404:49;8445:7;8436:6;8425:9;8421:22;8404:49;:::i;:::-;8394:59;;;7629:830;;;;;;;;:::o;8464:570::-;8639:2;8628:9;8621:21;8714:1;8710;8705:3;8701:11;8697:19;8688:6;8682:13;8678:39;8673:2;8662:9;8658:18;8651:67;8772:2;8764:6;8760:15;8754:22;8749:2;8738:9;8734:18;8727:50;8845:18;8841:23;8835:2;8827:6;8823:15;8817:22;8813:52;8808:2;8797:9;8793:18;8786:80;8602:4;8913:2;8905:6;8901:15;8895:22;8955:4;8948;8937:9;8933:20;8926:34;8977:51;9023:3;9012:9;9008:19;8994:12;8977:51;:::i;9266:898::-;9386:6;9394;9402;9410;9418;9426;9479:3;9467:9;9458:7;9454:23;9450:33;9447:53;;;9496:1;9493;9486:12;9447:53;9535:9;9522:23;9554:31;9579:5;9554:31;:::i;:::-;9604:5;-1:-1:-1;9661:2:1;9646:18;;9633:32;9674:33;9633:32;9674:33;:::i;:::-;9726:7;-1:-1:-1;9780:2:1;9765:18;;9752:32;;-1:-1:-1;9836:2:1;9821:18;;9808:32;9849:33;9808:32;9849:33;:::i;:::-;9901:7;-1:-1:-1;9960:3:1;9945:19;;9932:33;9974;9932;9974;:::i;:::-;10026:7;-1:-1:-1;10085:3:1;10070:19;;10057:33;10099;10057;10099;:::i;:::-;10151:7;10141:17;;;9266:898;;;;;;;;:::o;10169:407::-;10371:2;10353:21;;;10410:2;10390:18;;;10383:30;10449:34;10444:2;10429:18;;10422:62;-1:-1:-1;;;10515:2:1;10500:18;;10493:41;10566:3;10551:19;;10169:407::o;11461:184::-;11531:6;11584:2;11572:9;11563:7;11559:23;11555:32;11552:52;;;11600:1;11597;11590:12;11552:52;-1:-1:-1;11623:16:1;;11461:184;-1:-1:-1;11461:184:1:o;11650:416::-;11852:2;11834:21;;;11891:2;11871:18;;;11864:30;11930:34;11925:2;11910:18;;11903:62;-1:-1:-1;;;11996:2:1;11981:18;;11974:50;12056:3;12041:19;;11650:416::o;12380:251::-;12450:6;12503:2;12491:9;12482:7;12478:23;12474:32;12471:52;;;12519:1;12516;12509:12;12471:52;12551:9;12545:16;12570:31;12595:5;12570:31;:::i;12636:356::-;12838:2;12820:21;;;12857:18;;;12850:30;12916:34;12911:2;12896:18;;12889:62;12983:2;12968:18;;12636:356::o;12997:127::-;13058:10;13053:3;13049:20;13046:1;13039:31;13089:4;13086:1;13079:15;13113:4;13110:1;13103:15;13547:127;13608:10;13603:3;13599:20;13596:1;13589:31;13639:4;13636:1;13629:15;13663:4;13660:1;13653:15;13679:125;13719:4;13747:1;13744;13741:8;13738:34;;;13752:18;;:::i;:::-;-1:-1:-1;13789:9:1;;13679:125::o;15022:204::-;15060:3;15096:4;15093:1;15089:12;15128:4;15125:1;15121:12;15163:3;15157:4;15153:14;15148:3;15145:23;15142:49;;;15171:18;;:::i;:::-;15207:13;;15022:204;-1:-1:-1;;;15022:204:1:o;15231:175::-;15268:3;15312:4;15305:5;15301:16;15341:4;15332:7;15329:17;15326:43;;;15349:18;;:::i;:::-;15398:1;15385:15;;15231:175;-1:-1:-1;;15231:175:1:o;15822:135::-;15861:3;-1:-1:-1;;15882:17:1;;15879:43;;;15902:18;;:::i;:::-;-1:-1:-1;15949:1:1;15938:13;;15822:135::o;15962:584::-;16175:3;16207:26;16203:31;16276:2;16267:6;16263:2;16259:15;16255:24;16250:3;16243:37;16331:2;16322:6;16318:2;16314:15;16310:24;16305:2;16300:3;16296:12;16289:46;;16364:6;16358:13;16380:62;16435:6;16430:2;16425:3;16421:12;16414:4;16406:6;16402:17;16380:62;:::i;:::-;16501:2;16461:16;;16493:11;;;16486:27;;;;16537:2;16529:11;;15962:584;-1:-1:-1;;;;15962:584:1:o;16895:380::-;16974:1;16970:12;;;;17017;;;17038:61;;17092:4;17084:6;17080:17;17070:27;;17038:61;17145:2;17137:6;17134:14;17114:18;17111:38;17108:161;;;17191:10;17186:3;17182:20;17179:1;17172:31;17226:4;17223:1;17216:15;17254:4;17251:1;17244:15;17108:161;;16895:380;;;:::o;17280:277::-;17347:6;17400:2;17388:9;17379:7;17375:23;17371:32;17368:52;;;17416:1;17413;17406:12;17368:52;17448:9;17442:16;17501:5;17494:13;17487:21;17480:5;17477:32;17467:60;;17523:1;17520;17513:12;19061:128;19101:3;19132:1;19128:6;19125:1;19122:13;19119:39;;;19138:18;;:::i;:::-;-1:-1:-1;19174:9:1;;19061:128::o;19885:415::-;-1:-1:-1;;;;;20126:15:1;;;20108:34;;20178:15;;20173:2;20158:18;;20151:43;20230:2;20225;20210:18;;20203:30;;;20051:4;;20250:44;;20275:18;;20267:6;20250:44;:::i;23958:314::-;-1:-1:-1;;;;;24133:32:1;;24115:51;;24202:2;24197;24182:18;;24175:30;;;-1:-1:-1;;24222:44:1;;24247:18;;24239:6;24222:44;:::i;24970:1262::-;25063:6;25094:2;25137;25125:9;25116:7;25112:23;25108:32;25105:52;;;25153:1;25150;25143:12;25105:52;25186:9;25180:16;25215:18;25256:2;25248:6;25245:14;25242:34;;;25272:1;25269;25262:12;25242:34;25295:22;;;;25351:4;25333:16;;;25329:27;25326:47;;;25369:1;25366;25359:12;25326:47;25395:22;;:::i;:::-;25447:2;25441:9;25459:33;25484:7;25459:33;:::i;:::-;25501:22;;25561:11;;;25555:18;25539:14;;;25532:42;25608:2;25600:11;;25594:18;-1:-1:-1;;25639:33:1;;25631:42;;25621:70;;25687:1;25684;25677:12;25621:70;25718:2;25707:14;;25700:27;25766:2;25758:11;;25752:18;25782:16;;;25779:36;;;25811:1;25808;25801:12;25779:36;25842:8;25838:2;25834:17;25824:27;;;25889:7;25882:4;25878:2;25874:13;25870:27;25860:55;;25911:1;25908;25901:12;25860:55;25940:2;25934:9;25924:19;;25965:48;25981:31;26009:2;25981:31;:::i;25965:48::-;26036:2;26029:5;26022:17;26076:7;26071:2;26066;26062;26058:11;26054:20;26051:33;26048:53;;;26097:1;26094;26087:12;26048:53;26110:54;26161:2;26156;26149:5;26145:14;26140:2;26136;26132:11;26110:54;:::i;:::-;26191:2;26180:14;;26173:29;26184:5;24970:1262;-1:-1:-1;;;;;;24970:1262:1:o;28157:270::-;28237:6;28290:2;28278:9;28269:7;28265:23;28261:32;28258:52;;;28306:1;28303;28296:12;28258:52;28338:9;28332:16;28377:1;28370:5;28367:12;28357:40;;28393:1;28390;28383:12;28432:127;28493:10;28488:3;28484:20;28481:1;28474:31;28524:4;28521:1;28514:15;28548:4;28545:1;28538:15

Swarm Source

ipfs://36219ab918a429fdce341f2929073e190befbb7c069166e8b963bcc654c35c76
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.