// File: contracts/XtrackRevenueShare.sol



// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;

/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@%%%%%%####*#*##=++***+*+*+=+====================--------------------------------------------------------=:=------
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%@%@#*@%%%#*#  **%%##%=#%%%%#%%#########***********+****++=+++++=+====================================-
@@@@@@@@+=+*%=#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@=%%%%%@#@@@%%%#%%=*%#######%###%@@@##+*********++*+*++++*=++++++++==+=====+=======================-
@@*#*%#@@@@@@%%+=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%++%@%%%@@%%%%%@#-%%%%##%####%#%--@*#*##+********++***+++++++++++++++=============================-
@*%@###%%%%%#%%#%+=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@+*@%%%%%%%%%#-%@%%%%%##%%#%#%@*%#######**********+****++****+++++++++++++======================-
@=@#%%@@@@@@@@%%%@%*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@#=%@###+=++#%@%%%%%%%%#%##############+***********+*++++++++++++++============================-
@=@@%%@@@@@@@@@@%@#@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@%@%@@@@@@@@#=#%%@@@@@@%%%@%%%%%%#%%#%%%%%#####*###+*****+++==+*****+*++*=++++=+==+==+==================-
@%@#@@@@@   @@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@%@@@%%%%%%%%%%%%#%%%%%%#######%###########***######****++++++++*+++++**+++++++==+============-
-@@%@@@@@@@@@@@@%%@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@%%@%%%%@%%%%%%%%@%%%%%%%###########%#####***********+*****++++++=++++==+===+================-
=@@@%#%%@@@@@@@%#%#@@@@@@@@@@@@@@@@--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@%%%%%%##%%%%%%%%%##%###%######**+*+****++*++++*+*+++++++++=*==+====================-
@#=@@%@%%%%%%*#%@@+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@%@%%@@@@@@@@%%%@%%%%%%%@%%%%%%%%%%%%#%#############*********+*++*++++++++*++**+++==============+++=-
@@@@=#%@%%@@@@%++-*@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@*#%@@@@@@@@@@@@@@@@@%%@@%%%%%%@%%%%%%%%%%%%%%%#%########*+*****+***+++***++++++++++++++++=+++========+::=-
@@@@@@-##*+===@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%%@@@@@@%@@@@@@%%%%#%%%%%%%%%#####*#%#########*****##*****++*****++++++++++++++==========**#+-
@@@@@@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@+.@@%@@%%%%#%%%%%%%####%%%##########*#*****#***+*+*++++++++++++++=+++=============-
=@@@@@@@@@@@@@@@@@@@#-*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@#%@%@%%##%%%%%%%%%@@@@@#%%#####*#+******++***+++**+++++++++++##%###+=+=========-
@#-+@@@@@@@@@@@+=-+%@@@==@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@%@@%%%%%%%%%%%%%= =@####%####*##+*******+****++***++##@@#+=====%**==+=======-
%@@@-@@@@@@--*@@@@@@@%@@@-=@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%@%%%%@%%@#%%%%%%%@@@%%####%########***@@@#*****++****%=======*+*==%*++=+=====-
%@@@-@@@@@@=@@@@@@@@%@@@@@@=-*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@%@%@@@@%%@%%%%%%%@@@@@@%%%%%%%%%%%%%%###%##%#########*@:=#***+**++++#==++=======+==@%*++++===-
%@@=%@@@@@+=@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%@@@@@@@%%%%@@@@@%%##%%@%%%%%%%%%%%%@%%##%%%%%%%#%#############%@@#***#***+*%#=+*++*##*+=++*==#+=++*++-
%@@-@@@@@@-@@@@@@@# *#@@@@@@-=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@@@@@@@@@%%%%%%#@@@@@@@@@%%%#%###%############*********#@=#*++=# =#+===#==#+++==++-
%@@-@@@@@@-@@@@@@%= =%@@@@@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@      @@@@%@%@@@@@@%@     @%%%%%@@@@%%@@@      @@%#########%#%########+*******%==#++*+@  **+=++=**=++++++-
@@%-@@@@@*@@@@@@@@@@@@@@@@@%-@@@@@@@@@@@@@@%+%@@@@@@@@@%@   @@@   @@%@@@@@@@@@@@     @@%@@@%%@@%%@   @@@   @#%%%%###%%###############****%==++=++##%#+==+=+#*++++++=-
-=%@@@@@@@-#@@@@@@@@@@@@%@@=@@@@@@@@@@@@@@@@%@@@@@@@@@@@@  @@@@@  =@@@@@@@@@@@%@@  =@@@%%%%@%%%%#@  @@@@@  @@%%%%%%####%##%%%#######*#+**%@@==#+=+++===%==%**+**=+++-
@@@@@@@@@@@@-=@@@%@%@@@@@@--@@@@@@@@%@@@@@@@@@@@@@@@@@%%@%   @@   @=+@@@@@@@%@@%@  @@@@@@@%%%%@#@@@   @@   @%%%%#%%%%%##%####%##@@@@@@@@@%##@==+*#===++==@*+++++++*+-
@@@@@@@@@@@@@@=-@@@@*=--=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@        @@@@@@@%@@@@%@  @@@@@%@@@@%@@@        @@@%%%%%%%%%%%###%##@@@%-----=-=@%##@@=====++%%@%**++++++++-
@@@@@@@@@@@@@@@@*--=@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@%%@@%@@@@@@@@   @@@@@@@%@@@@  %@@%@%@-+@@@    @@@@@@@@@%%@@@@%%%%%%####%@--=*##%#*#*=*@%*%@@@%%***%@@@@%*++++++-
@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@   @@@@@@@@%@  %@@%@@@@@@+   @@@@@@%%%%%@@@=@@@%%%%%%%#%@-=##*#%%##*#+#=+%**+#@@@@@+=====%#*++++-
@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@%%@@@    @@@%@@%@  @@@%@@@@@   @@@@@%%%%%@%%@     @@%%%%%%%%@=##+#+**==+#+*@=%*#+@=:=%@%%=-+@=@%*+*+-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@     @%%@@@@@%@@@%@@@   @@@@@%@  @@@@@%@   @@@@@%@@@@@@%%@@     @@%%%%@%#@==#*#*=  ==-*+#%=%+#@@=@---------@==@%*+-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@     @%@@%@@@@@@@@@@@@  @@@@@%@  @@@%@%@  @@@@@@@@@@@@%@@%@     @@%%%##%%@-@*#*==**+==#+#=@@+%@=@=-=@@@@@=--=#=%#*-
@@@#=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@%@@@=  @@%@@@@@@@@@@@@@#@  @@@@@%@  %@@@%%@  @@%@@@@@%%%%%%@%@@@  @@@%%%##%%@-+@###*++***+%==%##%==*-=@+  #=@=--@=#++-
@@@#=@@@@@@@@@@@@@@@@%@@@@@@*+@@@@@@@%@@@@@%@@@@@%@   @@@@%@@%@@@@@@@%%@  @@@@@%@  %@%@@%@  @@%@@@@@%@%%%%%%%@@  @@%%%%%%%@@@@-=%%*##%@@%%-@@##%=%--=@*#=#=@--%=%#**-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@@@%@   @%%@@@@@@@@@%@@%#@  @@#%%@@  @@@###@  @@%@@@@@@@@%%%%%%@@  @%%%%%%%%%%%%@*=*%++----%@@###@-%#--=@@@@@=-=+=@*#+-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@@@@@@@@%@   @%@%@@@ +@@@@@@@@@  @@@@@@@  =@@@@@@  @@@%%@@* @@%%%%%%@@  @%%%%%%%%%%%%%@@--#@@@@@@%%%%%@@*=@=-------=@=%#**+-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@%%@@%@   @%@%%@   @@@@@@@@@                     @@@@@@   @%%%%%%@@  @%%%%%%%%%%%%%%@@@@%%%%%#######%@@-=%=*%@@===@%*+*+-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%@@@@%@   @%%%@@@  @@                                    =@@@@%%%@@  @@%%%%%%%%%%%%@%@@@%%%%%%%#%%###%%@#---*#%@@%*###**-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@     @@@@@@@@@@%@   @@@@@@       +@=        @@@@@@@@         @@       @@@@@@@  @%@@@@@%%%%%@@@@@%#%%%%%%%%%%####%#@@@@@%%##*#####+-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@%@     @@%@@@@@@@%@   @@      =@@@@@      @@@@@@@@@@@@@@@@       @@@@@      @@@  @%%@%-@%%%@@@   @%%%%%%%%%%%%%##%#%%#########%#*#*#=
@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@%@     @@@@@@@@%@@@=       @@@@@@@      @@@@@@@@@@@@@@@@@@@@      @@@@@@@=       @@@%@@@%%%%%@=  @%#@%%%%%#%%%%%##%###%#############=
%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@      @@@@@@@@@      @@@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@      @@@@@@%%%%@+  @%#%#%##%*#%%%%%###%%%#%###%@@#####=
%@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@%%@@@@@@@@        =@@@@@@@@@@@     @@@@@@@@        @@@@@@@@#     @@@@@@@@@@@        @@@@@@@=  @##%%%@##%%%%%%%%%#%##%###%%-+%####=
%@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@            @@@@@@@@@@@@     @@@@@@@            @@@@@@@     @@@@@@@@@@@@@            @@  @@@@@@@@@%%%%%%%%%%%##%####@=@#####=
#@@@@@%@%@@@@@ +@@@@@@@@@@@                        @@@@@@@@@@@@@     @@@@@@@             @@@@@@@    @@@@@@@@@@@@@@                       @@%%@#%%%%%%%%##%%%########=
#%%%%@%@%%%@@@@@@@@@@@@@@@@=                      @@@@@@@@@@@@@@     @@@@@@              @@@@@@@     @@@@@@@@@@@@@                       @%%%%%%%%#%%%%%%##%#%%#####=
#@@@@@@@@@%%%@@@@@%%@@@@@@@                        @@@@@@@@@@@@@     @@@@@@%             @@@@@@@    @@@@@@@@@@@@@@                       @%%%%%%%%%%%%%%%%%%#%%%#%%#=
#@@@@@@@@@@@@@@%@@%@@@%@@@@@@@@@@@@@  @             @@@@@@@@@@@@     @@@@@@@            @@@@@@@     @@@@@@@@@@@@@             @@@@@@@@@@@@%%%%%%%%%%%%%%%%%%##%#####=
#@%@@%%%%@@@@%%@@@@@@@%@%%@@@@@@@%@@  @@@@@@@        @@@@@@@@@@@@     @@@@@@@@        +@@@@@@@@     @@@@@@@@@@@        +@@@@@@@@@@@@%%%%%%%%%%%%%%%%%%#%%%%%%%###%%%+
=@@@%@%@@%%@@@%@%@@%@@@@@@@@%%%%@%@%  @%@%@@@@@@@      =@@@@@@@@@      @@@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@      @@@@@@@%#@     @@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##+
=*--@@@@@%%%%%%%@%@@@@@@@-@@@@@@@@@#  @%@@@@@@%@@@@=      =@@@@@@@      @@@@@@@@@@@@@@@@@@@@      @@@@@@@@       @@@@%%%%%@#@     @@%%%%%%%%%%%%%%%%%@%%%%@%%%%%%%%%+
=#%%+--#@@@@@%%@@@@@@---+##--@@@@%@=  @#@@@@@@%%%%@   @@      #@@@@*      @@@@@@@@@@@@@@@@       @@@@@      =@@  @@%@@%%%%%#@     @@%%%%%%%%%%%%%%%%%%%%%%%#%%%%%@@@%
=****%+%-#@#%%@@@---=%*+==#%%%--@@@@@@@%@@@%%%@@%#@   @@@@@@       @@        @@@@@@@@@@        @@@      =@@@@@@  @%%%%%%%@%%@@@@@@@@@%%%%%%%%%%%%%%%%%%%%%%@#%%%%%--*
*@%%###%=*@#@%@%-@@%%##%%%##*@@@=%@@@@@@@@@@@@@@@%@   @%%#@@@  @                                     =@@@@@@%@@  @@@@%%%%@@@@@%%%%%%%%@@%%%%%@@@@@@@@@@@%%%@#@%%%@@@#
=@%%%#*%-*@@%@@+-#####@%@%%%###%--@@@@@@@@@@@@@@%@@   @%@%@@%  @@@@@@@                        @@@@@   @%@@@@@%@  @@@@%%%%%%%%%%@%@@@@@%%@%%@%%%%%%%%@%%%%%%%#%%#%%%@*
 %%%%##@-#@%%%@+*%##%#%- %%%%##%+%@@@@@@@@@@@@@@@@@   @%@%@@#  @@@@%%@@@  @@@@@=#  =+#@@@@  @@@@%#@   @%%%%%@@@  @@%%%@@@@@@@@@@@@#+=#@@@@%%@@%%%%@%%%%%%%%%%%%%#%%%+
+@%%#%#%-@@%%%@-####%%%%%@%%%%#%-@@@@@@@@@@@@@@@@%@   @%@@%@#  @@@@@%@%@  @@@@@@@  @@@@@%@  @@@@@%@   @%%%%@%@@  @@%%%%@@@@@@%#+=##%%%*+@@@@@%%@%%%%%%%%%%%%%%%%%%%%*
=%##*###-@@%%@@-@###%%@@@@@%###%-@@@@@@@@@@@@@@@@@@   @@@@@@   @@%@@@%%@  @@@@@%@  #@@@@%@  @@%%@%@   @%@%%%%@@  @@@@%@@@@@%+*@@@@%%%%%%*=%@@%%%%@@@%%%%%%%%%%%%%%@@#
=###=---@@%%%%@-=%%###%######%*-*@@@@@@@@@@@@@@@@@@=  @@%@@@@@@@@@@@@@@@  @@@@@%@  #@@@@@@  @@%@@@@@@@@@@@@@@@@  @@@@@@@@@@@%@%%%@@@@@%@%%%#@@@@@@@@%@@@%%%%%%%%%@@%=
==--%@@@@@%%%%@@@--*%%###%#*--#@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@  @@@@@@@  #@@@@%@  @@@@@@@@@@@%@@@@@     @@@@%@@@@*#@%%@@+*%@%%%%#%@%%%%%%%%@@%%@%%%%%%@@-==
=%@@@@%@@@@@@@%%@@@@--**=-=@@@@@@@@@@@@@@@@@@@@@%@     @@%@@@@@@@@@@@@@#  @@@@@@@  %@@@@@@   @@@@@@@@@@@@@@@@     @@@@@@@@@*@%@@@#--#%%@%#%%%@@@@@@@%%%@%%@@%%%%@=-@-
+@%%%@@@+-+--#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     @%@@@@@@@@@@@@@   @@@@@@@@  %@@@@@@@*   @@@@@@@%@@@@@@     +@@@@@@@%#@%@%@@@@@@@@%#%@@@@@@@@@@%%%%%@%@@@@@-*@-
+@@@*=-+%@@@@@+-*@@@@%%@@@@@@@@@%@%%@@@@@@@@@@@@@@@@@@@@%%%%@@@@@@@@   @@@@@@@@@@  %@@@@@@@@@   =@@@@@@@@@@@@@@@@@@@@@@@@@@*=%@@%@%%%%%%%*%@@@@@@@@@@@@@@%%%%@%@@-%@-
**-+%%%%%%%%%%@@#+=#@@@@@@@@@@@@@%%%@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@   @@@@@@@@@@@@  #@@@@@@@@@@@   #@@@@@@@@@@@@@@@@@@@@@@@@@@@##%%%####*#@@@@@%%@@@@@@@@@@@%%%%@-@#@-
#-#%%%##%####%%%@@**@@@@@%@@@@@@@@@@@%@@@@@@%@@@@@@@@@#%%@@=       =@@@@@@@@@@@@@  #@@@@@@@@@@@@@        @@@@@@@@@@@%+==-+@@@@@%%#%%@@@@@@@@@@@@%%%@@@@%%@@%@@@@@--@+
#-%%###%%%%#*#%%%@*%@%@@%%@@@@@@@@@@@@@@@@@@@@@@%@@%%%@@@@   =    @@@@@@@@@@@@@@@  *@@@@@@@@@@@%@@@   :    @@@@@*===***##+-=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@@--
*-%%##%*%  ####%@%=%@%%%%%@%%@@%@@@@@@@@@@@@@@@@@@@%%@@ @  @@@@@  =@@@@@@@%@@@@@@  @@@@@@@@@@@@@@@  #@@@@  @@@@+######%%####==@@@@@@@@@@@@@@@@@@@@@@@@@@@*--**--@@@@%
+=@#%%##%@@@##%@@@*%@@@@@%@@@%%@@%%%@@@@@@@@@@@@@@%%@@@@@   @@@   @@@@@@@@@@%-@@     @@@@@@@@@@@@@   @@@=  @@@@+###@@@@@@%#*%+@@@@@@@@@@@@@@@@@@@@@@@*-=#@@@@@@@-=%@@
--@#%##%%#%#%%%@@#*%%%%%%%@@@@@@%%@@@@@@@@@@@@@@@@@%%@%%@@=      @@@@@@@@@@@@@@@     @@@@@@@@@@@@@@=      @@@@#*#%@@@  @@@#%%-@@%@@@@@@@@@@@@@@@@@@@@=@@@@%#*#%@%@#=%
=-#*%@%%%%@%%%%%**#@%@@%%%%%%%@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=%#%%@@@@@@@##*@@@@@@@@@@@##@@@@@@@@@@%-@@#*#@@+-=*%%-%
*@@%=-##%%%####%%@@@%%@@@@%%%%%@@@@@@%@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=%#@%%%%%%%##%=@@@@%%@@@@@@@@@@@@@@@@@%@@%*+#  *+##%-#%
+%%%%@%*++*#%%%@#@@@%%%@@@@@%%%%@@@@@@@@@@%+*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#=+%######+==+@%@@@@@@@@@@@@@@@@@@@@@-@@%*-%%%+:##* @+
+##%%%#@@@@%%%%%%%%%%@%%%%%@@%@@@@@%@@@+-*%*#@==@@@@@@@@@@@@@@==#@==@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=+**+=+#@@@@@@@@@@@@@@@@@@@@@@@@@@=-@@@@=+@@@+:  =:
+%%#%%#%%%%%%%%%%%%%%%%%%@%%%@@%@@@%**%@#+++*++%@+=@@@@@@@%=+@@@@@@@@=+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@%%@@@@@@*==@@@@@@@@@@@@@@@@@@@@@@@=-*%%@*.    =- 
+##%%%#%%%%%%%%%%%%%%%%%%%@@%%%@@@@*@#=-*#%@%%#-=-*=@@@@+*@@@%+-=--#@@@#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@===*#**-+@@@@@@@@@@@@=---+%@@@@%--=  +#@@@%-
=##%%%%####%%%%%%%%@@@%%%%%%%%%%%@=@=++%@@@@@@@#*+@*@%%@=@@*-*@@@@@@-*@%*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@==+*##******-=@@@@@@@#=+@@@@@%@#%@@@@@@@@@%%%#-
=######%#%####%%%%%+-@%%%%%%%%%%%@*@-*+@%@  @%%*=*==@%@@+@@+-@@  @%@**@##@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*-###%@@@@%##+=+@@@#%##%%#***####%#@@%%%%%%%%%#-
=###*####%#%%#####%@@@%%%%%%%%%%%@-@-+*@@@@@@@%==@@@@@@@=@@-=@%@@@%@-*@#@@@@@@@@@@@@*-@@@@@@@@@@@@@@@%@@- @@%%@@@%%@@--#*%#% @###===-@%%#%####%@@@#%%##*%%%%%%%%%%%%-
-+**#######%%#%#%###%%%%%@%%%%%%%@+@-==+%%@%%+-=-@=%%@@@=@@--#@@@%+--@@=*@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+#%#@@@ @@@%##=%@%%%##*##@  @**####%@#%%%%@%%#%-
-******###*###%%%%#%%####%%%#@%%#@--@@-------=+@#-@@@%@%-#@@@@----@@@@+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%-###%%@@@%##*#=@@%#%@#*##%@@@**%*##%@%%%%%%#==%-
-#******+#######%%%#%%%%%%##%%%%%@@@%+-%%*+#@+-@@@@@@@@@@@+-*@@@@@@+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=-=+++=#**+++--@@%%*%%%###%%##%@+#%%%%%%%%#*=+*=
-+++**#*#*+*+##**##%#%%%%%#%#%##%%##%%@@*--=%@@@@@#=--%@@@@@@*---+@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%--**++---@@@@@@@@=-#@@%%%@@% =@%%%%%%###*#%*:
-+++++++*+##*****##***######%%%%%%%%%###@@@@@@@%--++*+++--@@@@@@@@@@@@@%%%%@%@@@%@%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=--#@@@@@=-+@@@@@%-#@%#  #@@@@%%%%##%%%##*:
-++++++**+*************##*###*##%%#%%%%###%@%=-=+=++++++=++-@@%@%%%%%%%%%%@@%%%%%@@@@@@@@@@@@@@%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#--*@@%+-#@@@@@--@@@@@%%%%%%##%%##+*+.
-++++++++++++++*+***********########%%%%%%@=====+**###**+=*-%@%%%%%%%@@%%%%%%%%@%%%%%%%%%%%%%%%%@@@@%%%@@@@@@@@@@@@@@@@@@@@@--*#@@%%%%@%%--@%@@@@%%%%%%%%%#%%%###*#*.
-===+++*++++++++**+++*******+@@%*+#*#*####@-=+=+**@%@%#*+++-%%%@%%%%%%%@@@%%%%%%@@%@@@@%%@@@@@@@%%%%@@@@%%%%%%@@@@@@@@@@@%@@-@@%%%@%@%%%%@*@@@%%%%%%%%%#%%#%%#%####*.
-========+*++++++++++*+*****#=:@*****#+###@##=++**@  #%#++#*@%%%%%%@%%%%=*@%%%%%%%%%%@@@%%@@=-@@@@%%%@@@@@@%@%%%*%@@@@@@@@@@-%%%%@@#%@%%#@-@%@%%%%%%%%@%%%#%######## 
-==+========++++++++++++++++#@@%********++%==+==**@@@@*+==*=#@%##%#%%%%%@%%@%%%%%%#%%%%%%%%@@@@%%%%@@@%@%@@%@%@@@%@@@@@@@@%@-@#%%%@ @@%##@-@%%%%%%%%%%#%%########### 
-================+++++++++=++++++++*++****%==++===++=+====*-@%#%#%%#%%%%%##%%%%%%%%%%%%%%%#%%%%%%%%%%%%%%%%%%@@@@@@%%%%%%%@@-@%##%%%%%%#%@-@%%%#%%%%%%%%#%%######+#: 
-=================+=+++++++++++=++*++*****%#==============@@@#*#######%#%#%%####%%%%%%#%%#%%%%#%%%%#%%%%%%%%%%%%%%%%%%%%%@@@-=@@@%%#%@%%#--@@%%#%%%%%###%%%#%#*##+-: 
-=======================+=++++=++++=++++++++%##========%@%#*****+##**########%%%######@%%%%%%%%%%%%%%%%%%%%@%%%%%%%%%%%%%%%@@@--+@@%%---@@@@%%%@%%%%#%%%%%%%*#**#*:  
-------------------------------------------------------------------===-==================+++*****+*******++++****************#%@@---=%%%%#*#**++++=++++====-----:    
*/

error InsufficientBalance();
error AlreadyClaimed(address account);
error OnlyOwner();
error ArraysMustBeSameLength(uint256 length1, uint256 length2);
error ReentrancyAttackDetected();
error TransferFailed();
error ContractOutOfFunds();

contract XtrackRevenueShare {
    address payable public owner;
    bool private reentrancyLock;

    mapping(address => uint256) public balances;
    mapping(address => bool) public claimed;

    event BalanceClaimed(address account, uint256 balance);

    constructor() {
        owner = payable(msg.sender);
    }

    modifier nonReentrant() {
        if (reentrancyLock) {
            revert ReentrancyAttackDetected();
        }
        reentrancyLock = true;
        _;
        reentrancyLock = false;
    }

    modifier onlyOwner() {
        if (msg.sender != owner) {
            revert OnlyOwner();
        }
        _;
    }

    modifier alreadyClaimed() {
        if (claimed[msg.sender]) {
            revert AlreadyClaimed(msg.sender);
        }
        _;
    }

    modifier sufficientBalance() {
        if (balances[msg.sender] == 0) {
            revert InsufficientBalance();
        }
        _;
    }

    modifier contractHasFunds() {
        if (address(this).balance < 0) {
            revert ContractOutOfFunds();
        }
        _;
    }

    modifier arraysSameLength(uint256 length1, uint256 length2) {
        if (length1 != length2) {
            revert ArraysMustBeSameLength(length1, length2);
        }
        _;
    }

    function claim()
        external
        nonReentrant
        alreadyClaimed
        sufficientBalance
        contractHasFunds
    {
        uint256 amount = balances[msg.sender];
        balances[msg.sender] = 0;
        claimed[msg.sender] = true;

        (bool success, ) = payable(msg.sender).call{value: amount}("");
        if (!success) {
            revert TransferFailed();
        }

        emit BalanceClaimed(msg.sender, amount);
    }

    function setBalances(
        address[] calldata _addresses,
        uint256[] calldata _balances
    ) external onlyOwner arraysSameLength(_addresses.length, _balances.length) {
        for (uint256 i = 0; i < _addresses.length; i++) {
            balances[_addresses[i]] = _balances[i];
        }
    }

    function resetBalances(address[] calldata _addresses) external onlyOwner {
        for (uint256 i = 0; i < _addresses.length; i++) {
            balances[_addresses[i]] = 0;
            claimed[_addresses[i]] = false;
        }
    }

    function retrieveFunds() external onlyOwner nonReentrant {
        uint256 contractBalance = address(this).balance;
        (bool success, ) = payable(owner).call{value: contractBalance}("");
        if (!success) {
            revert TransferFailed();
        }
    }

    function destroy() external onlyOwner {
        selfdestruct(owner);
    }

    receive() external payable {}
}