From 71c24904d63655bede5b37c2cf180eeea4fbd4d5 Mon Sep 17 00:00:00 2001 From: Akshat Mittal Date: Sat, 27 Apr 2024 03:39:13 +0530 Subject: [PATCH 01/72] Starting of new release --- contracts/mixins/Versioned.sol | 2 +- test/fixtures.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/mixins/Versioned.sol b/contracts/mixins/Versioned.sol index fa2787a203..3c0038087e 100644 --- a/contracts/mixins/Versioned.sol +++ b/contracts/mixins/Versioned.sol @@ -4,7 +4,7 @@ pragma solidity 0.8.19; import "../interfaces/IVersioned.sol"; // This value should be updated on each release -string constant VERSION = "3.4.0"; +string constant VERSION = "4.0.0"; /** * @title Versioned diff --git a/test/fixtures.ts b/test/fixtures.ts index 1af9aa578d..7ee2b6f41f 100644 --- a/test/fixtures.ts +++ b/test/fixtures.ts @@ -94,7 +94,7 @@ export const ORACLE_ERROR = fp('0.01') // 1% oracle error export const REVENUE_HIDING = fp('0') // no revenue hiding by default; test individually // This will have to be updated on each release -export const VERSION = '3.4.0' +export const VERSION = '4.0.0' export type Collateral = | FiatCollateral From a21feddd49f1de57d7ad0ab6e6b3c4bf06db58a4 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Fri, 31 May 2024 11:38:44 -0400 Subject: [PATCH 02/72] fix GnosisTrade approval (#1150) --- contracts/plugins/trading/GnosisTrade.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/plugins/trading/GnosisTrade.sol b/contracts/plugins/trading/GnosisTrade.sol index ba4291bb68..3c7759cfbd 100644 --- a/contracts/plugins/trading/GnosisTrade.sol +++ b/contracts/plugins/trading/GnosisTrade.sol @@ -139,7 +139,7 @@ contract GnosisTrade is ITrade, Versioned { // // Context: wcUSDCv3 has a non-standard approve() function that reverts if the approve // amount is > 0 and < type(uint256).max. - AllowanceLib.safeApproveFallbackToMax(address(sell), address(gnosis), initBal); + AllowanceLib.safeApproveFallbackToMax(address(sell), address(gnosis), req.sellAmount); auctionId = gnosis.initiateAuction( sell, From d2f8627aebc611d7c2d78df6e83de958d35a2917 Mon Sep 17 00:00:00 2001 From: Akshat Mittal Date: Wed, 12 Jun 2024 21:01:24 +0530 Subject: [PATCH 03/72] Registries Setup (#1140) Co-authored-by: Julian R Co-authored-by: Taylor Brent Co-authored-by: Julian M. Rodriguez <56316686+julianmrodri@users.noreply.github.com> --- .github/workflows/tests.yml | 20 +- .prettierrc | 2 +- CHANGELOG.md | 16 + common/numbers.ts | 2 +- contracts/facade/FacadeWrite.sol | 9 +- contracts/facade/facets/ActFacet.sol | 10 +- contracts/facade/facets/ReadFacet.sol | 8 +- contracts/interfaces/IAssetRegistry.sol | 3 + contracts/interfaces/IBroker.sol | 6 + contracts/interfaces/IDeployer.sol | 11 +- contracts/interfaces/IDistributor.sol | 10 +- contracts/interfaces/IMain.sol | 15 + contracts/mocks/AssetPluginRegistryMock.sol | 8 + contracts/mocks/DeployerMock.sol | 25 + contracts/p0/AssetRegistry.sol | 2 + contracts/p0/Deployer.sol | 3 + contracts/p0/Distributor.sol | 38 +- contracts/p0/Main.sol | 12 + contracts/p1/AssetRegistry.sol | 34 +- contracts/p1/Broker.sol | 26 +- contracts/p1/Deployer.sol | 39 +- contracts/p1/Distributor.sol | 95 +- contracts/p1/Main.sol | 104 +- contracts/p1/mixins/Component.sol | 7 +- contracts/plugins/assets/Asset.sol | 2 +- .../plugins/assets/ERC4626FiatCollateral.sol | 7 +- contracts/plugins/assets/OracleLib.sol | 2 +- contracts/plugins/assets/VersionedAsset.sol | 2 +- .../assets/aave-v3/AaveV3FiatCollateral.sol | 2 +- .../assets/aave/ATokenFiatCollateral.sol | 2 +- .../compoundv2/CTokenFiatCollateral.sol | 2 +- .../CTokenSelfReferentialCollateral.sol | 2 +- .../assets/compoundv3/CTokenV3Collateral.sol | 7 +- .../assets/curve/CurveStableCollateral.sol | 4 +- .../curve/CurveStableMetapoolCollateral.sol | 11 +- contracts/plugins/assets/curve/PoolTokens.sol | 4 +- .../plugins/assets/dsr/SDaiCollateral.sol | 2 +- .../morpho-aave/MorphoFiatCollateral.sol | 5 +- .../MorphoSelfReferentialCollateral.sol | 4 +- .../mocks/AppreciatingMockDecimals.sol | 75 ++ .../AppreciatingMockDecimalsCollateral.sol | 34 + .../plugins/mocks/upgrades/DeployerV2.sol | 24 + contracts/plugins/trading/DutchTrade.sol | 2 +- contracts/plugins/trading/GnosisTrade.sol | 17 +- contracts/registry/AssetPluginRegistry.sol | 94 ++ contracts/registry/DAOFeeRegistry.sol | 72 ++ contracts/registry/VersionRegistry.sol | 79 ++ contracts/spells/3_4_0.sol | 41 +- test/Broker.test.ts | 82 +- test/Facade.test.ts | 41 +- test/FacadeWrite.test.ts | 4 +- test/Main.test.ts | 10 +- test/RTokenExtremes.test.ts | 19 +- test/Recollateralization.test.ts | 27 +- test/Revenues.test.ts | 509 +++++---- test/Upgradeability.test.ts | 1011 +++++++++++------ test/ZTradingExtremes.test.ts | 214 +++- test/fixtures.ts | 4 +- test/integration/EasyAuction.test.ts | 6 +- test/integration/UpgradeToR4.test.ts | 187 +++ .../UpgradeToR4WithRegistries.test.ts | 271 +++++ test/integration/fixtures.ts | 4 +- test/integration/fork-block-numbers.ts | 1 + test/plugins/RewardableERC20.test.ts | 2 +- .../aave/ATokenFiatCollateral.test.ts | 4 +- .../individual-collateral/cbeth/constants.ts | 2 +- .../individual-collateral/collateralTests.ts | 56 +- .../compoundv2/CTokenFiatCollateral.test.ts | 4 +- .../curve/collateralTests.ts | 78 +- .../stargate/constants.ts | 2 +- test/registries/AssetPluginRegistry.test.ts | 402 +++++++ test/registries/DAOFeeRegistry.test.ts | 217 ++++ test/registries/VersionRegistry.test.ts | 134 +++ test/scenario/ComplexBasket.test.ts | 41 +- test/scenario/NestedRTokens.test.ts | 20 +- test/utils/matchers.ts | 4 +- 76 files changed, 3479 insertions(+), 878 deletions(-) create mode 100644 contracts/mocks/AssetPluginRegistryMock.sol create mode 100644 contracts/mocks/DeployerMock.sol create mode 100644 contracts/plugins/mocks/AppreciatingMockDecimals.sol create mode 100644 contracts/plugins/mocks/AppreciatingMockDecimalsCollateral.sol create mode 100644 contracts/plugins/mocks/upgrades/DeployerV2.sol create mode 100644 contracts/registry/AssetPluginRegistry.sol create mode 100644 contracts/registry/DAOFeeRegistry.sol create mode 100644 contracts/registry/VersionRegistry.sol create mode 100644 test/integration/UpgradeToR4.test.ts create mode 100644 test/integration/UpgradeToR4WithRegistries.test.ts create mode 100644 test/registries/AssetPluginRegistry.test.ts create mode 100644 test/registries/DAOFeeRegistry.test.ts create mode 100644 test/registries/VersionRegistry.test.ts diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cb4093c2fb..92dc1ec4b4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -76,7 +76,7 @@ jobs: hardhat-network-fork- - run: yarn hardhat test ./test/plugins/individual-collateral/[A-Ca-c]*/*.test.ts ./test/plugins/individual-collateral/[A-Ca-c]*/*/*.test.ts env: - NODE_OPTIONS: '--max-old-space-size=8192' + NODE_OPTIONS: '--max-old-space-size=32768' TS_NODE_SKIP_IGNORE: true MAINNET_RPC_URL: https://eth-mainnet.alchemyapi.io/v2/${{ secrets.ALCHEMY_MAINNET_KEY }} FORK_NETWORK: mainnet @@ -103,7 +103,7 @@ jobs: hardhat-network-fork- - run: yarn hardhat test ./test/plugins/individual-collateral/[D-Zd-z]*/*.test.ts env: - NODE_OPTIONS: '--max-old-space-size=8192' + NODE_OPTIONS: '--max-old-space-size=32768' TS_NODE_SKIP_IGNORE: true MAINNET_RPC_URL: https://eth-mainnet.alchemyapi.io/v2/${{ secrets.ALCHEMY_MAINNET_KEY }} FORK_NETWORK: mainnet @@ -130,7 +130,7 @@ jobs: hardhat-network-fork- - run: npx hardhat test ./test/plugins/individual-collateral/{cbeth,aave-v3,compoundv3,stargate,lido}/*.test.ts env: - NODE_OPTIONS: '--max-old-space-size=8192' + NODE_OPTIONS: '--max-old-space-size=32768' TS_NODE_SKIP_IGNORE: true BASE_RPC_URL: https://base-mainnet.infura.io/v3/${{ secrets.INFURA_BASE_KEY }} FORK_NETWORK: base @@ -158,7 +158,7 @@ jobs: hardhat-network-fork- - run: npx hardhat test ./test/plugins/individual-collateral/{aave-v3,compoundv3,curve/cvx}/*.test.ts env: - NODE_OPTIONS: '--max-old-space-size=8192' + NODE_OPTIONS: '--max-old-space-size=32768' TS_NODE_SKIP_IGNORE: true ARBITRUM_RPC_URL: https://arb-mainnet.g.alchemy.com/v2/${{ secrets.ALCHEMY_ARBITRUM_KEY }} FORK_NETWORK: arbitrum @@ -178,7 +178,7 @@ jobs: - run: yarn install --immutable - run: yarn test:p0 env: - NODE_OPTIONS: '--max-old-space-size=8192' + NODE_OPTIONS: '--max-old-space-size=32768' p1-tests: name: 'P1 Tests' @@ -192,7 +192,7 @@ jobs: - run: yarn install --immutable - run: yarn test:p1 env: - NODE_OPTIONS: '--max-old-space-size=8192' + NODE_OPTIONS: '--max-old-space-size=32768' scenario-tests: name: 'Scenario Tests' @@ -206,7 +206,7 @@ jobs: - run: yarn install --immutable - run: yarn test:scenario env: - NODE_OPTIONS: '--max-old-space-size=8192' + NODE_OPTIONS: '--max-old-space-size=32768' extreme-tests: name: 'Extreme Tests' @@ -229,7 +229,7 @@ jobs: hardhat-network-fork- - run: yarn test:extreme:integration env: - NODE_OPTIONS: '--max-old-space-size=8192' + NODE_OPTIONS: '--max-old-space-size=32768' TS_NODE_SKIP_IGNORE: true MAINNET_RPC_URL: https://eth-mainnet.alchemyapi.io/v2/${{ secrets.ALCHEMY_MAINNET_KEY }} FORK_NETWORK: mainnet @@ -256,7 +256,7 @@ jobs: - run: yarn install --immutable - run: yarn test:integration env: - NODE_OPTIONS: '--max-old-space-size=8192' + NODE_OPTIONS: '--max-old-space-size=32768' TS_NODE_SKIP_IGNORE: true MAINNET_RPC_URL: https://eth-mainnet.alchemyapi.io/v2/${{ secrets.ALCHEMY_MAINNET_KEY }} FORK_NETWORK: mainnet @@ -281,7 +281,7 @@ jobs: hardhat-network-fork- - run: npx hardhat test ./test/monitor/*.test.ts env: - NODE_OPTIONS: '--max-old-space-size=8192' + NODE_OPTIONS: '--max-old-space-size=32768' TS_NODE_SKIP_IGNORE: true MAINNET_RPC_URL: https://eth-mainnet.alchemyapi.io/v2/${{ secrets.ALCHEMY_MAINNET_KEY }} FORK_NETWORK: mainnet diff --git a/.prettierrc b/.prettierrc index a5e4e5f36f..c56b893975 100644 --- a/.prettierrc +++ b/.prettierrc @@ -22,4 +22,4 @@ } } ] -} \ No newline at end of file +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bdac02699..a45c3e58dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +# 4.0.0 + +TODO + +## Upgrade Steps + +TODO + +Make sure distributor table sums to >10000. + +## Core Protocol Contracts + +- `Distributor` + - Breaking change: Remove `setDistribution()` in favor of `setDistributions()` + - New Invariant: Table must sum to >=10000 for precision reasons + # 3.4.0 This release adds Arbitrum support by adjusting `Furnace`/`StRSR`/`Governance` to function off of timestamp/timepoints, instead of discrete periods. This changes the interface of the governance voting token StRSR, making this a complicated and nuanced upgrade to get right. diff --git a/common/numbers.ts b/common/numbers.ts index d49a2a6606..487620b66b 100644 --- a/common/numbers.ts +++ b/common/numbers.ts @@ -14,7 +14,7 @@ export const pow10 = (exponent: BigNumberish): BigNumber => { } // Convert `x` to a new BigNumber with decimals = `decimals`. -// Input should have SCALE_DECIMALS (18) decimal places, and `decimals` should be less than 18. +// Input should have SCALE_DECIMALS (18) decimal places. export const toBNDecimals = (x: BigNumberish, decimals: number): BigNumber => { return decimals < SCALE_DECIMALS ? BigNumber.from(x).div(pow10(SCALE_DECIMALS - decimals)) diff --git a/contracts/facade/FacadeWrite.sol b/contracts/facade/FacadeWrite.sol index d76438467b..0f9b3fbcc5 100644 --- a/contracts/facade/FacadeWrite.sol +++ b/contracts/facade/FacadeWrite.sol @@ -104,12 +104,13 @@ contract FacadeWrite is IFacadeWrite { } // Setup revshare beneficiaries + address[] memory beneficiaries = new address[](setup.beneficiaries.length); + RevenueShare[] memory shares = new RevenueShare[](setup.beneficiaries.length); for (uint256 i = 0; i < setup.beneficiaries.length; ++i) { - main.distributor().setDistribution( - setup.beneficiaries[i].beneficiary, - setup.beneficiaries[i].revShare - ); + beneficiaries[i] = setup.beneficiaries[i].beneficiary; + shares[i] = setup.beneficiaries[i].revShare; } + main.distributor().setDistributions(beneficiaries, shares); // Pause until setupGovernance main.grantRole(PAUSER, address(this)); diff --git a/contracts/facade/facets/ActFacet.sol b/contracts/facade/facets/ActFacet.sol index 7294859c2e..ea5cccf37f 100644 --- a/contracts/facade/facets/ActFacet.sol +++ b/contracts/facade/facets/ActFacet.sol @@ -12,7 +12,7 @@ import "../../interfaces/IBackingManager.sol"; * @title ActFacet * @notice * Facet to help batch compound actions that cannot be done from an EOA, solely. - * Compatible with both 2.1.0 and ^3.0.0 RTokens. + * Compatible with 2.1.0, ^3.0.0, and ^4.0.0 RTokens. * @custom:static-call - Use ethers callStatic() to get result after update; do not execute */ // slither-disable-start @@ -214,7 +214,7 @@ contract ActFacet is Multicall { function _settleTrade(ITrading trader, IERC20 toSettle) private { bytes1 majorVersion = bytes(trader.version())[0]; - if (majorVersion == bytes1("3")) { + if (majorVersion == bytes1("3") || majorVersion == bytes1("4")) { // Settle auctions trader.settleTrade(toSettle); } else if (majorVersion == bytes1("2") || majorVersion == bytes1("1")) { @@ -227,7 +227,7 @@ contract ActFacet is Multicall { function _forwardRevenue(IBackingManager bm, IERC20[] memory toStart) private { bytes1 majorVersion = bytes(bm.version())[0]; // Need to use try-catch here in order to still show revenueOverview when basket not ready - if (majorVersion == bytes1("3")) { + if (majorVersion == bytes1("3") || majorVersion == bytes1("4")) { // solhint-disable-next-line no-empty-blocks try bm.forwardRevenue(toStart) {} catch {} } else if (majorVersion == bytes1("2") || majorVersion == bytes1("1")) { @@ -248,7 +248,7 @@ contract ActFacet is Multicall { ) private { bytes1 majorVersion = bytes(revenueTrader.version())[0]; - if (majorVersion == bytes1("3")) { + if (majorVersion == bytes1("3") || majorVersion == bytes1("4")) { revenueTrader.manageTokens(toStart, kinds); } else if (majorVersion == bytes1("2") || majorVersion == bytes1("1")) { for (uint256 i = 0; i < toStart.length; ++i) { @@ -264,7 +264,7 @@ contract ActFacet is Multicall { function _rebalance(IBackingManager bm, TradeKind kind) private { bytes1 majorVersion = bytes(bm.version())[0]; - if (majorVersion == bytes1("3")) { + if (majorVersion == bytes1("3") || majorVersion == bytes1("4")) { // solhint-disable-next-line no-empty-blocks try bm.rebalance(kind) {} catch {} } else if (majorVersion == bytes1("2") || majorVersion == bytes1("1")) { diff --git a/contracts/facade/facets/ReadFacet.sol b/contracts/facade/facets/ReadFacet.sol index 9924807e8f..f83cb5ed68 100644 --- a/contracts/facade/facets/ReadFacet.sol +++ b/contracts/facade/facets/ReadFacet.sol @@ -69,7 +69,9 @@ contract ReadFacet { uint192 mid = (low + high) / 2; // {UoA} = {tok} * {UoA/Tok} - depositsUoA[i] = shiftl_toFix(deposits[i], -int8(asset.erc20Decimals())).mul(mid); + depositsUoA[i] = shiftl_toFix(deposits[i], -int8(asset.erc20Decimals()), FLOOR).mul( + mid + ); } } @@ -195,7 +197,7 @@ contract ReadFacet { uint192 avg = (low + high) / 2; // {UoA/tok} // {UoA} = {qTok} * {tok/qTok} * {UoA/tok} - uoaAmts[i] = shiftl_toFix(deposits[i], -decimals).mul(avg); + uoaAmts[i] = shiftl_toFix(deposits[i], -decimals, FLOOR).mul(avg); uoaSum += uoaAmts[i]; } @@ -346,7 +348,7 @@ contract ReadFacet { IAsset asset = reg.toAsset(IERC20(basketERC20s[i])); // {tok} - uint192 needed = shiftl_toFix(quantities[i], -int8(asset.erc20Decimals())); + uint192 needed = shiftl_toFix(quantities[i], -int8(asset.erc20Decimals()), CEIL); // {UoA/tok} (uint192 low, uint192 high) = asset.price(); diff --git a/contracts/interfaces/IAssetRegistry.sol b/contracts/interfaces/IAssetRegistry.sol index add18d69b5..9a29b0b842 100644 --- a/contracts/interfaces/IAssetRegistry.sol +++ b/contracts/interfaces/IAssetRegistry.sol @@ -71,6 +71,9 @@ interface IAssetRegistry is IComponent { /// @return reg The list of registered ERC20s and Assets, in the same order function getRegistry() external view returns (Registry memory reg); + /// Validate that the current assets in the registry are compatible with the current version + function validateCurrentAssets() external view; + /// @return The number of registered ERC20s function size() external view returns (uint256); } diff --git a/contracts/interfaces/IBroker.sol b/contracts/interfaces/IBroker.sol index f1049ac5c7..369d47ac18 100644 --- a/contracts/interfaces/IBroker.sol +++ b/contracts/interfaces/IBroker.sol @@ -69,6 +69,12 @@ interface IBroker is IComponent { function dutchTradeDisabled(IERC20Metadata erc20) external view returns (bool); } +interface IExtendedBroker is IBroker { + function setBatchTradeImplementation(ITrade newTradeImplementation) external; + + function setDutchTradeImplementation(ITrade newTradeImplementation) external; +} + interface TestIBroker is IBroker { function gnosis() external view returns (IGnosis); diff --git a/contracts/interfaces/IDeployer.sol b/contracts/interfaces/IDeployer.sol index f8732a30bc..0a1e1ff6b5 100644 --- a/contracts/interfaces/IDeployer.sol +++ b/contracts/interfaces/IDeployer.sol @@ -111,6 +111,8 @@ interface IDeployer is IVersioned { /// Deploys a new RTokenAsset instance. Not needed during normal deployment flow /// @param maxTradeVolume {UoA} The maximum trade volume for the RTokenAsset function deployRTokenAsset(IRToken rToken, uint192 maxTradeVolume) external returns (IAsset); + + function implementations() external view returns (Implementations memory); } interface TestIDeployer is IDeployer { @@ -124,12 +126,5 @@ interface TestIDeployer is IDeployer { function rsrAsset() external view returns (IAsset); - function implementations() - external - view - returns ( - IMain, - Components memory, - TradePlugins memory - ); + function implementations() external view returns (Implementations memory); } diff --git a/contracts/interfaces/IDistributor.sol b/contracts/interfaces/IDistributor.sol index 5f5c76c5a2..2a8e751183 100644 --- a/contracts/interfaces/IDistributor.sol +++ b/contracts/interfaces/IDistributor.sol @@ -7,6 +7,9 @@ import "./IComponent.sol"; uint256 constant MAX_DISTRIBUTION = 1e4; // 10,000 uint8 constant MAX_DESTINATIONS = 100; // maximum number of RevenueShare destinations +// === 4.0.0 === +// Invariant: sum across destinations must be at *least* MAX_DISTRIBUTION + struct RevenueShare { uint16 rTokenDist; // {revShare} A value between [0, 10,000] uint16 rsrDist; // {revShare} A value between [0, 10,000] @@ -37,10 +40,13 @@ interface IDistributor is IComponent { event RevenueDistributed(IERC20 indexed erc20, address indexed source, uint256 amount); // Initialization - function init(IMain main_, RevenueShare memory dist) external; + function init(IMain main_, RevenueShare calldata dist) external; + + /// @custom:governance + function setDistribution(address dest, RevenueShare calldata share) external; /// @custom:governance - function setDistribution(address dest, RevenueShare memory share) external; + function setDistributions(address[] calldata dest, RevenueShare[] calldata share) external; /// Distribute the `erc20` token across all revenue destinations /// Only callable by RevenueTraders diff --git a/contracts/interfaces/IMain.sol b/contracts/interfaces/IMain.sol index dcb6ce910a..3c87331391 100644 --- a/contracts/interfaces/IMain.sol +++ b/contracts/interfaces/IMain.sol @@ -3,6 +3,9 @@ pragma solidity 0.8.19; import "@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "../registry/AssetPluginRegistry.sol"; +import "../registry/VersionRegistry.sol"; +import "../registry/DAOFeeRegistry.sol"; import "./IAssetRegistry.sol"; import "./IBasketHandler.sol"; import "./IBackingManager.sol"; @@ -174,9 +177,21 @@ interface IMain is IVersioned, IAuth, IComponentRegistry { ) external; function rsr() external view returns (IERC20); + + function assetPluginRegistry() external view returns (AssetPluginRegistry); + + function versionRegistry() external view returns (VersionRegistry); + + function daoFeeRegistry() external view returns (DAOFeeRegistry); } interface TestIMain is IMain { + function setVersionRegistry(VersionRegistry) external; + + function setAssetPluginRegistry(AssetPluginRegistry) external; + + function setDAOFeeRegistry(DAOFeeRegistry) external; + /// @custom:governance function setShortFreeze(uint48) external; diff --git a/contracts/mocks/AssetPluginRegistryMock.sol b/contracts/mocks/AssetPluginRegistryMock.sol new file mode 100644 index 0000000000..14aede2c95 --- /dev/null +++ b/contracts/mocks/AssetPluginRegistryMock.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: BlueOak-1.0.0 +pragma solidity 0.8.19; + +contract AssetPluginRegistryMock { + function isValidAsset(bytes32, address) public view returns (bool) { + return true; + } +} diff --git a/contracts/mocks/DeployerMock.sol b/contracts/mocks/DeployerMock.sol new file mode 100644 index 0000000000..e8beb8b07c --- /dev/null +++ b/contracts/mocks/DeployerMock.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: BlueOak-1.0.0 +pragma solidity 0.8.19; + +import "../mixins/Versioned.sol"; +import "../interfaces/IDeployer.sol"; +import "../interfaces/IMain.sol"; + +contract DeployerMock is Versioned { + // Implementation contracts - mock + Implementations private _implementations; + + constructor() { + _implementations.main = IMain(address(1)); // used in test + } + + function implementations() external view returns (Implementations memory) { + return _implementations; + } +} + +contract DeployerMockV2 is DeployerMock { + function version() public pure virtual override returns (string memory) { + return "V2"; + } +} diff --git a/contracts/p0/AssetRegistry.sol b/contracts/p0/AssetRegistry.sol index ebdf5fd8b1..ad4239cd84 100644 --- a/contracts/p0/AssetRegistry.sol +++ b/contracts/p0/AssetRegistry.sol @@ -125,6 +125,8 @@ contract AssetRegistryP0 is ComponentP0, IAssetRegistry { assert(reg.erc20s.length == reg.assets.length); } + function validateCurrentAssets() external view {} + /// @return The number of registered ERC20s function size() external view returns (uint256) { return _erc20s.length(); diff --git a/contracts/p0/Deployer.sol b/contracts/p0/Deployer.sol index b44e11a94d..e26569974a 100644 --- a/contracts/p0/Deployer.sol +++ b/contracts/p0/Deployer.sol @@ -170,4 +170,7 @@ contract DeployerP0 is IDeployer, Versioned { rTokenAsset = new RTokenAsset(rToken, maxTradeVolume); emit RTokenAssetCreated(rToken, rTokenAsset); } + + /// @dev Just to make solc happy. + function implementations() external view returns (Implementations memory) {} } diff --git a/contracts/p0/Distributor.sol b/contracts/p0/Distributor.sol index 264d7bfe7e..5e4fd609e2 100644 --- a/contracts/p0/Distributor.sol +++ b/contracts/p0/Distributor.sol @@ -25,7 +25,8 @@ contract DistributorP0 is ComponentP0, IDistributor { function init(IMain main_, RevenueShare memory dist) public initializer { __Component_init(main_); - _ensureNonZeroDistribution(dist.rTokenDist, dist.rsrDist); + + _ensureSufficientTotal(dist.rTokenDist, dist.rsrDist); _setDistribution(FURNACE, RevenueShare(dist.rTokenDist, 0)); _setDistribution(ST_RSR, RevenueShare(0, dist.rsrDist)); } @@ -40,7 +41,33 @@ contract DistributorP0 is ComponentP0, IDistributor { _setDistribution(dest, share); RevenueTotals memory revTotals = totals(); - _ensureNonZeroDistribution(revTotals.rTokenTotal, revTotals.rsrTotal); + _ensureSufficientTotal(revTotals.rTokenTotal, revTotals.rsrTotal); + } + + /// Set RevenueShares for destinations. Destinations `FURNACE` and `ST_RSR` refer to + /// main.furnace() and main.stRSR(). + /// @custom:governance + // checks: invariants hold in post-state + // effects: + // destinations' = dests + // distribution' = shares + function setDistributions(address[] calldata dests, RevenueShare[] calldata shares) + external + governance + { + require(dests.length == shares.length, "array length mismatch"); + + // solhint-disable-next-line no-empty-blocks + try main.rsrTrader().distributeTokenToBuy() {} catch {} + // solhint-disable-next-line no-empty-blocks + try main.rTokenTrader().distributeTokenToBuy() {} catch {} + + for (uint256 i = 0; i < dests.length; ++i) { + _setDistribution(dests[i], shares[i]); + } + + RevenueTotals memory revTotals = totals(); + _ensureSufficientTotal(revTotals.rTokenTotal, revTotals.rsrTotal); } /// Distribute revenue, in rsr or rtoken, per the distribution table. @@ -118,6 +145,7 @@ contract DistributorP0 is ComponentP0, IDistributor { dest != address(main.furnace()) && dest != address(main.stRSR()), "destination can not be furnace or strsr directly" ); + require(dest != address(main.daoFeeRegistry()), "destination cannot be daoFeeRegistry"); if (dest == FURNACE) require(share.rsrDist == 0, "Furnace must get 0% of RSR"); if (dest == ST_RSR) require(share.rTokenDist == 0, "StRSR must get 0% of RToken"); require(share.rsrDist <= MAX_DISTRIBUTION, "RSR distribution too high"); @@ -134,8 +162,8 @@ contract DistributorP0 is ComponentP0, IDistributor { emit DistributionSet(dest, share.rTokenDist, share.rsrDist); } - /// Ensures distribution values are non-zero - function _ensureNonZeroDistribution(uint24 rTokenDist, uint24 rsrDist) internal pure { - require(rTokenDist > 0 || rsrDist > 0, "no distribution defined"); + /// Ensures distribution values are large enough + function _ensureSufficientTotal(uint24 rTokenTotal, uint24 rsrTotal) internal pure { + require(rTokenTotal + rsrTotal >= MAX_DISTRIBUTION, "totals too low"); } } diff --git a/contracts/p0/Main.sol b/contracts/p0/Main.sol index 95dd973b56..856df61362 100644 --- a/contracts/p0/Main.sol +++ b/contracts/p0/Main.sol @@ -47,4 +47,16 @@ contract MainP0 is Versioned, Initializable, Auth, ComponentRegistry, IMain { { return super.hasRole(role, account); } + + function assetPluginRegistry() external pure returns (AssetPluginRegistry) { + return AssetPluginRegistry(address(0)); + } + + function versionRegistry() external pure returns (VersionRegistry) { + return VersionRegistry(address(0)); + } + + function daoFeeRegistry() external pure returns (DAOFeeRegistry) { + return DAOFeeRegistry(address(0)); + } } diff --git a/contracts/p1/AssetRegistry.sol b/contracts/p1/AssetRegistry.sol index 7854d27f5b..883c22cff2 100644 --- a/contracts/p1/AssetRegistry.sol +++ b/contracts/p1/AssetRegistry.sol @@ -156,7 +156,7 @@ contract AssetRegistryP1 is ComponentP1, IAssetRegistry { /// Returns keys(assets), values(assets) as (duplicate-free) lists. // returns: [keys(assets)], [values(assets)] without duplicates. /// @return reg The list of registered ERC20s and Assets, in the same order - function getRegistry() external view returns (Registry memory reg) { + function getRegistry() public view returns (Registry memory reg) { uint256 length = _erc20s.length(); reg.erc20s = new IERC20[](length); reg.assets = new IAsset[](length); @@ -166,6 +166,27 @@ contract AssetRegistryP1 is ComponentP1, IAssetRegistry { } } + /// @inheritdoc IAssetRegistry + function validateCurrentAssets() external view { + Registry memory registry = getRegistry(); + AssetPluginRegistry assetPluginRegistry = main.assetPluginRegistry(); + + if (address(assetPluginRegistry) != address(0)) { + uint256 assetLen = registry.assets.length; + for (uint256 i = 0; i < assetLen; ++i) { + IAsset asset = registry.assets[i]; + + require( + assetPluginRegistry.isValidAsset( + keccak256(abi.encodePacked(this.version())), + address(asset) + ), + "unsupported asset" + ); + } + } + } + /// @return The number of registered ERC20s function size() external view returns (uint256) { return _erc20s.length(); @@ -197,6 +218,17 @@ contract AssetRegistryP1 is ComponentP1, IAssetRegistry { ); } + AssetPluginRegistry assetPluginRegistry = main.assetPluginRegistry(); + if (address(assetPluginRegistry) != address(0)) { + require( + main.assetPluginRegistry().isValidAsset( + keccak256(abi.encodePacked(this.version())), + address(asset) + ), + "unsupported asset" + ); + } + IERC20Metadata erc20 = asset.erc20(); if (_erc20s.contains(address(erc20))) { if (assets[erc20] == asset) return false; diff --git a/contracts/p1/Broker.sol b/contracts/p1/Broker.sol index 29b36e21df..099969a330 100644 --- a/contracts/p1/Broker.sol +++ b/contracts/p1/Broker.sol @@ -82,9 +82,23 @@ contract BrokerP1 is ComponentP1, IBroker { cacheComponents(); setGnosis(gnosis_); - setBatchTradeImplementation(batchTradeImplementation_); + + require( + address(batchTradeImplementation_) != address(0), + "invalid batchTradeImplementation address" + ); + require( + address(dutchTradeImplementation_) != address(0), + "invalid dutchTradeImplementation address" + ); + + batchTradeImplementation = batchTradeImplementation_; + dutchTradeImplementation = dutchTradeImplementation_; + + emit BatchTradeImplementationSet(ITrade(address(0)), batchTradeImplementation_); + emit DutchTradeImplementationSet(ITrade(address(0)), dutchTradeImplementation_); + setBatchAuctionLength(batchAuctionLength_); - setDutchTradeImplementation(dutchTradeImplementation_); setDutchAuctionLength(dutchAuctionLength_); } @@ -168,8 +182,8 @@ contract BrokerP1 is ComponentP1, IBroker { gnosis = newGnosis; } - /// @custom:governance - function setBatchTradeImplementation(ITrade newTradeImplementation) public governance { + /// @custom:main + function setBatchTradeImplementation(ITrade newTradeImplementation) public onlyMain { require( address(newTradeImplementation) != address(0), "invalid batchTradeImplementation address" @@ -190,8 +204,8 @@ contract BrokerP1 is ComponentP1, IBroker { batchAuctionLength = newAuctionLength; } - /// @custom:governance - function setDutchTradeImplementation(ITrade newTradeImplementation) public governance { + /// @custom:main + function setDutchTradeImplementation(ITrade newTradeImplementation) public onlyMain { require( address(newTradeImplementation) != address(0), "invalid dutchTradeImplementation address" diff --git a/contracts/p1/Deployer.sol b/contracts/p1/Deployer.sol index a962b2efe8..bf5608a52f 100644 --- a/contracts/p1/Deployer.sol +++ b/contracts/p1/Deployer.sol @@ -35,7 +35,7 @@ contract DeployerP1 is IDeployer, Versioned { IAsset public immutable rsrAsset; // Implementation contracts for Upgradeability - Implementations public implementations; + Implementations private _implementations; // checks: every address in the input is nonzero // effects: post, all contract-state values are set @@ -68,7 +68,11 @@ contract DeployerP1 is IDeployer, Versioned { rsr = rsr_; gnosis = gnosis_; rsrAsset = rsrAsset_; - implementations = implementations_; + _implementations = implementations_; + } + + function implementations() external view override returns (Implementations memory) { + return _implementations; } /// Deploys an instance of the entire system, oriented around some mandate. @@ -111,22 +115,22 @@ contract DeployerP1 is IDeployer, Versioned { // Main - Proxy MainP1 main = MainP1( - address(new ERC1967Proxy(address(implementations.main), new bytes(0))) + address(new ERC1967Proxy(address(_implementations.main), new bytes(0))) ); // Components - Proxies IRToken rToken = IRToken( - address(new ERC1967Proxy(address(implementations.components.rToken), new bytes(0))) + address(new ERC1967Proxy(address(_implementations.components.rToken), new bytes(0))) ); Components memory components = Components({ stRSR: IStRSR( - address(new ERC1967Proxy(address(implementations.components.stRSR), new bytes(0))) + address(new ERC1967Proxy(address(_implementations.components.stRSR), new bytes(0))) ), rToken: rToken, assetRegistry: IAssetRegistry( address( new ERC1967Proxy( - address(implementations.components.assetRegistry), + address(_implementations.components.assetRegistry), new bytes(0) ) ) @@ -134,7 +138,7 @@ contract DeployerP1 is IDeployer, Versioned { basketHandler: IBasketHandler( address( new ERC1967Proxy( - address(implementations.components.basketHandler), + address(_implementations.components.basketHandler), new bytes(0) ) ) @@ -142,31 +146,36 @@ contract DeployerP1 is IDeployer, Versioned { backingManager: IBackingManager( address( new ERC1967Proxy( - address(implementations.components.backingManager), + address(_implementations.components.backingManager), new bytes(0) ) ) ), distributor: IDistributor( address( - new ERC1967Proxy(address(implementations.components.distributor), new bytes(0)) + new ERC1967Proxy(address(_implementations.components.distributor), new bytes(0)) ) ), rsrTrader: IRevenueTrader( address( - new ERC1967Proxy(address(implementations.components.rsrTrader), new bytes(0)) + new ERC1967Proxy(address(_implementations.components.rsrTrader), new bytes(0)) ) ), rTokenTrader: IRevenueTrader( address( - new ERC1967Proxy(address(implementations.components.rTokenTrader), new bytes(0)) + new ERC1967Proxy( + address(_implementations.components.rTokenTrader), + new bytes(0) + ) ) ), furnace: IFurnace( - address(new ERC1967Proxy(address(implementations.components.furnace), new bytes(0))) + address( + new ERC1967Proxy(address(_implementations.components.furnace), new bytes(0)) + ) ), broker: IBroker( - address(new ERC1967Proxy(address(implementations.components.broker), new bytes(0))) + address(new ERC1967Proxy(address(_implementations.components.broker), new bytes(0))) ) }); @@ -203,9 +212,9 @@ contract DeployerP1 is IDeployer, Versioned { components.broker.init( main, gnosis, - implementations.trading.gnosisTrade, + _implementations.trading.gnosisTrade, params.batchAuctionLength, - implementations.trading.dutchTrade, + _implementations.trading.dutchTrade, params.dutchAuctionLength ); diff --git a/contracts/p1/Distributor.sol b/contracts/p1/Distributor.sol index 75ec383c54..0a1900eb4e 100644 --- a/contracts/p1/Distributor.sol +++ b/contracts/p1/Distributor.sol @@ -24,6 +24,7 @@ contract DistributorP1 is ComponentP1, IDistributor { // distribution[ST_RSR].rTokenDist == 0 // distribution has no more than MAX_DESTINATIONS_ALLOWED key-value entries // all distribution-share values are <= MAX_DISTRIBUTION + // totals().rTokenTotal + totals().rsrTotal >= MAX_DISTRIBUTION // ==== destinations: // distribution[dest] != (0,0) if and only if dest in destinations @@ -44,7 +45,7 @@ contract DistributorP1 is ComponentP1, IDistributor { __Component_init(main_); cacheComponents(); - _ensureNonZeroDistribution(dist.rTokenDist, dist.rsrDist); + _ensureSufficientTotal(dist.rTokenDist, dist.rsrDist); _setDistribution(FURNACE, RevenueShare(dist.rTokenDist, 0)); _setDistribution(ST_RSR, RevenueShare(0, dist.rsrDist)); } @@ -56,15 +57,42 @@ contract DistributorP1 is ComponentP1, IDistributor { // effects: // destinations' = destinations.add(dest) // distribution' = distribution.set(dest, share) - function setDistribution(address dest, RevenueShare memory share) external governance { + function setDistribution(address dest, RevenueShare calldata share) external governance { // solhint-disable-next-line no-empty-blocks try main.rsrTrader().distributeTokenToBuy() {} catch {} // solhint-disable-next-line no-empty-blocks try main.rTokenTrader().distributeTokenToBuy() {} catch {} _setDistribution(dest, share); + + RevenueTotals memory revTotals = totals(); + _ensureSufficientTotal(revTotals.rTokenTotal, revTotals.rsrTotal); + } + + /// Set RevenueShares for destinations. Destinations `FURNACE` and `ST_RSR` refer to + /// main.furnace() and main.stRSR(). + /// @custom:governance + // checks: invariants hold in post-state + // effects: + // destinations' = dests + // distribution' = shares + function setDistributions(address[] calldata dests, RevenueShare[] calldata shares) + external + governance + { + require(dests.length == shares.length, "array length mismatch"); + + // solhint-disable-next-line no-empty-blocks + try main.rsrTrader().distributeTokenToBuy() {} catch {} + // solhint-disable-next-line no-empty-blocks + try main.rTokenTrader().distributeTokenToBuy() {} catch {} + + for (uint256 i = 0; i < dests.length; ++i) { + _setDistribution(dests[i], shares[i]); + } + RevenueTotals memory revTotals = totals(); - _ensureNonZeroDistribution(revTotals.rTokenTotal, revTotals.rsrTotal); + _ensureSufficientTotal(revTotals.rTokenTotal, revTotals.rsrTotal); } struct Transfer { @@ -94,24 +122,23 @@ contract DistributorP1 is ComponentP1, IDistributor { require(caller == rsrTrader || caller == rTokenTrader, "RevenueTraders only"); require(erc20 == rsr || erc20 == rToken, "RSR or RToken"); bool isRSR = erc20 == rsr; // if false: isRToken + uint256 tokensPerShare; + uint256 totalShares; { RevenueTotals memory revTotals = totals(); - uint256 totalShares = isRSR ? revTotals.rsrTotal : revTotals.rTokenTotal; + totalShares = isRSR ? revTotals.rsrTotal : revTotals.rTokenTotal; if (totalShares != 0) tokensPerShare = amount / totalShares; require(tokensPerShare != 0, "nothing to distribute"); } - // Evenly distribute revenue tokens per distribution share. // This rounds "early", and that's deliberate! Transfer[] memory transfers = new Transfer[](destinations.length()); uint256 numTransfers; - address furnaceAddr = address(furnace); // gas-saver - address stRSRAddr = address(stRSR); // gas-saver - bool accountRewards = false; + uint256 paidOutShares; for (uint256 i = 0; i < destinations.length(); ++i) { address addrTo = destinations.at(i); @@ -121,12 +148,13 @@ contract DistributorP1 is ComponentP1, IDistributor { : distribution[addrTo].rTokenDist; if (numberOfShares == 0) continue; uint256 transferAmt = tokensPerShare * numberOfShares; + paidOutShares += numberOfShares; if (addrTo == FURNACE) { - addrTo = furnaceAddr; + addrTo = address(furnace); if (transferAmt != 0) accountRewards = true; } else if (addrTo == ST_RSR) { - addrTo = stRSRAddr; + addrTo = address(stRSR); if (transferAmt != 0) accountRewards = true; } @@ -137,8 +165,27 @@ contract DistributorP1 is ComponentP1, IDistributor { // == Interactions == for (uint256 i = 0; i < numTransfers; ++i) { - Transfer memory t = transfers[i]; - IERC20Upgradeable(address(erc20)).safeTransferFrom(caller, t.addrTo, t.amount); + IERC20Upgradeable(address(erc20)).safeTransferFrom( + caller, + transfers[i].addrTo, + transfers[i].amount + ); + } + + DAOFeeRegistry daoFeeRegistry = main.daoFeeRegistry(); + if (address(daoFeeRegistry) != address(0)) { + // DAO Fee + if (isRSR) { + (address recipient, , ) = main.daoFeeRegistry().getFeeDetails(address(rToken)); + + if (recipient != address(0) && tokensPerShare * (totalShares - paidOutShares) > 0) { + IERC20Upgradeable(address(erc20)).safeTransferFrom( + caller, + recipient, + tokensPerShare * (totalShares - paidOutShares) + ); + } + } } // Perform reward accounting @@ -160,6 +207,21 @@ contract DistributorP1 is ComponentP1, IDistributor { revTotals.rTokenTotal += share.rTokenDist; revTotals.rsrTotal += share.rsrDist; } + + DAOFeeRegistry daoFeeRegistry = main.daoFeeRegistry(); + if (address(daoFeeRegistry) != address(0)) { + // DAO Fee + (address feeRecipient, uint256 feeNumerator, uint256 feeDenominator) = main + .daoFeeRegistry() + .getFeeDetails(address(rToken)); + + if (feeRecipient != address(0) && feeNumerator != 0) { + revTotals.rsrTotal += uint24( + (feeNumerator * uint256(revTotals.rTokenTotal + revTotals.rsrTotal)) / + (feeDenominator - feeNumerator) + ); + } + } } // ==== Internal ==== @@ -179,6 +241,7 @@ contract DistributorP1 is ComponentP1, IDistributor { dest != address(furnace) && dest != address(stRSR), "destination can not be furnace or strsr directly" ); + require(dest != address(main.daoFeeRegistry()), "destination cannot be daoFeeRegistry"); if (dest == FURNACE) require(share.rsrDist == 0, "Furnace must get 0% of RSR"); if (dest == ST_RSR) require(share.rTokenDist == 0, "StRSR must get 0% of RToken"); require(share.rsrDist <= MAX_DISTRIBUTION, "RSR distribution too high"); @@ -195,10 +258,10 @@ contract DistributorP1 is ComponentP1, IDistributor { emit DistributionSet(dest, share.rTokenDist, share.rsrDist); } - /// Ensures distribution values are non-zero - // checks: at least one of its arguments is nonzero - function _ensureNonZeroDistribution(uint24 rTokenDist, uint24 rsrDist) internal pure { - require(rTokenDist != 0 || rsrDist != 0, "no distribution defined"); + /// Ensures distribution values are large enough + // checks: sum exceeds MAX_DISTRIBUTION + function _ensureSufficientTotal(uint24 rTokenTotal, uint24 rsrTotal) internal pure { + require(uint256(rTokenTotal) + uint256(rsrTotal) >= MAX_DISTRIBUTION, "totals too low"); } /// Call after upgrade to >= 3.0.0 diff --git a/contracts/p1/Main.sol b/contracts/p1/Main.sol index 21781ca082..b5749c80fe 100644 --- a/contracts/p1/Main.sol +++ b/contracts/p1/Main.sol @@ -9,6 +9,10 @@ import "../interfaces/IMain.sol"; import "../mixins/ComponentRegistry.sol"; import "../mixins/Auth.sol"; import "../mixins/Versioned.sol"; +import "../registry/VersionRegistry.sol"; +import "../registry/AssetPluginRegistry.sol"; +import "../registry/DAOFeeRegistry.sol"; +import "../interfaces/IBroker.sol"; /** * @title Main @@ -17,6 +21,9 @@ import "../mixins/Versioned.sol"; // solhint-disable max-states-count contract MainP1 is Versioned, Initializable, Auth, ComponentRegistry, UUPSUpgradeable, IMain { IERC20 public rsr; + VersionRegistry public versionRegistry; + AssetPluginRegistry public assetPluginRegistry; + DAOFeeRegistry public daoFeeRegistry; /// @custom:oz-upgrades-unsafe-allow constructor // solhint-disable-next-line no-empty-blocks @@ -49,6 +56,33 @@ contract MainP1 is Versioned, Initializable, Auth, ComponentRegistry, UUPSUpgrad stRSR.payoutRewards(); } + /// Set Version Registry + /// @dev Can only be called once. + function setVersionRegistry(VersionRegistry versionRegistry_) external onlyRole(OWNER) { + require(address(versionRegistry_) != address(0), "invalid registry address"); + require(address(versionRegistry) == address(0), "already set"); + + versionRegistry = VersionRegistry(versionRegistry_); + } + + /// Set Asset Plugin Registry + /// @dev Can only be called once. + function setAssetPluginRegistry(AssetPluginRegistry registry_) external onlyRole(OWNER) { + require(address(registry_) != address(0), "invalid registry address"); + require(address(assetPluginRegistry) == address(0), "already set"); + + assetPluginRegistry = AssetPluginRegistry(registry_); + } + + /// Set DAO Fee Registry + /// @dev Can only be called once. + function setDAOFeeRegistry(DAOFeeRegistry feeRegistry_) external onlyRole(OWNER) { + require(address(feeRegistry_) != address(0), "invalid registry address"); + require(address(daoFeeRegistry) == address(0), "already set"); + + daoFeeRegistry = DAOFeeRegistry(feeRegistry_); + } + function hasRole(bytes32 role, address account) public view @@ -58,14 +92,78 @@ contract MainP1 is Versioned, Initializable, Auth, ComponentRegistry, UUPSUpgrad return super.hasRole(role, account); } + /** + * @dev When upgrading from a prior version to 4.0.0, + * this must happen in the Governance proposal. + */ + function upgradeMainTo(bytes32 versionHash) external onlyRole(OWNER) { + require(address(versionRegistry) != address(0), "no registry"); + require(!versionRegistry.isDeprecated(versionHash), "version deprecated"); + + Implementations memory implementation = versionRegistry.getImplementationForVersion( + versionHash + ); + + _upgradeProxy(address(this), address(implementation.main)); + } + + function upgradeRTokenTo( + bytes32 versionHash, + bool preValidation, + bool postValidation + ) external onlyRole(OWNER) { + require(address(versionRegistry) != address(0), "no registry"); + require(keccak256(abi.encodePacked(this.version())) == versionHash, "upgrade main first"); + + Implementations memory implementation = versionRegistry.getImplementationForVersion( + versionHash + ); + + if (preValidation) { + // Validate before the upgrade. + assetRegistry.validateCurrentAssets(); + } + + _upgradeProxy(address(rToken), address(implementation.components.rToken)); + _upgradeProxy(address(stRSR), address(implementation.components.stRSR)); + _upgradeProxy(address(assetRegistry), address(implementation.components.assetRegistry)); + _upgradeProxy(address(basketHandler), address(implementation.components.basketHandler)); + _upgradeProxy(address(backingManager), address(implementation.components.backingManager)); + _upgradeProxy(address(distributor), address(implementation.components.distributor)); + _upgradeProxy(address(furnace), address(implementation.components.furnace)); + _upgradeProxy(address(broker), address(implementation.components.broker)); + _upgradeProxy(address(rsrTrader), address(implementation.components.rsrTrader)); + _upgradeProxy(address(rTokenTrader), address(implementation.components.rTokenTrader)); + + if (postValidation) { + // ...then validate after the upgrade. + assetRegistry.validateCurrentAssets(); + } + + IExtendedBroker(address(broker)).setBatchTradeImplementation( + implementation.trading.gnosisTrade + ); + IExtendedBroker(address(broker)).setDutchTradeImplementation( + implementation.trading.dutchTrade + ); + } + // === Upgradeability === - // solhint-disable-next-line no-empty-blocks - function _authorizeUpgrade(address newImplementation) internal override onlyRole(OWNER) {} + function _authorizeUpgrade(address) internal view override { + require(msg.sender == address(this), "not self"); + } + + function _upgradeProxy(address proxy, address implementation) internal { + (bool success, ) = proxy.call( + abi.encodeWithSelector(UUPSUpgradeable.upgradeTo.selector, implementation) + ); + require(success, "upgrade failed"); + } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[49] private __gap; + uint256[46] private __gap; } diff --git a/contracts/p1/mixins/Component.sol b/contracts/p1/mixins/Component.sol index aac70ec217..9fc44c25d5 100644 --- a/contracts/p1/mixins/Component.sol +++ b/contracts/p1/mixins/Component.sol @@ -58,8 +58,13 @@ abstract contract ComponentP1 is _; } + modifier onlyMain() { + require(_msgSender() == address(main), "main only"); + _; + } + // solhint-disable-next-line no-empty-blocks - function _authorizeUpgrade(address newImplementation) internal view override governance {} + function _authorizeUpgrade(address newImplementation) internal view override onlyMain {} /** * @dev This empty reserved space is put in place to allow future versions to add new diff --git a/contracts/plugins/assets/Asset.sol b/contracts/plugins/assets/Asset.sol index 2a59ebb594..b28cc1bf12 100644 --- a/contracts/plugins/assets/Asset.sol +++ b/contracts/plugins/assets/Asset.sol @@ -176,7 +176,7 @@ contract Asset is IAsset, VersionedAsset { /// @return {tok} The balance of the ERC20 in whole tokens function bal(address account) external view virtual returns (uint192) { - return shiftl_toFix(erc20.balanceOf(account), -int8(erc20Decimals)); + return shiftl_toFix(erc20.balanceOf(account), -int8(erc20Decimals), FLOOR); } /// @return If the asset is an instance of ICollateral or not diff --git a/contracts/plugins/assets/ERC4626FiatCollateral.sol b/contracts/plugins/assets/ERC4626FiatCollateral.sol index b2ce03a4e4..3c5b73c904 100644 --- a/contracts/plugins/assets/ERC4626FiatCollateral.sol +++ b/contracts/plugins/assets/ERC4626FiatCollateral.sol @@ -8,7 +8,7 @@ import { OracleLib } from "./OracleLib.sol"; import { AggregatorV3Interface } from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; import { IERC4626 } from "@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol"; import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import { shiftl_toFix } from "../../libraries/Fixed.sol"; +import { FLOOR, shiftl_toFix } from "../../libraries/Fixed.sol"; /** * @title ERC4626FiatCollateral @@ -33,7 +33,8 @@ contract ERC4626FiatCollateral is AppreciatingFiatCollateral { /// @return {ref/tok} Actual quantity of whole reference units per whole collateral tokens function underlyingRefPerTok() public view override returns (uint192) { - // already accounts for fees to be taken out - return shiftl_toFix(IERC4626(address(erc20)).convertToAssets(oneShare), -refDecimals); + // already accounts for fees to be taken out -- FLOOR + return + shiftl_toFix(IERC4626(address(erc20)).convertToAssets(oneShare), -refDecimals, FLOOR); } } diff --git a/contracts/plugins/assets/OracleLib.sol b/contracts/plugins/assets/OracleLib.sol index 06df2abbfb..7e51b9b7be 100644 --- a/contracts/plugins/assets/OracleLib.sol +++ b/contracts/plugins/assets/OracleLib.sol @@ -39,7 +39,7 @@ library OracleLib { if (p <= 0) revert InvalidPrice(); // {UoA/tok} - return shiftl_toFix(uint256(p), -int8(chainlinkFeed.decimals())); + return shiftl_toFix(uint256(p), -int8(chainlinkFeed.decimals()), FLOOR); } catch (bytes memory errData) { // Check if the aggregator was not set: if so, the chainlink feed has been deprecated // and a _specific_ error needs to be raised in order to avoid looking like OOG diff --git a/contracts/plugins/assets/VersionedAsset.sol b/contracts/plugins/assets/VersionedAsset.sol index b9e558d5ff..9d5b828b3a 100644 --- a/contracts/plugins/assets/VersionedAsset.sol +++ b/contracts/plugins/assets/VersionedAsset.sol @@ -4,7 +4,7 @@ pragma solidity 0.8.19; import "../../interfaces/IVersioned.sol"; // This value should be updated on each release -string constant ASSET_VERSION = "3.4.0"; +string constant ASSET_VERSION = "4.0.0"; /** * @title VersionedAsset diff --git a/contracts/plugins/assets/aave-v3/AaveV3FiatCollateral.sol b/contracts/plugins/assets/aave-v3/AaveV3FiatCollateral.sol index a4af5a87d0..2201a86970 100644 --- a/contracts/plugins/assets/aave-v3/AaveV3FiatCollateral.sol +++ b/contracts/plugins/assets/aave-v3/AaveV3FiatCollateral.sol @@ -30,7 +30,7 @@ contract AaveV3FiatCollateral is AppreciatingFiatCollateral { function underlyingRefPerTok() public view override returns (uint192) { uint256 rate = StaticATokenV3LM(address(erc20)).rate(); // {ray ref/tok} - return shiftl_toFix(rate, -27); // {ray -> wad} + return shiftl_toFix(rate, -27, FLOOR); // {ray -> wad} } /// Claim rewards earned by holding a balance of the ERC20 token diff --git a/contracts/plugins/assets/aave/ATokenFiatCollateral.sol b/contracts/plugins/assets/aave/ATokenFiatCollateral.sol index 665830de8c..0950cdb4c7 100644 --- a/contracts/plugins/assets/aave/ATokenFiatCollateral.sol +++ b/contracts/plugins/assets/aave/ATokenFiatCollateral.sol @@ -53,7 +53,7 @@ contract ATokenFiatCollateral is AppreciatingFiatCollateral { /// @return {ref/tok} Actual quantity of whole reference units per whole collateral tokens function underlyingRefPerTok() public view override returns (uint192) { uint256 rateInRAYs = IStaticAToken(address(erc20)).rate(); // {ray ref/tok} - return shiftl_toFix(rateInRAYs, -27); + return shiftl_toFix(rateInRAYs, -27, FLOOR); } /// Claim rewards earned by holding a balance of the ERC20 token diff --git a/contracts/plugins/assets/compoundv2/CTokenFiatCollateral.sol b/contracts/plugins/assets/compoundv2/CTokenFiatCollateral.sol index e1d77aeea0..d679f98140 100644 --- a/contracts/plugins/assets/compoundv2/CTokenFiatCollateral.sol +++ b/contracts/plugins/assets/compoundv2/CTokenFiatCollateral.sol @@ -66,7 +66,7 @@ contract CTokenFiatCollateral is AppreciatingFiatCollateral { function underlyingRefPerTok() public view override returns (uint192) { uint256 rate = ICToken(address(erc20)).exchangeRateStored(); int8 shiftLeft = 8 - int8(referenceERC20Decimals) - 18; - return shiftl_toFix(rate, shiftLeft); + return shiftl_toFix(rate, shiftLeft, FLOOR); } /// Claim rewards earned by holding a balance of the ERC20 token diff --git a/contracts/plugins/assets/compoundv2/CTokenSelfReferentialCollateral.sol b/contracts/plugins/assets/compoundv2/CTokenSelfReferentialCollateral.sol index d20e4f44fc..8766be3d71 100644 --- a/contracts/plugins/assets/compoundv2/CTokenSelfReferentialCollateral.sol +++ b/contracts/plugins/assets/compoundv2/CTokenSelfReferentialCollateral.sol @@ -92,7 +92,7 @@ contract CTokenSelfReferentialCollateral is AppreciatingFiatCollateral { function underlyingRefPerTok() public view override returns (uint192) { uint256 rate = ICToken(address(erc20)).exchangeRateStored(); int8 shiftLeft = 8 - int8(referenceERC20Decimals) - 18; - return shiftl_toFix(rate, shiftLeft); + return shiftl_toFix(rate, shiftLeft, FLOOR); } /// Claim rewards earned by holding a balance of the ERC20 token diff --git a/contracts/plugins/assets/compoundv3/CTokenV3Collateral.sol b/contracts/plugins/assets/compoundv3/CTokenV3Collateral.sol index ed285f5db1..416b5d5f36 100644 --- a/contracts/plugins/assets/compoundv3/CTokenV3Collateral.sol +++ b/contracts/plugins/assets/compoundv3/CTokenV3Collateral.sol @@ -44,7 +44,12 @@ contract CTokenV3Collateral is AppreciatingFiatCollateral { } function underlyingRefPerTok() public view virtual override returns (uint192) { - return shiftl_toFix(ICusdcV3Wrapper(address(erc20)).exchangeRate(), -int8(cometDecimals)); + return + shiftl_toFix( + ICusdcV3Wrapper(address(erc20)).exchangeRate(), + -int8(cometDecimals), + FLOOR + ); } /// Refresh exchange rates and update default status. diff --git a/contracts/plugins/assets/curve/CurveStableCollateral.sol b/contracts/plugins/assets/curve/CurveStableCollateral.sol index e7b6ce7507..3971f4019b 100644 --- a/contracts/plugins/assets/curve/CurveStableCollateral.sol +++ b/contracts/plugins/assets/curve/CurveStableCollateral.sol @@ -85,8 +85,8 @@ contract CurveStableCollateral is AppreciatingFiatCollateral, PoolTokens { (uint192 aumLow, uint192 aumHigh) = totalBalancesValue(); // {tok} - uint192 supply = shiftl_toFix(lpToken.totalSupply(), -int8(lpToken.decimals())); - // We can always assume that the total supply is non-zero + uint192 supply = shiftl_toFix(lpToken.totalSupply(), -int8(lpToken.decimals()), FLOOR); + // We can always assume that the total supply is sufficiently non-zero // {UoA/tok} = {UoA} / {tok} low = aumLow.div(supply, FLOOR); diff --git a/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol b/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol index 61eb351d50..3a49b1bd77 100644 --- a/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol +++ b/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol @@ -107,9 +107,9 @@ contract CurveStableMetapoolCollateral is CurveStableCollateral { // {UoA} (uint192 aumLow, uint192 aumHigh) = _metapoolBalancesValue(lowPaired, highPaired); - // {tok} + // {tok} -- FLOOR uint192 supply = shiftl_toFix(metapoolToken.totalSupply(), -int8(metapoolToken.decimals())); - // We can always assume that the total supply is non-zero + // We can always assume that the total supply is sufficiently non-zero // {UoA/tok} = {UoA} / {tok} low = aumLow.div(supply, FLOOR); @@ -169,21 +169,22 @@ contract CurveStableMetapoolCollateral is CurveStableCollateral { // {UoA} (uint192 underlyingAumLow, uint192 underlyingAumHigh) = totalBalancesValue(); - // {tokUnderlying} + // {tokUnderlying} -- FLOOR uint192 underlyingSupply = shiftl_toFix(lpToken.totalSupply(), -int8(lpToken.decimals())); + // We can always assume that the underlying supply is sufficiently non-zero // {UoA/tokUnderlying} = {UoA} / {tokUnderlying} uint192 underlyingLow = underlyingAumLow.div(underlyingSupply, FLOOR); uint192 underlyingHigh = underlyingAumHigh.div(underlyingSupply, CEIL); - // {tokUnderlying} + // {tokUnderlying} -- FLOOR uint192 balUnderlying = shiftl_toFix(metapoolToken.balances(1), -int8(lpToken.decimals())); // {UoA} = {UoA/tokUnderlying} * {tokUnderlying} aumLow = underlyingLow.mul(balUnderlying, FLOOR); aumHigh = underlyingHigh.mul(balUnderlying, CEIL); - // {pairedTok} + // {pairedTok} -- FLOOR uint192 pairedBal = shiftl_toFix(metapoolToken.balances(0), -int8(pairedToken.decimals())); // Add-in contribution from pairedTok diff --git a/contracts/plugins/assets/curve/PoolTokens.sol b/contracts/plugins/assets/curve/PoolTokens.sol index b99378db00..bc04b35be0 100644 --- a/contracts/plugins/assets/curve/PoolTokens.sol +++ b/contracts/plugins/assets/curve/PoolTokens.sol @@ -296,7 +296,7 @@ contract PoolTokens { function totalBalancesValue() internal view returns (uint192 low, uint192 high) { for (uint8 i = 0; i < nTokens; ++i) { IERC20Metadata token = getToken(i); - uint192 balance = shiftl_toFix(curvePool.balances(i), -int8(token.decimals())); + uint192 balance = shiftl_toFix(curvePool.balances(i), -int8(token.decimals()), FLOOR); (uint192 lowP, uint192 highP) = tokenPrice(i); low += balance.mul(lowP, FLOOR); @@ -310,7 +310,7 @@ contract PoolTokens { for (uint8 i = 0; i < nTokens; ++i) { IERC20Metadata token = getToken(i); - uint192 balance = shiftl_toFix(curvePool.balances(i), -int8(token.decimals())); + uint192 balance = shiftl_toFix(curvePool.balances(i), -int8(token.decimals()), FLOOR); balances[i] = (balance); } diff --git a/contracts/plugins/assets/dsr/SDaiCollateral.sol b/contracts/plugins/assets/dsr/SDaiCollateral.sol index 215d2e7b74..6e0e88c279 100644 --- a/contracts/plugins/assets/dsr/SDaiCollateral.sol +++ b/contracts/plugins/assets/dsr/SDaiCollateral.sol @@ -53,6 +53,6 @@ contract SDaiCollateral is AppreciatingFiatCollateral { /// @return {ref/tok} Actual quantity of whole reference units per whole collateral tokens function underlyingRefPerTok() public view override returns (uint192) { - return shiftl_toFix(pot.chi(), -27); + return shiftl_toFix(pot.chi(), -27, FLOOR); } } diff --git a/contracts/plugins/assets/morpho-aave/MorphoFiatCollateral.sol b/contracts/plugins/assets/morpho-aave/MorphoFiatCollateral.sol index b3429791e7..bf868400a0 100644 --- a/contracts/plugins/assets/morpho-aave/MorphoFiatCollateral.sol +++ b/contracts/plugins/assets/morpho-aave/MorphoFiatCollateral.sol @@ -8,7 +8,7 @@ import { OracleLib } from "../OracleLib.sol"; // solhint-disable-next-line max-line-length import { AggregatorV3Interface } from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import { shiftl_toFix, FIX_ONE } from "../../../libraries/Fixed.sol"; +import { shiftl_toFix, FIX_ONE, FLOOR } from "../../../libraries/Fixed.sol"; /** * @title MorphoFiatCollateral @@ -41,7 +41,8 @@ contract MorphoFiatCollateral is AppreciatingFiatCollateral { return shiftl_toFix( MorphoTokenisedDeposit(address(erc20)).convertToAssets(oneShare), - -refDecimals + -refDecimals, + FLOOR ); } diff --git a/contracts/plugins/assets/morpho-aave/MorphoSelfReferentialCollateral.sol b/contracts/plugins/assets/morpho-aave/MorphoSelfReferentialCollateral.sol index c12f2c2547..babea4e816 100644 --- a/contracts/plugins/assets/morpho-aave/MorphoSelfReferentialCollateral.sol +++ b/contracts/plugins/assets/morpho-aave/MorphoSelfReferentialCollateral.sol @@ -6,7 +6,7 @@ import { Asset, AppreciatingFiatCollateral, CollateralConfig, IRewardable } from import { MorphoTokenisedDeposit } from "./MorphoTokenisedDeposit.sol"; import { OracleLib } from "../OracleLib.sol"; import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import { shiftl_toFix, FIX_ONE, FixLib, CEIL } from "../../../libraries/Fixed.sol"; +import { shiftl_toFix, FIX_ONE, FLOOR, FixLib, CEIL } from "../../../libraries/Fixed.sol"; // solhint-enable max-line-length @@ -65,7 +65,7 @@ contract MorphoSelfReferentialCollateral is AppreciatingFiatCollateral { /// @return {ref/tok} Actual quantity of whole reference units per whole collateral tokens function underlyingRefPerTok() public view override returns (uint192) { - return shiftl_toFix(vault.convertToAssets(oneShare), -refDecimals); + return shiftl_toFix(vault.convertToAssets(oneShare), -refDecimals, FLOOR); } /// Claim rewards earned by holding a balance of the ERC20 token diff --git a/contracts/plugins/mocks/AppreciatingMockDecimals.sol b/contracts/plugins/mocks/AppreciatingMockDecimals.sol new file mode 100644 index 0000000000..3082b56e7e --- /dev/null +++ b/contracts/plugins/mocks/AppreciatingMockDecimals.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: BlueOak-1.0.0 +pragma solidity 0.8.19; + +import "../assets/aave/ATokenFiatCollateral.sol"; +import "../../libraries/Fixed.sol"; +import "./ERC20MockDecimals.sol"; + +contract AppreciatingMockDecimals is ERC20MockDecimals { + using FixLib for uint192; + + /// Emitted whenever a reward token balance is claimed + event RewardsClaimed(IERC20 indexed erc20, uint256 indexed amount); + + address internal _underlyingToken; + uint256 internal _exchangeRate; + + ERC20MockDecimals public rewardToken; + mapping(address => uint256) public rewardBalances; + + constructor( + string memory name, + string memory symbol, + uint8 decimals, + address underlyingToken + ) ERC20MockDecimals(name, symbol, decimals) { + _underlyingToken = underlyingToken; + _exchangeRate = _toExchangeRate(FIX_ONE); + require( + decimals == ERC20MockDecimals(address(_underlyingToken)).decimals(), + "invalid decimals" + ); + } + + function underlying() external view returns (address) { + return _underlyingToken; + } + + function rate() external view returns (uint256) { + return _exchangeRate; + } + + function setExchangeRate(uint192 fiatcoinRedemptionRate) external { + _exchangeRate = _toExchangeRate(fiatcoinRedemptionRate); + } + + function _toExchangeRate(uint192 fiatcoinRedemptionRate) internal view returns (uint256) { + /// From Compound Docs: The current exchange rate, scaled by 10^(18 - 8 + Underlying Token Decimals). + if (decimals() <= 18) { + int8 leftShift = 18 - int8(IERC20Metadata(_underlyingToken).decimals()); + return fiatcoinRedemptionRate.shiftl(leftShift); + } else { + return fiatcoinRedemptionRate.mulu_toUint(10**decimals(), ROUND); + } + } + + function setRewardToken(address rewardToken_) external { + rewardToken = ERC20MockDecimals(rewardToken_); + } + + function setRewards(address recipient, uint256 amount) external { + rewardBalances[recipient] = amount; + } + + function claimRewards() external { + uint256 oldBal = rewardToken.balanceOf(msg.sender); + if (address(rewardToken) != address(0) && rewardBalances[msg.sender] != 0) { + rewardToken.mint(msg.sender, rewardBalances[msg.sender]); + rewardBalances[msg.sender] = 0; + } + emit RewardsClaimed( + IERC20(address(rewardToken)), + rewardToken.balanceOf(msg.sender) - oldBal + ); + } +} diff --git a/contracts/plugins/mocks/AppreciatingMockDecimalsCollateral.sol b/contracts/plugins/mocks/AppreciatingMockDecimalsCollateral.sol new file mode 100644 index 0000000000..c4d5ec0b53 --- /dev/null +++ b/contracts/plugins/mocks/AppreciatingMockDecimalsCollateral.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: BlueOak-1.0.0 +pragma solidity 0.8.19; + +// solhint-disable-next-line max-line-length +import { Asset, AppreciatingFiatCollateral, CollateralConfig, IRewardable } from "../assets/AppreciatingFiatCollateral.sol"; +import { OracleLib } from "../assets/OracleLib.sol"; +// solhint-disable-next-line max-line-length +import { AppreciatingMockDecimals } from "./AppreciatingMockDecimals.sol"; +import { AggregatorV3Interface } from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; +import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { shiftl_toFix } from "../../libraries/Fixed.sol"; + +/** + * AppreciatingMockDecimalsCollateral - Used for extreme tests on large decimals (e.g: 21, 27) + */ +contract AppreciatingMockDecimalsCollateral is AppreciatingFiatCollateral { + int8 private immutable refDecimals; + + /// config.erc20 must be an AppreciatingMockDecimals token + /// @param config.chainlinkFeed Feed units: {UoA/ref} + /// @param revenueHiding {1} A value like 1e-6 that represents the maximum refPerTok to hide + constructor(CollateralConfig memory config, uint192 revenueHiding) + AppreciatingFiatCollateral(config, revenueHiding) + { + AppreciatingMockDecimals appToken = AppreciatingMockDecimals(address(config.erc20)); + refDecimals = int8(uint8(IERC20Metadata(appToken.underlying()).decimals())); + require(refDecimals > 18, "only decimals > 18"); + } + + /// @return {ref/tok} Actual quantity of whole reference units per whole collateral tokens + function underlyingRefPerTok() public view override returns (uint192) { + return shiftl_toFix(AppreciatingMockDecimals(address(erc20)).rate(), -refDecimals); + } +} diff --git a/contracts/plugins/mocks/upgrades/DeployerV2.sol b/contracts/plugins/mocks/upgrades/DeployerV2.sol new file mode 100644 index 0000000000..2269ff86ca --- /dev/null +++ b/contracts/plugins/mocks/upgrades/DeployerV2.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: BlueOak-1.0.0 +pragma solidity 0.8.19; + +import "../../../p1/Deployer.sol"; + +/// @custom:oz-upgrades-unsafe-allow external-library-linking +contract DeployerP1V2 is DeployerP1 { + uint256 public newValue; + + constructor( + IERC20Metadata rsr_, + IGnosis gnosis_, + IAsset rsrAsset_, + Implementations memory implementations_ + ) DeployerP1(rsr_, gnosis_, rsrAsset_, implementations_) {} + + function setNewValue(uint256 newValue_) external { + newValue = newValue_; + } + + function version() public pure override(Versioned, IVersioned) returns (string memory) { + return "2.0.0"; + } +} diff --git a/contracts/plugins/trading/DutchTrade.sol b/contracts/plugins/trading/DutchTrade.sol index 7c9eb5a046..65004ce613 100644 --- a/contracts/plugins/trading/DutchTrade.sol +++ b/contracts/plugins/trading/DutchTrade.sol @@ -174,7 +174,7 @@ contract DutchTrade is ITrade, Versioned { buy = buy_.erc20(); require(sellAmount_ <= sell.balanceOf(address(this)), "unfunded trade"); - sellAmount = shiftl_toFix(sellAmount_, -int8(sell.decimals())); // {sellTok} + sellAmount = shiftl_toFix(sellAmount_, -int8(sell.decimals()), FLOOR); // {sellTok} // Track auction end by time, to generalize to all chains uint48 _startTime = uint48(block.timestamp) + 1; // cannot fulfill in current block diff --git a/contracts/plugins/trading/GnosisTrade.sol b/contracts/plugins/trading/GnosisTrade.sol index 3c7759cfbd..ca0625e5f2 100644 --- a/contracts/plugins/trading/GnosisTrade.sol +++ b/contracts/plugins/trading/GnosisTrade.sol @@ -45,7 +45,7 @@ contract GnosisTrade is ITrade, Versioned { IERC20Metadata public sell; // address of token this trade is selling IERC20Metadata public buy; // address of token this trade is buying uint256 public initBal; // {qSellTok}, this trade's balance of `sell` when init() was called - uint192 public sellAmount; // {sellTok}, quantity of whole tokens being sold; dup with initBal + uint192 public sellAmount; // {sellTok}, quantity of whole tokens being sold, != initBal uint48 public endTime; // timestamp after which this trade's auction can be settled uint192 public worstCasePrice; // {buyTok/sellTok}, the worst price we expect to get at Auction // We expect Gnosis Auction either to meet or beat worstCasePrice, or to return the `sell` @@ -91,10 +91,9 @@ contract GnosisTrade is ITrade, Versioned { sell = req.sell.erc20(); buy = req.buy.erc20(); - initBal = sell.balanceOf(address(this)); // {qSellTok} - sellAmount = shiftl_toFix(initBal, -int8(sell.decimals())); // {sellTok} + sellAmount = shiftl_toFix(req.sellAmount, -int8(sell.decimals())); // {sellTok} - require(initBal <= type(uint96).max, "initBal too large"); + initBal = sell.balanceOf(address(this)); // {qSellTok} require(initBal >= req.sellAmount, "unfunded trade"); assert(origin_ != address(0)); @@ -105,8 +104,9 @@ contract GnosisTrade is ITrade, Versioned { endTime = uint48(block.timestamp) + batchAuctionLength; // {buyTok/sellTok} - worstCasePrice = shiftl_toFix(req.minBuyAmount, -int8(buy.decimals())).div( - shiftl_toFix(req.sellAmount, -int8(sell.decimals())) + worstCasePrice = divuu(req.minBuyAmount, req.sellAmount).shiftl( + int8(sell.decimals()) - int8(buy.decimals()), + FLOOR ); // Downsize our sell amount to adjust for fee @@ -212,8 +212,9 @@ contract GnosisTrade is ITrade, Versioned { uint256 adjustedBuyAmt = boughtAmt + 1; // {buyTok/sellTok} - uint192 clearingPrice = shiftl_toFix(adjustedBuyAmt, -int8(buy.decimals())).div( - shiftl_toFix(adjustedSoldAmt, -int8(sell.decimals())) + uint192 clearingPrice = divuu(adjustedBuyAmt, adjustedSoldAmt).shiftl( + int8(sell.decimals()) - int8(buy.decimals()), + FLOOR ); if (clearingPrice.lt(worstCasePrice)) { diff --git a/contracts/registry/AssetPluginRegistry.sol b/contracts/registry/AssetPluginRegistry.sol new file mode 100644 index 0000000000..253009841f --- /dev/null +++ b/contracts/registry/AssetPluginRegistry.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: BlueOak-1.0.0 +pragma solidity 0.8.19; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { VersionRegistry } from "./VersionRegistry.sol"; + +/** + * @title Asset Plugin Registry + * @notice A tiny contract for tracking asset plugins + */ +contract AssetPluginRegistry is Ownable { + VersionRegistry public versionRegistry; + // versionHash => asset => isValid + mapping(bytes32 => mapping(address => bool)) public isValidAsset; + + error AssetPluginRegistry__InvalidAsset(); + error AssetPluginRegistry__InvalidVersion(); + error AssetPluginRegistry__LengthMismatch(); + + event AssetPluginRegistryUpdated(bytes32 versionHash, address asset, bool validity); + + constructor(address _versionRegistry) Ownable() { + versionRegistry = VersionRegistry(_versionRegistry); + + _transferOwnership(versionRegistry.owner()); + } + + function registerAsset(address _asset, bytes32[] calldata validForVersions) external onlyOwner { + if (_asset == address(0)) { + revert AssetPluginRegistry__InvalidAsset(); + } + + for (uint256 i = 0; i < validForVersions.length; ++i) { + bytes32 versionHash = validForVersions[i]; + if (address(versionRegistry.deployments(versionHash)) == address(0)) { + revert AssetPluginRegistry__InvalidVersion(); + } + + isValidAsset[versionHash][_asset] = true; + + emit AssetPluginRegistryUpdated(versionHash, _asset, true); + } + } + + function updateVersionsByAsset( + address _asset, + bytes32[] calldata _versionHashes, + bool[] calldata _validities + ) external onlyOwner { + if (_versionHashes.length != _validities.length) { + revert AssetPluginRegistry__LengthMismatch(); + } + + if (_asset == address(0)) { + revert AssetPluginRegistry__InvalidAsset(); + } + + for (uint256 i = 0; i < _versionHashes.length; ++i) { + bytes32 versionHash = _versionHashes[i]; + if (address(versionRegistry.deployments(versionHash)) == address(0)) { + revert AssetPluginRegistry__InvalidVersion(); + } + + isValidAsset[versionHash][_asset] = _validities[i]; + + emit AssetPluginRegistryUpdated(versionHash, _asset, _validities[i]); + } + } + + function updateAssetsByVersion( + bytes32 _versionHash, + address[] calldata _assets, + bool[] calldata _validities + ) external onlyOwner { + if (_assets.length != _validities.length) { + revert AssetPluginRegistry__LengthMismatch(); + } + + if (address(versionRegistry.deployments(_versionHash)) == address(0)) { + revert AssetPluginRegistry__InvalidVersion(); + } + + for (uint256 i = 0; i < _assets.length; ++i) { + address asset = _assets[i]; + if (asset == address(0)) { + revert AssetPluginRegistry__InvalidAsset(); + } + + isValidAsset[_versionHash][asset] = _validities[i]; + + emit AssetPluginRegistryUpdated(_versionHash, asset, _validities[i]); + } + } +} diff --git a/contracts/registry/DAOFeeRegistry.sol b/contracts/registry/DAOFeeRegistry.sol new file mode 100644 index 0000000000..420b13ddb7 --- /dev/null +++ b/contracts/registry/DAOFeeRegistry.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BlueOak-1.0.0 +pragma solidity 0.8.19; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; + +uint256 constant MAX_FEE_NUMERATOR = 15_00; // max 15% DAO fee +uint256 constant FEE_DENOMINATOR = 100_00; + +contract DAOFeeRegistry is Ownable { + address private feeRecipient; + uint256 private defaultFeeNumerator; // 0% + + mapping(address => uint256) private rTokenFeeNumerator; + mapping(address => bool) private rTokenFeeSet; + + error DAOFeeRegistry__FeeRecipientAlreadySet(); + error DAOFeeRegistry__InvalidFeeRecipient(); + error DAOFeeRegistry__InvalidFeeNumerator(); + + event FeeRecipientSet(address indexed feeRecipient); + event DefaultFeeNumeratorSet(uint256 defaultFeeNumerator); + event RTokenFeeNumeratorSet(address indexed rToken, uint256 feeNumerator, bool isActive); + + constructor(address owner_) Ownable() { + _transferOwnership(owner_); // Ownership to DAO + feeRecipient = owner_; // DAO as initial fee recipient + } + + function setFeeRecipient(address feeRecipient_) external onlyOwner { + if (feeRecipient_ == address(0)) revert DAOFeeRegistry__InvalidFeeRecipient(); + if (feeRecipient_ == feeRecipient) revert DAOFeeRegistry__FeeRecipientAlreadySet(); + + feeRecipient = feeRecipient_; + emit FeeRecipientSet(feeRecipient_); + } + + function setDefaultFeeNumerator(uint256 feeNumerator_) external onlyOwner { + if (feeNumerator_ > MAX_FEE_NUMERATOR) revert DAOFeeRegistry__InvalidFeeNumerator(); + + defaultFeeNumerator = feeNumerator_; + emit DefaultFeeNumeratorSet(defaultFeeNumerator); + } + + function setRTokenFeeNumerator(address rToken, uint256 feeNumerator_) external onlyOwner { + if (feeNumerator_ > MAX_FEE_NUMERATOR) revert DAOFeeRegistry__InvalidFeeNumerator(); + + rTokenFeeNumerator[rToken] = feeNumerator_; + rTokenFeeSet[rToken] = true; + emit RTokenFeeNumeratorSet(rToken, feeNumerator_, true); + } + + function resetRTokenFee(address rToken) external onlyOwner { + rTokenFeeNumerator[rToken] = 0; + rTokenFeeSet[rToken] = false; + + emit RTokenFeeNumeratorSet(rToken, 0, false); + } + + function getFeeDetails(address rToken) + external + view + returns ( + address recipient, + uint256 feeNumerator, + uint256 feeDenominator + ) + { + recipient = feeRecipient; + feeNumerator = rTokenFeeSet[rToken] ? rTokenFeeNumerator[rToken] : defaultFeeNumerator; + feeDenominator = FEE_DENOMINATOR; + } +} diff --git a/contracts/registry/VersionRegistry.sol b/contracts/registry/VersionRegistry.sol new file mode 100644 index 0000000000..b132f5d370 --- /dev/null +++ b/contracts/registry/VersionRegistry.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: BlueOak-1.0.0 +pragma solidity 0.8.19; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { IDeployer, Implementations } from "../interfaces/IDeployer.sol"; + +/** + * @title VersionRegistry + * @notice A tiny contract for tracking deployment versions + */ +contract VersionRegistry is Ownable { + mapping(bytes32 => IDeployer) public deployments; + mapping(bytes32 => bool) public isDeprecated; + bytes32 private latestVersion; + + error VersionRegistry__ZeroAddress(); + error VersionRegistry__InvalidRegistration(); + error VersionRegistry__AlreadyDeprecated(); + + event VersionRegistered(bytes32 versionHash, IDeployer deployer); + event VersionDeprecated(bytes32 versionHash); + + constructor(address owner_) Ownable() { + _transferOwnership(owner_); + } + + /// Register a deployer address, keyed by version. + /// @param deployer The deployer contract address for the version to be added. + function registerVersion(IDeployer deployer) external onlyOwner { + if (address(deployer) == address(0)) { + revert VersionRegistry__ZeroAddress(); + } + + string memory version = deployer.version(); + bytes32 versionHash = keccak256(abi.encodePacked(version)); + + if (address(deployments[versionHash]) != address(0)) { + revert VersionRegistry__InvalidRegistration(); + } + + deployments[versionHash] = deployer; + latestVersion = versionHash; + + emit VersionRegistered(versionHash, deployer); + } + + function deprecateVersion(bytes32 versionHash) external onlyOwner { + if (isDeprecated[versionHash]) { + revert VersionRegistry__AlreadyDeprecated(); + } + isDeprecated[versionHash] = true; + + emit VersionDeprecated(versionHash); + } + + function getLatestVersion() + external + view + returns ( + bytes32 versionHash, + string memory version, + IDeployer deployer, + bool deprecated + ) + { + versionHash = latestVersion; + deployer = deployments[versionHash]; + version = deployer.version(); + deprecated = isDeprecated[versionHash]; + } + + function getImplementationForVersion(bytes32 versionHash) + external + view + returns (Implementations memory) + { + return deployments[versionHash].implementations(); + } +} diff --git a/contracts/spells/3_4_0.sol b/contracts/spells/3_4_0.sol index 9fb80238dc..6565fee965 100644 --- a/contracts/spells/3_4_0.sol +++ b/contracts/spells/3_4_0.sol @@ -343,33 +343,38 @@ contract Upgrade3_4_0 { // Proxy Upgrades { - ( - IMain mainImpl, - Components memory compImpls, - TradePlugins memory tradingImpls - ) = deployer.implementations(); - UUPSUpgradeable(address(main)).upgradeTo(address(mainImpl)); + Implementations memory impls = deployer.implementations(); + + UUPSUpgradeable(address(main)).upgradeTo(address(impls.main)); UUPSUpgradeable(address(proxy.assetRegistry)).upgradeTo( - address(compImpls.assetRegistry) + address(impls.components.assetRegistry) ); UUPSUpgradeable(address(proxy.backingManager)).upgradeTo( - address(compImpls.backingManager) + address(impls.components.backingManager) ); UUPSUpgradeable(address(proxy.basketHandler)).upgradeTo( - address(compImpls.basketHandler) + address(impls.components.basketHandler) + ); + UUPSUpgradeable(address(proxy.broker)).upgradeTo(address(impls.components.broker)); + UUPSUpgradeable(address(proxy.distributor)).upgradeTo( + address(impls.components.distributor) ); - UUPSUpgradeable(address(proxy.broker)).upgradeTo(address(compImpls.broker)); - UUPSUpgradeable(address(proxy.distributor)).upgradeTo(address(compImpls.distributor)); - UUPSUpgradeable(address(proxy.furnace)).upgradeTo(address(compImpls.furnace)); - UUPSUpgradeable(address(proxy.rTokenTrader)).upgradeTo(address(compImpls.rTokenTrader)); - UUPSUpgradeable(address(proxy.rsrTrader)).upgradeTo(address(compImpls.rsrTrader)); - UUPSUpgradeable(address(proxy.stRSR)).upgradeTo(address(compImpls.stRSR)); - UUPSUpgradeable(address(proxy.rToken)).upgradeTo(address(compImpls.rToken)); + UUPSUpgradeable(address(proxy.furnace)).upgradeTo(address(impls.components.furnace)); + UUPSUpgradeable(address(proxy.rTokenTrader)).upgradeTo( + address(impls.components.rTokenTrader) + ); + UUPSUpgradeable(address(proxy.rsrTrader)).upgradeTo( + address(impls.components.rsrTrader) + ); + UUPSUpgradeable(address(proxy.stRSR)).upgradeTo(address(impls.components.stRSR)); + UUPSUpgradeable(address(proxy.rToken)).upgradeTo(address(impls.components.rToken)); // Trading plugins - TestIBroker(address(proxy.broker)).setDutchTradeImplementation(tradingImpls.dutchTrade); + TestIBroker(address(proxy.broker)).setDutchTradeImplementation( + impls.trading.dutchTrade + ); TestIBroker(address(proxy.broker)).setBatchTradeImplementation( - tradingImpls.gnosisTrade + impls.trading.gnosisTrade ); // cacheComponents() diff --git a/test/Broker.test.ts b/test/Broker.test.ts index 8192e0b3a4..92a104c404 100644 --- a/test/Broker.test.ts +++ b/test/Broker.test.ts @@ -211,14 +211,19 @@ describe(`BrokerP${IMPLEMENTATION} contract #fast`, () => { }) it('Should allow to update BatchTrade Implementation if Owner and perform validations', async () => { + const upgraderAddr = IMPLEMENTATION == Implementation.P1 ? main.address : owner.address + const errorMsg = IMPLEMENTATION == Implementation.P1 ? 'main only' : 'governance only' + // Create a Trade const TradeFactory: ContractFactory = await ethers.getContractFactory('GnosisTrade') const tradeImpl: GnosisTrade = await TradeFactory.deploy() // Update to a trade implementation to use as baseline for tests - await expect(broker.connect(owner).setBatchTradeImplementation(tradeImpl.address)) - .to.emit(broker, 'BatchTradeImplementationSet') - .withArgs(anyValue, tradeImpl.address) + await whileImpersonating(upgraderAddr, async (upgSigner) => { + await expect(broker.connect(upgSigner).setBatchTradeImplementation(tradeImpl.address)) + .to.emit(broker, 'BatchTradeImplementationSet') + .withArgs(anyValue, tradeImpl.address) + }) // Check existing value expect(await broker.batchTradeImplementation()).to.equal(tradeImpl.address) @@ -226,34 +231,40 @@ describe(`BrokerP${IMPLEMENTATION} contract #fast`, () => { // If not owner cannot update await expect( broker.connect(other).setBatchTradeImplementation(mock.address) - ).to.be.revertedWith('governance only') + ).to.be.revertedWith(errorMsg) // Check value did not change expect(await broker.batchTradeImplementation()).to.equal(tradeImpl.address) // Attempt to update with Owner but zero address - not allowed - await expect( - broker.connect(owner).setBatchTradeImplementation(ZERO_ADDRESS) - ).to.be.revertedWith('invalid batchTradeImplementation address') - - // Update with owner - await expect(broker.connect(owner).setBatchTradeImplementation(mock.address)) - .to.emit(broker, 'BatchTradeImplementationSet') - .withArgs(tradeImpl.address, mock.address) + await whileImpersonating(upgraderAddr, async (upgSigner) => { + await expect( + broker.connect(upgSigner).setBatchTradeImplementation(ZERO_ADDRESS) + ).to.be.revertedWith('invalid batchTradeImplementation address') + // Update with owner + await expect(broker.connect(upgSigner).setBatchTradeImplementation(mock.address)) + .to.emit(broker, 'BatchTradeImplementationSet') + .withArgs(tradeImpl.address, mock.address) + }) // Check value was updated expect(await broker.batchTradeImplementation()).to.equal(mock.address) }) it('Should allow to update DutchTrade Implementation if Owner and perform validations', async () => { + const upgraderAddr = IMPLEMENTATION == Implementation.P1 ? main.address : owner.address + const errorMsg = IMPLEMENTATION == Implementation.P1 ? 'main only' : 'governance only' + // Create a Trade const TradeFactory: ContractFactory = await ethers.getContractFactory('DutchTrade') const tradeImpl: DutchTrade = await TradeFactory.deploy() // Update to a trade implementation to use as baseline for tests - await expect(broker.connect(owner).setDutchTradeImplementation(tradeImpl.address)) - .to.emit(broker, 'DutchTradeImplementationSet') - .withArgs(anyValue, tradeImpl.address) + await whileImpersonating(upgraderAddr, async (upgSigner) => { + await expect(broker.connect(upgSigner).setDutchTradeImplementation(tradeImpl.address)) + .to.emit(broker, 'DutchTradeImplementationSet') + .withArgs(anyValue, tradeImpl.address) + }) // Check existing value expect(await broker.dutchTradeImplementation()).to.equal(tradeImpl.address) @@ -261,20 +272,22 @@ describe(`BrokerP${IMPLEMENTATION} contract #fast`, () => { // If not owner cannot update await expect( broker.connect(other).setDutchTradeImplementation(mock.address) - ).to.be.revertedWith('governance only') + ).to.be.revertedWith(errorMsg) // Check value did not change expect(await broker.dutchTradeImplementation()).to.equal(tradeImpl.address) // Attempt to update with Owner but zero address - not allowed - await expect( - broker.connect(owner).setDutchTradeImplementation(ZERO_ADDRESS) - ).to.be.revertedWith('invalid dutchTradeImplementation address') + await whileImpersonating(upgraderAddr, async (upgSigner) => { + await expect( + broker.connect(upgSigner).setDutchTradeImplementation(ZERO_ADDRESS) + ).to.be.revertedWith('invalid dutchTradeImplementation address') - // Update with owner - await expect(broker.connect(owner).setDutchTradeImplementation(mock.address)) - .to.emit(broker, 'DutchTradeImplementationSet') - .withArgs(tradeImpl.address, mock.address) + // Update with owner + await expect(broker.connect(upgSigner).setDutchTradeImplementation(mock.address)) + .to.emit(broker, 'DutchTradeImplementationSet') + .withArgs(tradeImpl.address, mock.address) + }) // Check value was updated expect(await broker.dutchTradeImplementation()).to.equal(mock.address) @@ -733,7 +746,7 @@ describe(`BrokerP${IMPLEMENTATION} contract #fast`, () => { // Fund trade with large balance await token0.connect(owner).mint(trade.address, invalidAmount) - // Attempt to initialize + // Will initialize correctly await expect( trade.init( broker.address, @@ -742,7 +755,7 @@ describe(`BrokerP${IMPLEMENTATION} contract #fast`, () => { config.batchAuctionLength, tradeRequest ) - ).to.be.revertedWith('initBal too large') + ).to.not.be.reverted }) it('Should not allow to initialize an unfunded trade', async () => { @@ -1424,6 +1437,9 @@ describe(`BrokerP${IMPLEMENTATION} contract #fast`, () => { const MAX_ERC20_SUPPLY = bn('1e48') // from docs/solidity-style.md + const MAX_BUY_TOKEN_SCALED = toBNDecimals(MAX_ERC20_SUPPLY, Number(buyTokDecimals)) + const MAX_SELL_TOKEN_SCALED = toBNDecimals(MAX_ERC20_SUPPLY, Number(sellTokDecimals)) + // Max out throttles const issuanceThrottleParams = { amtRate: MAX_ERC20_SUPPLY, pctRate: 0 } const redemptionThrottleParams = { amtRate: MAX_ERC20_SUPPLY, pctRate: 0 } @@ -1432,12 +1448,12 @@ describe(`BrokerP${IMPLEMENTATION} contract #fast`, () => { await advanceTime(3600) // Mint coll tokens to addr1 - await buyTok.connect(owner).mint(addr1.address, MAX_ERC20_SUPPLY) - await sellTok.connect(owner).mint(addr1.address, MAX_ERC20_SUPPLY) + await buyTok.connect(owner).mint(addr1.address, MAX_BUY_TOKEN_SCALED) + await sellTok.connect(owner).mint(addr1.address, MAX_SELL_TOKEN_SCALED) // Issue RToken - await buyTok.connect(addr1).approve(rToken.address, MAX_ERC20_SUPPLY) - await sellTok.connect(addr1).approve(rToken.address, MAX_ERC20_SUPPLY) + await buyTok.connect(addr1).approve(rToken.address, MAX_BUY_TOKEN_SCALED) + await sellTok.connect(addr1).approve(rToken.address, MAX_SELL_TOKEN_SCALED) await rToken.connect(addr1).issue(MAX_ERC20_SUPPLY.div(2)) // Burn buyTok from backingManager and send extra sellTok @@ -1446,7 +1462,9 @@ describe(`BrokerP${IMPLEMENTATION} contract #fast`, () => { bn(10).pow(sellTokDecimals) ) await buyTok.burn(backingManager.address, burnAmount) - await sellTok.connect(addr1).transfer(backingManager.address, auctionSellAmt.mul(10)) + await sellTok + .connect(addr1) + .transfer(backingManager.address, auctionSellAmt.mul(bn(10).pow(sellTokDecimals))) // Rebalance should cause backingManager to trade about auctionSellAmt, though not exactly await backingManager.setMaxTradeSlippage(bn('0')) @@ -1483,7 +1501,7 @@ describe(`BrokerP${IMPLEMENTATION} contract #fast`, () => { await buyTok.connect(addr1).approve(router.address, constants.MaxUint256) await router.connect(addr1).bid(trade.address, addr1.address) } else if (bidType.eq(bn(BidType.TRANSFER))) { - await buyTok.connect(addr1).approve(tradeAddr, MAX_ERC20_SUPPLY) + await buyTok.connect(addr1).approve(tradeAddr, MAX_BUY_TOKEN_SCALED) await trade.connect(addr1).bid() } await advanceBlocks(1) @@ -1506,7 +1524,7 @@ describe(`BrokerP${IMPLEMENTATION} contract #fast`, () => { const bidTypes = [bn(BidType.CALLBACK), bn(BidType.TRANSFER)] // applied to both buy and sell tokens - const decimals = [bn('1'), bn('6'), bn('8'), bn('9'), bn('18')] + const decimals = [bn('1'), bn('6'), bn('8'), bn('9'), bn('18'), bn('21'), bn('27')] // auction sell amount const auctionSellAmts = [bn('2'), bn('1595439874635'), bn('987321984732198435645846513')] diff --git a/test/Facade.test.ts b/test/Facade.test.ts index e104d87385..e04376a349 100644 --- a/test/Facade.test.ts +++ b/test/Facade.test.ts @@ -763,7 +763,10 @@ describe('Facade + FacadeMonitor contracts', () => { ) await expect(facade.callStatic.revenueOverview(rsrTrader.address)).not.to.be.reverted - await backingManager.connect(owner).upgradeTo(bckMgrInvalidVer.address) + + await whileImpersonating(main.address, async (signer) => { + await backingManager.connect(signer).upgradeTo(bckMgrInvalidVer.address) + }) // Reverts due to invalid version when forwarding revenue await expect(facade.callStatic.revenueOverview(rsrTrader.address)).to.be.revertedWith( @@ -859,7 +862,9 @@ describe('Facade + FacadeMonitor contracts', () => { ) // Upgrade BackingManager to V2 - await backingManager.connect(owner).upgradeTo(backingManagerV2.address) + await whileImpersonating(main.address, async (signer) => { + await backingManager.connect(signer).upgradeTo(backingManagerV2.address) + }) // Confirm no auction to run yet - should not revert let [canStart, sell, buy, sellAmount] = @@ -905,7 +910,9 @@ describe('Facade + FacadeMonitor contracts', () => { }) // Upgrade BackingManager to V1 - await backingManager.connect(owner).upgradeTo(backingManagerV1.address) + await whileImpersonating(main.address, async (signer) => { + await backingManager.connect(signer).upgradeTo(backingManagerV1.address) + }) // nextRecollateralizationAuction should return false (trade open) ;[canStart, sell, buy, sellAmount] = await facade.callStatic.nextRecollateralizationAuction( @@ -932,7 +939,9 @@ describe('Facade + FacadeMonitor contracts', () => { expect(sellAmount).to.equal(sellAmt) // Invalid versions are also handled - await backingManager.connect(owner).upgradeTo(backingManagerInvalidVer.address) + await whileImpersonating(main.address, async (signer) => { + await backingManager.connect(signer).upgradeTo(backingManagerInvalidVer.address) + }) await expect( facade.callStatic.nextRecollateralizationAuction( @@ -953,7 +962,9 @@ describe('Facade + FacadeMonitor contracts', () => { ) // Upgrade BackingManager to Invalid version - await backingManager.connect(owner).upgradeTo(backingManagerInvalidVer.address) + await whileImpersonating(main.address, async (signer) => { + await backingManager.connect(signer).upgradeTo(backingManagerInvalidVer.address) + }) // Setup prime basket await basketHandler.connect(owner).setPrimeBasket([usdc.address], [fp('1')]) @@ -1673,8 +1684,10 @@ describe('Facade + FacadeMonitor contracts', () => { await advanceToTimestamp((await getLatestBlockTimestamp()) + auctionLength + 13) // Upgrade components to V2 - await backingManager.connect(owner).upgradeTo(backingManagerV2.address) - await rTokenTrader.connect(owner).upgradeTo(revTraderV2.address) + await whileImpersonating(main.address, async (signer) => { + await backingManager.connect(signer).upgradeTo(backingManagerV2.address) + await rTokenTrader.connect(signer).upgradeTo(revTraderV2.address) + }) // Settle and start new auction - Will retry await expectEvents( @@ -1701,8 +1714,10 @@ describe('Facade + FacadeMonitor contracts', () => { ) // Upgrade to V1 - await backingManager.connect(owner).upgradeTo(backingManagerV1.address) - await rTokenTrader.connect(owner).upgradeTo(revTraderV1.address) + await whileImpersonating(main.address, async (signer) => { + await backingManager.connect(signer).upgradeTo(backingManagerV1.address) + await rTokenTrader.connect(signer).upgradeTo(revTraderV1.address) + }) // Advance time till auction ended await advanceToTimestamp((await getLatestBlockTimestamp()) + auctionLength + 13) @@ -1742,7 +1757,9 @@ describe('Facade + FacadeMonitor contracts', () => { ) // Upgrade RevenueTrader to invalid version - Use RSR as an example - await rsrTrader.connect(owner).upgradeTo(revTraderInvalidVer.address) + await whileImpersonating(main.address, async (signer) => { + await rsrTrader.connect(signer).upgradeTo(revTraderInvalidVer.address) + }) const tokenSurplus = bn('0.5e18') await token.connect(addr1).transfer(rsrTrader.address, tokenSurplus) @@ -1752,7 +1769,9 @@ describe('Facade + FacadeMonitor contracts', () => { ).to.be.revertedWith('unrecognized version') // Also set BackingManager to invalid version - await backingManager.connect(owner).upgradeTo(backingManagerInvalidVer.address) + await whileImpersonating(main.address, async (signer) => { + await backingManager.connect(signer).upgradeTo(backingManagerInvalidVer.address) + }) await expect( facade.runRevenueAuctions(rsrTrader.address, [], [token.address], [TradeKind.DUTCH_AUCTION]) diff --git a/test/FacadeWrite.test.ts b/test/FacadeWrite.test.ts index cf7c533b60..d44bffcbed 100644 --- a/test/FacadeWrite.test.ts +++ b/test/FacadeWrite.test.ts @@ -164,8 +164,8 @@ describe('FacadeWrite contract', () => { // Decrease revenue splits for nicer rounding const localConfig = cloneDeep(config) - localConfig.dist.rTokenDist = bn('394') - localConfig.dist.rsrDist = bn('591') + localConfig.dist.rTokenDist = bn('4000') + localConfig.dist.rsrDist = bn('6000') // Set parameters rTokenConfig = { diff --git a/test/Main.test.ts b/test/Main.test.ts index c7b6389471..0ae0ae4cdb 100644 --- a/test/Main.test.ts +++ b/test/Main.test.ts @@ -250,8 +250,8 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { // Configuration const [rTokenTotal, rsrTotal] = await distributor.totals() - expect(rTokenTotal).to.equal(bn(40)) - expect(rsrTotal).to.equal(bn(60)) + expect(rTokenTotal).to.equal(bn(4000)) + expect(rsrTotal).to.equal(bn(6000)) expect(await main.shortFreeze()).to.equal(config.shortFreeze) expect(await main.longFreeze()).to.equal(config.longFreeze) @@ -469,7 +469,7 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { await expect( deployer.deploy('RTKN RToken', 'RTKN', 'mandate', owner.address, invalidDistConfig) - ).to.be.revertedWith('no distribution defined') + ).to.be.revertedWith('totals too low') // Create a new instance of Main const MainFactory: ContractFactory = await ethers.getContractFactory(`MainP${IMPLEMENTATION}`) @@ -1167,6 +1167,10 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { ).to.be.revertedWith('not enough gas to unregister safely') }) + it('Should validate current assets if no Plugin Registry', async () => { + await expect(assetRegistry.validateCurrentAssets()).to.not.be.reverted + }) + it('Should be able to disableBasket during deregistration with basket size of 128', async () => { // Set up backup config await basketHandler.setBackupConfig(await ethers.utils.formatBytes32String('USD'), 1, [ diff --git a/test/RTokenExtremes.test.ts b/test/RTokenExtremes.test.ts index 229960812c..bdf29d52fb 100644 --- a/test/RTokenExtremes.test.ts +++ b/test/RTokenExtremes.test.ts @@ -6,7 +6,7 @@ import { ethers } from 'hardhat' import { BN_SCALE_FACTOR, CollateralStatus } from '../common/constants' import { bn, fp, shortString } from '../common/numbers' import { - ERC20Mock, + ERC20MockDecimals, FiatCollateral, IAssetRegistry, MockV3Aggregator, @@ -53,9 +53,11 @@ describe(`RTokenP${IMPLEMENTATION} contract`, () => { describeExtreme(`Extreme Values ${SLOW ? 'slow mode' : 'fast mode'}`, () => { // makeColl: Deploy and register a new constant-price collateral - async function makeColl(index: number | string): Promise { - const ERC20: ContractFactory = await ethers.getContractFactory('ERC20Mock') - const erc20: ERC20Mock = await ERC20.deploy('Token ' + index, 'T' + index) + async function makeColl(index: number | string, decimals: number): Promise { + const ERC20: ContractFactory = await ethers.getContractFactory('ERC20MockDecimals') + const erc20: ERC20MockDecimals = ( + await ERC20.deploy('Token ' + index, 'T' + index, decimals) + ) const OracleFactory: ContractFactory = await ethers.getContractFactory('MockV3Aggregator') const oracle: MockV3Aggregator = await OracleFactory.deploy(8, bn('1e8')) await oracle.deployed() // fix extreme value tests failing @@ -93,6 +95,7 @@ describe(`RTokenP${IMPLEMENTATION} contract`, () => { weightRest, // another target amount per asset (weight of second+ assets) issuancePctAmt, // range under test: [.000_001 to 1.0] redemptionPctAmt, // range under test: [.000_001 to 1.0] + collateralDecimals, ]: BigNumber[]) { // skip nonsense cases if ( @@ -106,11 +109,11 @@ describe(`RTokenP${IMPLEMENTATION} contract`, () => { // ==== Deploy and register basket collateral const N = numBasketAssets.toNumber() - const erc20s: ERC20Mock[] = [] + const erc20s: ERC20MockDecimals[] = [] const weights: BigNumber[] = [] let totalWeight: BigNumber = fp(0) for (let i = 0; i < N; i++) { - const erc20 = await makeColl(i) + const erc20 = await makeColl(i, Number(collateralDecimals)) erc20s.push(erc20) const currWeight = i == 0 ? weightFirst : weightRest weights.push(currWeight) @@ -134,7 +137,7 @@ describe(`RTokenP${IMPLEMENTATION} contract`, () => { const toIssue0 = totalSupply.sub(toIssue) const e18 = BN_SCALE_FACTOR for (let i = 0; i < N; i++) { - const erc20: ERC20Mock = erc20s[i] + const erc20: ERC20MockDecimals = erc20s[i] // user owner starts with enough basket assets to issue (totalSupply - toIssue) const toMint0: BigNumber = toIssue0.mul(weights[i]).add(e18.sub(1)).div(e18) await erc20.mint(owner.address, toMint0) @@ -207,6 +210,7 @@ describe(`RTokenP${IMPLEMENTATION} contract`, () => { [MIN_WEIGHT, MAX_WEIGHT, fp('0.2')], // weightRest [MIN_ISSUANCE_PCT, fp('1e-2'), fp(1)], // issuanceThrottle.pctRate [MIN_REDEMPTION_PCT, fp('1e-2'), fp(1)], // redemptionThrottle.pctRate + [bn(6), bn(18), bn(21), bn(27)], // collateralDecimals ] paramList = cartesianProduct(...bounds) @@ -220,6 +224,7 @@ describe(`RTokenP${IMPLEMENTATION} contract`, () => { [MIN_WEIGHT], // weightRest [MIN_ISSUANCE_PCT, fp(1)], // issuanceThrottle.pctRate [MIN_REDEMPTION_PCT, fp(1)], // redemptionThrottle.pctRate + [bn(6), bn(27)], // collateralDecimals ] paramList = cartesianProduct(...bounds) } diff --git a/test/Recollateralization.test.ts b/test/Recollateralization.test.ts index ce9c04f586..d448fd2884 100644 --- a/test/Recollateralization.test.ts +++ b/test/Recollateralization.test.ts @@ -51,7 +51,7 @@ import { } from './fixtures' import snapshotGasCost from './utils/snapshotGasCost' import { expectTrade, getTrade, dutchBuyAmount } from './utils/trades' -import { withinQuad } from './utils/matchers' +import { withinTolerance } from './utils/matchers' import { expectRTokenPrice, expectUnpriced, setOraclePrice } from './utils/oracles' import { useEnv } from '#/utils/env' import { mintCollaterals } from './utils/tokens' @@ -1405,7 +1405,7 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { expect(await basketHandler.status()).to.equal(CollateralStatus.SOUND) expect(await basketHandler.fullyCollateralized()).to.equal(true) expect(await facadeTest.callStatic.totalAssetValue(rToken.address)).to.be.gt(issueAmount) - expect(await token0.balanceOf(backingManager.address)).to.be.closeTo(bn('0'), bn('100')) // up to 100 atto + expect(await token0.balanceOf(backingManager.address)).to.be.closeTo(bn('0'), bn('10000')) expect(await token1.balanceOf(backingManager.address)).to.equal(toBNDecimals(buyAmt, 6)) expect(await rToken.totalSupply()).to.be.gt(issueAmount) // New RToken minting @@ -1531,7 +1531,7 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { issueAmount, issueAmount.mul(520).div(100000) // 520 parts in 1 miliion ) - expect(await token0.balanceOf(backingManager.address)).to.be.closeTo(0, 10) + expect(await token0.balanceOf(backingManager.address)).to.be.closeTo(0, 1000) expect(await token1.balanceOf(backingManager.address)).to.be.closeTo( 0, toBNDecimals(sellAmt, 6) @@ -1665,7 +1665,7 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { remainingValue, remainingValue.div(bn('5e3')) ) - expect(await token0.balanceOf(backingManager.address)).to.be.closeTo(0, 10) + expect(await token0.balanceOf(backingManager.address)).to.be.closeTo(0, 1000) expect(await token1.balanceOf(backingManager.address)).to.equal( toBNDecimals(minBuyAmt, 6) ) @@ -2073,7 +2073,7 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { expect(await token1.balanceOf(backingManager.address)).to.equal( toBNDecimals(issueAmount, 6).add(1) ) - expect(await aaveToken.balanceOf(backingManager.address)).to.be.closeTo(bn('0'), 100) // distributor leaves some + expect(await aaveToken.balanceOf(backingManager.address)).to.be.closeTo(bn('0'), 10000) // distributor leaves some expect(await rToken.totalSupply()).to.be.closeTo(issueAmount, fp('0.000001')) // we have a bit more // Check price in USD of the current RToken @@ -3172,7 +3172,7 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { expect(await token1.balanceOf(backingManager.address)).to.equal( toBNDecimals(issueAmount, 6).add(1) ) - expect(await aaveToken.balanceOf(backingManager.address)).to.be.closeTo(bn('0'), 100) // distributor leaves some + expect(await aaveToken.balanceOf(backingManager.address)).to.be.closeTo(bn('0'), 10000) // distributor leaves some expect(await rToken.totalSupply()).to.be.closeTo(issueAmount, fp('0.000001')) // we have a bit more // Check price in USD of the current RToken @@ -3184,7 +3184,8 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { }) }) - context('DutchTrade', () => { + // TODO + context.skip('DutchTrade', () => { const auctionLength = 1800 // 30 minutes beforeEach(async () => { await broker.connect(owner).setDutchAuctionLength(auctionLength) @@ -3541,7 +3542,7 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { token2.address, backupToken1.address, sellAmt2, - withinQuad(minBuyAmt2), + withinTolerance(minBuyAmt2), ], emitted: true, }, @@ -4907,7 +4908,7 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { // Check price in USD of the current RToken - Haircut of ~37.52% taken // The default was for 37.5% of backing, so this is pretty awesome - const exactRTokenPrice = fp('0.6247979797979798') + const exactRTokenPrice = fp('0.62488525484848490000') const totalAssetValue = issueAmount.mul(exactRTokenPrice).div(fp('1')) expect(await facadeTest.callStatic.totalAssetValue(rToken.address)).to.be.closeTo( totalAssetValue, @@ -4925,10 +4926,10 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { // Check quotes - reduced by ~38.15% as well (less collateral is required to match the new price) ;[, quotes] = await facade.connect(addr1).callStatic.issue(rToken.address, bn('1e18')) - const finalQuotes = newQuotes.map((q) => { - return divCeil(q.mul(exactRTokenPrice), fp('1')) - }) - expect(quotes).to.eql(finalQuotes) + for (const q of newQuotes) { + const expected = divCeil(q.mul(exactRTokenPrice), fp('1')) + expect(expected).to.be.closeTo(expected, 100) + } // Check Backup tokens available const expBackup1 = sellAmt0 diff --git a/test/Revenues.test.ts b/test/Revenues.test.ts index 90d3bb944e..df4294d001 100644 --- a/test/Revenues.test.ts +++ b/test/Revenues.test.ts @@ -57,7 +57,7 @@ import { defaultFixture, } from './fixtures' import { whileImpersonating } from './utils/impersonation' -import { withinQuad } from './utils/matchers' +import { withinTolerance } from './utils/matchers' import { expectRTokenPrice, setOraclePrice } from './utils/oracles' import snapshotGasCost from './utils/snapshotGasCost' import { advanceTime, advanceToTimestamp, getLatestBlockTimestamp } from './utils/time' @@ -67,6 +67,8 @@ import { dutchBuyAmount, expectTrade, getTrade } from './utils/trades' const describeGas = IMPLEMENTATION == Implementation.P1 && useEnv('REPORT_GAS') ? describe.only : describe.skip +const itP1 = IMPLEMENTATION == Implementation.P1 ? it : it.skip + describe(`Revenues - P${IMPLEMENTATION}`, () => { let owner: SignerWithAddress let addr1: SignerWithAddress @@ -258,35 +260,43 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { it('Should setup initial distribution correctly', async () => { // Configuration const [rTokenTotal, rsrTotal] = await distributor.totals() - expect(rsrTotal).equal(bn(60)) - expect(rTokenTotal).equal(bn(40)) + expect(rsrTotal).equal(bn(6000)) + expect(rTokenTotal).equal(bn(4000)) }) it('Should allow to set distribution if owner', async () => { // Check initial status const [rTokenTotal, rsrTotal] = await distributor.totals() - expect(rsrTotal).equal(bn(60)) - expect(rTokenTotal).equal(bn(40)) + expect(rsrTotal).equal(bn(6000)) + expect(rTokenTotal).equal(bn(4000)) // Attempt to update with another account await expect( - distributor - .connect(other) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) + distributor.connect(other).setDistributions( + [STRSR_DEST, FURNACE_DEST], + [ + { rTokenDist: bn(0), rsrDist: bn(10000) }, + { rTokenDist: bn(0), rsrDist: bn(0) }, + ] + ) ).to.be.revertedWith('governance only') // Update with owner - Set f = 1 await expect( - distributor - .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) + distributor.connect(owner).setDistributions( + [STRSR_DEST, FURNACE_DEST], + [ + { rTokenDist: bn(0), rsrDist: bn(10000) }, + { rTokenDist: bn(0), rsrDist: bn(0) }, + ] + ) ) .to.emit(distributor, 'DistributionSet') .withArgs(FURNACE_DEST, bn(0), bn(0)) // Check updated status const [newRTokenTotal, newRsrTotal] = await distributor.totals() - expect(newRsrTotal).equal(bn(60)) + expect(newRsrTotal).equal(bn(10000)) expect(newRTokenTotal).equal(bn(0)) }) @@ -295,14 +305,14 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await expect( distributor .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(1) }) + .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(10000) }) ).to.be.revertedWith('Furnace must get 0% of RSR') // Cannot set RToken > 0 for StRSR await expect( distributor .connect(owner) - .setDistribution(STRSR_DEST, { rTokenDist: bn(1), rsrDist: bn(0) }) + .setDistribution(STRSR_DEST, { rTokenDist: bn(10000), rsrDist: bn(0) }) ).to.be.revertedWith('StRSR must get 0% of RToken') // Cannot set RSR distribution too high @@ -319,15 +329,25 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { .setDistribution(FURNACE_DEST, { rTokenDist: bn(10001), rsrDist: bn(0) }) ).to.be.revertedWith('RToken distribution too high') - // Cannot set both distributions = 0 - await distributor - .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) + // Cannot set both distributions below MAX_DISTRIBUTION await expect( - distributor - .connect(owner) - .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) - ).to.be.revertedWith('no distribution defined') + distributor.connect(owner).setDistributions( + [FURNACE_DEST, STRSR_DEST], + [ + { rTokenDist: bn(1), rsrDist: bn(0) }, + { rTokenDist: bn(0), rsrDist: bn(1) }, + ] + ) + ).to.be.reverted + await expect( + distributor.connect(owner).setDistributions( + [FURNACE_DEST, STRSR_DEST], + [ + { rTokenDist: bn(0), rsrDist: bn(0) }, + { rTokenDist: bn(0), rsrDist: bn(0) }, + ] + ) + ).to.be.reverted // Cannot set zero addr beneficiary await expect( @@ -351,6 +371,16 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { ).to.be.revertedWith('destination can not be furnace or strsr directly') }) + itP1('Should not allow to set Dao fee explicitly', async () => { + // Cannot set DAO fee explicitly + await main.connect(owner).setDAOFeeRegistry(other.address) + await expect( + distributor + .connect(owner) + .setDistribution(other.address, { rTokenDist: bn(10000), rsrDist: bn(0) }) + ).to.be.revertedWith('destination cannot be daoFeeRegistry') + }) + it('Should validate number of destinations', async () => { // Cannot set more than Max (100) const maxDestinations = 100 @@ -359,14 +389,14 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { const usr: Wallet = await ethers.Wallet.createRandom() await distributor .connect(owner) - .setDistribution(usr.address, { rTokenDist: bn(40), rsrDist: bn(60) }) + .setDistribution(usr.address, { rTokenDist: bn(4000), rsrDist: bn(6000) }) } // Attempt to add an additional destination will revert await expect( distributor .connect(owner) - .setDistribution(other.address, { rTokenDist: bn(40), rsrDist: bn(60) }) + .setDistribution(other.address, { rTokenDist: bn(4000), rsrDist: bn(6000) }) ).to.be.revertedWith('Too many destinations') }) }) @@ -449,7 +479,13 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { const minBuyAmt = await toMinBuyAmt(issueAmount, fp('0.7'), realRtokenPrice) await expect(rTokenTrader.manageTokens([token0.address], [TradeKind.BATCH_AUCTION])) .to.emit(rTokenTrader, 'TradeStarted') - .withArgs(anyValue, token0.address, rToken.address, issueAmount, withinQuad(minBuyAmt)) + .withArgs( + anyValue, + token0.address, + rToken.address, + issueAmount, + withinTolerance(minBuyAmt) + ) }) it('Should forward revenue to traders', async () => { @@ -465,8 +501,12 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { 'Transfer' ) expect(await aaveToken.balanceOf(backingManager.address)).to.equal(0) - expect(await aaveToken.balanceOf(rsrTrader.address)).to.equal(rewardAmt.mul(60).div(100)) - expect(await aaveToken.balanceOf(rTokenTrader.address)).to.equal(rewardAmt.mul(40).div(100)) + expect(await aaveToken.balanceOf(rsrTrader.address)).to.equal( + rewardAmt.mul(6000).div(10000) + ) + expect(await aaveToken.balanceOf(rTokenTrader.address)).to.equal( + rewardAmt.mul(4000).div(10000) + ) }) it('Should not forward revenue if basket not ready', async () => { @@ -512,8 +552,12 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { 'Transfer' ) expect(await aaveToken.balanceOf(backingManager.address)).to.equal(0) - expect(await aaveToken.balanceOf(rsrTrader.address)).to.equal(rewardAmt.mul(60).div(100)) - expect(await aaveToken.balanceOf(rTokenTrader.address)).to.equal(rewardAmt.mul(40).div(100)) + expect(await aaveToken.balanceOf(rsrTrader.address)).to.equal( + rewardAmt.mul(6000).div(10000) + ) + expect(await aaveToken.balanceOf(rTokenTrader.address)).to.equal( + rewardAmt.mul(4000).div(10000) + ) }) it('Should not forward revenue if paused', async () => { @@ -620,7 +664,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await rsr.connect(owner).mint(rsrTrader.address, issueAmount) await rsrTrader.distributeTokenToBuy() const expectedAmount = stRSRBal.add(issueAmount) - expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(expectedAmount, 100) + expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(expectedAmount, 10000) }) it('Should distribute tokenToBuy - manageTokens()', async () => { @@ -629,7 +673,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await rsr.connect(owner).mint(rsrTrader.address, issueAmount) await rsrTrader.manageTokens([rsr.address], [TradeKind.BATCH_AUCTION]) const expectedAmount = stRSRBal.add(issueAmount) - expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(expectedAmount, 100) + expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(expectedAmount, 10000) }) it('Should not distribute tokenToBuy if frozen or trading paused', async () => { @@ -660,14 +704,14 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Can distribute now await rsrTrader.distributeTokenToBuy() const expectedAmount = stRSRBal.add(issueAmount) - expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(expectedAmount, 100) + expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(expectedAmount, 10000) }) it('Should distribute tokenToBuy before updating distribution', async () => { // Check initial status const [rTokenTotal, rsrTotal] = await distributor.totals() - expect(rsrTotal).equal(bn(60)) - expect(rTokenTotal).equal(bn(40)) + expect(rsrTotal).equal(bn(6000)) + expect(rTokenTotal).equal(bn(4000)) // Set some balance of token-to-buy in traders const issueAmount = bn('100e18') @@ -681,22 +725,26 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await rToken.connect(addr1).issueTo(rTokenTrader.address, issueAmount) // Update distributions with owner - Set f = 1 - await distributor - .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) + await distributor.connect(owner).setDistributions( + [STRSR_DEST, FURNACE_DEST], + [ + { rTokenDist: bn(0), rsrDist: bn(10000) }, + { rTokenDist: bn(0), rsrDist: bn(0) }, + ] + ) // Check tokens were transferred from Traders const expectedAmountRSR = stRSRBal.add(issueAmount) - expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(expectedAmountRSR, 100) - expect(await rsr.balanceOf(rsrTrader.address)).to.be.closeTo(bn(0), 100) + expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(expectedAmountRSR, 10000) + expect(await rsr.balanceOf(rsrTrader.address)).to.be.closeTo(bn(0), 10000) const expectedAmountRToken = rTokenBal.add(issueAmount) - expect(await rToken.balanceOf(furnace.address)).to.be.closeTo(expectedAmountRToken, 100) - expect(await rsr.balanceOf(rTokenTrader.address)).to.be.closeTo(bn(0), 100) + expect(await rToken.balanceOf(furnace.address)).to.be.closeTo(expectedAmountRToken, 10000) + expect(await rsr.balanceOf(rTokenTrader.address)).to.be.closeTo(bn(0), 10000) // Check updated distributions const [newRTokenTotal, newRsrTotal] = await distributor.totals() - expect(newRsrTotal).equal(bn(60)) + expect(newRsrTotal).equal(bn(10000)) expect(newRTokenTotal).equal(bn(0)) }) @@ -718,7 +766,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await advanceTime(Number(ONE_PERIOD)) await expect(rsrTrader.distributeTokenToBuy()).to.emit(stRSR, 'RewardsPaid') const expectedAmountStRSR = stRSRBal.add(issueAmount) - expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(expectedAmountStRSR, 100) + expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(expectedAmountStRSR, 10000) // 2. Furnace.melt() // Transfer RTokens to Furnace (to trigger melting later) @@ -741,8 +789,8 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { it('Should update distribution even if distributeTokenToBuy() reverts', async () => { // Check initial status const [rTokenTotal, rsrTotal] = await distributor.totals() - expect(rsrTotal).equal(bn(60)) - expect(rTokenTotal).equal(bn(40)) + expect(rsrTotal).equal(bn(6000)) + expect(rTokenTotal).equal(bn(4000)) // Set some balance of token-to-buy in RSR trader const issueAmount = bn('100e18') @@ -754,9 +802,13 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await expect(rsrTrader.distributeTokenToBuy()).to.be.reverted // Update distributions with owner - Set f = 1 - await distributor - .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) + await distributor.connect(owner).setDistributions( + [STRSR_DEST, FURNACE_DEST], + [ + { rTokenDist: bn(0), rsrDist: bn(10000) }, + { rTokenDist: bn(0), rsrDist: bn(0) }, + ] + ) // Check no tokens were transferred expect(await rsr.balanceOf(stRSR.address)).to.equal(stRSRBal) @@ -764,7 +816,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Check updated distributions const [newRTokenTotal, newRsrTotal] = await distributor.totals() - expect(newRsrTotal).equal(bn(60)) + expect(newRsrTotal).equal(bn(10000)) expect(newRTokenTotal).equal(bn(0)) }) @@ -790,7 +842,13 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await expect( rsrTrader.returnTokens([rsr.address, token0.address, token1.address]) ).to.be.revertedWith('rsrTotal > 0') - await distributor.setDistribution(STRSR_DEST, { rTokenDist: bn('0'), rsrDist: bn('0') }) + await distributor.setDistributions( + [FURNACE_DEST, STRSR_DEST], + [ + { rTokenDist: bn(10000), rsrDist: bn(0) }, + { rTokenDist: bn('0'), rsrDist: bn('0') }, + ] + ) // Mint RSR await rsr.connect(owner).mint(rsrTrader.address, issueAmount) @@ -846,7 +904,13 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await expect( rTokenTrader.returnTokens([rsr.address, token0.address, token1.address]) ).to.be.revertedWith('rTokenTotal > 0') - await distributor.setDistribution(FURNACE_DEST, { rTokenDist: bn('0'), rsrDist: bn('0') }) + await distributor.setDistributions( + [FURNACE_DEST, STRSR_DEST], + [ + { rTokenDist: bn(0), rsrDist: bn(0) }, + { rTokenDist: bn(0), rsrDist: bn(10000) }, + ] + ) // Should fail for unregistered token await assetRegistry.connect(owner).unregister(collateral1.address) @@ -964,7 +1028,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Collect revenue // Expected values based on Prices between COMP and RSR/RToken = 1 to 1 (for simplification) - const sellAmt: BigNumber = rewardAmountCOMP.mul(60).div(100) // due to f = 60% + const sellAmt: BigNumber = rewardAmountCOMP.mul(6000).div(10000) // due to f = 6000% const minBuyAmt: BigNumber = await toMinBuyAmt(sellAmt, fp('1'), fp('1')) const sellAmtRToken: BigNumber = rewardAmountCOMP.sub(sellAmt) // Remainder @@ -993,7 +1057,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, compToken.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [anyValue, compToken.address, rsr.address, sellAmt, withinTolerance(minBuyAmt)], emitted: true, }, { @@ -1004,7 +1068,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { compToken.address, rToken.address, sellAmtRToken, - withinQuad(minBuyAmtRToken), + withinTolerance(minBuyAmtRToken), ], emitted: true, }, @@ -1092,12 +1156,12 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // StRSR expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo( minBuyAmt, - minBuyAmt.div(bn('1e15')) + minBuyAmt.div(bn('1e13')) ) // Furnace expect(await rToken.balanceOf(furnace.address)).to.closeTo( minBuyAmtRToken, - minBuyAmtRToken.div(bn('1e15')) + minBuyAmtRToken.div(bn('1e13')) ) }) @@ -1191,9 +1255,13 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { it('Should handle properly an asset with low maxTradeVolume', async () => { // Set f = 1 await expect( - distributor - .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) + distributor.connect(owner).setDistributions( + [STRSR_DEST, FURNACE_DEST], + [ + { rTokenDist: bn(0), rsrDist: bn(10000) }, + { rTokenDist: bn(0), rsrDist: bn(0) }, + ] + ) ) .to.emit(distributor, 'DistributionSet') .withArgs(FURNACE_DEST, bn(0), bn(0)) @@ -1202,10 +1270,10 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await expect( distributor .connect(owner) - .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(1) }) + .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(10000) }) ) .to.emit(distributor, 'DistributionSet') - .withArgs(STRSR_DEST, bn(0), bn(1)) + .withArgs(STRSR_DEST, bn(0), bn(10000)) // Set AAVE tokens as reward rewardAmountAAVE = bn('1000e18') @@ -1344,7 +1412,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Collect revenue // Expected values based on Prices between AAVE and RSR/RToken = 1 to 1 (for simplification) - const sellAmt: BigNumber = rewardAmountAAVE.mul(60).div(100) // due to f = 60% + const sellAmt: BigNumber = rewardAmountAAVE.mul(6000).div(10000) // due to f = 6000% const minBuyAmt: BigNumber = await toMinBuyAmt(sellAmt, fp('1'), fp('1')) const sellAmtRToken: BigNumber = rewardAmountAAVE.sub(sellAmt) // Remainder @@ -1375,7 +1443,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinTolerance(minBuyAmt)], emitted: true, }, { @@ -1386,7 +1454,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { aaveToken.address, rToken.address, sellAmtRToken, - withinQuad(minBuyAmtRToken), + withinTolerance(minBuyAmtRToken), ], emitted: true, }, @@ -1459,12 +1527,12 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // StRSR expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo( minBuyAmt, - minBuyAmt.div(bn('1e15')) + minBuyAmt.div(bn('1e13')) ) // Furnace expect(await rToken.balanceOf(furnace.address)).to.be.closeTo( minBuyAmtRToken, - minBuyAmtRToken.div(bn('1e15')) + minBuyAmtRToken.div(bn('1e13')) ) }) @@ -1490,9 +1558,13 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Set f = 1 await expect( - distributor - .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) + distributor.connect(owner).setDistributions( + [STRSR_DEST, FURNACE_DEST], + [ + { rTokenDist: bn(0), rsrDist: bn(10000) }, + { rTokenDist: bn(0), rsrDist: bn(0) }, + ] + ) ) .to.emit(distributor, 'DistributionSet') .withArgs(FURNACE_DEST, bn(0), bn(0)) @@ -1501,10 +1573,10 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await expect( distributor .connect(owner) - .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(1) }) + .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(10000) }) ) .to.emit(distributor, 'DistributionSet') - .withArgs(STRSR_DEST, bn(0), bn(1)) + .withArgs(STRSR_DEST, bn(0), bn(10000)) // Set AAVE tokens as reward rewardAmountAAVE = fp('1.9') @@ -1539,7 +1611,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinTolerance(minBuyAmt)], emitted: true, }, { @@ -1607,7 +1679,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { aaveToken.address, rsr.address, remainderSellAmt, - withinQuad(remainderMinBuyAmt), + withinTolerance(remainderMinBuyAmt), ], emitted: true, }, @@ -1663,7 +1735,10 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { ]) // Check balances sent to corresponding destinations - expect(await rsr.balanceOf(stRSR.address)).to.equal(minBuyAmt.add(remainderMinBuyAmt)) + expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo( + minBuyAmt.add(remainderMinBuyAmt), + 10000 + ) expect(await rToken.balanceOf(furnace.address)).to.equal(0) }) @@ -1692,10 +1767,10 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await expect( distributor .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(1), rsrDist: bn(0) }) + .setDistribution(FURNACE_DEST, { rTokenDist: bn(10000), rsrDist: bn(0) }) ) .to.emit(distributor, 'DistributionSet') - .withArgs(FURNACE_DEST, bn(1), bn(0)) + .withArgs(FURNACE_DEST, bn(10000), bn(0)) await expect( distributor @@ -1741,7 +1816,13 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rTokenTrader, name: 'TradeStarted', - args: [anyValue, aaveToken.address, rToken.address, sellAmt, withinQuad(minBuyAmt)], + args: [ + anyValue, + aaveToken.address, + rToken.address, + sellAmt, + withinTolerance(minBuyAmt), + ], emitted: true, }, { @@ -1797,7 +1878,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { aaveToken.address, rToken.address, sellAmtRemainder, - withinQuad(minBuyAmtRemainder), + withinTolerance(minBuyAmtRemainder), ], emitted: true, }, @@ -1888,19 +1969,16 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Set f = 0.8 (0.2 for Rtoken) await expect( - distributor - .connect(owner) - .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(4) }) - ) - .to.emit(distributor, 'DistributionSet') - .withArgs(STRSR_DEST, bn(0), bn(4)) - await expect( - distributor - .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(1), rsrDist: bn(0) }) + distributor.connect(owner).setDistributions( + [STRSR_DEST, FURNACE_DEST], + [ + { rTokenDist: bn(0), rsrDist: bn(8000) }, + { rTokenDist: bn(2000), rsrDist: bn(0) }, + ] + ) ) .to.emit(distributor, 'DistributionSet') - .withArgs(FURNACE_DEST, bn(1), bn(0)) + .withArgs(FURNACE_DEST, bn(2000), bn(0)) // Set AAVE tokens as reward // Based on current f -> 1.6e18 to RSR and 0.4e18 to Rtoken @@ -1941,7 +2019,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinTolerance(minBuyAmt)], emitted: true, }, { @@ -1952,7 +2030,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { aaveToken.address, rToken.address, sellAmtRToken, - withinQuad(minBuyAmtRToken), + withinTolerance(minBuyAmtRToken), ], emitted: true, }, @@ -2026,7 +2104,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { aaveToken.address, rsr.address, sellAmtRemainder, - withinQuad(minBuyAmtRemainder), + withinTolerance(minBuyAmtRemainder), ], emitted: true, }, @@ -2039,9 +2117,9 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Check destinations at this stage // StRSR - expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(minBuyAmt, 15) + expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(minBuyAmt, 10000) // Furnace - expect(await rToken.balanceOf(furnace.address)).to.equal(minBuyAmtRToken) + expect(await rToken.balanceOf(furnace.address)).to.be.closeTo(minBuyAmtRToken, 10000) // Run final auction until all funds are converted // Advance time till auction ended @@ -2078,11 +2156,11 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // StRSR expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo( minBuyAmt.add(minBuyAmtRemainder), - 15 + 10000 ) expect(await rToken.balanceOf(furnace.address)).to.be.closeTo( minBuyAmtRToken, - minBuyAmtRToken.div(bn('1e2')) // melting + minBuyAmtRToken.div(bn('1e2')) ) }) @@ -2091,9 +2169,13 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Set f = 1 await expect( - distributor - .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) + distributor.connect(owner).setDistributions( + [STRSR_DEST, FURNACE_DEST], + [ + { rTokenDist: bn(0), rsrDist: bn(10000) }, + { rTokenDist: bn(0), rsrDist: bn(0) }, + ] + ) ) .to.emit(distributor, 'DistributionSet') .withArgs(FURNACE_DEST, bn(0), bn(0)) @@ -2101,10 +2183,10 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await expect( distributor .connect(owner) - .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(1) }) + .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(10000) }) ) .to.emit(distributor, 'DistributionSet') - .withArgs(STRSR_DEST, bn(0), bn(1)) + .withArgs(STRSR_DEST, bn(0), bn(10000)) // Transfer some RSR to RevenueTraders await rsr.connect(addr1).transfer(rTokenTrader.address, distAmount) @@ -2152,10 +2234,10 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await expect( distributor .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(1), rsrDist: bn(0) }) + .setDistribution(FURNACE_DEST, { rTokenDist: bn(10000), rsrDist: bn(0) }) ) .to.emit(distributor, 'DistributionSet') - .withArgs(FURNACE_DEST, bn(1), bn(0)) + .withArgs(FURNACE_DEST, bn(10000), bn(0)) await expect( distributor .connect(owner) @@ -2176,38 +2258,6 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { expect(await rToken.balanceOf(furnace.address)).to.equal(0) }) - it('Should not start trades if no distribution defined', async () => { - // Check funds in Backing Manager and destinations - expect(await rsr.balanceOf(backingManager.address)).to.equal(0) - expect(await rsr.balanceOf(stRSR.address)).to.equal(0) - expect(await rToken.balanceOf(furnace.address)).to.equal(0) - - // Set f = 0, avoid dropping tokens - await expect( - distributor - .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(1), rsrDist: bn(0) }) - ) - .to.emit(distributor, 'DistributionSet') - .withArgs(FURNACE_DEST, bn(1), bn(0)) - await expect( - distributor - .connect(owner) - .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) - ) - .to.emit(distributor, 'DistributionSet') - .withArgs(STRSR_DEST, bn(0), bn(0)) - - await expect( - rsrTrader.manageTokens([rsr.address], [TradeKind.BATCH_AUCTION]) - ).to.be.revertedWith('zero distribution') - - // Check funds, nothing changed - expect(await rsr.balanceOf(backingManager.address)).to.equal(0) - expect(await rsr.balanceOf(stRSR.address)).to.equal(0) - expect(await rToken.balanceOf(furnace.address)).to.equal(0) - }) - it('Should handle no distribution defined when settling trade', async () => { // Set COMP tokens as reward rewardAmountCOMP = bn('0.8e18') @@ -2217,7 +2267,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Collect revenue // Expected values based on Prices between COMP and RSR/RToken = 1 to 1 (for simplification) - const sellAmt: BigNumber = rewardAmountCOMP.mul(60).div(100) // due to f = 60% + const sellAmt: BigNumber = rewardAmountCOMP.mul(6000).div(10000) // due to f = 6000% const minBuyAmt: BigNumber = await toMinBuyAmt(sellAmt, fp('1'), fp('1')) const sellAmtRToken: BigNumber = rewardAmountCOMP.sub(sellAmt) // Remainder @@ -2246,7 +2296,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, compToken.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [anyValue, compToken.address, rsr.address, sellAmt, withinTolerance(minBuyAmt)], emitted: true, }, { @@ -2257,7 +2307,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { compToken.address, rToken.address, sellAmtRToken, - withinQuad(minBuyAmtRToken), + withinTolerance(minBuyAmtRToken), ], emitted: true, }, @@ -2307,10 +2357,10 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await expect( distributor .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(1), rsrDist: bn(0) }) + .setDistribution(FURNACE_DEST, { rTokenDist: bn(10000), rsrDist: bn(0) }) ) .to.emit(distributor, 'DistributionSet') - .withArgs(FURNACE_DEST, bn(1), bn(0)) + .withArgs(FURNACE_DEST, bn(10000), bn(0)) await expect( distributor .connect(owner) @@ -2351,10 +2401,10 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { expect(await rsr.balanceOf(stRSR.address)).to.equal(bn(0)) // Furnace - RTokens transferred to destination - expect(await rToken.balanceOf(rTokenTrader.address)).to.equal(bn(0)) + expect(await rToken.balanceOf(rTokenTrader.address)).to.closeTo(bn(0), 10000) expect(await rToken.balanceOf(furnace.address)).to.closeTo( minBuyAmtRToken, - minBuyAmtRToken.div(bn('1e15')) + minBuyAmtRToken.div(bn('1e13')) ) }) @@ -2367,7 +2417,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Collect revenue // Expected values based on Prices between COMP and RSR/RToken = 1 to 1 (for simplification) - const sellAmt: BigNumber = rewardAmountCOMP.mul(60).div(100) // due to f = 60% + const sellAmt: BigNumber = rewardAmountCOMP.mul(6000).div(10000) // due to f = 6000% const minBuyAmt: BigNumber = await toMinBuyAmt(sellAmt, fp('1'), fp('1')) const sellAmtRToken: BigNumber = rewardAmountCOMP.sub(sellAmt) // Remainder @@ -2396,7 +2446,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, compToken.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [anyValue, compToken.address, rsr.address, sellAmt, withinTolerance(minBuyAmt)], emitted: true, }, { @@ -2407,7 +2457,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { compToken.address, rToken.address, sellAmtRToken, - withinQuad(minBuyAmtRToken), + withinTolerance(minBuyAmtRToken), ], emitted: true, }, @@ -2515,7 +2565,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { expect(await aaveToken.balanceOf(backingManager.address)).to.equal(rewardAmountAAVE) // Set expected values, based on f = 0.6 - const expectedToTrader = rewardAmountAAVE.mul(60).div(100) + const expectedToTrader = rewardAmountAAVE.mul(6000).div(10000) const expectedToFurnace = rewardAmountAAVE.sub(expectedToTrader) // Check status of traders at this point @@ -2552,7 +2602,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Collect revenue // Expected values based on Prices between AAVE and RSR/RToken = 1 to 1 (for simplification) - const sellAmt: BigNumber = rewardAmountAAVE.mul(60).div(100) // due to f = 60% + const sellAmt: BigNumber = rewardAmountAAVE.mul(6000).div(10000) // due to f = 6000% const minBuyAmt: BigNumber = await toMinBuyAmt(sellAmt, fp('1'), fp('1')) const sellAmtRToken: BigNumber = rewardAmountAAVE.sub(sellAmt) // Remainder @@ -2584,7 +2634,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinTolerance(minBuyAmt)], emitted: true, }, { @@ -2595,7 +2645,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { aaveToken.address, rToken.address, sellAmtRToken, - withinQuad(minBuyAmtRToken), + withinTolerance(minBuyAmtRToken), ], emitted: true, }, @@ -2681,8 +2731,8 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { expect(await broker.batchTradeDisabled()).to.equal(true) // Check funds at destinations - expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(minBuyAmt.sub(10), 50) - expect(await rToken.balanceOf(furnace.address)).to.be.closeTo(minBuyAmtRToken.sub(10), 50) + expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(minBuyAmt.sub(10), 5000) + expect(await rToken.balanceOf(furnace.address)).to.be.closeTo(minBuyAmtRToken.sub(10), 5000) }) it('Should report violation even if paused or frozen', async () => { @@ -2696,7 +2746,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Collect revenue // Expected values based on Prices between AAVE and RSR/RToken = 1 to 1 (for simplification) - const sellAmt: BigNumber = rewardAmountAAVE.mul(60).div(100) // due to f = 60% + const sellAmt: BigNumber = rewardAmountAAVE.mul(6000).div(10000) // due to f = 6000% const minBuyAmt: BigNumber = await toMinBuyAmt(sellAmt, fp('1'), fp('1')) const sellAmtRToken: BigNumber = rewardAmountAAVE.sub(sellAmt) // Remainder @@ -2714,7 +2764,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinTolerance(minBuyAmt)], emitted: true, }, { @@ -2725,7 +2775,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { aaveToken.address, rToken.address, sellAmtRToken, - withinQuad(minBuyAmtRToken), + withinTolerance(minBuyAmtRToken), ], emitted: true, }, @@ -2817,7 +2867,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Collect revenue // Expected values based on Prices between AAVE and RSR/RToken = 1 to 1 (for simplification) - const sellAmt: BigNumber = rewardAmountAAVE.mul(60).div(100) // due to f = 60% + const sellAmt: BigNumber = rewardAmountAAVE.mul(6000).div(10000) // due to f = 6000% const minBuyAmt: BigNumber = await toMinBuyAmt(sellAmt, fp('1'), fp('1')) const sellAmtRToken: BigNumber = rewardAmountAAVE.sub(sellAmt) // Remainder @@ -2851,7 +2901,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinTolerance(minBuyAmt)], emitted: true, }, { @@ -2862,7 +2912,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { aaveToken.address, rToken.address, sellAmtRToken, - withinQuad(minBuyAmtRToken), + withinTolerance(minBuyAmtRToken), ], emitted: true, }, @@ -2934,7 +2984,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Collect revenue // Expected values based on Prices between AAVE and RSR/RToken = 1 to 1 (for simplification) - const sellAmt: BigNumber = rewardAmountAAVE.mul(60).div(100) // due to f = 60% + const sellAmt: BigNumber = rewardAmountAAVE.mul(6000).div(10000) // due to f = 6000% const minBuyAmt: BigNumber = await toMinBuyAmt(sellAmt, fp('1'), fp('1')) const sellAmtRToken: BigNumber = rewardAmountAAVE.sub(sellAmt) // Remainder @@ -2968,7 +3018,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinTolerance(minBuyAmt)], emitted: true, }, { @@ -2979,7 +3029,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { aaveToken.address, rToken.address, sellAmtRToken, - withinQuad(minBuyAmtRToken), + withinTolerance(minBuyAmtRToken), ], emitted: true, }, @@ -3068,7 +3118,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await disableBatchTrade() // Expected values based on Prices between AAVE and RSR/RToken = 1 to 1 (for simplification) - const sellAmt: BigNumber = rewardAmountAAVE.mul(60).div(100) // due to f = 60% + const sellAmt: BigNumber = rewardAmountAAVE.mul(6000).div(10000) // due to f = 6000% const sellAmtRToken: BigNumber = rewardAmountAAVE.sub(sellAmt) // Remainder // Attempt to run auctions @@ -3133,10 +3183,10 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await expect( distributor .connect(owner) - .setDistribution(other.address, { rTokenDist: bn(40), rsrDist: bn(60) }) + .setDistribution(other.address, { rTokenDist: bn(4000), rsrDist: bn(6000) }) ) .to.emit(distributor, 'DistributionSet') - .withArgs(other.address, bn(40), bn(60)) + .withArgs(other.address, bn(4000), bn(6000)) // Set AAVE tokens as reward rewardAmountAAVE = bn('1e18') @@ -3146,7 +3196,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Collect revenue // Expected values based on Prices between AAVE and RSR/RToken = 1 to 1 (for simplification) - const sellAmt: BigNumber = rewardAmountAAVE.mul(60).div(100) // due to f = 60% + const sellAmt: BigNumber = rewardAmountAAVE.mul(6000).div(10000) // due to f = 6000% const minBuyAmt: BigNumber = await toMinBuyAmt(sellAmt, fp('1'), fp('1')) const sellAmtRToken: BigNumber = rewardAmountAAVE.sub(sellAmt) // Remainder @@ -3178,7 +3228,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [anyValue, aaveToken.address, rsr.address, sellAmt, withinTolerance(minBuyAmt)], emitted: true, }, { @@ -3189,7 +3239,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { aaveToken.address, rToken.address, sellAmtRToken, - withinQuad(minBuyAmtRToken), + withinTolerance(minBuyAmtRToken), ], emitted: true, }, @@ -3264,21 +3314,21 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // StRSR - 50% to StRSR, 50% to other expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo( minBuyAmt.div(2), - minBuyAmt.div(2).div(bn('1e15')) + minBuyAmt.div(2).div(bn('1e13')) ) expect(await rsr.balanceOf(other.address)).to.be.closeTo( minBuyAmt.div(2), - minBuyAmt.div(2).div(bn('1e15')) + minBuyAmt.div(2).div(bn('1e13')) ) // Furnace - 50% to Furnace, 50% to other expect(await rToken.balanceOf(furnace.address)).to.be.closeTo( minBuyAmtRToken.div(2), - minBuyAmtRToken.div(2).div(bn('1e15')) + minBuyAmtRToken.div(2).div(bn('1e13')) ) expect(await rToken.balanceOf(other.address)).to.be.closeTo( minBuyAmtRToken.div(2), - minBuyAmtRToken.div(2).div(bn('1e15')) + minBuyAmtRToken.div(2).div(bn('1e13')) ) }) @@ -3287,33 +3337,30 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await expect( distributor .connect(owner) - .setDistribution(other.address, { rTokenDist: bn(0), rsrDist: bn(1) }) + .setDistribution(other.address, { rTokenDist: bn(0), rsrDist: bn(10000) }) ) .to.emit(distributor, 'DistributionSet') - .withArgs(other.address, bn(0), bn(1)) + .withArgs(other.address, bn(0), bn(10000)) // No distribution to Furnace or StRSR await expect( - distributor - .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) + distributor.connect(owner).setDistributions( + [other.address, STRSR_DEST, FURNACE_DEST], + [ + { rTokenDist: bn(0), rsrDist: bn(10000) }, + { rTokenDist: bn(0), rsrDist: bn(0) }, + { rTokenDist: bn(0), rsrDist: bn(0) }, + ] + ) ) .to.emit(distributor, 'DistributionSet') .withArgs(FURNACE_DEST, bn(0), bn(0)) - await expect( - distributor - .connect(owner) - .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) - ) - .to.emit(distributor, 'DistributionSet') - .withArgs(STRSR_DEST, bn(0), bn(0)) - const rsrBalInDestination = await rsr.balanceOf(other.address) await rsr.connect(owner).mint(rsrTrader.address, issueAmount) await rsrTrader.distributeTokenToBuy() const expectedAmount = rsrBalInDestination.add(issueAmount) - expect(await rsr.balanceOf(other.address)).to.be.closeTo(expectedAmount, 100) + expect(await rsr.balanceOf(other.address)).to.be.closeTo(expectedAmount, 10000) }) it('Should claim but not sweep rewards to BackingManager from the Revenue Traders', async () => { @@ -3686,7 +3733,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { issueAmount, config.maxTradeSlippage ) - expect(actual).to.be.closeTo(expected, expected.div(bn('1e15'))) + expect(actual).to.be.closeTo(expected, expected.div(bn('1e13'))) const staticResult = await router .connect(addr1) @@ -3777,7 +3824,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { config.maxTradeSlippage ) expect(await rTokenTrader.tradesOpen()).to.equal(0) - expect(await rToken.balanceOf(rTokenTrader.address)).to.be.closeTo(0, 100) + expect(await rToken.balanceOf(rTokenTrader.address)).to.be.closeTo(0, 10000) expect(await rToken.balanceOf(furnace.address)).to.equal(expected) }) }) @@ -3867,7 +3914,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Expected values const currentTotalSupply: BigNumber = await rToken.totalSupply() - const expectedToTrader = excessQuantity.mul(60).div(100) + const expectedToTrader = excessQuantity.mul(6000).div(10000) const expectedToFurnace = excessQuantity.sub(expectedToTrader) const sellAmt: BigNumber = expectedToTrader // everything is auctioned, below max auction @@ -3880,7 +3927,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, token2.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [anyValue, token2.address, rsr.address, sellAmt, withinTolerance(minBuyAmt)], emitted: true, }, { @@ -3891,7 +3938,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { token2.address, rToken.address, sellAmtRToken, - withinQuad(minBuyAmtRToken), + withinTolerance(minBuyAmtRToken), ], emitted: true, }, @@ -3983,11 +4030,11 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Check destinations at this stage - RSR and RTokens already in StRSR and Furnace expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo( minBuyAmt, - minBuyAmt.div(bn('1e15')) + minBuyAmt.div(bn('1e13')) ) expect(await rToken.balanceOf(furnace.address)).to.be.closeTo( minBuyAmtRToken, - minBuyAmtRToken.div(bn('1e15')) + minBuyAmtRToken.div(bn('1e13')) ) // Check no more funds in Market and Traders @@ -4021,8 +4068,8 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Expected values const currentTotalSupply: BigNumber = await rToken.totalSupply() - const expectedToTrader = divCeil(excessQuantity.mul(60), bn(100)).sub(60) - const expectedToFurnace = divCeil(excessQuantity.mul(40), bn(100)).sub(40) // excessQuantity.sub(expectedToTrader) + const expectedToTrader = divCeil(excessQuantity.mul(6000), bn(10000)).sub(6000) + const expectedToFurnace = divCeil(excessQuantity.mul(4000), bn(10000)).sub(4000) // excessQuantity.sub(expectedToTrader) const sellAmt: BigNumber = expectedToTrader const minBuyAmt: BigNumber = await toMinBuyAmt(sellAmt, fp('1.02'), fp('1')) @@ -4035,7 +4082,13 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, token2.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [ + anyValue, + token2.address, + rsr.address, + withinTolerance(sellAmt), + withinTolerance(minBuyAmt), + ], emitted: true, }, { @@ -4045,8 +4098,8 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { anyValue, token2.address, rToken.address, - sellAmtRToken, - withinQuad(minBuyAmtRToken), + withinTolerance(sellAmtRToken), + withinTolerance(minBuyAmtRToken), ], emitted: true, }, @@ -4055,7 +4108,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Check Price (unchanged) and Assets value (restored) - Supply remains constant await expectRTokenPrice(rTokenAsset.address, fp('1'), ORACLE_ERROR) expect( - near(await facadeTest.callStatic.totalAssetValue(rToken.address), issueAmount, 100) + near(await facadeTest.callStatic.totalAssetValue(rToken.address), issueAmount, 10000) ).to.equal(true) expect( (await facadeTest.callStatic.totalAssetValue(rToken.address)).gt(issueAmount) @@ -4086,8 +4139,11 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { }) // Check funds in Market and Traders - expect(near(await token2.balanceOf(gnosis.address), excessQuantity, 100)).to.equal(true) - expect(await token2.balanceOf(gnosis.address)).to.equal(sellAmt.add(sellAmtRToken)) + expect(near(await token2.balanceOf(gnosis.address), excessQuantity, 10000)).to.equal(true) + expect(await token2.balanceOf(gnosis.address)).to.be.closeTo( + sellAmt.add(sellAmtRToken), + 10000 + ) expect(await token2.balanceOf(rsrTrader.address)).to.equal(expectedToTrader.sub(sellAmt)) expect(await token2.balanceOf(rsrTrader.address)).to.equal(0) expect(await token2.balanceOf(rTokenTrader.address)).to.equal( @@ -4126,22 +4182,12 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { args: [anyValue, token2.address, rToken.address, sellAmtRToken, minBuyAmtRToken], emitted: true, }, - { - contract: rsrTrader, - name: 'TradeStarted', - emitted: false, - }, - { - contract: rTokenTrader, - name: 'TradeStarted', - emitted: false, - }, ]) // Check Price (unchanged) and Assets value (unchanged) await expectRTokenPrice(rTokenAsset.address, fp('1'), ORACLE_ERROR) expect( - near(await facadeTest.callStatic.totalAssetValue(rToken.address), issueAmount, 100) + near(await facadeTest.callStatic.totalAssetValue(rToken.address), issueAmount, 10000) ).to.equal(true) expect( (await facadeTest.callStatic.totalAssetValue(rToken.address)).gt(issueAmount) @@ -4150,9 +4196,9 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Check balances sent to corresponding destinations // StRSR - expect(near(await rsr.balanceOf(stRSR.address), minBuyAmt, 100)).to.equal(true) + expect(near(await rsr.balanceOf(stRSR.address), minBuyAmt, 10000)).to.equal(true) // Furnace - expect(near(await rToken.balanceOf(furnace.address), minBuyAmtRToken, 100)).to.equal(true) + expect(near(await rToken.balanceOf(furnace.address), minBuyAmtRToken, 10000)).to.equal(true) }) it('Should not oversend if backingManager.forwardRevenue() is called with duplicate tokens', async () => { @@ -4227,7 +4273,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { expect(await rToken.balanceOf(furnace.address)).to.equal(0) // Set expected minting, based on f = 0.6 - const expectedToTrader = issueAmount.mul(60).div(100) + const expectedToTrader = issueAmount.mul(6000).div(10000) const expectedToFurnace = issueAmount.sub(expectedToTrader) // Set expected auction values @@ -4247,7 +4293,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rsrTrader, name: 'TradeStarted', - args: [anyValue, rToken.address, rsr.address, sellAmt, withinQuad(minBuyAmt)], + args: [anyValue, rToken.address, rsr.address, sellAmt, withinTolerance(minBuyAmt)], emitted: true, }, ]) @@ -4317,7 +4363,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { expect(await rToken.balanceOf(gnosis.address)).to.equal(0) // Check destinations after newly minted tokens - expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(minBuyAmt, 1000) + expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(minBuyAmt, 100000) expect(await rToken.balanceOf(rsrTrader.address)).to.equal(0) }) @@ -4350,18 +4396,18 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Set expected values based on f=0.6 const currentTotalSupply: BigNumber = await rToken.totalSupply() - const excessRToken: BigNumber = issueAmount.mul(60).div(100) + const excessRToken: BigNumber = issueAmount.mul(6000).div(10000) const excessCollateralValue: BigNumber = excessTotalValue.sub(excessRToken) const excessCollateralQty: BigNumber = excessCollateralValue.div(2) // each unit of this collateral is worth now $2 - const expectedToTraderFromRToken = divCeil(excessRToken.mul(60), bn(100)) + const expectedToTraderFromRToken = divCeil(excessRToken.mul(6000), bn(10000)) const expectedToFurnaceFromRToken = excessRToken.sub(expectedToTraderFromRToken) - const expectedToRSRTraderFromCollateral = divCeil(excessCollateralQty.mul(60), bn(100)) + const expectedToRSRTraderFromCollateral = divCeil(excessCollateralQty.mul(6000), bn(10000)) const expectedToRTokenTraderFromCollateral = excessCollateralQty.sub( expectedToRSRTraderFromCollateral ) // Set expected auction values - const newTotalSupply: BigNumber = currentTotalSupply.mul(160).div(100) + const newTotalSupply: BigNumber = currentTotalSupply.mul(16000).div(10000) const sellAmtFromRToken: BigNumber = expectedToTraderFromRToken // all will be processed at once, due to max trade volume of 50% const minBuyAmtFromRToken: BigNumber = await toMinBuyAmt( sellAmtFromRToken, @@ -4397,7 +4443,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { rToken.address, rsr.address, sellAmtFromRToken, - withinQuad(minBuyAmtFromRToken), + withinTolerance(minBuyAmtFromRToken), ], emitted: true, }, @@ -4409,7 +4455,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { token2.address, rsr.address, sellAmtRSRFromCollateral, - withinQuad(minBuyAmtRSRFromCollateral.mul(2)), + withinTolerance(minBuyAmtRSRFromCollateral.mul(2)), ], emitted: true, }, @@ -4421,7 +4467,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { token2.address, rToken.address, sellAmtRTokenFromCollateral, - withinQuad(minBuyAmtRTokenFromCollateral.mul(2)), + withinTolerance(minBuyAmtRTokenFromCollateral.mul(2)), ], emitted: true, }, @@ -4568,7 +4614,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { const expectedRSR = minBuyAmtFromRToken.add(minBuyAmtRSRFromCollateral) expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo( expectedRSR, - expectedRSR.div(bn('1e15')) + expectedRSR.div(bn('1e13')) ) expect(await rToken.balanceOf(rsrTrader.address)).to.equal(0) expect(await token2.balanceOf(rsrTrader.address)).to.equal(0) @@ -4579,7 +4625,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Set distribution for RToken only (f=0) await distributor .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(1), rsrDist: bn(0) }) + .setDistribution(FURNACE_DEST, { rTokenDist: bn(10000), rsrDist: bn(0) }) await distributor .connect(owner) @@ -4637,7 +4683,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { { contract: rToken, name: 'Transfer', - args: [ZERO_ADDRESS, backingManager.address, withinQuad(excessRevenue)], + args: [ZERO_ADDRESS, backingManager.address, withinTolerance(excessRevenue)], emitted: true, }, { @@ -4744,8 +4790,12 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { 'Transfer' ) expect(await aaveToken.balanceOf(backingManager.address)).to.equal(0) - expect(await aaveToken.balanceOf(rsrTrader.address)).to.equal(rewardAmt.mul(60).div(100)) - expect(await aaveToken.balanceOf(rTokenTrader.address)).to.equal(rewardAmt.mul(40).div(100)) + expect(await aaveToken.balanceOf(rsrTrader.address)).to.equal( + rewardAmt.mul(6000).div(10000) + ) + expect(await aaveToken.balanceOf(rTokenTrader.address)).to.equal( + rewardAmt.mul(4000).div(10000) + ) }) }) }) @@ -4825,11 +4875,10 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Set f = 0.8 (0.2 for Rtoken) await distributor .connect(owner) - .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(4) }) - + .setDistribution(FURNACE_DEST, { rTokenDist: bn(10000), rsrDist: bn(0) }) await distributor .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(1), rsrDist: bn(0) }) + .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(4) }) // Set COMP tokens as reward rewardAmountCOMP = bn('2e18') diff --git a/test/Upgradeability.test.ts b/test/Upgradeability.test.ts index bacd80f602..0e4e24bd0d 100644 --- a/test/Upgradeability.test.ts +++ b/test/Upgradeability.test.ts @@ -1,10 +1,11 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' import { expect } from 'chai' -import { ContractFactory, Wallet } from 'ethers' +import { ContractFactory } from 'ethers' import { ethers, upgrades } from 'hardhat' -import { IComponents, IConfig } from '../common/configuration' +import { IComponents, IConfig, IImplementations } from '../common/configuration' import { OWNER, SHORT_FREEZER, LONG_FREEZER, PAUSER } from '../common/constants' +import { whileImpersonating } from './utils/impersonation' import { bn } from '../common/numbers' import { Asset, @@ -17,6 +18,7 @@ import { BasketLibP1, BrokerP1, BrokerP1V2, + DeployerP1, DistributorP1, DistributorP1V2, DutchTrade, @@ -45,13 +47,24 @@ import { TestIRToken, TestIStRSR, RecollateralizationLibP1, + VersionRegistry, + DeployerP1V2, + AssetPluginRegistry, } from '../typechain' import { defaultFixture, Implementation, IMPLEMENTATION } from './fixtures' const describeP1 = IMPLEMENTATION == Implementation.P1 ? describe : describe.skip +const MAIN_OWNER_ROLE = '0x4f574e4552000000000000000000000000000000000000000000000000000000' + +// Helper function to calculate hash for a specific version +const toHash = (version: string): string => { + return ethers.utils.keccak256(ethers.utils.toUtf8Bytes(version)) +} + describeP1(`Upgradeability - P${IMPLEMENTATION}`, () => { let owner: SignerWithAddress + let other: SignerWithAddress // Config let config: IConfig @@ -78,6 +91,7 @@ describeP1(`Upgradeability - P${IMPLEMENTATION}`, () => { let rTokenTrader: TestIRevenueTrader let tradingLib: RecollateralizationLibP1 let basketLib: BasketLibP1 + let deployer: DeployerP1 // Factories let MainFactory: ContractFactory @@ -93,17 +107,12 @@ describeP1(`Upgradeability - P${IMPLEMENTATION}`, () => { let DutchTradeFactory: ContractFactory let StRSRFactory: ContractFactory - let notWallet: Wallet - - before('create fixture loader', async () => { - ;[, notWallet] = (await ethers.getSigners()) as unknown as Wallet[] - }) - beforeEach(async () => { - ;[owner] = await ethers.getSigners() + ;[owner, other] = await ethers.getSigners() // Deploy fixture ;({ + deployer, rsr, rsrAsset, config, @@ -302,8 +311,8 @@ describeP1(`Upgradeability - P${IMPLEMENTATION}`, () => { await newDistributor.deployed() const [rTokenTotal, rsrTotal] = await newDistributor.totals() - expect(rsrTotal).equal(bn(60)) - expect(rTokenTotal).equal(bn(40)) + expect(rsrTotal).equal(bn(6000)) + expect(rTokenTotal).equal(bn(4000)) expect(await newDistributor.main()).to.equal(main.address) }) @@ -394,332 +403,700 @@ describeP1(`Upgradeability - P${IMPLEMENTATION}`, () => { }) describe('Upgrades', () => { - it('Should only allow OWNER to upgrade - Main', async () => { - const MainV2Factory: ContractFactory = await ethers.getContractFactory('MainP1V2', notWallet) - await expect(upgrades.upgradeProxy(main.address, MainV2Factory)).revertedWith( - `AccessControl: account ${notWallet.address.toLowerCase()} is missing role 0x4f574e4552000000000000000000000000000000000000000000000000000000` - ) - }) - - it('Should only allow governance to upgrade - Component', async () => { - const AssetRegV2Factory: ContractFactory = await ethers.getContractFactory( - 'AssetRegistryP1V2', - notWallet - ) - await expect(upgrades.upgradeProxy(assetRegistry.address, AssetRegV2Factory)).revertedWith( - 'governance only' - ) - }) - - it('Should upgrade correctly - Main', async () => { - // Upgrading + it('Should only allow Main to upgrade itself', async () => { const MainV2Factory: ContractFactory = await ethers.getContractFactory('MainP1V2') - const mainV2: MainP1V2 = await upgrades.upgradeProxy(main.address, MainV2Factory) - - // Check address is maintained - expect(mainV2.address).to.equal(main.address) - - // Check state is preserved - expect(await mainV2.tradingPaused()).to.equal(false) - expect(await mainV2.issuancePaused()).to.equal(false) - expect(await mainV2.frozen()).to.equal(false) - expect(await mainV2.tradingPausedOrFrozen()).to.equal(false) - expect(await mainV2.issuancePausedOrFrozen()).to.equal(false) - expect(await mainV2.hasRole(OWNER, owner.address)).to.equal(true) - expect(await mainV2.hasRole(OWNER, main.address)).to.equal(false) - expect(await mainV2.hasRole(SHORT_FREEZER, owner.address)).to.equal(true) - expect(await mainV2.hasRole(SHORT_FREEZER, main.address)).to.equal(false) - expect(await mainV2.hasRole(LONG_FREEZER, owner.address)).to.equal(true) - expect(await mainV2.hasRole(LONG_FREEZER, main.address)).to.equal(false) - expect(await mainV2.hasRole(PAUSER, owner.address)).to.equal(true) - expect(await mainV2.hasRole(PAUSER, main.address)).to.equal(false) + const mainV2ImplAddr = (await upgrades.prepareUpgrade(main.address, MainV2Factory, { + kind: 'uups', + })) as string - // Components - expect(await mainV2.stRSR()).to.equal(stRSR.address) - expect(await mainV2.rToken()).to.equal(rToken.address) - expect(await mainV2.assetRegistry()).to.equal(assetRegistry.address) - expect(await mainV2.basketHandler()).to.equal(basketHandler.address) - expect(await mainV2.backingManager()).to.equal(backingManager.address) - expect(await mainV2.distributor()).to.equal(distributor.address) - expect(await mainV2.furnace()).to.equal(furnace.address) - expect(await mainV2.broker()).to.equal(broker.address) - expect(await mainV2.rsrTrader()).to.equal(rsrTrader.address) - expect(await mainV2.rTokenTrader()).to.equal(rTokenTrader.address) - - // Check new version is implemented - expect(await mainV2.version()).to.equal('2.0.0') - - expect(await mainV2.newValue()).to.equal(0) - await mainV2.connect(owner).setNewValue(bn(1000)) - expect(await mainV2.newValue()).to.equal(bn(1000)) + const upgMain = await ethers.getContractAt('MainP1', main.address) + await expect(upgMain.connect(owner).upgradeTo(mainV2ImplAddr)).revertedWith('not self') }) - it('Should upgrade correctly - AssetRegistry', async () => { - // Upgrading + it('Should only allow Main to upgrade - Component', async () => { const AssetRegV2Factory: ContractFactory = await ethers.getContractFactory( 'AssetRegistryP1V2' ) - const assetRegV2: AssetRegistryP1V2 = ( - await upgrades.upgradeProxy(assetRegistry.address, AssetRegV2Factory) - ) - - // Check address is maintained - expect(assetRegV2.address).to.equal(assetRegistry.address) - - // Check state is preserved - expect(await assetRegV2.isRegistered(rsr.address)).to.equal(true) - expect(await assetRegV2.isRegistered(rToken.address)).to.equal(true) - expect(await assetRegV2.main()).to.equal(main.address) - - // Check new version is implemented - expect(await assetRegV2.version()).to.equal('2.0.0') - - expect(await assetRegV2.newValue()).to.equal(0) - await assetRegV2.connect(owner).setNewValue(bn(1000)) - expect(await assetRegV2.newValue()).to.equal(bn(1000)) - }) - - it('Should upgrade correctly - BackingManager', async () => { - // Upgrading - const BackingMgrV2Factory: ContractFactory = await ethers.getContractFactory( - 'BackingManagerP1V2', - { - libraries: { - RecollateralizationLibP1: tradingLib.address, - }, - } - ) - const backingMgrV2: BackingManagerP1V2 = await upgrades.upgradeProxy( - backingManager.address, - BackingMgrV2Factory, - { - unsafeAllow: ['external-library-linking', 'delegatecall'], // TradingLib - } - ) - - // Check address is maintained - expect(backingMgrV2.address).to.equal(backingManager.address) - - // Check state is preserved - expect(await backingMgrV2.tradingDelay()).to.equal(config.tradingDelay) - expect(await backingMgrV2.backingBuffer()).to.equal(config.backingBuffer) - expect(await backingMgrV2.maxTradeSlippage()).to.equal(config.maxTradeSlippage) - expect(await backingMgrV2.main()).to.equal(main.address) - - // Check new version is implemented - expect(await backingMgrV2.version()).to.equal('2.0.0') - - expect(await backingMgrV2.newValue()).to.equal(0) - await backingMgrV2.connect(owner).setNewValue(bn(1000)) - expect(await backingMgrV2.newValue()).to.equal(bn(1000)) - }) - it('Should upgrade correctly - BasketHandler', async () => { - // Upgrading - const BasketHandlerV2Factory: ContractFactory = await ethers.getContractFactory( - 'BasketHandlerP1V2', - { libraries: { BasketLibP1: basketLib.address } } - ) - const bskHndlrV2: BasketHandlerP1V2 = await upgrades.upgradeProxy( - basketHandler.address, - BasketHandlerV2Factory, + const assetRegV2ImplAddr = (await upgrades.prepareUpgrade( + assetRegistry.address, + AssetRegV2Factory, { - unsafeAllow: ['external-library-linking'], // BasketLibP1 - } - ) - - // Check address is maintained - expect(bskHndlrV2.address).to.equal(basketHandler.address) - - // Check state is preserved - expect(await bskHndlrV2.main()).to.equal(main.address) - - // Check new version is implemented - expect(await bskHndlrV2.version()).to.equal('2.0.0') - - expect(await bskHndlrV2.newValue()).to.equal(0) - await bskHndlrV2.connect(owner).setNewValue(bn(1000)) - expect(await bskHndlrV2.newValue()).to.equal(bn(1000)) - }) - - it('Should upgrade correctly - Broker', async () => { - // Upgrading - const BrokerV2Factory: ContractFactory = await ethers.getContractFactory('BrokerP1V2') - const brokerV2: BrokerP1V2 = ( - await upgrades.upgradeProxy(broker.address, BrokerV2Factory) - ) - - // Check address is maintained - expect(brokerV2.address).to.equal(broker.address) - - // Check state is preserved - expect(await brokerV2.gnosis()).to.equal(gnosis.address) - expect(await brokerV2.batchAuctionLength()).to.equal(config.batchAuctionLength) - expect(await brokerV2.batchTradeDisabled()).to.equal(false) - expect(await brokerV2.dutchTradeDisabled(rToken.address)).to.equal(false) - expect(await brokerV2.dutchTradeDisabled(rsr.address)).to.equal(false) - expect(await brokerV2.main()).to.equal(main.address) - - // Check new version is implemented - expect(await brokerV2.version()).to.equal('2.0.0') - - expect(await brokerV2.newValue()).to.equal(0) - await brokerV2.connect(owner).setNewValue(bn(1000)) - expect(await brokerV2.newValue()).to.equal(bn(1000)) - }) - - it('Should upgrade correctly - Distributor', async () => { - // Upgrading - const DistributorV2Factory: ContractFactory = await ethers.getContractFactory( - 'DistributorP1V2' - ) - const distributorV2: DistributorP1V2 = ( - await upgrades.upgradeProxy(distributor.address, DistributorV2Factory) - ) - - // Check address is maintained - expect(distributorV2.address).to.equal(distributor.address) - - // Check state is preserved - const [rTokenTotal, rsrTotal] = await distributorV2.totals() - expect(rsrTotal).equal(bn(60)) - expect(rTokenTotal).equal(bn(40)) - expect(await distributorV2.main()).to.equal(main.address) - - // Check new version is implemented - expect(await distributorV2.version()).to.equal('2.0.0') - - expect(await distributorV2.newValue()).to.equal(0) - await distributorV2.connect(owner).setNewValue(bn(1000)) - expect(await distributorV2.newValue()).to.equal(bn(1000)) - }) - - it('Should upgrade correctly - Furnace', async () => { - // Upgrading - const FurnaceV2Factory: ContractFactory = await ethers.getContractFactory('FurnaceP1V2') - const furnaceV2: FurnaceP1V2 = ( - await upgrades.upgradeProxy(furnace.address, FurnaceV2Factory) - ) - - // Check address is maintained - expect(furnaceV2.address).to.equal(furnace.address) - - // Check state is preserved - expect(await furnaceV2.ratio()).to.equal(config.rewardRatio) - expect(await furnaceV2.lastPayout()).to.be.gt(0) // A timestamp is set - expect(await furnaceV2.main()).to.equal(main.address) - - // Check new version is implemented - expect(await furnaceV2.version()).to.equal('2.0.0') - - expect(await furnaceV2.newValue()).to.equal(0) - await furnaceV2.connect(owner).setNewValue(bn(1000)) - expect(await furnaceV2.newValue()).to.equal(bn(1000)) - }) - - it('Should upgrade correctly - RevenueTrader', async () => { - // Upgrading - const RevTraderV2Factory: ContractFactory = await ethers.getContractFactory( - 'RevenueTraderP1V2' - ) - const rsrTraderV2: RevenueTraderP1V2 = await upgrades.upgradeProxy( - rsrTrader.address, - RevTraderV2Factory, - { - unsafeAllow: ['delegatecall'], // Multicall + kind: 'uups', } - ) + )) as string - const rTokenTraderV2: RevenueTraderP1V2 = await upgrades.upgradeProxy( - rTokenTrader.address, - RevTraderV2Factory, - { - unsafeAllow: ['delegatecall'], // Multicall - } + const upgAR = ( + await ethers.getContractAt('AssetRegistryP1', assetRegistry.address) ) - - // Check addresses are maintained - expect(rsrTraderV2.address).to.equal(rsrTrader.address) - expect(rTokenTraderV2.address).to.equal(rTokenTrader.address) - - // Check state is preserved - expect(await rsrTraderV2.tokenToBuy()).to.equal(rsr.address) - expect(await rsrTraderV2.maxTradeSlippage()).to.equal(config.maxTradeSlippage) - expect(await rsrTraderV2.main()).to.equal(main.address) - - expect(await rTokenTraderV2.tokenToBuy()).to.equal(rToken.address) - expect(await rTokenTraderV2.maxTradeSlippage()).to.equal(config.maxTradeSlippage) - expect(await rTokenTraderV2.main()).to.equal(main.address) - - // Check new version is implemented - expect(await rsrTraderV2.version()).to.equal('2.0.0') - expect(await rTokenTraderV2.version()).to.equal('2.0.0') - - expect(await rsrTraderV2.newValue()).to.equal(0) - await rsrTraderV2.connect(owner).setNewValue(bn(1000)) - expect(await rsrTraderV2.newValue()).to.equal(bn(1000)) - - expect(await rTokenTraderV2.newValue()).to.equal(0) - await rTokenTraderV2.connect(owner).setNewValue(bn(500)) - expect(await rTokenTraderV2.newValue()).to.equal(bn(500)) + await expect(upgAR.connect(owner).upgradeTo(assetRegV2ImplAddr)).revertedWith('main only') }) - it('Should upgrade correctly - RToken', async () => { - // Upgrading - const RTokenV2Factory: ContractFactory = await ethers.getContractFactory('RTokenP1V2') - const rTokenV2: RTokenP1V2 = ( - await upgrades.upgradeProxy(rToken.address, RTokenV2Factory) - ) + context('With deployed implementations', function () { + let MainV2Factory: ContractFactory + let AssetRegV2Factory: ContractFactory + let BackingMgrV2Factory: ContractFactory + let BasketHandlerV2Factory: ContractFactory + let BrokerV2Factory: ContractFactory + let DistributorV2Factory: ContractFactory + let FurnaceV2Factory: ContractFactory + let RevTraderV2Factory: ContractFactory + let RTokenV2Factory: ContractFactory + let StRSRV2Factory: ContractFactory + + let mainV2ImplAddr: string + let assetRegV2ImplAddr: string + let backingMgrV2ImplAddr: string + let bskHndlrV2ImplAddr: string + let brokerV2ImplAddr: string + let distributorV2ImplAddr: string + let furnaceV2ImplAddr: string + let rsrTraderV2ImplAddr: string + let rTokenTraderV2ImplAddr: string + let rTokenV2ImplAddr: string + let stRSRV2ImplAddr: string + + beforeEach(async () => { + MainV2Factory = await ethers.getContractFactory('MainP1V2') + AssetRegV2Factory = await ethers.getContractFactory('AssetRegistryP1V2') + BackingMgrV2Factory = await ethers.getContractFactory('BackingManagerP1V2', { + libraries: { + RecollateralizationLibP1: tradingLib.address, + }, + }) - // Check address is maintained - expect(rTokenV2.address).to.equal(rToken.address) - - // Check state is preserved - expect(await rTokenV2.name()).to.equal('RTKN RToken') - expect(await rTokenV2.symbol()).to.equal('RTKN') - expect(await rTokenV2.decimals()).to.equal(18) - expect(await rTokenV2.totalSupply()).to.equal(bn(0)) - expect(await rTokenV2.main()).to.equal(main.address) - const issThrottle = await rToken.issuanceThrottleParams() - expect(issThrottle.amtRate).to.equal(config.issuanceThrottle.amtRate) - expect(issThrottle.pctRate).to.equal(config.issuanceThrottle.pctRate) - const redemptionThrottle = await rToken.redemptionThrottleParams() - expect(redemptionThrottle.amtRate).to.equal(config.redemptionThrottle.amtRate) - expect(redemptionThrottle.pctRate).to.equal(config.redemptionThrottle.pctRate) - - // Check new version is implemented - expect(await rTokenV2.version()).to.equal('2.0.0') - - expect(await rTokenV2.newValue()).to.equal(0) - await rTokenV2.connect(owner).setNewValue(bn(1000)) - expect(await rTokenV2.newValue()).to.equal(bn(1000)) - }) + BasketHandlerV2Factory = await ethers.getContractFactory('BasketHandlerP1V2', { + libraries: { BasketLibP1: basketLib.address }, + }) - it('Should upgrade correctly - StRSR', async () => { - // Upgrading - const StRSRV2Factory: ContractFactory = await ethers.getContractFactory('StRSRP1VotesV2') - const stRSRV2: StRSRP1VotesV2 = ( - await upgrades.upgradeProxy(stRSR.address, StRSRV2Factory) - ) + BrokerV2Factory = await ethers.getContractFactory('BrokerP1V2') + DistributorV2Factory = await ethers.getContractFactory('DistributorP1V2') + FurnaceV2Factory = await ethers.getContractFactory('FurnaceP1V2') + RevTraderV2Factory = await ethers.getContractFactory('RevenueTraderP1V2') + RTokenV2Factory = await ethers.getContractFactory('RTokenP1V2') + StRSRV2Factory = await ethers.getContractFactory('StRSRP1VotesV2') - // Check address is maintained - expect(stRSRV2.address).to.equal(stRSR.address) + mainV2ImplAddr = (await upgrades.prepareUpgrade(main.address, MainV2Factory, { + kind: 'uups', + })) as string + + assetRegV2ImplAddr = (await upgrades.prepareUpgrade( + assetRegistry.address, + AssetRegV2Factory, + { + kind: 'uups', + } + )) as string + + backingMgrV2ImplAddr = (await upgrades.prepareUpgrade( + backingManager.address, + BackingMgrV2Factory, + { + kind: 'uups', + unsafeAllow: ['external-library-linking', 'delegatecall'], // TradingLib + } + )) as string + + bskHndlrV2ImplAddr = (await upgrades.prepareUpgrade( + basketHandler.address, + BasketHandlerV2Factory, + { + kind: 'uups', + unsafeAllow: ['external-library-linking'], // BasketLibP1 + } + )) as string + + brokerV2ImplAddr = (await upgrades.prepareUpgrade(broker.address, BrokerV2Factory, { + kind: 'uups', + })) as string - // Check state is preserved - expect(await stRSRV2.name()).to.equal('rtknRSR Token') - expect(await stRSRV2.symbol()).to.equal('rtknRSR') - expect(await stRSRV2.decimals()).to.equal(18) - expect(await stRSRV2.totalSupply()).to.equal(0) - expect(await stRSRV2.unstakingDelay()).to.equal(config.unstakingDelay) - expect(await stRSRV2.rewardRatio()).to.equal(config.rewardRatio) - expect(await stRSRV2.main()).to.equal(main.address) + distributorV2ImplAddr = (await upgrades.prepareUpgrade( + distributor.address, + DistributorV2Factory, + { + kind: 'uups', + } + )) as string - // Check new version is implemented - expect(await stRSRV2.version()).to.equal('2.0.0') + furnaceV2ImplAddr = (await upgrades.prepareUpgrade(furnace.address, FurnaceV2Factory, { + kind: 'uups', + })) as string + + rsrTraderV2ImplAddr = (await upgrades.prepareUpgrade( + rsrTrader.address, + RevTraderV2Factory, + { + kind: 'uups', + unsafeAllow: ['delegatecall'], // Multicall + } + )) as string + + rTokenTraderV2ImplAddr = (await upgrades.prepareUpgrade( + rTokenTrader.address, + RevTraderV2Factory, + { + kind: 'uups', + unsafeAllow: ['delegatecall'], // Multicall + } + )) as string + + rTokenV2ImplAddr = (await upgrades.prepareUpgrade(rToken.address, RTokenV2Factory, { + kind: 'uups', + })) as string - expect(await stRSRV2.newValue()).to.equal(0) - await stRSRV2.connect(owner).setNewValue(bn(1000)) - expect(await stRSRV2.newValue()).to.equal(bn(1000)) + stRSRV2ImplAddr = (await upgrades.prepareUpgrade(stRSR.address, StRSRV2Factory, { + kind: 'uups', + })) as string + }) + + it('Should upgrade correctly - Main', async () => { + const upgMain = await ethers.getContractAt('MainP1', main.address) + + // Upgrade via Main + await whileImpersonating(main.address, async (upgSigner) => { + await upgMain.connect(upgSigner).upgradeTo(mainV2ImplAddr) + }) + + const mainV2: MainP1V2 = await ethers.getContractAt('MainP1V2', main.address) + + // Check address is maintained + expect(mainV2.address).to.equal(main.address) + + // Check state is preserved + expect(await mainV2.tradingPaused()).to.equal(false) + expect(await mainV2.issuancePaused()).to.equal(false) + expect(await mainV2.frozen()).to.equal(false) + expect(await mainV2.tradingPausedOrFrozen()).to.equal(false) + expect(await mainV2.issuancePausedOrFrozen()).to.equal(false) + expect(await mainV2.hasRole(OWNER, owner.address)).to.equal(true) + expect(await mainV2.hasRole(OWNER, main.address)).to.equal(false) + expect(await mainV2.hasRole(SHORT_FREEZER, owner.address)).to.equal(true) + expect(await mainV2.hasRole(SHORT_FREEZER, main.address)).to.equal(false) + expect(await mainV2.hasRole(LONG_FREEZER, owner.address)).to.equal(true) + expect(await mainV2.hasRole(LONG_FREEZER, main.address)).to.equal(false) + expect(await mainV2.hasRole(PAUSER, owner.address)).to.equal(true) + expect(await mainV2.hasRole(PAUSER, main.address)).to.equal(false) + + // Components + expect(await mainV2.stRSR()).to.equal(stRSR.address) + expect(await mainV2.rToken()).to.equal(rToken.address) + expect(await mainV2.assetRegistry()).to.equal(assetRegistry.address) + expect(await mainV2.basketHandler()).to.equal(basketHandler.address) + expect(await mainV2.backingManager()).to.equal(backingManager.address) + expect(await mainV2.distributor()).to.equal(distributor.address) + expect(await mainV2.furnace()).to.equal(furnace.address) + expect(await mainV2.broker()).to.equal(broker.address) + expect(await mainV2.rsrTrader()).to.equal(rsrTrader.address) + expect(await mainV2.rTokenTrader()).to.equal(rTokenTrader.address) + + // Check new version is implemented + expect(await mainV2.version()).to.equal('2.0.0') + + expect(await mainV2.newValue()).to.equal(0) + await mainV2.connect(owner).setNewValue(bn(1000)) + expect(await mainV2.newValue()).to.equal(bn(1000)) + }) + + it('Should upgrade correctly - AssetRegistry', async () => { + const upgAR = ( + await ethers.getContractAt('AssetRegistryP1', assetRegistry.address) + ) + + // Upgrade via Main + await whileImpersonating(main.address, async (upgSigner) => { + await upgAR.connect(upgSigner).upgradeTo(assetRegV2ImplAddr) + }) + + const assetRegV2: AssetRegistryP1V2 = ( + await ethers.getContractAt('AssetRegistryP1V2', assetRegistry.address) + ) + + // Check address is maintained + expect(assetRegV2.address).to.equal(assetRegistry.address) + + // Check state is preserved + expect(await assetRegV2.isRegistered(rsr.address)).to.equal(true) + expect(await assetRegV2.isRegistered(rToken.address)).to.equal(true) + expect(await assetRegV2.main()).to.equal(main.address) + + // Check new version is implemented + expect(await assetRegV2.version()).to.equal('2.0.0') + + expect(await assetRegV2.newValue()).to.equal(0) + await assetRegV2.connect(owner).setNewValue(bn(1000)) + expect(await assetRegV2.newValue()).to.equal(bn(1000)) + }) + + it('Should upgrade correctly - BackingManager', async () => { + const upgBM = ( + await ethers.getContractAt('BackingManagerP1', backingManager.address) + ) + + // Upgrade via Main + await whileImpersonating(main.address, async (upgSigner) => { + await upgBM.connect(upgSigner).upgradeTo(backingMgrV2ImplAddr) + }) + + const backingMgrV2: BackingManagerP1V2 = ( + await ethers.getContractAt('BackingManagerP1V2', backingManager.address) + ) + + // Check address is maintained + expect(backingMgrV2.address).to.equal(backingManager.address) + + // Check state is preserved + expect(await backingMgrV2.tradingDelay()).to.equal(config.tradingDelay) + expect(await backingMgrV2.backingBuffer()).to.equal(config.backingBuffer) + expect(await backingMgrV2.maxTradeSlippage()).to.equal(config.maxTradeSlippage) + expect(await backingMgrV2.main()).to.equal(main.address) + + // Check new version is implemented + expect(await backingMgrV2.version()).to.equal('2.0.0') + + expect(await backingMgrV2.newValue()).to.equal(0) + await backingMgrV2.connect(owner).setNewValue(bn(1000)) + expect(await backingMgrV2.newValue()).to.equal(bn(1000)) + }) + + it('Should upgrade correctly - BasketHandler', async () => { + const upgBH = ( + await ethers.getContractAt('BasketHandlerP1', basketHandler.address) + ) + + // Upgrade via Main + await whileImpersonating(main.address, async (upgSigner) => { + await upgBH.connect(upgSigner).upgradeTo(bskHndlrV2ImplAddr) + }) + + const bskHndlrV2: BasketHandlerP1V2 = ( + await ethers.getContractAt('BasketHandlerP1V2', basketHandler.address) + ) + + // Check address is maintained + expect(bskHndlrV2.address).to.equal(basketHandler.address) + + // Check state is preserved + expect(await bskHndlrV2.main()).to.equal(main.address) + + // Check new version is implemented + expect(await bskHndlrV2.version()).to.equal('2.0.0') + + expect(await bskHndlrV2.newValue()).to.equal(0) + await bskHndlrV2.connect(owner).setNewValue(bn(1000)) + expect(await bskHndlrV2.newValue()).to.equal(bn(1000)) + }) + + it('Should upgrade correctly - Broker', async () => { + const upgBroker = await ethers.getContractAt('BrokerP1', broker.address) + + // Upgrade via Main + await whileImpersonating(main.address, async (upgSigner) => { + await upgBroker.connect(upgSigner).upgradeTo(brokerV2ImplAddr) + }) + + const brokerV2: BrokerP1V2 = ( + await ethers.getContractAt('BrokerP1V2', broker.address) + ) + + // Check address is maintained + expect(brokerV2.address).to.equal(broker.address) + + // Check state is preserved + expect(await brokerV2.gnosis()).to.equal(gnosis.address) + expect(await brokerV2.batchAuctionLength()).to.equal(config.batchAuctionLength) + expect(await brokerV2.batchTradeDisabled()).to.equal(false) + expect(await brokerV2.dutchTradeDisabled(rToken.address)).to.equal(false) + expect(await brokerV2.dutchTradeDisabled(rsr.address)).to.equal(false) + expect(await brokerV2.main()).to.equal(main.address) + + // Check new version is implemented + expect(await brokerV2.version()).to.equal('2.0.0') + + expect(await brokerV2.newValue()).to.equal(0) + await brokerV2.connect(owner).setNewValue(bn(1000)) + expect(await brokerV2.newValue()).to.equal(bn(1000)) + }) + + it('Should upgrade correctly - Distributor', async () => { + const upgDist = ( + await ethers.getContractAt('DistributorP1', distributor.address) + ) + + // Upgrade via Main + await whileImpersonating(main.address, async (upgSigner) => { + await upgDist.connect(upgSigner).upgradeTo(distributorV2ImplAddr) + }) + + const distributorV2: DistributorP1V2 = ( + await ethers.getContractAt('DistributorP1V2', distributor.address) + ) + + // Check address is maintained + expect(distributorV2.address).to.equal(distributor.address) + + // Check state is preserved + const [rTokenTotal, rsrTotal] = await distributorV2.totals() + expect(rsrTotal).equal(bn(6000)) + expect(rTokenTotal).equal(bn(4000)) + expect(await distributorV2.main()).to.equal(main.address) + + // Check new version is implemented + expect(await distributorV2.version()).to.equal('2.0.0') + + expect(await distributorV2.newValue()).to.equal(0) + await distributorV2.connect(owner).setNewValue(bn(1000)) + expect(await distributorV2.newValue()).to.equal(bn(1000)) + }) + + it('Should upgrade correctly - Furnace', async () => { + const upgFur = await ethers.getContractAt('FurnaceP1', furnace.address) + + // Upgrade via Main + await whileImpersonating(main.address, async (upgSigner) => { + await upgFur.connect(upgSigner).upgradeTo(furnaceV2ImplAddr) + }) + + const furnaceV2: FurnaceP1V2 = ( + await ethers.getContractAt('FurnaceP1V2', furnace.address) + ) + + // Check address is maintained + expect(furnaceV2.address).to.equal(furnace.address) + + // Check state is preserved + expect(await furnaceV2.ratio()).to.equal(config.rewardRatio) + expect(await furnaceV2.lastPayout()).to.be.gt(0) // A timestamp is set + expect(await furnaceV2.main()).to.equal(main.address) + + // Check new version is implemented + expect(await furnaceV2.version()).to.equal('2.0.0') + + expect(await furnaceV2.newValue()).to.equal(0) + await furnaceV2.connect(owner).setNewValue(bn(1000)) + expect(await furnaceV2.newValue()).to.equal(bn(1000)) + }) + + it('Should upgrade correctly - RevenueTrader', async () => { + const upgRSRRevTrader = ( + await ethers.getContractAt('RevenueTraderP1', rsrTrader.address) + ) + const upgRTokRevTrader = ( + await ethers.getContractAt('RevenueTraderP1', rTokenTrader.address) + ) + + // Upgrade via Main + await whileImpersonating(main.address, async (upgSigner) => { + await upgRSRRevTrader.connect(upgSigner).upgradeTo(rsrTraderV2ImplAddr) + }) + await whileImpersonating(main.address, async (upgSigner) => { + await upgRTokRevTrader.connect(upgSigner).upgradeTo(rTokenTraderV2ImplAddr) + }) + + const rsrTraderV2: RevenueTraderP1V2 = ( + await ethers.getContractAt('RevenueTraderP1V2', rsrTrader.address) + ) + + const rTokenTraderV2: RevenueTraderP1V2 = ( + await ethers.getContractAt('RevenueTraderP1V2', rTokenTrader.address) + ) + + // Check addresses are maintained + expect(rsrTraderV2.address).to.equal(rsrTrader.address) + expect(rTokenTraderV2.address).to.equal(rTokenTrader.address) + + // Check state is preserved + expect(await rsrTraderV2.tokenToBuy()).to.equal(rsr.address) + expect(await rsrTraderV2.maxTradeSlippage()).to.equal(config.maxTradeSlippage) + expect(await rsrTraderV2.main()).to.equal(main.address) + + expect(await rTokenTraderV2.tokenToBuy()).to.equal(rToken.address) + expect(await rTokenTraderV2.maxTradeSlippage()).to.equal(config.maxTradeSlippage) + expect(await rTokenTraderV2.main()).to.equal(main.address) + + // Check new version is implemented + expect(await rsrTraderV2.version()).to.equal('2.0.0') + expect(await rTokenTraderV2.version()).to.equal('2.0.0') + + expect(await rsrTraderV2.newValue()).to.equal(0) + await rsrTraderV2.connect(owner).setNewValue(bn(1000)) + expect(await rsrTraderV2.newValue()).to.equal(bn(1000)) + + expect(await rTokenTraderV2.newValue()).to.equal(0) + await rTokenTraderV2.connect(owner).setNewValue(bn(500)) + expect(await rTokenTraderV2.newValue()).to.equal(bn(500)) + }) + + it('Should upgrade correctly - RToken', async () => { + const upgRToken = await ethers.getContractAt('RTokenP1', rToken.address) + + // Upgrade via Main + await whileImpersonating(main.address, async (upgSigner) => { + await upgRToken.connect(upgSigner).upgradeTo(rTokenV2ImplAddr) + }) + + const rTokenV2: RTokenP1V2 = ( + await ethers.getContractAt('RTokenP1V2', rToken.address) + ) + + // Check address is maintained + expect(rTokenV2.address).to.equal(rToken.address) + + // Check state is preserved + expect(await rTokenV2.name()).to.equal('RTKN RToken') + expect(await rTokenV2.symbol()).to.equal('RTKN') + expect(await rTokenV2.decimals()).to.equal(18) + expect(await rTokenV2.totalSupply()).to.equal(bn(0)) + expect(await rTokenV2.main()).to.equal(main.address) + const issThrottle = await rToken.issuanceThrottleParams() + expect(issThrottle.amtRate).to.equal(config.issuanceThrottle.amtRate) + expect(issThrottle.pctRate).to.equal(config.issuanceThrottle.pctRate) + const redemptionThrottle = await rToken.redemptionThrottleParams() + expect(redemptionThrottle.amtRate).to.equal(config.redemptionThrottle.amtRate) + expect(redemptionThrottle.pctRate).to.equal(config.redemptionThrottle.pctRate) + + // Check new version is implemented + expect(await rTokenV2.version()).to.equal('2.0.0') + + expect(await rTokenV2.newValue()).to.equal(0) + await rTokenV2.connect(owner).setNewValue(bn(1000)) + expect(await rTokenV2.newValue()).to.equal(bn(1000)) + }) + + it('Should upgrade correctly - StRSR', async () => { + const upgStRSR = await ethers.getContractAt('StRSRP1Votes', stRSR.address) + + // Upgrade via Main + await whileImpersonating(main.address, async (upgSigner) => { + await upgStRSR.connect(upgSigner).upgradeTo(stRSRV2ImplAddr) + }) + + const stRSRV2: StRSRP1VotesV2 = ( + await ethers.getContractAt('StRSRP1VotesV2', stRSR.address) + ) + + // Check address is maintained + expect(stRSRV2.address).to.equal(stRSR.address) + + // Check state is preserved + expect(await stRSRV2.name()).to.equal('rtknRSR Token') + expect(await stRSRV2.symbol()).to.equal('rtknRSR') + expect(await stRSRV2.decimals()).to.equal(18) + expect(await stRSRV2.totalSupply()).to.equal(0) + expect(await stRSRV2.unstakingDelay()).to.equal(config.unstakingDelay) + expect(await stRSRV2.rewardRatio()).to.equal(config.rewardRatio) + expect(await stRSRV2.main()).to.equal(main.address) + + // Check new version is implemented + expect(await stRSRV2.version()).to.equal('2.0.0') + + expect(await stRSRV2.newValue()).to.equal(0) + await stRSRV2.connect(owner).setNewValue(bn(1000)) + expect(await stRSRV2.newValue()).to.equal(bn(1000)) + }) + + context('Using Registries', function () { + let versionRegistry: VersionRegistry + let assetPluginRegistry: AssetPluginRegistry + + let implementationsV2: IImplementations + let deployerV2: DeployerP1V2 + + beforeEach(async () => { + const versionRegistryFactory = await ethers.getContractFactory('VersionRegistry') + versionRegistry = await versionRegistryFactory.deploy(owner.address) + + const assetPluginRegistryFactory = await ethers.getContractFactory('AssetPluginRegistry') + assetPluginRegistry = await assetPluginRegistryFactory.deploy(versionRegistry.address) + + // Prepare V2 Deployer and register new version + implementationsV2 = { + main: mainV2ImplAddr, + components: { + assetRegistry: assetRegV2ImplAddr, + basketHandler: bskHndlrV2ImplAddr, + distributor: distributorV2ImplAddr, + broker: brokerV2ImplAddr, + backingManager: backingMgrV2ImplAddr, + furnace: furnaceV2ImplAddr, + rToken: rTokenV2ImplAddr, + rsrTrader: rsrTraderV2ImplAddr, + rTokenTrader: rTokenTraderV2ImplAddr, + stRSR: stRSRV2ImplAddr, + }, + trading: { + gnosisTrade: await broker.batchTradeImplementation(), + dutchTrade: await broker.dutchTradeImplementation(), + }, + } + + const DeployerV2Factory = await ethers.getContractFactory('DeployerP1V2') + deployerV2 = await DeployerV2Factory.deploy( + rsr.address, + gnosis.address, + rsrAsset.address, + implementationsV2 + ) + }) + it('Should upgrade all contracts at once - Using Registries', async () => { + // Register current deployment + await versionRegistry.connect(owner).registerVersion(deployer.address) + + // Register new deployment + await versionRegistry.connect(owner).registerVersion(deployerV2.address) + + // Update Main to new version + const versionV1Hash = toHash(await deployer.version()) + const versionV2Hash = toHash(await deployerV2.version()) + const upgMain = await ethers.getContractAt('MainP1', main.address) + + // Update Main to have a Registry + await main.connect(owner).setVersionRegistry(versionRegistry.address) + + // Upgrade Main + expect(toHash(await main.version())).to.equal(versionV1Hash) + await upgMain.connect(owner).upgradeMainTo(versionV2Hash) + expect(toHash(await main.version())).to.equal(versionV2Hash) + + // Components still in original version + expect(toHash(await assetRegistry.version())).to.equal(versionV1Hash) + expect(toHash(await backingManager.version())).to.equal(versionV1Hash) + expect(toHash(await basketHandler.version())).to.equal(versionV1Hash) + expect(toHash(await broker.version())).to.equal(versionV1Hash) + expect(toHash(await distributor.version())).to.equal(versionV1Hash) + expect(toHash(await furnace.version())).to.equal(versionV1Hash) + expect(toHash(await rsrTrader.version())).to.equal(versionV1Hash) + expect(toHash(await rTokenTrader.version())).to.equal(versionV1Hash) + expect(toHash(await rToken.version())).to.equal(versionV1Hash) + expect(toHash(await stRSR.version())).to.equal(versionV1Hash) + + // Upgrade RToken + expect(toHash(await rToken.version())).to.equal(versionV1Hash) + await upgMain.connect(owner).upgradeRTokenTo(versionV2Hash, false, false) + expect(toHash(await rToken.version())).to.equal(versionV2Hash) + + // All components updated + expect(toHash(await assetRegistry.version())).to.equal(versionV2Hash) + expect(toHash(await backingManager.version())).to.equal(versionV2Hash) + expect(toHash(await basketHandler.version())).to.equal(versionV2Hash) + expect(toHash(await broker.version())).to.equal(versionV2Hash) + expect(toHash(await distributor.version())).to.equal(versionV2Hash) + expect(toHash(await furnace.version())).to.equal(versionV2Hash) + expect(toHash(await rsrTrader.version())).to.equal(versionV2Hash) + expect(toHash(await rTokenTrader.version())).to.equal(versionV2Hash) + expect(toHash(await rToken.version())).to.equal(versionV2Hash) + expect(toHash(await stRSR.version())).to.equal(versionV2Hash) + }) + + it('Should perform pre and post validations on Assets- Using Registries', async () => { + // Register deployments + await versionRegistry.connect(owner).registerVersion(deployer.address) + await versionRegistry.connect(owner).registerVersion(deployerV2.address) + + // Update Main to have both registries + await main.connect(owner).setVersionRegistry(versionRegistry.address) + await main.connect(owner).setAssetPluginRegistry(assetPluginRegistry.address) + + // Update Main to new version + const versionV1Hash = toHash(await deployer.version()) + const versionV2Hash = toHash(await deployerV2.version()) + const upgMain = await ethers.getContractAt('MainP1', main.address) + await upgMain.connect(owner).upgradeMainTo(versionV2Hash) + + // Upgrade to RToken fails if not assets registered + await expect( + upgMain.connect(owner).upgradeRTokenTo(versionV2Hash, true, true) + ).to.be.revertedWith('unsupported asset') + + // Register Assets in the Registry for current version + const currentAssetRegistry = await assetRegistry.getRegistry() + const currentAssetPlugins = currentAssetRegistry.assets + + await assetPluginRegistry.connect(owner).updateAssetsByVersion( + versionV1Hash, + currentAssetPlugins, + currentAssetPlugins.map(() => true) + ) + + // Upgrade to RToken fails, still not registered for the new version + await expect( + upgMain.connect(owner).upgradeRTokenTo(versionV2Hash, true, true) + ).to.be.revertedWith('unsupported asset') + + // Register Assets in the Registry for new version + await assetPluginRegistry.connect(owner).updateAssetsByVersion( + versionV2Hash, + currentAssetPlugins, + currentAssetPlugins.map(() => true) + ) + + // Upgrade RToken + expect(toHash(await rToken.version())).to.equal(versionV1Hash) + await upgMain.connect(owner).upgradeRTokenTo(versionV2Hash, true, true) + expect(toHash(await rToken.version())).to.equal(versionV2Hash) + + // All components updated + expect(toHash(await assetRegistry.version())).to.equal(versionV2Hash) + expect(toHash(await backingManager.version())).to.equal(versionV2Hash) + expect(toHash(await basketHandler.version())).to.equal(versionV2Hash) + expect(toHash(await broker.version())).to.equal(versionV2Hash) + expect(toHash(await distributor.version())).to.equal(versionV2Hash) + expect(toHash(await furnace.version())).to.equal(versionV2Hash) + expect(toHash(await rsrTrader.version())).to.equal(versionV2Hash) + expect(toHash(await rTokenTrader.version())).to.equal(versionV2Hash) + expect(toHash(await rToken.version())).to.equal(versionV2Hash) + expect(toHash(await stRSR.version())).to.equal(versionV2Hash) + }) + + it('Should perform validation in the upgrade process - Using Registries', async () => { + // Register current deployment + await versionRegistry.connect(owner).registerVersion(deployer.address) + + // Get V2 version + const versionV2Hash = toHash(await deployerV2.version()) + + const upgMain = await ethers.getContractAt('MainP1', main.address) + + // Cannot upgrade if no registry in Main + await expect(upgMain.connect(owner).upgradeMainTo(versionV2Hash)).to.be.revertedWith( + 'no registry' + ) + await expect( + upgMain.connect(owner).upgradeRTokenTo(versionV2Hash, false, false) + ).to.be.revertedWith('no registry') + + // Update Main to have a Registry + await main.connect(owner).setVersionRegistry(versionRegistry.address) + + // If not governance cannot upgrade + await expect(upgMain.connect(other).upgradeMainTo(versionV2Hash)).to.be.revertedWith( + `AccessControl: account ${other.address.toLowerCase()} is missing role ${MAIN_OWNER_ROLE}` + ) + await expect( + upgMain.connect(other).upgradeRTokenTo(versionV2Hash, false, false) + ).to.be.revertedWith( + `AccessControl: account ${other.address.toLowerCase()} is missing role ${MAIN_OWNER_ROLE}` + ) + + // Cannot upgrade if version not registered + await expect(upgMain.connect(owner).upgradeMainTo(versionV2Hash)).to.be.reverted + await expect(upgMain.connect(owner).upgradeRTokenTo(versionV2Hash, false, false)).to.be + .reverted + + // Register new deployment + await versionRegistry.connect(owner).registerVersion(deployerV2.address) + + // Cannot upgrade RToken before main + await expect( + upgMain.connect(owner).upgradeRTokenTo(versionV2Hash, false, false) + ).to.be.revertedWith('upgrade main first') + + // Cannot upgrade to deprecated version + await versionRegistry.connect(owner).deprecateVersion(versionV2Hash) + await expect(upgMain.connect(owner).upgradeMainTo(versionV2Hash)).to.be.revertedWith( + 'version deprecated' + ) + }) + }) }) }) }) diff --git a/test/ZTradingExtremes.test.ts b/test/ZTradingExtremes.test.ts index e394a2105d..8ff6b8cc30 100644 --- a/test/ZTradingExtremes.test.ts +++ b/test/ZTradingExtremes.test.ts @@ -13,12 +13,15 @@ import { import { FURNACE_DEST, STRSR_DEST, MAX_UINT256, ZERO_ADDRESS } from '../common/constants' import { bn, fp, shortString, toBNDecimals, divCeil } from '../common/numbers' import { + AppreciatingMockDecimals, + AppreciatingMockDecimalsCollateral, Asset, ATokenFiatCollateral, ComptrollerMock, CTokenFiatCollateral, CTokenMock, ERC20Mock, + ERC20MockDecimals, FacadeTest, FiatCollateral, GnosisMock, @@ -60,10 +63,14 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, let compToken: ERC20Mock let compoundMock: ComptrollerMock let aaveToken: ERC20Mock + let rewardToken21: ERC20MockDecimals + let rewardToken27: ERC20MockDecimals let rsrAsset: Asset let aaveAsset: Asset let compAsset: Asset + let rewardTokensLargeDecimals: { [key: number]: ERC20MockDecimals } + // Trading let rsrTrader: TestIRevenueTrader let rTokenTrader: TestIRevenueTrader @@ -81,10 +88,13 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, let distributor: TestIDistributor let ERC20Mock: ContractFactory + let ERC20MockDecimals: ContractFactory + let AppreciatingMockDecimalsFactory: ContractFactory let ATokenMockFactory: ContractFactory let CTokenMockFactory: ContractFactory let ATokenCollateralFactory: ContractFactory let CTokenCollateralFactory: ContractFactory + let AppreciatingMockDecimalsCollateralFactory: ContractFactory const DEFAULT_THRESHOLD = fp('0.01') // 1% const DELAY_UNTIL_DEFAULT = bn('86400') // 24h @@ -115,10 +125,28 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, } = await loadFixture(defaultFixtureNoBasket)) ERC20Mock = await ethers.getContractFactory('ERC20Mock') + ERC20MockDecimals = await ethers.getContractFactory('ERC20MockDecimals') + AppreciatingMockDecimalsFactory = await ethers.getContractFactory('AppreciatingMockDecimals') ATokenMockFactory = await ethers.getContractFactory('StaticATokenMock') CTokenMockFactory = await ethers.getContractFactory('CTokenMock') ATokenCollateralFactory = await ethers.getContractFactory('ATokenFiatCollateral') CTokenCollateralFactory = await ethers.getContractFactory('CTokenFiatCollateral') + AppreciatingMockDecimalsCollateralFactory = await ethers.getContractFactory( + 'AppreciatingMockDecimalsCollateral' + ) + + // Setup rewards tokens with 21 and 27 decimals (for large decimal extreme test) + rewardToken21 = ( + await ERC20MockDecimals.deploy(`ERC20_REWARD_21`, `ERC20_SYM_REWARD_21`, 21) + ) + rewardToken27 = ( + await ERC20MockDecimals.deploy(`ERC20_REWARD_27`, `ERC20_SYM_REWARD_27`, 27) + ) + + rewardTokensLargeDecimals = { + 21: rewardToken21, + 27: rewardToken27, + } // Set backingBuffer and minTradeVolume to 0, to make math easy and always trade await backingManager.connect(owner).setBackingBuffer(0) @@ -198,25 +226,64 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, return erc20 } + const prepLargeDecimalToken = async ( + index: number, + decimals: number + ): Promise => { + const underlying: ERC20MockDecimals = ( + await ERC20MockDecimals.deploy(`ERC20_NAME:${index}`, `ERC20_SYM:${index}`, decimals) + ) + const erc20: AppreciatingMockDecimals = ( + await AppreciatingMockDecimalsFactory.deploy( + `AppreciatingToken_NAME:${index}`, + `AppreciatingToken_SYM:${index}`, + decimals, + underlying.address + ) + ) + + await erc20.setExchangeRate(fp('1')) + + await erc20.setRewardToken(rewardTokensLargeDecimals[decimals].address) + + const chainlinkFeed = ( + await (await ethers.getContractFactory('MockV3Aggregator')).deploy(8, bn('1e8')) + ) + const collateral = ( + await AppreciatingMockDecimalsCollateralFactory.deploy( + { + priceTimeout: PRICE_TIMEOUT, + chainlinkFeed: chainlinkFeed.address, + oracleError: ORACLE_ERROR, + erc20: erc20.address, + maxTradeVolume: MAX_UOA, + oracleTimeout: MAX_ORACLE_TIMEOUT, + targetName: ethers.utils.formatBytes32String('USD'), + defaultThreshold: DEFAULT_THRESHOLD, + delayUntilDefault: DELAY_UNTIL_DEFAULT, + }, + REVENUE_HIDING + ) + ) + + await assetRegistry.connect(owner).register(collateral.address) + return erc20 + } + const setupTrading = async (stRSRCut: BigNumber) => { // Configure Distributor - const rsrDist = bn(5).mul(stRSRCut).div(fp('1')) - const rTokenDist = bn(5).mul(fp('1').sub(stRSRCut)).div(fp('1')) - expect(rsrDist.add(rTokenDist)).to.equal(5) + const rsrDist = bn(10000).mul(stRSRCut).div(fp('1')) + const rTokenDist = bn(10000).sub(rsrDist) + expect(rsrDist.add(rTokenDist)).to.equal(10000) await expect( - distributor - .connect(owner) - .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: rsrDist }) - ) - .to.emit(distributor, 'DistributionSet') - .withArgs(STRSR_DEST, bn(0), rsrDist) - await expect( - distributor - .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: rTokenDist, rsrDist: bn(0) }) + distributor.connect(owner).setDistributions( + [STRSR_DEST, FURNACE_DEST], + [ + { rTokenDist: bn(0), rsrDist: rsrDist }, + { rTokenDist: rTokenDist, rsrDist: bn(0) }, + ] + ) ) - .to.emit(distributor, 'DistributionSet') - .withArgs(FURNACE_DEST, rTokenDist, bn(0)) // Set prices await setOraclePrice(rsrAsset.address, bn('1e8')) @@ -327,8 +394,26 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, const primeBasket = [] const targetAmts = [] for (let i = 0; i < basketSize; i++) { - expect(collateralDecimals == 8 || collateralDecimals == 18).to.equal(true) - const token = collateralDecimals == 8 ? await prepCToken(i) : await prepAToken(i) + expect( + collateralDecimals == 8 || + collateralDecimals == 18 || + collateralDecimals == 21 || + collateralDecimals == 27 + ).to.equal(true) + let token: CTokenMock | StaticATokenMock | AppreciatingMockDecimals + switch (collateralDecimals) { + case 8: + token = await prepCToken(i) + break + case 21: + case 27: + token = await prepLargeDecimalToken(i, collateralDecimals) + break + default: + token = await prepAToken(i) // 18 decimals + break + } + primeBasket.push(token) targetAmts.push(divCeil(primeWeight, bn(basketSize))) // might sum to slightly over, is ok await token.connect(owner).mint(addr1.address, MAX_UINT256) @@ -373,7 +458,7 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, [fp('1e-6'), fp('1e30')], // RToken supply [1, MAX_BASKET_SIZE], // basket size [fp('1e-6'), fp('1e3'), fp('1')], // prime basket weights - [8, 18], // collateral decimals + [8, 18, 21, 27], // collateral decimals [fp('1e9'), fp('1').add(fp('1e-9'))], // exchange rate at appreciation [1, MAX_BASKET_SIZE], // how many collateral assets appreciate (up to) [fp('0'), fp('1'), fp('0.6')], // StRSR cut (f) @@ -383,7 +468,7 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, [fp('1e-6'), fp('1e30')], // RToken supply [7], // basket size [fp('1e-6'), fp('1e3')], // prime basket weights - [8, 18], // collateral decimals + [8, 18, 21, 27], // collateral decimals [fp('1e9')], // exchange rate at appreciation [1], // how many collateral assets appreciate (up to) [fp('0.6')], // StRSR cut (f) @@ -419,7 +504,7 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, // // 1. RToken supply (including this in order to check 0 supply case) // 2. Size of reward-earning basket tokens - // 3. Number of reward tokens (1 or 2) + // 3. Number of reward tokens (1, 2, 3, or 4) // 4. Size of reward // 5. StRSR cut (previously: f) @@ -458,17 +543,58 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, await assetRegistry.connect(owner).swapRegistered(newAaveAsset.address) await assetRegistry.connect(owner).swapRegistered(newCompAsset.address) + // Create new reward assets with large decimals (21 and 27) + + const newRewardAsset21: Asset = await AssetFactory.deploy( + PRICE_TIMEOUT, + await aaveAsset.chainlinkFeed(), // reuse + ORACLE_ERROR, + rewardToken21.address, + MAX_UOA, + MAX_ORACLE_TIMEOUT + ) + + const newRewardAsset27: Asset = await AssetFactory.deploy( + PRICE_TIMEOUT, + await aaveAsset.chainlinkFeed(), // reuse + ORACLE_ERROR, + rewardToken27.address, + MAX_UOA, + MAX_ORACLE_TIMEOUT + ) + + await assetRegistry.connect(owner).register(newRewardAsset21.address) + await assetRegistry.connect(owner).register(newRewardAsset27.address) + // Set up prime basket const primeBasket = [] const targetAmts = [] for (let i = 0; i < basketSize; i++) { - expect(numRewardTokens == 1 || numRewardTokens == 2).to.equal(true) + expect(numRewardTokens <= 4).to.equal(true) let token if (numRewardTokens == 1) { token = await prepCToken(i) - } else { - token = i % 2 == 0 ? await prepCToken(i) : await prepAToken(i) + } else if (numRewardTokens > 1) { + const which = i % numRewardTokens + switch (which) { + case 0: + token = await prepCToken(i) + break + case 1: + token = await prepAToken(i) + break + case 2: + token = await prepLargeDecimalToken(i, 21) + break + case 3: + token = await prepLargeDecimalToken(i, 27) + break + default: + token = await prepAToken(i) // 18 decimals + break + } } + primeBasket.push(token) targetAmts.push(fp('1').div(basketSize)) await token.connect(owner).mint(addr1.address, MAX_UINT256) @@ -498,7 +624,7 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, // Grant rewards for (let i = 0; i < primeBasket.length; i++) { const decimals = await primeBasket[i].decimals() - expect(decimals == 8 || decimals == 18).to.equal(true) + expect(decimals == 8 || decimals == 18 || decimals == 21 || decimals == 27).to.equal(true) if (decimals == 8) { // cToken const oldRewards = await compoundMock.compBalances(backingManager.address) @@ -510,6 +636,16 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, const aToken = primeBasket[i] const rewards = rewardTok.mul(bn('1e18')).div(numRewardTokens) await aToken.setRewards(backingManager.address, rewards) + } else if (decimals == 21) { + // large decimal appreciating collateral + const appMockDecimals = primeBasket[i] + const rewards = rewardTok.mul(bn('1e21')).div(numRewardTokens) + await appMockDecimals.setRewards(backingManager.address, rewards) + } else if (decimals == 27) { + // large decimal appreciating collateral + const appMockDecimals = primeBasket[i] + const rewards = rewardTok.mul(bn('1e27')).div(numRewardTokens) + await appMockDecimals.setRewards(backingManager.address, rewards) } } @@ -522,7 +658,7 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, dimensions = [ [fp('1e-6'), fp('1e30')], // RToken supply [1, MAX_BASKET_SIZE], // basket size - [1, 2], // num reward tokens + [1, 2, 3, 4], // num reward tokens [bn('0'), bn('1e11'), bn('1e6')], // reward amount (whole tokens), up to 100B supply tokens [fp('0'), fp('1'), fp('0.6')], // StRSR cut (f) ] @@ -530,7 +666,7 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, dimensions = [ [fp('1e-6'), fp('1e30')], // RToken supply [1, 7], // basket size - [2], // num reward tokens + [2, 4], // num reward tokens [bn('1e11')], // reward amount (whole tokens), up to 100B supply tokens [fp('0.6')], // StRSR cut (f) ] @@ -631,8 +767,26 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, const primeBasket = [] const targetAmts = [] for (let i = 0; i < basketSize; i++) { - expect(collateralDecimals == 8 || collateralDecimals == 18).to.equal(true) - const token = collateralDecimals == 8 ? await prepCToken(i) : await prepAToken(i) + expect( + collateralDecimals == 8 || + collateralDecimals == 18 || + collateralDecimals == 21 || + collateralDecimals == 27 + ).to.equal(true) + let token: CTokenMock | StaticATokenMock | AppreciatingMockDecimals + switch (collateralDecimals) { + case 8: + token = await prepCToken(i) + break + case 21: + case 27: + token = await prepLargeDecimalToken(i, collateralDecimals) + break + default: + token = await prepAToken(i) // 18 decimals + break + } + primeBasket.push(token) targetAmts.push(primeWeight.div(basketSize).add(1)) await token.connect(owner).mint(addr1.address, MAX_UINT256) @@ -691,7 +845,7 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, [fp('1e-6'), fp('1e30')], // RToken supply [2, MAX_BASKET_SIZE], // basket size [fp('1e-6'), fp('1e3'), fp('1')], // prime basket weights - [8, 18], // collateral decimals + [8, 18, 21, 27], // collateral decimals [1, MAX_BASKET_SIZE - 1], // how many collateral assets default (up to) ] } else { @@ -699,7 +853,7 @@ describeExtreme(`Trading Extreme Values (${SLOW ? 'slow mode' : 'fast mode'})`, [fp('1e-6'), fp('1e30')], // RToken supply [7], // basket size [fp('1e-6'), fp('1e3')], // prime basket weights - [8, 18], // collateral decimals + [8, 18, 21, 27], // collateral decimals [1], // how many collateral assets default (up to) ] } diff --git a/test/fixtures.ts b/test/fixtures.ts index c7ce3d9314..cf52748cba 100644 --- a/test/fixtures.ts +++ b/test/fixtures.ts @@ -441,8 +441,8 @@ const makeDefaultFixture = async (setBasket: boolean): Promise = const { gnosis, easyAuction } = await gnosisFixture() const gnosisAddr = useEnv('FORK') ? easyAuction.address : gnosis.address const dist: IRevenueShare = { - rTokenDist: bn(40), // 2/5 RToken - rsrDist: bn(60), // 3/5 RSR + rTokenDist: bn(4000), // 2/5 RToken + rsrDist: bn(6000), // 3/5 RSR } // Setup Config diff --git a/test/integration/EasyAuction.test.ts b/test/integration/EasyAuction.test.ts index 5a298c4533..5674ba344c 100644 --- a/test/integration/EasyAuction.test.ts +++ b/test/integration/EasyAuction.test.ts @@ -33,7 +33,7 @@ import { setOraclePrice } from '../utils/oracles' import { getChainId } from '../../common/blockchain-utils' import { whileImpersonating } from '../utils/impersonation' import { expectRTokenPrice } from '../utils/oracles' -import { withinQuad } from '../utils/matchers' +import { withinTolerance } from '../utils/matchers' import { cartesianProduct } from '../utils/cases' import { EasyAuction, @@ -154,7 +154,7 @@ describeFork(`Gnosis EasyAuction Mainnet Forking - P${IMPLEMENTATION}`, function // Create auction await expect(backingManager.rebalance(TradeKind.BATCH_AUCTION)) .to.emit(backingManager, 'TradeStarted') - .withArgs(anyValue, rsr.address, token0.address, anyValue, withinQuad(buyAmt)) + .withArgs(anyValue, rsr.address, token0.address, anyValue, withinTolerance(buyAmt)) const t = await getTrade(backingManager, rsr.address) sellAmt = await t.initBal() @@ -840,7 +840,7 @@ describeFork(`Gnosis EasyAuction Mainnet Forking - P${IMPLEMENTATION}`, function // ==== Generate the tests ==== // applied to both buy and sell tokens - const decimals = [bn('1'), bn('6'), bn('8'), bn('9'), bn('18')] + const decimals = [bn('1'), bn('6'), bn('8'), bn('9'), bn('18'), bn('21'), bn('27')] // auction sell amount const auctionSellAmts = [bn('1'), bn('1595439874635'), bn('987321984732198435645846513')] diff --git a/test/integration/UpgradeToR4.test.ts b/test/integration/UpgradeToR4.test.ts new file mode 100644 index 0000000000..b5e6215c90 --- /dev/null +++ b/test/integration/UpgradeToR4.test.ts @@ -0,0 +1,187 @@ +import hre, { ethers } from 'hardhat' +import { reset } from '@nomicfoundation/hardhat-network-helpers' +import { VersionRegistry } from '@typechain/VersionRegistry' +import { expect } from 'chai' +import { forkRpcs } from '#/utils/fork' +import { IImplementations } from '#/common/configuration' +import { DeployerP1 } from '@typechain/DeployerP1' +import { AssetPluginRegistry } from '@typechain/AssetPluginRegistry' +import { whileImpersonating } from '#/utils/impersonation' +import { DAOFeeRegistry } from '@typechain/DAOFeeRegistry' + +interface RTokenParams { + name: string + mainAddress: string + timelockAddress: string +} + +// These RTokens must be on 3.4.0 as the target block +const rTokensToTest: RTokenParams[] = [ + { + name: 'dgnETH', + mainAddress: '0xC376168c8470C6e0F4854A7d450874C30A0973d7', + timelockAddress: '0x98D7C5230C46b671dB0CeBb25B17d1E183B23B97', + }, +] + +const v4VersionHash = '0x81ed76178093786cbe0cb79744f6e7ca3336fbb9fe7d1ddff1f0157b63e09813' + +async function _confirmVersion(address: string, target: string) { + const versionedTarget = await ethers.getContractAt('Versioned', address) + expect(await versionedTarget.version()).to.eq(target) +} + +// NOTE: This is an explicit test! +describe('Upgrade from 3.4.0 to 4.0.0 (Mainnet Fork)', () => { + let implementations: IImplementations + let deployer: DeployerP1 + let versionRegistry: VersionRegistry + let assetPluginRegistry: AssetPluginRegistry + let daoFeeRegistry: DAOFeeRegistry + + before(async () => { + await reset(forkRpcs.mainnet, 19991614) + const [owner] = await ethers.getSigners() + + const TradingLibFactory = await ethers.getContractFactory('RecollateralizationLibP1') + const BasketLibFactory = await ethers.getContractFactory('BasketLibP1') + const tradingLib = await TradingLibFactory.deploy() + const basketLib = await BasketLibFactory.deploy() + + const MainFactory = await ethers.getContractFactory('MainP1') + const RTokenFactory = await ethers.getContractFactory('RTokenP1') + const FurnaceFactory = await ethers.getContractFactory('FurnaceP1') + const RevenueTraderFactory = await ethers.getContractFactory('RevenueTraderP1') + const BackingManagerFactory = await ethers.getContractFactory('BackingManagerP1', { + libraries: { + RecollateralizationLibP1: tradingLib.address, + }, + }) + const AssetRegistryFactory = await ethers.getContractFactory('AssetRegistryP1') + const BasketHandlerFactory = await ethers.getContractFactory('BasketHandlerP1', { + libraries: { BasketLibP1: basketLib.address }, + }) + const DistributorFactory = await ethers.getContractFactory('DistributorP1') + const BrokerFactory = await ethers.getContractFactory('BrokerP1') + const GnosisTradeFactory = await ethers.getContractFactory('GnosisTrade') + const DutchTradeFactory = await ethers.getContractFactory('DutchTrade') + const StRSRFactory = await ethers.getContractFactory('StRSRP1Votes') + + const RevenueTrader = await RevenueTraderFactory.deploy() + + implementations = { + main: (await MainFactory.deploy()).address, + components: { + assetRegistry: (await AssetRegistryFactory.deploy()).address, + basketHandler: (await BasketHandlerFactory.deploy()).address, + distributor: (await DistributorFactory.deploy()).address, + broker: (await BrokerFactory.deploy()).address, + backingManager: (await BackingManagerFactory.deploy()).address, + furnace: (await FurnaceFactory.deploy()).address, + rToken: (await RTokenFactory.deploy()).address, + rsrTrader: RevenueTrader.address, + rTokenTrader: RevenueTrader.address, + stRSR: (await StRSRFactory.deploy()).address, + }, + trading: { + gnosisTrade: (await GnosisTradeFactory.deploy()).address, + dutchTrade: (await DutchTradeFactory.deploy()).address, + }, + } + + const DeployerFactory = await ethers.getContractFactory('DeployerP1') + deployer = await DeployerFactory.deploy( + '0x320623b8E4fF03373931769A31Fc52A4E78B5d70', + '0x0b7fFc1f4AD541A4Ed16b40D8c37f0929158D101', + '0x591529f039Ba48C3bEAc5090e30ceDDcb41D0EaA', + implementations + ) + + const versionRegistryFactory = await ethers.getContractFactory('VersionRegistry') + versionRegistry = await versionRegistryFactory.deploy(await owner.getAddress()) + + await versionRegistry.registerVersion(deployer.address) + + const AssetPluginRegistryFactory = await ethers.getContractFactory('AssetPluginRegistryMock') + assetPluginRegistry = + (await AssetPluginRegistryFactory.deploy()) as unknown as AssetPluginRegistry + + const DAOFeeRegistryFactory = await ethers.getContractFactory('DAOFeeRegistry') + daoFeeRegistry = await DAOFeeRegistryFactory.deploy(await owner.getAddress()) + }) + + describe('The Upgrade', () => { + for (let i = 0; i < rTokensToTest.length; i++) { + const TIMELOCK_ADDRESS = rTokensToTest[i].timelockAddress + const MAIN_ADDRESS = rTokensToTest[i].mainAddress + + it(`Double Upgrade Check: ${rTokensToTest[i].name}`, async () => { + const RTokenMain = await ethers.getContractAt('MainP1', MAIN_ADDRESS) + const TimelockController = await ethers.getContractAt( + 'TimelockController', + TIMELOCK_ADDRESS + ) + + await whileImpersonating(hre, TimelockController.address, async (signer) => { + // Upgrade Main to 4.0.0's Main + await RTokenMain.connect(signer).upgradeTo(implementations.main) + + // Set registries + await RTokenMain.connect(signer).setVersionRegistry(versionRegistry.address) + await RTokenMain.connect(signer).setAssetPluginRegistry(assetPluginRegistry.address) + await RTokenMain.connect(signer).setDAOFeeRegistry(daoFeeRegistry.address) + + // Grant OWNER to Main + await RTokenMain.connect(signer).grantRole( + await RTokenMain.OWNER_ROLE(), + RTokenMain.address + ) + + // Upgrade RToken + await RTokenMain.connect(signer).upgradeRTokenTo(v4VersionHash, false, false) + + // Revoke OWNER from Main + await RTokenMain.connect(signer).revokeRole( + await RTokenMain.OWNER_ROLE(), + RTokenMain.address + ) + }) + + const targetsToVerify = [ + RTokenMain.address, + await RTokenMain.rToken(), + await RTokenMain.assetRegistry(), + await RTokenMain.basketHandler(), + await RTokenMain.distributor(), + await RTokenMain.broker(), + await RTokenMain.backingManager(), + await RTokenMain.furnace(), + await RTokenMain.rsrTrader(), + await RTokenMain.rTokenTrader(), + await RTokenMain.stRSR(), + ] + + for (let j = 0; j < targetsToVerify.length; j++) { + await _confirmVersion(targetsToVerify[j], '4.0.0') + } + + const broker = await ethers.getContractAt('BrokerP1', await RTokenMain.broker()) + expect(await broker.batchTradeImplementation()).to.equal( + implementations.trading.gnosisTrade + ) + expect(await broker.dutchTradeImplementation()).to.equal(implementations.trading.dutchTrade) + + // So, let's upgrade the RToken _again_ to verify the process flow works. + await whileImpersonating(hre, TimelockController.address, async (signer) => { + // Upgrade Main to 4.0.0's Main + await RTokenMain.connect(signer).upgradeMainTo(v4VersionHash) + + // Upgrade RToken + await RTokenMain.connect(signer).upgradeRTokenTo(v4VersionHash, true, true) + + // ^^ This is how the upgrade would look like for future versions. + }) + }) + } + }) +}) diff --git a/test/integration/UpgradeToR4WithRegistries.test.ts b/test/integration/UpgradeToR4WithRegistries.test.ts new file mode 100644 index 0000000000..b0b12a7334 --- /dev/null +++ b/test/integration/UpgradeToR4WithRegistries.test.ts @@ -0,0 +1,271 @@ +import hre, { ethers } from 'hardhat' +import { reset } from '@nomicfoundation/hardhat-network-helpers' +import { VersionRegistry } from '@typechain/VersionRegistry' +import { expect } from 'chai' +import { forkRpcs } from '#/utils/fork' +import { IImplementations } from '#/common/configuration' +import { AssetPluginRegistry } from '@typechain/AssetPluginRegistry' +import { whileImpersonating } from '#/utils/impersonation' +import { DAOFeeRegistry } from '@typechain/DAOFeeRegistry' + +interface RTokenParams { + name: string + mainAddress: string + timelockAddress: string +} + +// These RTokens must be on 3.4.0 as the target block +const rTokensToTest: RTokenParams[] = [ + { + name: 'dgnETH', + mainAddress: '0xC376168c8470C6e0F4854A7d450874C30A0973d7', + timelockAddress: '0x98D7C5230C46b671dB0CeBb25B17d1E183B23B97', + }, +] + +const v4VersionHash = '0x81ed76178093786cbe0cb79744f6e7ca3336fbb9fe7d1ddff1f0157b63e09813' +const v2VersionHash = '0xb4bcb154e38601c389396fa918314da42d4626f13ef6d0ceb07e5f5d26b2fbc3' + +async function _confirmVersion(address: string, target: string) { + const versionedTarget = await ethers.getContractAt('Versioned', address) + expect(await versionedTarget.version()).to.eq(target) +} + +// NOTE: This is an explicit test! +describe('Upgrade from 4.0.0 to New Version with all Registries Enabled', () => { + let versionRegistry: VersionRegistry + let assetPluginRegistry: AssetPluginRegistry + let daoFeeRegistry: DAOFeeRegistry + + let implementationsR4: IImplementations + let implementationsR2: IImplementations + + before(async () => { + await reset(forkRpcs.mainnet, 19991614) + const [owner] = await ethers.getSigners() + + // Setup Registries + const versionRegistryFactory = await ethers.getContractFactory('VersionRegistry') + versionRegistry = await versionRegistryFactory.deploy(await owner.getAddress()) + + const AssetPluginRegistryFactory = await ethers.getContractFactory('AssetPluginRegistry') + assetPluginRegistry = await AssetPluginRegistryFactory.deploy(versionRegistry.address) + + const DAOFeeRegistryFactory = await ethers.getContractFactory('DAOFeeRegistry') + daoFeeRegistry = await DAOFeeRegistryFactory.deploy(await owner.getAddress()) + + // Setup Common Dependencies + const TradingLibFactory = await ethers.getContractFactory('RecollateralizationLibP1') + const BasketLibFactory = await ethers.getContractFactory('BasketLibP1') + const tradingLib = await TradingLibFactory.deploy() + const basketLib = await BasketLibFactory.deploy() + + // Setup R4 Implementations & Deployer + { + const MainFactory = await ethers.getContractFactory('MainP1') + const RTokenFactory = await ethers.getContractFactory('RTokenP1') + const FurnaceFactory = await ethers.getContractFactory('FurnaceP1') + const RevenueTraderFactory = await ethers.getContractFactory('RevenueTraderP1') + const BackingManagerFactory = await ethers.getContractFactory('BackingManagerP1', { + libraries: { + RecollateralizationLibP1: tradingLib.address, + }, + }) + const AssetRegistryFactory = await ethers.getContractFactory('AssetRegistryP1') + const BasketHandlerFactory = await ethers.getContractFactory('BasketHandlerP1', { + libraries: { BasketLibP1: basketLib.address }, + }) + const DistributorFactory = await ethers.getContractFactory('DistributorP1') + const BrokerFactory = await ethers.getContractFactory('BrokerP1') + const GnosisTradeFactory = await ethers.getContractFactory('GnosisTrade') + const DutchTradeFactory = await ethers.getContractFactory('DutchTrade') + const StRSRFactory = await ethers.getContractFactory('StRSRP1Votes') + + const RevenueTrader = await RevenueTraderFactory.deploy() + + implementationsR4 = { + main: (await MainFactory.deploy()).address, + components: { + assetRegistry: (await AssetRegistryFactory.deploy()).address, + basketHandler: (await BasketHandlerFactory.deploy()).address, + distributor: (await DistributorFactory.deploy()).address, + broker: (await BrokerFactory.deploy()).address, + backingManager: (await BackingManagerFactory.deploy()).address, + furnace: (await FurnaceFactory.deploy()).address, + rToken: (await RTokenFactory.deploy()).address, + rsrTrader: RevenueTrader.address, + rTokenTrader: RevenueTrader.address, + stRSR: (await StRSRFactory.deploy()).address, + }, + trading: { + gnosisTrade: (await GnosisTradeFactory.deploy()).address, + dutchTrade: (await DutchTradeFactory.deploy()).address, + }, + } + + const DeployerFactory = await ethers.getContractFactory('DeployerP1') + const deployerR4 = await DeployerFactory.deploy( + '0x320623b8E4fF03373931769A31Fc52A4E78B5d70', + '0x0b7fFc1f4AD541A4Ed16b40D8c37f0929158D101', + '0x591529f039Ba48C3bEAc5090e30ceDDcb41D0EaA', + implementationsR4 + ) + await versionRegistry.registerVersion(deployerR4.address) + } + + // Setup R2 Implementations & Deployer + { + const MainFactory = await ethers.getContractFactory('MainP1V2') + const RTokenFactory = await ethers.getContractFactory('RTokenP1V2') + const FurnaceFactory = await ethers.getContractFactory('FurnaceP1V2') + const RevenueTraderFactory = await ethers.getContractFactory('RevenueTraderP1V2') + const BackingManagerFactory = await ethers.getContractFactory('BackingManagerP1V2', { + libraries: { + RecollateralizationLibP1: tradingLib.address, + }, + }) + const AssetRegistryFactory = await ethers.getContractFactory('AssetRegistryP1V2') + const BasketHandlerFactory = await ethers.getContractFactory('BasketHandlerP1V2', { + libraries: { BasketLibP1: basketLib.address }, + }) + const DistributorFactory = await ethers.getContractFactory('DistributorP1V2') + const BrokerFactory = await ethers.getContractFactory('BrokerP1V2') + const GnosisTradeFactory = await ethers.getContractFactory('GnosisTrade') + const DutchTradeFactory = await ethers.getContractFactory('DutchTrade') + const StRSRFactory = await ethers.getContractFactory('StRSRP1VotesV2') + + const RevenueTrader = await RevenueTraderFactory.deploy() + + implementationsR2 = { + main: (await MainFactory.deploy()).address, + components: { + assetRegistry: (await AssetRegistryFactory.deploy()).address, + basketHandler: (await BasketHandlerFactory.deploy()).address, + distributor: (await DistributorFactory.deploy()).address, + broker: (await BrokerFactory.deploy()).address, + backingManager: (await BackingManagerFactory.deploy()).address, + furnace: (await FurnaceFactory.deploy()).address, + rToken: (await RTokenFactory.deploy()).address, + rsrTrader: RevenueTrader.address, + rTokenTrader: RevenueTrader.address, + stRSR: (await StRSRFactory.deploy()).address, + }, + trading: { + gnosisTrade: (await GnosisTradeFactory.deploy()).address, + dutchTrade: (await DutchTradeFactory.deploy()).address, + }, + } + + const DeployerFactory = await ethers.getContractFactory('DeployerP1V2') + const deployerR2 = await DeployerFactory.deploy( + '0x320623b8E4fF03373931769A31Fc52A4E78B5d70', + '0x0b7fFc1f4AD541A4Ed16b40D8c37f0929158D101', + '0x591529f039Ba48C3bEAc5090e30ceDDcb41D0EaA', + implementationsR2 + ) + await versionRegistry.registerVersion(deployerR2.address) + } + }) + + describe('Upgrade Check', () => { + for (let i = 0; i < rTokensToTest.length; i++) { + const TIMELOCK_ADDRESS = rTokensToTest[i].timelockAddress + const MAIN_ADDRESS = rTokensToTest[i].mainAddress + + it(`Progressive Upgrade Check - ${rTokensToTest[i].name}`, async () => { + const RTokenMain = await ethers.getContractAt('MainP1', MAIN_ADDRESS) + const RTokenAssetRegistry = await ethers.getContractAt( + 'AssetRegistryP1', + await RTokenMain.assetRegistry() + ) + const TimelockController = await ethers.getContractAt( + 'TimelockController', + TIMELOCK_ADDRESS + ) + + await whileImpersonating(hre, TimelockController.address, async (signer) => { + // Upgrade Main to 4.0.0's Main + await RTokenMain.connect(signer).upgradeTo(implementationsR4.main) + + // Set registries + await RTokenMain.connect(signer).setVersionRegistry(versionRegistry.address) + await RTokenMain.connect(signer).setAssetPluginRegistry(assetPluginRegistry.address) + await RTokenMain.connect(signer).setDAOFeeRegistry(daoFeeRegistry.address) + + // Grant OWNER to Main + await RTokenMain.connect(signer).grantRole( + await RTokenMain.OWNER_ROLE(), + RTokenMain.address + ) + + // Upgrade RToken + await RTokenMain.connect(signer).upgradeRTokenTo(v4VersionHash, false, false) + + // Revoke OWNER from Main + await RTokenMain.connect(signer).revokeRole( + await RTokenMain.OWNER_ROLE(), + RTokenMain.address + ) + }) + + const targetsToVerify = [ + RTokenMain.address, + await RTokenMain.rToken(), + RTokenAssetRegistry.address, + await RTokenMain.basketHandler(), + await RTokenMain.distributor(), + await RTokenMain.broker(), + await RTokenMain.backingManager(), + await RTokenMain.furnace(), + await RTokenMain.rsrTrader(), + await RTokenMain.rTokenTrader(), + await RTokenMain.stRSR(), + ] + + for (let j = 0; j < targetsToVerify.length; j++) { + await _confirmVersion(targetsToVerify[j], '4.0.0') + } + + const currentAssetRegistry = await RTokenAssetRegistry.getRegistry() + const currentAssetPlugins = currentAssetRegistry.assets + + // We don't have all the assets in the registry, so this should fail + await expect(RTokenAssetRegistry.validateCurrentAssets()).to.be.revertedWith( + 'unsupported asset' + ) + + // So, let's upgrade the RToken to a new version now. + await whileImpersonating(hre, TimelockController.address, async (signer) => { + // Upgrade Main to 4.0.0's Main + await RTokenMain.connect(signer).upgradeMainTo(v2VersionHash) + + // Registry does not have assets yet. + await expect( + RTokenMain.connect(signer).upgradeRTokenTo(v2VersionHash, true, true) + ).to.be.revertedWith('unsupported asset') + }) + + // Register Assets in the Registry + await assetPluginRegistry.updateAssetsByVersion( + v4VersionHash, + currentAssetPlugins, + currentAssetPlugins.map(() => true) + ) + await assetPluginRegistry.updateAssetsByVersion( + v2VersionHash, + currentAssetPlugins, + currentAssetPlugins.map(() => true) + ) + + // Finish upgrade, with asset validation + await whileImpersonating(hre, TimelockController.address, async (signer) => { + // Upgrade Main to 4.0.0's Main + await RTokenMain.connect(signer).upgradeMainTo(v2VersionHash) + + // Upgrade RToken, without validating assets + await RTokenMain.connect(signer).upgradeRTokenTo(v2VersionHash, true, true) + }) + }) + } + }) +}) diff --git a/test/integration/fixtures.ts b/test/integration/fixtures.ts index fec57dbc26..97630e1ba6 100644 --- a/test/integration/fixtures.ts +++ b/test/integration/fixtures.ts @@ -623,8 +623,8 @@ const makeDefaultFixture = async (setBasket: boolean): Promise = const { weth, compToken, compoundMock, aaveToken, aaveMock } = await compAaveFixture() const { easyAuction } = await gnosisFixture() const dist: IRevenueShare = { - rTokenDist: bn(40), // 2/5 RToken - rsrDist: bn(60), // 3/5 RSR + rTokenDist: bn(4000), // 2/5 RToken + rsrDist: bn(6000), // 3/5 RSR } const chainId = await getChainId(hre) diff --git a/test/integration/fork-block-numbers.ts b/test/integration/fork-block-numbers.ts index e0adbbffc9..bd346d05a5 100644 --- a/test/integration/fork-block-numbers.ts +++ b/test/integration/fork-block-numbers.ts @@ -8,6 +8,7 @@ const forkBlockNumber = { 'facade-monitor': 18742016, // Ethereum 'old-curve-plugins': 16915576, // Ethereum 'new-curve-plugins': 19626711, // Ethereum + // TODO add all the block numbers we fork from to benefit from caching default: 19742528, // Ethereum } diff --git a/test/plugins/RewardableERC20.test.ts b/test/plugins/RewardableERC20.test.ts index 2b10d1847b..c6f932801a 100644 --- a/test/plugins/RewardableERC20.test.ts +++ b/test/plugins/RewardableERC20.test.ts @@ -788,7 +788,7 @@ for (const wrapperName of wrapperNames) { }) } - const decimalSeeds = [6, 8, 18] + const decimalSeeds = [6, 8, 18, 21, 27] const cases = cartesianProduct(decimalSeeds, decimalSeeds) cases.forEach((params) => { const wrapperStr = wrapperName.replace('Test', '') diff --git a/test/plugins/individual-collateral/aave/ATokenFiatCollateral.test.ts b/test/plugins/individual-collateral/aave/ATokenFiatCollateral.test.ts index b906eac08c..ad632a8d07 100644 --- a/test/plugins/individual-collateral/aave/ATokenFiatCollateral.test.ts +++ b/test/plugins/individual-collateral/aave/ATokenFiatCollateral.test.ts @@ -132,8 +132,8 @@ describeFork(`ATokenFiatCollateral - Mainnet Forking P${IMPLEMENTATION}`, functi // RToken Configuration const dist: IRevenueShare = { - rTokenDist: bn(40), // 2/5 RToken - rsrDist: bn(60), // 3/5 RSR + rTokenDist: bn(4000), // 2/5 RToken + rsrDist: bn(6000), // 3/5 RSR } const config: IConfig = { dist: dist, diff --git a/test/plugins/individual-collateral/cbeth/constants.ts b/test/plugins/individual-collateral/cbeth/constants.ts index 19324775f7..9af8e7f78c 100644 --- a/test/plugins/individual-collateral/cbeth/constants.ts +++ b/test/plugins/individual-collateral/cbeth/constants.ts @@ -25,4 +25,4 @@ export const DELAY_UNTIL_DEFAULT = bn(86400) export const MAX_TRADE_VOL = bn(1000) export const FORK_BLOCK = 17479312 -export const FORK_BLOCK_BASE = 4446300 +export const FORK_BLOCK_BASE = 5374534 diff --git a/test/plugins/individual-collateral/collateralTests.ts b/test/plugins/individual-collateral/collateralTests.ts index 5a1cc4692a..45b6a11713 100644 --- a/test/plugins/individual-collateral/collateralTests.ts +++ b/test/plugins/individual-collateral/collateralTests.ts @@ -630,6 +630,9 @@ export default function fn( }) describe('integration tests', () => { + const onBase = useEnv('FORK_NETWORK').toLowerCase() == 'base' + const onArbitrum = useEnv('FORK_NETWORK').toLowerCase() == 'arbitrum' + before(resetFork) let ctx: X @@ -654,7 +657,8 @@ export default function fn( let assetRegistry: IAssetRegistry let backingManager: TestIBackingManager let basketHandler: TestIBasketHandler - let rTokenTrader: TestIRevenueTrader + let rsrTrader: TestIRevenueTrader + let rsr: ERC20Mock let deployer: TestIDeployer let facadeWrite: FacadeWrite @@ -663,8 +667,8 @@ export default function fn( const config = { dist: { - rTokenDist: bn(100), // 100% RToken - rsrDist: bn(0), // 0% RSR + rTokenDist: bn(0), // 0% RToken + rsrDist: bn(10000), // 100% RSR }, minTradeVolume: bn('0'), // $0 rTokenMaxTradeVolume: MAX_UINT192, // +inf @@ -720,7 +724,7 @@ export default function fn( let protocol: DefaultFixture ;({ ctx, protocol } = await loadFixture(integrationFixture)) ;({ collateral } = ctx) - ;({ deployer, facadeWrite, govParams } = protocol) + ;({ deployer, facadeWrite, govParams, rsr } = protocol) supply = fp('1') @@ -777,8 +781,8 @@ export default function fn( await ethers.getContractAt('TestIBasketHandler', await main.basketHandler()) ) rToken = await ethers.getContractAt('TestIRToken', await main.rToken()) - rTokenTrader = ( - await ethers.getContractAt('TestIRevenueTrader', await main.rTokenTrader()) + rsrTrader = ( + await ethers.getContractAt('TestIRevenueTrader', await main.rsrTrader()) ) // Set initial governance roles @@ -862,43 +866,53 @@ export default function fn( }) it('forwards revenue and sells in a revenue auction', async () => { + expect(await collateralERC20.balanceOf(rsrTrader.address)).to.be.eq(0) const router = await (await ethers.getContractFactory('DutchTradeRouter')).deploy() - await rToken.connect(addr1).approve(router.address, MAX_UINT256) + await rsr.connect(addr1).approve(router.address, MAX_UINT256) // Send excess collateral to the RToken trader via forwardRevenue() let mintAmt = toBNDecimals(fp('1e-6'), await collateralERC20.decimals()) - mintAmt = mintAmt.gt('150') ? mintAmt : bn('150') + mintAmt = mintAmt.gt('100000') ? mintAmt : bn('100000') // fewest tokens distributor will transfer await mintCollateralTo(ctx, mintAmt, addr1, backingManager.address) await backingManager.forwardRevenue([collateralERC20.address]) - expect(await collateralERC20.balanceOf(rTokenTrader.address)).to.be.gt(0) + expect(await collateralERC20.balanceOf(rsrTrader.address)).to.be.gt(0) // Run revenue auction - await expect( - rTokenTrader.manageTokens([collateralERC20.address], [TradeKind.DUTCH_AUCTION]) - ) - .to.emit(rTokenTrader, 'TradeStarted') - .withArgs(anyValue, collateralERC20.address, rToken.address, anyValue, anyValue) - const tradeAddr = await rTokenTrader.trades(collateralERC20.address) + await expect(rsrTrader.manageTokens([collateralERC20.address], [TradeKind.DUTCH_AUCTION])) + .to.emit(rsrTrader, 'TradeStarted') + .withArgs(anyValue, collateralERC20.address, rsr.address, anyValue, anyValue) + const tradeAddr = await rsrTrader.trades(collateralERC20.address) expect(tradeAddr).to.not.equal(ZERO_ADDRESS) const trade = await ethers.getContractAt('DutchTrade', tradeAddr) expect(await trade.sell()).to.equal(collateralERC20.address) - expect(await trade.buy()).to.equal(rToken.address) + expect(await trade.buy()).to.equal(rsr.address) const buyAmt = await trade.bidAmount(await trade.endTime()) - await rToken.connect(addr1).approve(trade.address, buyAmt) + + // The base whale below is hyUSDStRSR. This is bad, and generally we don't want to do this. But there + // are no RSR holders on Base in size that hold their balance consistently across blocks, since + // everyone is farming. Since the individual tests each have their own block they use, + // this was the easiest way to make everything work. I'm not worried about this in this case + // because hyUSDStRSR is _not_ the RToken we are testing here, so it should have no impact. + const whale = onBase + ? '0x796d2367AF69deB3319B8E10712b8B65957371c3' + : onArbitrum + ? '0xBe81e75C579b090428CC5495540541231FD3c0bD' + : '0x6bab6EB87Aa5a1e4A8310C73bDAAA8A5dAAd81C1' + await whileImpersonating(whale, async (signer) => { + await rsr.connect(signer).transfer(addr1.address, buyAmt) + }) await advanceToTimestamp((await trade.endTime()) - 1) // Bid await expect(router.connect(addr1).bid(trade.address, addr1.address)).to.emit( - rTokenTrader, + rsrTrader, 'TradeSettled' ) - expect(await rTokenTrader.tradesOpen()).to.equal(0) + expect(await rsrTrader.tradesOpen()).to.equal(0) }) // === Integration Test Helpers === const makePairedCollateral = async (target: string): Promise => { - const onBase = useEnv('FORK_NETWORK').toLowerCase() == 'base' - const onArbitrum = useEnv('FORK_NETWORK').toLowerCase() == 'arbitrum' const MockV3AggregatorFactory: ContractFactory = await ethers.getContractFactory( 'MockV3Aggregator' ) diff --git a/test/plugins/individual-collateral/compoundv2/CTokenFiatCollateral.test.ts b/test/plugins/individual-collateral/compoundv2/CTokenFiatCollateral.test.ts index 5be2bff89d..3e282cdbff 100644 --- a/test/plugins/individual-collateral/compoundv2/CTokenFiatCollateral.test.ts +++ b/test/plugins/individual-collateral/compoundv2/CTokenFiatCollateral.test.ts @@ -130,8 +130,8 @@ describeFork(`CTokenFiatCollateral - Mainnet Forking P${IMPLEMENTATION}`, functi // RToken Configuration const dist: IRevenueShare = { - rTokenDist: bn(40), // 2/5 RToken - rsrDist: bn(60), // 3/5 RSR + rTokenDist: bn(4000), // 2/5 RToken + rsrDist: bn(6000), // 3/5 RSR } const config: IConfig = { dist: dist, diff --git a/test/plugins/individual-collateral/curve/collateralTests.ts b/test/plugins/individual-collateral/curve/collateralTests.ts index fbb35852aa..48c28790d6 100644 --- a/test/plugins/individual-collateral/curve/collateralTests.ts +++ b/test/plugins/individual-collateral/curve/collateralTests.ts @@ -790,6 +790,9 @@ export default function fn( // Only run full protocol integration tests on mainnet // Protocol integration fixture not currently set up to deploy onto base getDescribeFork(targetNetwork)('integration tests', () => { + const onBase = useEnv('FORK_NETWORK').toLowerCase() == 'base' + const onArbitrum = useEnv('FORK_NETWORK').toLowerCase() == 'arbitrum' + before(resetFork) let ctx: X @@ -814,7 +817,8 @@ export default function fn( let assetRegistry: IAssetRegistry let backingManager: TestIBackingManager let basketHandler: TestIBasketHandler - let rTokenTrader: TestIRevenueTrader + let rsrTrader: TestIRevenueTrader + let rsr: ERC20Mock let deployer: TestIDeployer let facadeWrite: FacadeWrite @@ -823,8 +827,8 @@ export default function fn( const config = { dist: { - rTokenDist: bn(100), // 100% RToken - rsrDist: bn(0), // 0% RSR + rTokenDist: bn(0), // 0% RToken + rsrDist: bn(10000), // 100% RSR }, minTradeVolume: bn('0'), // $0 rTokenMaxTradeVolume: MAX_UINT192, // +inf @@ -878,7 +882,7 @@ export default function fn( let protocol: DefaultFixture ;({ ctx, protocol } = await loadFixture(integrationFixture)) ;({ collateral } = ctx) - ;({ deployer, facadeWrite, govParams } = protocol) + ;({ deployer, facadeWrite, govParams, rsr } = protocol) supply = fp('1') @@ -935,8 +939,8 @@ export default function fn( await ethers.getContractAt('TestIBasketHandler', await main.basketHandler()) ) rToken = await ethers.getContractAt('TestIRToken', await main.rToken()) - rTokenTrader = ( - await ethers.getContractAt('TestIRevenueTrader', await main.rTokenTrader()) + rsrTrader = ( + await ethers.getContractAt('TestIRevenueTrader', await main.rsrTrader()) ) // Set initial governance roles @@ -1021,39 +1025,50 @@ export default function fn( it('forwards revenue and sells in a revenue auction', async () => { const router = await (await ethers.getContractFactory('DutchTradeRouter')).deploy() - await rToken.connect(addr1).approve(router.address, MAX_UINT256) + await rsr.connect(addr1).approve(router.address, MAX_UINT256) // Send excess collateral to the RToken trader via forwardRevenue() const mintAmt = toBNDecimals(fp('1e-6'), await collateralERC20.decimals()) await mintCollateralTo( ctx, - mintAmt.gt('150') ? mintAmt : bn('150'), + mintAmt.gt('10000') ? mintAmt : bn('10000'), addr1, backingManager.address ) await backingManager.forwardRevenue([collateralERC20.address]) - expect(await collateralERC20.balanceOf(rTokenTrader.address)).to.be.gt(0) + expect(await collateralERC20.balanceOf(rsrTrader.address)).to.be.gt(0) // Run revenue auction - await expect( - rTokenTrader.manageTokens([collateralERC20.address], [TradeKind.DUTCH_AUCTION]) - ) - .to.emit(rTokenTrader, 'TradeStarted') - .withArgs(anyValue, collateralERC20.address, rToken.address, anyValue, anyValue) - const tradeAddr = await rTokenTrader.trades(collateralERC20.address) + await expect(rsrTrader.manageTokens([collateralERC20.address], [TradeKind.DUTCH_AUCTION])) + .to.emit(rsrTrader, 'TradeStarted') + .withArgs(anyValue, collateralERC20.address, rsr.address, anyValue, anyValue) + const tradeAddr = await rsrTrader.trades(collateralERC20.address) expect(tradeAddr).to.not.equal(ZERO_ADDRESS) const trade = await ethers.getContractAt('DutchTrade', tradeAddr) expect(await trade.sell()).to.equal(collateralERC20.address) - expect(await trade.buy()).to.equal(rToken.address) + expect(await trade.buy()).to.equal(rsr.address) const buyAmt = await trade.bidAmount(await trade.endTime()) - await rToken.connect(addr1).approve(trade.address, buyAmt) + + // The base whale below is hyUSDStRSR. This is bad, and generally we don't want to do this. But there + // are no RSR holders on Base in size that hold their balance consistently across blocks, since + // everyone is farming. Since the individual tests each have their own block they use, + // this was the easiest way to make everything work. I'm not worried about this in this case + // because hyUSDStRSR is _not_ the RToken we are testing here, so it should have no impact. + const whale = onBase + ? '0x796d2367AF69deB3319B8E10712b8B65957371c3' + : onArbitrum + ? '0xBe81e75C579b090428CC5495540541231FD3c0bD' + : '0x6bab6EB87Aa5a1e4A8310C73bDAAA8A5dAAd81C1' + await whileImpersonating(whale, async (signer) => { + await rsr.connect(signer).transfer(addr1.address, buyAmt) + }) await advanceToTimestamp((await trade.endTime()) - 1) await expect(router.connect(addr1).bid(trade.address, addr1.address)).to.emit( - rTokenTrader, + rsrTrader, 'TradeSettled' ) - expect(await rTokenTrader.tradesOpen()).to.equal(0) + expect(await rsrTrader.tradesOpen()).to.equal(0) }) // === Integration Test Helpers === @@ -1067,8 +1082,8 @@ export default function fn( ) let chainId = await getChainId(hre) - if (useEnv('FORK_NETWORK').toLowerCase() == 'base') chainId = 8453 - if (useEnv('FORK_NETWORK').toLowerCase() == 'arbitrum') chainId = 42161 + if (onBase) chainId = 8453 + if (onArbitrum) chainId = 42161 if (target == ethers.utils.formatBytes32String('USD')) { // USD @@ -1077,10 +1092,9 @@ export default function fn( networkConfig[chainId].tokens.USDC! ) - const usdcHolder = - chainId == 42161 - ? '0x47c031236e19d024b42f8ae6780e44a573170703' - : '0x40ec5b33f54e0e8a33a975908c5ba1c14e5bbbdf' + const usdcHolder = onArbitrum + ? '0x47c031236e19d024b42f8ae6780e44a573170703' + : '0x40ec5b33f54e0e8a33a975908c5ba1c14e5bbbdf' await whileImpersonating(usdcHolder, async (signer) => { await erc20 .connect(signer) @@ -1106,10 +1120,9 @@ export default function fn( 'IERC20Metadata', networkConfig[chainId].tokens.WETH! ) - const wethHolder = - chainId == 42161 - ? '0x70d95587d40a2caf56bd97485ab3eec10bee6336' - : '0xF04a5cC80B1E94C69B48f5ee68a08CD2F09A7c3E' + const wethHolder = onArbitrum + ? '0x70d95587d40a2caf56bd97485ab3eec10bee6336' + : '0xF04a5cC80B1E94C69B48f5ee68a08CD2F09A7c3E' await whileImpersonating(wethHolder, async (signer) => { await erc20 .connect(signer) @@ -1138,10 +1151,9 @@ export default function fn( 'IERC20Metadata', networkConfig[chainId].tokens.WBTC! ) - const wbtcHolder = - chainId == 42161 - ? '0x47c031236e19d024b42f8ae6780e44a573170703' - : '0xccf4429db6322d5c611ee964527d42e5d685dd6a' + const wbtcHolder = onArbitrum + ? '0x47c031236e19d024b42f8ae6780e44a573170703' + : '0xccf4429db6322d5c611ee964527d42e5d685dd6a' await whileImpersonating(wbtcHolder, async (signer) => { await erc20 diff --git a/test/plugins/individual-collateral/stargate/constants.ts b/test/plugins/individual-collateral/stargate/constants.ts index fa88507d3e..69eb5ca910 100644 --- a/test/plugins/individual-collateral/stargate/constants.ts +++ b/test/plugins/individual-collateral/stargate/constants.ts @@ -53,4 +53,4 @@ export const DELAY_UNTIL_DEFAULT = bn(86400) export const MAX_TRADE_VOL = bn(1000000) export const USDC_DECIMALS = bn(6) -export const FORK_BLOCK = chainId == '8453' ? 4873094 : 17289300 +export const FORK_BLOCK = chainId == '8453' ? 5374534 : 17289300 diff --git a/test/registries/AssetPluginRegistry.test.ts b/test/registries/AssetPluginRegistry.test.ts new file mode 100644 index 0000000000..0c727afb9e --- /dev/null +++ b/test/registries/AssetPluginRegistry.test.ts @@ -0,0 +1,402 @@ +import { ethers } from 'hardhat' +import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { expect } from 'chai' +import { ZERO_ADDRESS } from '#/common/constants' +import { Collateral, Implementation, IMPLEMENTATION, defaultFixture } from '../fixtures' +import { AssetPluginRegistry, TestIDeployer, VersionRegistry, DeployerMock } from '../../typechain' + +const describeP1 = IMPLEMENTATION == Implementation.P1 ? describe : describe.skip + +describeP1('Asset Plugin Registry', () => { + let owner: SignerWithAddress + let other: SignerWithAddress + + // Assets + let tokenAsset: Collateral + let usdcAsset: Collateral + let basket: Collateral[] + + // Deployers + let deployer: TestIDeployer + let deployerMockV1: DeployerMock + let deployerMockV2: DeployerMock + + // Registries + let versionRegistry: VersionRegistry + let assetPluginRegistry: AssetPluginRegistry + + beforeEach(async () => { + ;[owner, other] = await ethers.getSigners() + + // Deploy fixture + ;({ deployer, basket } = await loadFixture(defaultFixture)) + + const versionRegistryFactory = await ethers.getContractFactory('VersionRegistry') + versionRegistry = await versionRegistryFactory.deploy(await owner.getAddress()) + + const assetPluginRegistryFactory = await ethers.getContractFactory('AssetPluginRegistry') + assetPluginRegistry = await assetPluginRegistryFactory.deploy(versionRegistry.address) + + // Get assets and tokens + ;[tokenAsset, usdcAsset] = basket + + const DeployerMockFactoryV1 = await ethers.getContractFactory('DeployerMock') + deployerMockV1 = await DeployerMockFactoryV1.deploy() + + const DeployerMockFactoryV2 = await ethers.getContractFactory('DeployerMockV2') + deployerMockV2 = (await DeployerMockFactoryV2.deploy()) as DeployerMock + }) + + describe('Deployment', () => { + it('should set the owner/version registry correctly', async () => { + expect(await assetPluginRegistry.owner()).to.eq(await owner.getAddress()) + expect(await assetPluginRegistry.versionRegistry()).to.eq(versionRegistry.address) + }) + }) + + describe('Asset Plugin Management', () => { + it('Register Asset', async () => { + const versionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await tokenAsset.version()) + ) + + // Register deployment + await versionRegistry.connect(owner).registerVersion(deployer.address) + + // Register assets + expect(await assetPluginRegistry.isValidAsset(versionHash, tokenAsset.address)).to.equal( + false + ) + await expect( + assetPluginRegistry.connect(owner).registerAsset(tokenAsset.address, [versionHash]) + ) + .to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionHash, tokenAsset.address, true) + expect(await assetPluginRegistry.isValidAsset(versionHash, tokenAsset.address)).to.equal(true) + + // Registering again overrides status and enables it again (if it was disabled) + await expect( + assetPluginRegistry.connect(owner).registerAsset(tokenAsset.address, [versionHash]) + ) + .to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionHash, tokenAsset.address, true) + expect(await assetPluginRegistry.isValidAsset(versionHash, tokenAsset.address)).to.equal(true) // remains true + + // Can register multiple versions + await versionRegistry.connect(owner).registerVersion(deployerMockV1.address) + await versionRegistry.connect(owner).registerVersion(deployerMockV2.address) + const versionV1Hash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await deployerMockV1.version()) + ) + const versionV2Hash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await deployerMockV2.version()) + ) + expect(await assetPluginRegistry.isValidAsset(versionV1Hash, tokenAsset.address)).to.equal( + false + ) + expect(await assetPluginRegistry.isValidAsset(versionV2Hash, tokenAsset.address)).to.equal( + false + ) + await expect( + assetPluginRegistry + .connect(owner) + .registerAsset(tokenAsset.address, [versionV1Hash, versionV2Hash]) + ) + .to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionV1Hash, tokenAsset.address, true) + .and.to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionV2Hash, tokenAsset.address, true) + expect(await assetPluginRegistry.isValidAsset(versionV1Hash, tokenAsset.address)).to.equal( + true + ) + expect(await assetPluginRegistry.isValidAsset(versionV2Hash, tokenAsset.address)).to.equal( + true + ) + }) + + it('Denies invalid registrations', async () => { + const versionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await tokenAsset.version()) + ) + // Fails if deployment not registered + await expect( + assetPluginRegistry.connect(owner).registerAsset(tokenAsset.address, [versionHash]) + ).to.be.revertedWithCustomError(assetPluginRegistry, 'AssetPluginRegistry__InvalidVersion') + + // Register deployment + await versionRegistry.connect(owner).registerVersion(deployer.address) + + // If not owner cannot register asset + await expect( + assetPluginRegistry.connect(other).registerAsset(tokenAsset.address, [versionHash]) + ).to.be.revertedWith('Ownable: caller is not the owner') + + // Invalid registration with zero address is also rejected + await expect( + assetPluginRegistry.connect(owner).registerAsset(ZERO_ADDRESS, [versionHash]) + ).to.be.revertedWithCustomError(assetPluginRegistry, 'AssetPluginRegistry__InvalidAsset') + + // Fails if any of the versions is not registered + const versionV1Hash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await deployerMockV1.version()) + ) + await expect( + assetPluginRegistry + .connect(owner) + .registerAsset(tokenAsset.address, [versionHash, versionV1Hash]) + ).to.be.revertedWithCustomError(assetPluginRegistry, 'AssetPluginRegistry__InvalidVersion') + + expect(await assetPluginRegistry.isValidAsset(versionHash, tokenAsset.address)).to.equal( + false + ) + expect(await assetPluginRegistry.isValidAsset(versionV1Hash, tokenAsset.address)).to.equal( + false + ) + }) + + it('Updates versions by asset', async () => { + const versionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await tokenAsset.version()) + ) + const versionV1Hash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await deployerMockV1.version()) + ) + + // Register deployments + await versionRegistry.connect(owner).registerVersion(deployer.address) + await versionRegistry.connect(owner).registerVersion(deployerMockV1.address) + + // Register assets + expect(await assetPluginRegistry.isValidAsset(versionHash, tokenAsset.address)).to.equal( + false + ) + expect(await assetPluginRegistry.isValidAsset(versionV1Hash, tokenAsset.address)).to.equal( + false + ) + + await expect( + assetPluginRegistry + .connect(owner) + .updateVersionsByAsset(tokenAsset.address, [versionHash, versionV1Hash], [true, true]) + ) + .to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionHash, tokenAsset.address, true) + .and.to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionV1Hash, tokenAsset.address, true) + + expect(await assetPluginRegistry.isValidAsset(versionHash, tokenAsset.address)).to.equal(true) + expect(await assetPluginRegistry.isValidAsset(versionV1Hash, tokenAsset.address)).to.equal( + true + ) + + // Allows to override and unregister + await expect( + assetPluginRegistry + .connect(owner) + .updateVersionsByAsset(tokenAsset.address, [versionHash, versionV1Hash], [true, false]) + ) + .to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionHash, tokenAsset.address, true) + .and.to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionV1Hash, tokenAsset.address, false) + + expect(await assetPluginRegistry.isValidAsset(versionHash, tokenAsset.address)).to.equal(true) // remains true + expect(await assetPluginRegistry.isValidAsset(versionV1Hash, tokenAsset.address)).to.equal( + false + ) // unregistered + + // Set another asset + expect(await assetPluginRegistry.isValidAsset(versionHash, usdcAsset.address)).to.equal(false) + expect(await assetPluginRegistry.isValidAsset(versionV1Hash, usdcAsset.address)).to.equal( + false + ) + + await expect( + assetPluginRegistry + .connect(owner) + .updateVersionsByAsset(usdcAsset.address, [versionHash, versionV1Hash], [true, true]) + ) + .to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionHash, usdcAsset.address, true) + .and.to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionV1Hash, usdcAsset.address, true) + + expect(await assetPluginRegistry.isValidAsset(versionHash, usdcAsset.address)).to.equal(true) + expect(await assetPluginRegistry.isValidAsset(versionV1Hash, usdcAsset.address)).to.equal( + true + ) + }) + + it('Denies invalid updates (version by asset)', async () => { + const versionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await tokenAsset.version()) + ) + + // Checks valid lengths + await expect( + assetPluginRegistry.updateVersionsByAsset(tokenAsset.address, [versionHash], [true, true]) + ).to.be.revertedWithCustomError(assetPluginRegistry, 'AssetPluginRegistry__LengthMismatch') + + // Invalid registration with zero address is also rejected + await expect( + assetPluginRegistry + .connect(owner) + .updateVersionsByAsset(ZERO_ADDRESS, [versionHash], [true]) + ).to.be.revertedWithCustomError(assetPluginRegistry, 'AssetPluginRegistry__InvalidAsset') + + // Fails if deployment not registered + await expect( + assetPluginRegistry + .connect(owner) + .updateVersionsByAsset(tokenAsset.address, [versionHash], [true]) + ).to.be.revertedWithCustomError(assetPluginRegistry, 'AssetPluginRegistry__InvalidVersion') + + // Register deployment + await versionRegistry.connect(owner).registerVersion(deployer.address) + + // If not owner cannot update + await expect( + assetPluginRegistry + .connect(other) + .updateVersionsByAsset(tokenAsset.address, [versionHash], [true]) + ).to.be.revertedWith('Ownable: caller is not the owner') + + // Fails if any of the versions is not registered + const versionV1Hash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await deployerMockV1.version()) + ) + await expect( + assetPluginRegistry + .connect(owner) + .updateVersionsByAsset(tokenAsset.address, [versionHash, versionV1Hash], [true, true]) + ).to.be.revertedWithCustomError(assetPluginRegistry, 'AssetPluginRegistry__InvalidVersion') + + expect(await assetPluginRegistry.isValidAsset(versionHash, tokenAsset.address)).to.equal( + false + ) + expect(await assetPluginRegistry.isValidAsset(versionV1Hash, tokenAsset.address)).to.equal( + false + ) + }) + + it('Update assets by version', async () => { + const versionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await tokenAsset.version()) + ) + + // Register deployments + await versionRegistry.connect(owner).registerVersion(deployer.address) + await versionRegistry.connect(owner).registerVersion(deployerMockV1.address) + + // Register assets + expect(await assetPluginRegistry.isValidAsset(versionHash, tokenAsset.address)).to.equal( + false + ) + expect(await assetPluginRegistry.isValidAsset(versionHash, usdcAsset.address)).to.equal(false) + + await expect( + assetPluginRegistry + .connect(owner) + .updateAssetsByVersion(versionHash, [tokenAsset.address, usdcAsset.address], [true, true]) + ) + .to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionHash, tokenAsset.address, true) + .and.to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionHash, usdcAsset.address, true) + + expect(await assetPluginRegistry.isValidAsset(versionHash, tokenAsset.address)).to.equal(true) + expect(await assetPluginRegistry.isValidAsset(versionHash, usdcAsset.address)).to.equal(true) + + // Allows to override and unregister + await expect( + assetPluginRegistry + .connect(owner) + .updateAssetsByVersion( + versionHash, + [tokenAsset.address, usdcAsset.address], + [true, false] + ) + ) + .to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionHash, tokenAsset.address, true) + .and.to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionHash, usdcAsset.address, false) + + expect(await assetPluginRegistry.isValidAsset(versionHash, tokenAsset.address)).to.equal(true) // remains true + expect(await assetPluginRegistry.isValidAsset(versionHash, usdcAsset.address)).to.equal(false) // unregistered + + // Set another version + const versionV1Hash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await deployerMockV1.version()) + ) + + expect(await assetPluginRegistry.isValidAsset(versionV1Hash, tokenAsset.address)).to.equal( + false + ) + expect(await assetPluginRegistry.isValidAsset(versionV1Hash, usdcAsset.address)).to.equal( + false + ) + + await expect( + assetPluginRegistry + .connect(owner) + .updateAssetsByVersion( + versionV1Hash, + [tokenAsset.address, usdcAsset.address], + [true, true] + ) + ) + .to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionV1Hash, tokenAsset.address, true) + .and.to.emit(assetPluginRegistry, 'AssetPluginRegistryUpdated') + .withArgs(versionV1Hash, usdcAsset.address, true) + + expect(await assetPluginRegistry.isValidAsset(versionV1Hash, tokenAsset.address)).to.equal( + true + ) + expect(await assetPluginRegistry.isValidAsset(versionV1Hash, usdcAsset.address)).to.equal( + true + ) + }) + + it('Denies invalid updates (asset by version)', async () => { + const versionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await tokenAsset.version()) + ) + + // Checks valid lengths + await expect( + assetPluginRegistry.updateAssetsByVersion(versionHash, [tokenAsset.address], [true, true]) + ).to.be.revertedWithCustomError(assetPluginRegistry, 'AssetPluginRegistry__LengthMismatch') + + // Fails if deployment not registered + await expect( + assetPluginRegistry + .connect(owner) + .updateAssetsByVersion(versionHash, [tokenAsset.address], [true]) + ).to.be.revertedWithCustomError(assetPluginRegistry, 'AssetPluginRegistry__InvalidVersion') + + // Register deployment + await versionRegistry.connect(owner).registerVersion(deployer.address) + + // If not owner cannot update + await expect( + assetPluginRegistry + .connect(other) + .updateAssetsByVersion(versionHash, [tokenAsset.address], [true]) + ).to.be.revertedWith('Ownable: caller is not the owner') + + // Fails if any of the assets is zero address + await expect( + assetPluginRegistry + .connect(owner) + .updateAssetsByVersion(versionHash, [tokenAsset.address, ZERO_ADDRESS], [true, true]) + ).to.be.revertedWithCustomError(assetPluginRegistry, 'AssetPluginRegistry__InvalidAsset') + + expect(await assetPluginRegistry.isValidAsset(versionHash, tokenAsset.address)).to.equal( + false + ) + }) + }) +}) diff --git a/test/registries/DAOFeeRegistry.test.ts b/test/registries/DAOFeeRegistry.test.ts new file mode 100644 index 0000000000..4a75c0c77c --- /dev/null +++ b/test/registries/DAOFeeRegistry.test.ts @@ -0,0 +1,217 @@ +import { ethers } from 'hardhat' +import { bn } from '#/common/numbers' +import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { expect } from 'chai' +import { ZERO_ADDRESS } from '#/common/constants' +import { Implementation, IMPLEMENTATION, defaultFixture } from '../fixtures' +import { whileImpersonating } from '../utils/impersonation' +import { + DAOFeeRegistry, + ERC20Mock, + TestIDistributor, + TestIRevenueTrader, + TestIMain, + IRToken, +} from '../../typechain' + +const describeP1 = IMPLEMENTATION == Implementation.P1 ? describe : describe.skip + +describeP1('DAO Fee Registry', () => { + let owner: SignerWithAddress + let other: SignerWithAddress + + let distributor: TestIDistributor + let main: TestIMain + let rToken: IRToken + let rsr: ERC20Mock + let rsrTrader: TestIRevenueTrader + + let feeRegistry: DAOFeeRegistry + + beforeEach(async () => { + ;[owner, other] = await ethers.getSigners() + + // Deploy fixture + ;({ distributor, main, rToken, rsr, rsrTrader } = await loadFixture(defaultFixture)) + + const DAOFeeRegistryFactory = await ethers.getContractFactory('DAOFeeRegistry') + feeRegistry = await DAOFeeRegistryFactory.connect(owner).deploy(await owner.getAddress()) + await main.connect(owner).setDAOFeeRegistry(feeRegistry.address) + }) + + describe('Deployment', () => { + it('should set the owner correctly', async () => { + expect(await feeRegistry.owner()).to.eq(await owner.getAddress()) + }) + it('fee should begin zero and assigned to owner', async () => { + const feeDetails = await feeRegistry.getFeeDetails(rToken.address) + expect(feeDetails.recipient).to.equal(owner.address) + expect(feeDetails.feeNumerator).to.equal(0) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + }) + }) + + describe('Ownership', () => { + it('Should be able to change owner', async () => { + expect(await feeRegistry.owner()).to.eq(await owner.getAddress()) + await feeRegistry.connect(owner).transferOwnership(other.address) + expect(await feeRegistry.owner()).to.eq(await other.getAddress()) + await expect(feeRegistry.connect(owner).setFeeRecipient(owner.address)).to.be.revertedWith( + 'Ownable: caller is not the owner' + ) + await expect(feeRegistry.connect(owner).setDefaultFeeNumerator(bn('100'))).to.be.revertedWith( + 'Ownable: caller is not the owner' + ) + await expect( + feeRegistry.connect(owner).setRTokenFeeNumerator(rToken.address, bn('100')) + ).to.be.revertedWith('Ownable: caller is not the owner') + }) + }) + + describe('Negative cases', () => { + it('Should not allow calling setters by anyone other than owner', async () => { + await expect(feeRegistry.connect(other).setFeeRecipient(owner.address)).to.be.revertedWith( + 'Ownable: caller is not the owner' + ) + await expect(feeRegistry.connect(other).setDefaultFeeNumerator(bn('100'))).to.be.revertedWith( + 'Ownable: caller is not the owner' + ) + await expect( + feeRegistry.connect(other).setRTokenFeeNumerator(rToken.address, bn('100')) + ).to.be.revertedWith('Ownable: caller is not the owner') + await expect(feeRegistry.connect(other).resetRTokenFee(rToken.address)).to.be.revertedWith( + 'Ownable: caller is not the owner' + ) + }) + + it('Should not allow setting fee recipient to zero address', async () => { + await expect( + feeRegistry.connect(owner).setFeeRecipient(ZERO_ADDRESS) + ).to.be.revertedWithCustomError(feeRegistry, 'DAOFeeRegistry__InvalidFeeRecipient') + }) + + it('Should not allow setting fee recipient twice', async () => { + await expect( + feeRegistry.connect(owner).setFeeRecipient(owner.address) + ).to.be.revertedWithCustomError(feeRegistry, 'DAOFeeRegistry__FeeRecipientAlreadySet') + }) + + it('Should not allow fee numerator above max fee numerator', async () => { + await expect( + feeRegistry.connect(owner).setDefaultFeeNumerator(bn('15e2').add(1)) + ).to.be.revertedWithCustomError(feeRegistry, 'DAOFeeRegistry__InvalidFeeNumerator') + await expect( + feeRegistry.connect(owner).setDefaultFeeNumerator(bn('2').pow(256).sub(1)) + ).to.be.revertedWithCustomError(feeRegistry, 'DAOFeeRegistry__InvalidFeeNumerator') + }) + }) + + describe('Fee Management', () => { + const defaultFees = [bn('0'), bn('1e3'), bn('15e2')] // test 3 fees: 0%, 10%, 15% + for (const defaultFee of defaultFees) { + context(`Default Fee: ${defaultFee.div(100).toString()}%`, () => { + beforeEach(async () => { + await expect(feeRegistry.connect(owner).setDefaultFeeNumerator(defaultFee)) + .to.emit(feeRegistry, 'DefaultFeeNumeratorSet') + .withArgs(defaultFee) + }) + + it('Should handle complex sequence of fee setting and unsetting', async () => { + // Should start out as expected + let feeDetails = await feeRegistry.getFeeDetails(rToken.address) + expect(feeDetails.recipient).to.equal(owner.address) + expect(feeDetails.feeNumerator).to.equal(defaultFee) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + feeDetails = await feeRegistry.getFeeDetails(other.address) + expect(feeDetails.recipient).to.equal(owner.address) + expect(feeDetails.feeNumerator).to.equal(defaultFee) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + + // Should be able to set precise fee for specific rToken while keeping recipient + await expect(feeRegistry.connect(owner).setRTokenFeeNumerator(rToken.address, bn('1e3'))) + .to.emit(feeRegistry, 'RTokenFeeNumeratorSet') + .withArgs(rToken.address, bn('1e3'), true) + feeDetails = await feeRegistry.getFeeDetails(rToken.address) + expect(feeDetails.recipient).to.equal(owner.address) + expect(feeDetails.feeNumerator).to.equal(bn('1e3')) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + feeDetails = await feeRegistry.getFeeDetails(other.address) + expect(feeDetails.recipient).to.equal(owner.address) + expect(feeDetails.feeNumerator).to.equal(defaultFee) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + + // Should be able to change fee recipient while keeping precise fee + await feeRegistry.setFeeRecipient(other.address) + feeDetails = await feeRegistry.getFeeDetails(rToken.address) + expect(feeDetails.recipient).to.equal(other.address) + expect(feeDetails.feeNumerator).to.equal(bn('1e3')) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + feeDetails = await feeRegistry.getFeeDetails(other.address) + expect(feeDetails.recipient).to.equal(other.address) + expect(feeDetails.feeNumerator).to.equal(defaultFee) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + + // Should be able to set fee to 0 + await feeRegistry.setRTokenFeeNumerator(rToken.address, 0) + feeDetails = await feeRegistry.getFeeDetails(rToken.address) + expect(feeDetails.recipient).to.equal(other.address) + expect(feeDetails.feeNumerator).to.equal(0) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + feeDetails = await feeRegistry.getFeeDetails(other.address) + expect(feeDetails.recipient).to.equal(other.address) + expect(feeDetails.feeNumerator).to.equal(defaultFee) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + + // Should be able to resetFee to use default fee + await expect(feeRegistry.resetRTokenFee(rToken.address)) + .to.emit(feeRegistry, 'RTokenFeeNumeratorSet') + .withArgs(rToken.address, 0, false) + feeDetails = await feeRegistry.getFeeDetails(rToken.address) + expect(feeDetails.recipient).to.equal(other.address) + expect(feeDetails.feeNumerator).to.equal(defaultFee) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + feeDetails = await feeRegistry.getFeeDetails(other.address) + expect(feeDetails.recipient).to.equal(other.address) + expect(feeDetails.feeNumerator).to.equal(defaultFee) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + + // Should be able to change default fee and update everyone + await feeRegistry.setDefaultFeeNumerator(bn('5e2')) // 5% + feeDetails = await feeRegistry.getFeeDetails(rToken.address) + expect(feeDetails.recipient).to.equal(other.address) + expect(feeDetails.feeNumerator).to.equal(bn('5e2')) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + feeDetails = await feeRegistry.getFeeDetails(other.address) + expect(feeDetails.recipient).to.equal(other.address) + expect(feeDetails.feeNumerator).to.equal(bn('5e2')) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + }) + + if (defaultFee.gt(0)) { + it('Distributor distributions should reflect the fee', async () => { + // Check setup + const feeDetails = await feeRegistry.getFeeDetails(rToken.address) + expect(feeDetails.recipient).to.equal(owner.address) + expect(feeDetails.feeNumerator).to.equal(defaultFee) + expect(feeDetails.feeDenominator).to.equal(bn('1e4')) + expect(await rsr.balanceOf(rsrTrader.address)).to.equal(0) + + // Distribute 1m RSR + const amt = bn('1e24') + await rsr.mint(rsrTrader.address, amt) + await whileImpersonating(rsrTrader.address, async (signer) => { + await rsr.connect(signer).approve(distributor.address, amt) + expect(await rsr.balanceOf(owner.address)).to.equal(0) + await distributor.connect(signer).distribute(rsr.address, amt) + + // Expected returned amount is for the fee times 5/3 to account for rev share split + const expectedAmt = amt.mul(defaultFee).div(bn('1e4')).mul(5).div(3) + expect(await rsr.balanceOf(owner.address)).to.equal(expectedAmt) + }) + }) + } + }) + } + }) +}) diff --git a/test/registries/VersionRegistry.test.ts b/test/registries/VersionRegistry.test.ts new file mode 100644 index 0000000000..9edfc493d7 --- /dev/null +++ b/test/registries/VersionRegistry.test.ts @@ -0,0 +1,134 @@ +import { ethers } from 'hardhat' +import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { expect } from 'chai' +import { ONE_ADDRESS, ZERO_ADDRESS, ZERO_BYTES } from '#/common/constants' +import { IImplementations } from '#/common/configuration' +import { DeployerMock, TestIDeployer, VersionRegistry } from '../../typechain' +import { Implementation, IMPLEMENTATION, defaultFixture } from '../fixtures' + +const describeP1 = IMPLEMENTATION == Implementation.P1 ? describe : describe.skip + +describeP1('Version Registry', () => { + let versionRegistry: VersionRegistry + let deployer: TestIDeployer + let deployerMockV1: DeployerMock + let deployerMockV2: DeployerMock + let owner: SignerWithAddress + let other: SignerWithAddress + + beforeEach(async () => { + ;[owner, other] = await ethers.getSigners() + ;({ deployer } = await loadFixture(defaultFixture)) + + const versionRegistryFactory = await ethers.getContractFactory('VersionRegistry') + versionRegistry = await versionRegistryFactory.deploy(await owner.getAddress()) + + const DeployerMockFactoryV1 = await ethers.getContractFactory('DeployerMock') + deployerMockV1 = await DeployerMockFactoryV1.deploy() + + const DeployerMockFactoryV2 = await ethers.getContractFactory('DeployerMockV2') + deployerMockV2 = await DeployerMockFactoryV2.deploy() + }) + + describe('Deployment', () => { + it('should set the owner to the specified address', async () => { + expect(await versionRegistry.owner()).to.eq(await owner.getAddress()) + }) + }) + + describe('Version Management', () => { + beforeEach(async () => { + await versionRegistry.connect(owner).registerVersion(deployerMockV1.address) + }) + + it('Registered version correctly', async () => { + const versionData = await versionRegistry.getLatestVersion() + + expect(versionData.versionHash).not.be.eq(ZERO_BYTES) + expect(versionData.deprecated).be.eq(false) + + const expectedVersionHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('V1')) + expect(versionData.versionHash).to.eq(expectedVersionHash) + expect(await versionRegistry.deployments(expectedVersionHash)).to.not.equal(ZERO_ADDRESS) + expect(await versionRegistry.deployments(expectedVersionHash)).to.equal( + deployerMockV1.address + ) + }) + + it('Denies Duplicate and Invalid Registration', async () => { + // If not owner, should be rejected + await expect( + versionRegistry.connect(other).registerVersion(deployer.address) + ).to.be.revertedWith('Ownable: caller is not the owner') + + // Same version, different deployer, should be rejected. + const DeployerMockFactory = await ethers.getContractFactory('DeployerMock') + const deployerMockDup = await DeployerMockFactory.deploy() + await expect( + versionRegistry.connect(owner).registerVersion(deployerMockDup.address) + ).to.be.revertedWithCustomError(versionRegistry, 'VersionRegistry__InvalidRegistration') + + // Invalid registration with zero address is also rejected + await expect( + versionRegistry.connect(owner).registerVersion(ZERO_ADDRESS) + ).to.be.revertedWithCustomError(versionRegistry, 'VersionRegistry__ZeroAddress') + }) + + it('Handles multiple versions', async () => { + const initialVersionData = await versionRegistry.getLatestVersion() + + // Register new version + const expectedV2Hash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('V2')) + await expect(versionRegistry.connect(owner).registerVersion(deployerMockV2.address)) + .to.emit(versionRegistry, 'VersionRegistered') + .withArgs(expectedV2Hash, deployerMockV2.address) + + // Check V2 properly registered + const v2VersionData = await versionRegistry.getLatestVersion() + expect(v2VersionData.versionHash).to.eq(expectedV2Hash) + expect(v2VersionData.versionHash).not.be.eq(ZERO_BYTES) + expect(v2VersionData.deprecated).be.eq(false) + expect(await versionRegistry.deployments(expectedV2Hash)).to.not.equal(ZERO_ADDRESS) + expect(await versionRegistry.deployments(expectedV2Hash)).to.equal(deployerMockV2.address) + + // Original deployment still registered + expect(await versionRegistry.deployments(initialVersionData.versionHash)).to.equal( + deployerMockV1.address + ) + + // Can also register the fixture version (4.0.0 or later for example) + const expectedDeployerFixtureHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await deployer.version()) + ) + await expect(versionRegistry.connect(owner).registerVersion(deployer.address)) + .to.emit(versionRegistry, 'VersionRegistered') + .withArgs(expectedDeployerFixtureHash, deployer.address) + }) + + it('Deprecate Version', async () => { + let versionData = await versionRegistry.getLatestVersion() + + await expect(versionRegistry.connect(owner).deprecateVersion(versionData.versionHash)) + .to.emit(versionRegistry, 'VersionDeprecated') + .withArgs(versionData.versionHash) + versionData = await versionRegistry.getLatestVersion() + + expect(versionData.versionHash).not.be.eq(ZERO_BYTES) + expect(versionData.deprecated).be.eq(true) + + // Cannot deprecate again + await expect( + versionRegistry.connect(owner).deprecateVersion(versionData.versionHash) + ).to.be.revertedWithCustomError(versionRegistry, 'VersionRegistry__AlreadyDeprecated') + }) + + it('Returns implementations correctly', async () => { + const versionData = await versionRegistry.getLatestVersion() + const implementations: IImplementations = await versionRegistry.getImplementationForVersion( + versionData.versionHash + ) + expect(implementations.main).to.eq(ONE_ADDRESS) + }) + }) +}) diff --git a/test/scenario/ComplexBasket.test.ts b/test/scenario/ComplexBasket.test.ts index a14028e444..f3924355e7 100644 --- a/test/scenario/ComplexBasket.test.ts +++ b/test/scenario/ComplexBasket.test.ts @@ -27,7 +27,7 @@ import { TestIStRSR, TestIDistributor, } from '../../typechain' -import { withinQuad } from '../utils/matchers' +import { withinTolerance } from '../utils/matchers' import { advanceTime, getLatestBlockTimestamp } from '../utils/time' import { Collateral, @@ -535,17 +535,18 @@ describe(`Complex Basket - P${IMPLEMENTATION}`, () => { await expect( distributor .connect(owner) - .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) + .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(10000) }) ) .to.emit(distributor, 'DistributionSet') - .withArgs(FURNACE_DEST, bn(0), bn(0)) + .withArgs(STRSR_DEST, bn(0), bn(10000)) - // Avoid dropping qCOMP by making there be exactly 1 distribution share. await expect( - distributor.connect(owner).setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(1) }) + distributor + .connect(owner) + .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) ) .to.emit(distributor, 'DistributionSet') - .withArgs(STRSR_DEST, bn(0), bn(1)) + .withArgs(FURNACE_DEST, bn(0), bn(0)) // COMP Rewards await compoundMock.setRewards(backingManager.address, rewardAmount) @@ -642,7 +643,7 @@ describe(`Complex Basket - P${IMPLEMENTATION}`, () => { // Check balances sent to corresponding destinations // StRSR - expect(await rsr.balanceOf(stRSR.address)).to.equal(minBuyAmt) + expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(minBuyAmt, 10000) // Furnace expect(await rToken.balanceOf(furnace.address)).to.equal(0) }) @@ -1146,7 +1147,7 @@ describe(`Complex Basket - P${IMPLEMENTATION}`, () => { // Check destinations at this stage - RSR and RTokens already in StRSR and Furnace expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo( auctionbuyAmt2.add(auctionbuyAmt5), - bn('50') + bn('10000') ) expect(await rToken.balanceOf(furnace.address)).to.be.closeTo( auctionbuyAmtRToken2.add(auctionbuyAmtRToken5), @@ -1266,7 +1267,7 @@ describe(`Complex Basket - P${IMPLEMENTATION}`, () => { // Check destinations at this stage - RSR and RTokens already in StRSR and Furnace expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo( auctionbuyAmt2.add(auctionbuyAmt5).add(auctionbuyAmt7), - bn('10') + bn('10000') ) expect(await rToken.balanceOf(furnace.address)).to.be.closeTo( auctionbuyAmtRToken2.add(auctionbuyAmtRToken5).add(auctionbuyAmtRToken7), @@ -1423,8 +1424,8 @@ describe(`Complex Basket - P${IMPLEMENTATION}`, () => { anyValue, rsr.address, wbtc.address, - withinQuad(sellAmtRSR), - withinQuad(buyAmtBidRSR), + withinTolerance(sellAmtRSR), + withinTolerance(buyAmtBidRSR), ], emitted: true, }, @@ -1481,7 +1482,7 @@ describe(`Complex Basket - P${IMPLEMENTATION}`, () => { rsr.address, wbtc.address, auctionSellAmtRSR, - withinQuad(auctionBuyAmtRSR), + withinTolerance(auctionBuyAmtRSR), ], emitted: true, }, @@ -1593,7 +1594,13 @@ describe(`Complex Basket - P${IMPLEMENTATION}`, () => { { contract: backingManager, name: 'TradeStarted', - args: [anyValue, cETH.address, weth.address, withinQuad(sellAmt), withinQuad(minBuyAmt)], + args: [ + anyValue, + cETH.address, + weth.address, + withinTolerance(sellAmt), + withinTolerance(minBuyAmt), + ], emitted: true, }, ]) @@ -1656,8 +1663,8 @@ describe(`Complex Basket - P${IMPLEMENTATION}`, () => { anyValue, cETH.address, weth.address, - withinQuad(sellAmtRemainder), - withinQuad(minBuyAmtRemainder), + withinTolerance(sellAmtRemainder), + withinTolerance(minBuyAmtRemainder), ], emitted: true, }, @@ -1821,8 +1828,8 @@ describe(`Complex Basket - P${IMPLEMENTATION}`, () => { anyValue, rsr.address, weth.address, - withinQuad(sellAmtRSR2), - withinQuad(buyAmtRSR2), + withinTolerance(sellAmtRSR2), + withinTolerance(buyAmtRSR2), ], emitted: true, }, diff --git a/test/scenario/NestedRTokens.test.ts b/test/scenario/NestedRTokens.test.ts index 6386b158fd..eff96b200d 100644 --- a/test/scenario/NestedRTokens.test.ts +++ b/test/scenario/NestedRTokens.test.ts @@ -6,7 +6,7 @@ import { ethers } from 'hardhat' import { BigNumber } from 'ethers' import { ONE_PERIOD, ZERO_ADDRESS, CollateralStatus, TradeKind } from '../../common/constants' import { bn, fp } from '../../common/numbers' -import { withinQuad } from '../utils/matchers' +import { withinTolerance } from '../utils/matchers' import { toSellAmt, toMinBuyAmt } from '../utils/trades' import { expectRTokenPrice, setOraclePrice } from '../utils/oracles' import { advanceTime } from '../utils/time' @@ -232,8 +232,8 @@ describe(`Nested RTokens - P${IMPLEMENTATION}`, () => { anyValue, one.rsr.address, staticATokenERC20.address, - withinQuad(sellAmt), - withinQuad(buyAmt) + withinTolerance(sellAmt), + withinTolerance(buyAmt) ) // Verify outer RToken isn't panicking @@ -358,15 +358,15 @@ describe(`Nested RTokens - P${IMPLEMENTATION}`, () => { await one.assetRegistry.refresh() await two.assetRegistry.refresh() - const rTokSellAmt = issueAmt.div(2).mul(2).div(5).sub(40) - const rsrSellAmt = issueAmt.div(2).mul(3).div(5).sub(60) + const rTokSellAmt = issueAmt.div(2).mul(2).div(5).sub(4000) + const rsrSellAmt = issueAmt.div(2).mul(3).div(5).sub(6000) const rsrMinBuyAmt = toMinBuyAmt( rsrSellAmt, fp('1'), fp('1'), ORACLE_ERROR, await one.backingManager.maxTradeSlippage() - ).add(1) + ) expect(await staticATokenERC20.balanceOf(one.backingManager.address)).to.equal(issueAmt) // Note the inner RToken mints internally since it has excess backing @@ -386,13 +386,7 @@ describe(`Nested RTokens - P${IMPLEMENTATION}`, () => { { contract: one.rsrTrader, name: 'TradeStarted', - args: [ - anyValue, - one.rToken.address, - one.rsr.address, - rsrSellAmt, - rsrMinBuyAmt, //rsrSellAmt.mul(99).div(100).add(31), - ], + args: [anyValue, one.rToken.address, one.rsr.address, rsrSellAmt, rsrMinBuyAmt], emitted: true, }, ]) diff --git a/test/utils/matchers.ts b/test/utils/matchers.ts index 51fe4a97e8..5e2a11f901 100644 --- a/test/utils/matchers.ts +++ b/test/utils/matchers.ts @@ -3,9 +3,9 @@ import { expect } from 'chai' import { bn } from '../../common/numbers' // Creates a chai matcher that returns true if y is within a quadrillion of x -export const withinQuad = (x: BigNumber): ((y: BigNumber) => boolean) => { +export const withinTolerance = (x: BigNumber): ((y: BigNumber) => boolean) => { return (y: BigNumber) => { - const tolerance = x.div(bn('1e15')) + const tolerance = x.div(bn('1e13')) const lower = x.sub(tolerance) const higher = x.add(tolerance) return y.gte(lower) && y.lte(higher) From e135fabf699a44b2898d9555149521e121a2a645 Mon Sep 17 00:00:00 2001 From: "Julian M. Rodriguez" <56316686+julianmrodri@users.noreply.github.com> Date: Wed, 12 Jun 2024 13:41:29 -0300 Subject: [PATCH 04/72] Reset fork on every plugin test (#1155) Co-authored-by: Akshat Mittal Co-authored-by: Taylor Brent --- .github/workflows/tests.yml | 33 +++++++++++++++++-- test/Broker.test.ts | 7 ++-- .../individual-collateral/collateralTests.ts | 7 ++-- ...> StargateETHTestSuite.test.ts_DEPRECATED} | 2 -- ... StargateUSDCTestSuite.test.ts_DEPRECATED} | 3 +- 5 files changed, 38 insertions(+), 14 deletions(-) rename test/plugins/individual-collateral/stargate/{StargateETHTestSuite.test.ts => StargateETHTestSuite.test.ts_DEPRECATED} (98%) rename test/plugins/individual-collateral/stargate/{StargateUSDCTestSuite.test.ts => StargateUSDCTestSuite.test.ts_DEPRECATED} (99%) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 92dc1ec4b4..5479cbbec9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -57,7 +57,7 @@ jobs: - run: yarn test:plugins plugin-tests-mainnet-1: - name: 'Plugin Integration Tests (Mainnet) - 1/2' + name: 'Plugin Integration Tests (Mainnet) - 1/3' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -84,7 +84,7 @@ jobs: FORK: 1 plugin-tests-mainnet-2: - name: 'Plugin Integration Tests (Mainnet) - 2/2' + name: 'Plugin Integration Tests (Mainnet) - 2/3' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -101,7 +101,34 @@ jobs: restore-keys: | hardhat-network-fork-${{ runner.os }}- hardhat-network-fork- - - run: yarn hardhat test ./test/plugins/individual-collateral/[D-Zd-z]*/*.test.ts + - run: yarn hardhat test ./test/plugins/individual-collateral/[D-Ld-l]*/*.test.ts + env: + NODE_OPTIONS: '--max-old-space-size=32768' + TS_NODE_SKIP_IGNORE: true + MAINNET_RPC_URL: https://eth-mainnet.alchemyapi.io/v2/${{ secrets.ALCHEMY_MAINNET_KEY }} + FORK_NETWORK: mainnet + PROTO_IMPL: 1 + FORK: 1 + + plugin-tests-mainnet-3: + name: 'Plugin Integration Tests (Mainnet) - 3/3' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16.x + cache: 'yarn' + - run: yarn install --immutable + - name: 'Cache hardhat network fork' + uses: actions/cache@v3 + with: + path: cache/hardhat-network-fork + key: hardhat-network-fork-${{ runner.os }}-${{ hashFiles('test/integration/fork-block-numbers.ts') }} + restore-keys: | + hardhat-network-fork-${{ runner.os }}- + hardhat-network-fork- + - run: yarn hardhat test ./test/plugins/individual-collateral/[M-Zm-z]*/*.test.ts env: NODE_OPTIONS: '--max-old-space-size=32768' TS_NODE_SKIP_IGNORE: true diff --git a/test/Broker.test.ts b/test/Broker.test.ts index 92a104c404..9ebcd98888 100644 --- a/test/Broker.test.ts +++ b/test/Broker.test.ts @@ -1524,7 +1524,7 @@ describe(`BrokerP${IMPLEMENTATION} contract #fast`, () => { const bidTypes = [bn(BidType.CALLBACK), bn(BidType.TRANSFER)] // applied to both buy and sell tokens - const decimals = [bn('1'), bn('6'), bn('8'), bn('9'), bn('18'), bn('21'), bn('27')] + const decimals = [bn('1'), bn('6'), bn('18'), bn('27')] // auction sell amount const auctionSellAmts = [bn('2'), bn('1595439874635'), bn('987321984732198435645846513')] @@ -1532,12 +1532,13 @@ describe(`BrokerP${IMPLEMENTATION} contract #fast`, () => { // auction progression %: these will get rounded to blocks later const progression = [fp('0'), fp('0.321698432589749813'), fp('0.798138321987329646'), fp('1')] - // total cases is 5 * 5 * 3 * 4 = 300 + // total cases is 2 * 4 * 4 * 3 * 4 = 384 if (SLOW) { + decimals.push(bn('8'), bn('9'), bn('21')) progression.push(fp('0.176334768961354965'), fp('0.523449931646439834')) - // total cases is 5 * 5 * 3 * 6 = 450 + // total cases is 2 * 7 * 7 * 3 * 6 = 1764 } const paramList = cartesianProduct(bidTypes, decimals, decimals, auctionSellAmts, progression) diff --git a/test/plugins/individual-collateral/collateralTests.ts b/test/plugins/individual-collateral/collateralTests.ts index 45b6a11713..8dbce3ee93 100644 --- a/test/plugins/individual-collateral/collateralTests.ts +++ b/test/plugins/individual-collateral/collateralTests.ts @@ -163,6 +163,7 @@ export default function fn( }) beforeEach(async () => { + await resetFork() ;[, alice] = await ethers.getSigners() ctx = await loadFixture(makeCollateralFixtureContext(alice, {})) ;({ chainlinkFeed, collateral } = ctx) @@ -211,8 +212,6 @@ export default function fn( }) describe('prices', () => { - before(resetFork) // important for getting prices/refPerToks to behave predictably - it('enters IFFY state when price becomes stale', async () => { const decayDelay = (await collateral.maxOracleTimeout()) + ORACLE_TIMEOUT_BUFFER await advanceToTimestamp((await getLatestBlockTimestamp()) + decayDelay) @@ -360,7 +359,7 @@ export default function fn( itHasRevenueHiding('does revenue hiding correctly', async () => { const tempCtx = await makeCollateralFixtureContext(alice, { erc20: ctx.tok.address, - revenueHiding: fp('0.01'), + revenueHiding: fp('0.0101'), })() // ctx.collateral = await deployCollateral() @@ -448,8 +447,6 @@ export default function fn( }) describe('status', () => { - before(resetFork) - it('maintains status in normal situations', async () => { // Check initial state expect(await collateral.status()).to.equal(CollateralStatus.SOUND) diff --git a/test/plugins/individual-collateral/stargate/StargateETHTestSuite.test.ts b/test/plugins/individual-collateral/stargate/StargateETHTestSuite.test.ts_DEPRECATED similarity index 98% rename from test/plugins/individual-collateral/stargate/StargateETHTestSuite.test.ts rename to test/plugins/individual-collateral/stargate/StargateETHTestSuite.test.ts_DEPRECATED index dfe30a4deb..b06b686bf5 100644 --- a/test/plugins/individual-collateral/stargate/StargateETHTestSuite.test.ts +++ b/test/plugins/individual-collateral/stargate/StargateETHTestSuite.test.ts_DEPRECATED @@ -1,4 +1,3 @@ -/** DEPRECATED import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' import collateralTests from '../collateralTests' import { ETH_USD_PRICE_FEED } from './constants' @@ -27,4 +26,3 @@ const volatileOpts = { } collateralTests(volatileOpts) -*/ diff --git a/test/plugins/individual-collateral/stargate/StargateUSDCTestSuite.test.ts b/test/plugins/individual-collateral/stargate/StargateUSDCTestSuite.test.ts_DEPRECATED similarity index 99% rename from test/plugins/individual-collateral/stargate/StargateUSDCTestSuite.test.ts rename to test/plugins/individual-collateral/stargate/StargateUSDCTestSuite.test.ts_DEPRECATED index 1968edfe85..009ffdf1a8 100644 --- a/test/plugins/individual-collateral/stargate/StargateUSDCTestSuite.test.ts +++ b/test/plugins/individual-collateral/stargate/StargateUSDCTestSuite.test.ts_DEPRECATED @@ -201,6 +201,7 @@ const mintCollateralTo: MintCollateralFunc = a await ctx.pool.connect(router).mint(user.address, amount) }) await ctx.pool.connect(user).approve(ctx.wpool.address, ethers.constants.MaxUint256) + await ctx.wpool.connect(user).deposit(amount, user.address) await ctx.wpool.connect(user).transfer(recipient, amount) if (ctx.pool.address != SUSDC) { @@ -259,7 +260,7 @@ const increaseTargetPerRef = async ( } const beforeEachRewardsTest = async (ctx: StargateCollateralFixtureContext) => { - // switch to propoer network rewards setup + // switch to proper network rewards setup const stargate = await ethers.getContractAt('ERC20Mock', STARGATE) const stakingContract = ( From 718b22de0ab7b94bd2e11f89282d38a84334c3c5 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Wed, 12 Jun 2024 14:46:47 -0400 Subject: [PATCH 05/72] CHANGELOG --- CHANGELOG.md | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a45c3e58dc..62146ba19e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,9 @@ # 4.0.0 -TODO +This release prepares the core protocol for veRSR through the introduction of 3 registries (`DAOFeeRegistry`, `AssetPluginRegistry`, and `VersionRegistry`) and through restricting component upgrades to be handled by `Main`, where upgrade constraints can be enforced. + +The release also expands collateral decimal support from 18 to 27. ## Upgrade Steps @@ -12,9 +14,37 @@ Make sure distributor table sums to >10000. ## Core Protocol Contracts +- `AssetRegistry` + - Prevent registering assets that are not in the `AssetPluginRegistry` + - Add `validateCurrentAssets() view` +- `Broker` + - Make setters only callable by `Main` - `Distributor` - - Breaking change: Remove `setDistribution()` in favor of `setDistributions()` - - New Invariant: Table must sum to >=10000 for precision reasons + - Add `setDistributions()` function to parallel `setDistribution()` + - Take DAO fee out account in `distribute()` and `totals()` + - Add new revenue share table invariant: must sum to >=10000 (for precision reasons) +- `Main` + - Add `versionRegistry()`/`assetPluginRegistry()`/`daoFeeRegistry()` getters + - Add `setVersionRegistry()`/`setAssetPluginRegistry()`/`setDaoFeeRegistry()` setters + - Add `upgradeMainTo()` + `upgradeRTokenTo()` functions to handle upgrade of Main + Components + - Make Main the only caller that can upgrade Main + +## Plugins + +### Assets + +No functional change. FLOOR rounding added explicitly to `shiftl_toFix` + +### Trading + +Small bugfix to `GnosisTrade`. Should prevent donated tokens from causing the trade to revert. + +### Facades + +- `ActFacet` + - Expand to handle 4.0 version numbers +- `ReadFacet` + - Make `shiftl_toFix` rounding in L349 CEIL # 3.4.0 From dd288e72ff7a0b96642b3a21e811ee0fbf372aea Mon Sep 17 00:00:00 2001 From: "Julian M. Rodriguez" <56316686+julianmrodri@users.noreply.github.com> Date: Fri, 14 Jun 2024 12:14:22 -0300 Subject: [PATCH 06/72] Fix Rtoken Exteme test (#1157) --- test/RTokenExtremes.test.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/test/RTokenExtremes.test.ts b/test/RTokenExtremes.test.ts index bdf29d52fb..af09e357d9 100644 --- a/test/RTokenExtremes.test.ts +++ b/test/RTokenExtremes.test.ts @@ -4,7 +4,7 @@ import { expect } from 'chai' import { BigNumber, ContractFactory } from 'ethers' import { ethers } from 'hardhat' import { BN_SCALE_FACTOR, CollateralStatus } from '../common/constants' -import { bn, fp, shortString } from '../common/numbers' +import { bn, fp, shortString, toBNDecimals } from '../common/numbers' import { ERC20MockDecimals, FiatCollateral, @@ -139,12 +139,14 @@ describe(`RTokenP${IMPLEMENTATION} contract`, () => { for (let i = 0; i < N; i++) { const erc20: ERC20MockDecimals = erc20s[i] // user owner starts with enough basket assets to issue (totalSupply - toIssue) - const toMint0: BigNumber = toIssue0.mul(weights[i]).add(e18.sub(1)).div(e18) + const toIssue0Scaled: BigNumber = toBNDecimals(toIssue0, Number(collateralDecimals)) + const toMint0: BigNumber = toIssue0Scaled.mul(weights[i]).add(e18.sub(1)).div(e18) await erc20.mint(owner.address, toMint0) await erc20.connect(owner).increaseAllowance(rToken.address, toMint0) // user addr1 starts with enough basket assets to issue (toIssue) - const toMint: BigNumber = toIssue.mul(weights[i]).add(e18.sub(1)).div(e18) + const toIssueScaled: BigNumber = toBNDecimals(toIssue, Number(collateralDecimals)) + const toMint: BigNumber = toIssueScaled.mul(weights[i]).add(e18.sub(1)).div(e18) await erc20.mint(addr1.address, toMint) await erc20.connect(addr1).increaseAllowance(rToken.address, toMint) } @@ -219,12 +221,12 @@ describe(`RTokenP${IMPLEMENTATION} contract`, () => { [MIN_RTOKENS, MAX_RTOKENS], // toIssue [MIN_RTOKENS, MAX_RTOKENS], // toRedeem [MAX_RTOKENS], // totalSupply - [bn(1)], // numAssets + [bn(1), bn(3)], // numAssets [MIN_WEIGHT, MAX_WEIGHT], // weightFirst [MIN_WEIGHT], // weightRest [MIN_ISSUANCE_PCT, fp(1)], // issuanceThrottle.pctRate [MIN_REDEMPTION_PCT, fp(1)], // redemptionThrottle.pctRate - [bn(6), bn(27)], // collateralDecimals + [bn(6), bn(18), bn(27)], // collateralDecimals ] paramList = cartesianProduct(...bounds) } From 35057d795ed9ed284aed91301bb5e82f525e855f Mon Sep 17 00:00:00 2001 From: Akshat Mittal Date: Mon, 17 Jun 2024 14:39:58 +0530 Subject: [PATCH 07/72] Tweaks --- contracts/interfaces/IDistributor.sol | 2 +- contracts/registry/DAOFeeRegistry.sol | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/contracts/interfaces/IDistributor.sol b/contracts/interfaces/IDistributor.sol index 2a8e751183..32de4b401e 100644 --- a/contracts/interfaces/IDistributor.sol +++ b/contracts/interfaces/IDistributor.sol @@ -46,7 +46,7 @@ interface IDistributor is IComponent { function setDistribution(address dest, RevenueShare calldata share) external; /// @custom:governance - function setDistributions(address[] calldata dest, RevenueShare[] calldata share) external; + function setDistributions(address[] calldata dests, RevenueShare[] calldata shares) external; /// Distribute the `erc20` token across all revenue destinations /// Only callable by RevenueTraders diff --git a/contracts/registry/DAOFeeRegistry.sol b/contracts/registry/DAOFeeRegistry.sol index 420b13ddb7..a80b8018ba 100644 --- a/contracts/registry/DAOFeeRegistry.sol +++ b/contracts/registry/DAOFeeRegistry.sol @@ -16,12 +16,17 @@ contract DAOFeeRegistry is Ownable { error DAOFeeRegistry__FeeRecipientAlreadySet(); error DAOFeeRegistry__InvalidFeeRecipient(); error DAOFeeRegistry__InvalidFeeNumerator(); + error DAOFeeRegistry__InvalidOwner(); event FeeRecipientSet(address indexed feeRecipient); event DefaultFeeNumeratorSet(uint256 defaultFeeNumerator); event RTokenFeeNumeratorSet(address indexed rToken, uint256 feeNumerator, bool isActive); constructor(address owner_) Ownable() { + if (owner_ == address(0)) { + revert DAOFeeRegistry__InvalidOwner(); + } + _transferOwnership(owner_); // Ownership to DAO feeRecipient = owner_; // DAO as initial fee recipient } From 80a9feaeccfd36a846b1dbcb4f834b87dc5b0b8f Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Mon, 17 Jun 2024 16:10:35 -0400 Subject: [PATCH 08/72] fix comment --- contracts/p0/Distributor.sol | 4 ---- contracts/p1/Distributor.sol | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/contracts/p0/Distributor.sol b/contracts/p0/Distributor.sol index 5e4fd609e2..ade5d11df2 100644 --- a/contracts/p0/Distributor.sol +++ b/contracts/p0/Distributor.sol @@ -47,10 +47,6 @@ contract DistributorP0 is ComponentP0, IDistributor { /// Set RevenueShares for destinations. Destinations `FURNACE` and `ST_RSR` refer to /// main.furnace() and main.stRSR(). /// @custom:governance - // checks: invariants hold in post-state - // effects: - // destinations' = dests - // distribution' = shares function setDistributions(address[] calldata dests, RevenueShare[] calldata shares) external governance diff --git a/contracts/p1/Distributor.sol b/contracts/p1/Distributor.sol index 0a1900eb4e..f022c54f8d 100644 --- a/contracts/p1/Distributor.sol +++ b/contracts/p1/Distributor.sol @@ -74,8 +74,8 @@ contract DistributorP1 is ComponentP1, IDistributor { /// @custom:governance // checks: invariants hold in post-state // effects: - // destinations' = dests - // distribution' = shares + // destinations' = destinations.add(dests[i]) for i < dests.length + // distribution' = distribution.set(dests[i], shares[i]) for i < dests.length function setDistributions(address[] calldata dests, RevenueShare[] calldata shares) external governance From 448b6333217dc2e648a1b3f55e96e4121f52abe3 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Mon, 17 Jun 2024 16:13:54 -0400 Subject: [PATCH 09/72] distributor small simplification --- contracts/p1/Distributor.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/p1/Distributor.sol b/contracts/p1/Distributor.sol index f022c54f8d..179f865ead 100644 --- a/contracts/p1/Distributor.sol +++ b/contracts/p1/Distributor.sol @@ -174,11 +174,10 @@ contract DistributorP1 is ComponentP1, IDistributor { DAOFeeRegistry daoFeeRegistry = main.daoFeeRegistry(); if (address(daoFeeRegistry) != address(0)) { - // DAO Fee - if (isRSR) { + if (totalShares > paidOutShares) { (address recipient, , ) = main.daoFeeRegistry().getFeeDetails(address(rToken)); - if (recipient != address(0) && tokensPerShare * (totalShares - paidOutShares) > 0) { + if (recipient != address(0)) { IERC20Upgradeable(address(erc20)).safeTransferFrom( caller, recipient, From 9972e7e761c3280efe0590d468f5fc65dcb7dc73 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Mon, 17 Jun 2024 16:19:06 -0400 Subject: [PATCH 10/72] change name of priceNotDecayed function --- contracts/p0/Broker.sol | 6 +++--- contracts/p1/Broker.sol | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/p0/Broker.sol b/contracts/p0/Broker.sol index 1a6345cfee..9009f857a9 100644 --- a/contracts/p0/Broker.sol +++ b/contracts/p0/Broker.sol @@ -235,7 +235,7 @@ contract BrokerP0 is ComponentP0, IBroker { ); require(dutchAuctionLength > 0, "dutch auctions not enabled"); require( - priceNotDecayed(req.sell) && priceNotDecayed(req.buy), + pricedInBlock(req.sell) && pricedInBlock(req.buy), "dutch auctions require live prices" ); @@ -252,8 +252,8 @@ contract BrokerP0 is ComponentP0, IBroker { return trade; } - /// @return true iff the price is not decayed, or it's the RTokenAsset - function priceNotDecayed(IAsset asset) private view returns (bool) { + /// @return true iff the price was last priced in this block, or it's the RTokenAsset + function pricedInBlock(IAsset asset) private view returns (bool) { return asset.lastSave() == block.timestamp || address(asset.erc20()) == address(main.rToken()); } diff --git a/contracts/p1/Broker.sol b/contracts/p1/Broker.sol index 099969a330..f0eba681e8 100644 --- a/contracts/p1/Broker.sol +++ b/contracts/p1/Broker.sol @@ -276,7 +276,7 @@ contract BrokerP1 is ComponentP1, IBroker { ); require(dutchAuctionLength != 0, "dutch auctions not enabled"); require( - priceNotDecayed(req.sell) && priceNotDecayed(req.buy), + pricedInBlock(req.sell) && pricedInBlock(req.buy), "dutch auctions require live prices" ); @@ -294,8 +294,8 @@ contract BrokerP1 is ComponentP1, IBroker { return trade; } - /// @return true iff the price is not decayed, or it's the RTokenAsset - function priceNotDecayed(IAsset asset) private view returns (bool) { + /// @return true iff the price was last priced in this block, or it's the RTokenAsset + function pricedInBlock(IAsset asset) private view returns (bool) { return asset.lastSave() == block.timestamp || address(asset.erc20()) == address(rToken); } From 62542ec9065460b774419d9e2dd4da523ebcc9e8 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Tue, 18 Jun 2024 14:06:17 -0400 Subject: [PATCH 11/72] document DAO fee rounding --- contracts/p1/Distributor.sol | 1 + contracts/registry/DAOFeeRegistry.sol | 1 + 2 files changed, 2 insertions(+) diff --git a/contracts/p1/Distributor.sol b/contracts/p1/Distributor.sol index 179f865ead..8c4e14cd63 100644 --- a/contracts/p1/Distributor.sol +++ b/contracts/p1/Distributor.sol @@ -214,6 +214,7 @@ contract DistributorP1 is ComponentP1, IDistributor { .daoFeeRegistry() .getFeeDetails(address(rToken)); + // Small DAO fees <1% not recommended; ~10% precision due to rounding at 0.1% fee if (feeRecipient != address(0) && feeNumerator != 0) { revTotals.rsrTotal += uint24( (feeNumerator * uint256(revTotals.rTokenTotal + revTotals.rsrTotal)) / diff --git a/contracts/registry/DAOFeeRegistry.sol b/contracts/registry/DAOFeeRegistry.sol index a80b8018ba..a8e1fd60e5 100644 --- a/contracts/registry/DAOFeeRegistry.sol +++ b/contracts/registry/DAOFeeRegistry.sol @@ -46,6 +46,7 @@ contract DAOFeeRegistry is Ownable { emit DefaultFeeNumeratorSet(defaultFeeNumerator); } + /// @dev A fee below 1% not recommended due to poor precision in the Distributor function setRTokenFeeNumerator(address rToken, uint256 feeNumerator_) external onlyOwner { if (feeNumerator_ > MAX_FEE_NUMERATOR) revert DAOFeeRegistry__InvalidFeeNumerator(); From 9571eb8f8dbaf72176decf3839e58dade8076b14 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Tue, 18 Jun 2024 14:24:07 -0400 Subject: [PATCH 12/72] rename to pricedAtTimestamp --- contracts/p0/Broker.sol | 6 +++--- contracts/p1/Broker.sol | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/p0/Broker.sol b/contracts/p0/Broker.sol index 9009f857a9..fffc341f16 100644 --- a/contracts/p0/Broker.sol +++ b/contracts/p0/Broker.sol @@ -235,7 +235,7 @@ contract BrokerP0 is ComponentP0, IBroker { ); require(dutchAuctionLength > 0, "dutch auctions not enabled"); require( - pricedInBlock(req.sell) && pricedInBlock(req.buy), + pricedAtTimestamp(req.sell) && pricedAtTimestamp(req.buy), "dutch auctions require live prices" ); @@ -252,8 +252,8 @@ contract BrokerP0 is ComponentP0, IBroker { return trade; } - /// @return true iff the price was last priced in this block, or it's the RTokenAsset - function pricedInBlock(IAsset asset) private view returns (bool) { + /// @return true iff the asset has been priced at this timestamp, or it's the RTokenAsset + function pricedAtTimestamp(IAsset asset) private view returns (bool) { return asset.lastSave() == block.timestamp || address(asset.erc20()) == address(main.rToken()); } diff --git a/contracts/p1/Broker.sol b/contracts/p1/Broker.sol index f0eba681e8..001f8419cd 100644 --- a/contracts/p1/Broker.sol +++ b/contracts/p1/Broker.sol @@ -276,7 +276,7 @@ contract BrokerP1 is ComponentP1, IBroker { ); require(dutchAuctionLength != 0, "dutch auctions not enabled"); require( - pricedInBlock(req.sell) && pricedInBlock(req.buy), + pricedAtTimestamp(req.sell) && pricedAtTimestamp(req.buy), "dutch auctions require live prices" ); @@ -294,8 +294,8 @@ contract BrokerP1 is ComponentP1, IBroker { return trade; } - /// @return true iff the price was last priced in this block, or it's the RTokenAsset - function pricedInBlock(IAsset asset) private view returns (bool) { + /// @return true iff the asset has been priced at this timestamp, or it's the RTokenAsset + function pricedAtTimestamp(IAsset asset) private view returns (bool) { return asset.lastSave() == block.timestamp || address(asset.erc20()) == address(rToken); } From 94ef4764391c930f2ce61b9a99135254d5f1e810 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Tue, 18 Jun 2024 19:00:54 -0400 Subject: [PATCH 13/72] uncomment .skip --- test/Recollateralization.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/Recollateralization.test.ts b/test/Recollateralization.test.ts index d448fd2884..7d63f9c4bd 100644 --- a/test/Recollateralization.test.ts +++ b/test/Recollateralization.test.ts @@ -3184,8 +3184,7 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { }) }) - // TODO - context.skip('DutchTrade', () => { + context('DutchTrade', () => { const auctionLength = 1800 // 30 minutes beforeEach(async () => { await broker.connect(owner).setDutchAuctionLength(auctionLength) From 4c1be60ffd6234301dfd0b30bb4e976f430bc6ec Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Tue, 18 Jun 2024 19:01:08 -0400 Subject: [PATCH 14/72] add test cases for >uint96 amounts in Broker.openTrade --- test/Broker.test.ts | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/test/Broker.test.ts b/test/Broker.test.ts index 9ebcd98888..58d0ec73db 100644 --- a/test/Broker.test.ts +++ b/test/Broker.test.ts @@ -56,7 +56,7 @@ import { getLatestBlockTimestamp, setNextBlockTimestamp, } from './utils/time' -import { ITradeRequest, disableBatchTrade, disableDutchTrade } from './utils/trades' +import { ITradeRequest, disableBatchTrade, disableDutchTrade, getTrade } from './utils/trades' import { useEnv } from '#/utils/env' import { parseUnits } from 'ethers/lib/utils' @@ -1102,6 +1102,40 @@ describe(`BrokerP${IMPLEMENTATION} contract #fast`, () => { expect(await token0.balanceOf(backingManager.address)).to.equal(amount.add(newFunds)) }) + it('Should downsize trades above uint96 - sell side', async () => { + const tradeRequest: ITradeRequest = { + sell: collateral0.address, + buy: collateral1.address, + sellAmount: MAX_UINT96.add(1), + minBuyAmount: amount, + } + + // Should open trade JUST on MAX_UINT96 approval, not MAX_UINT96 + 1 + await whileImpersonating(backingManager.address, async (bmSigner) => { + await token0.mint(backingManager.address, MAX_UINT96) + await token0.connect(bmSigner).approve(broker.address, MAX_UINT96) + await broker.connect(bmSigner).openTrade(TradeKind.BATCH_AUCTION, tradeRequest, prices) + // should not revert + }) + }) + + it('Should downsize trades above uint96 - buy side', async () => { + const tradeRequest: ITradeRequest = { + sell: collateral0.address, + buy: collateral1.address, + sellAmount: amount, + minBuyAmount: MAX_UINT96.add(1), + } + + // Should open trade JUST on amount - 1 approval, not amount + await whileImpersonating(backingManager.address, async (bmSigner) => { + await token0.mint(backingManager.address, amount.sub(1)) + await token0.connect(bmSigner).approve(broker.address, amount.sub(1)) + await broker.connect(bmSigner).openTrade(TradeKind.BATCH_AUCTION, tradeRequest, prices) + // should not revert + }) + }) + // There is no test here for the reportViolation case; that is in Revenues.test.ts }) From edc464aceb8128cc67270361308071423c8da103 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Tue, 18 Jun 2024 19:21:43 -0400 Subject: [PATCH 15/72] switch to better approach of tracking worst case price at qTok level --- CHANGELOG.md | 4 +++- contracts/plugins/trading/GnosisTrade.sol | 21 +++++++-------------- tasks/validation/utils/trades.ts | 17 +++++++++++------ test/Revenues.test.ts | 2 +- test/scenario/BadCollateralPlugin.test.ts | 2 +- test/scenario/RevenueHiding.test.ts | 2 +- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62146ba19e..2192cd1c13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,7 +37,9 @@ No functional change. FLOOR rounding added explicitly to `shiftl_toFix` ### Trading -Small bugfix to `GnosisTrade`. Should prevent donated tokens from causing the trade to revert. +- `GnosisTrade` + - Change units of `worstCasePrice()` from {buyTok/sellTok} to {qBuyTok/qSellTok} + - Small fix to prevent donated tokens from being able to cause the trade to revert ### Facades diff --git a/contracts/plugins/trading/GnosisTrade.sol b/contracts/plugins/trading/GnosisTrade.sol index ca0625e5f2..e02a83ef6e 100644 --- a/contracts/plugins/trading/GnosisTrade.sol +++ b/contracts/plugins/trading/GnosisTrade.sol @@ -47,7 +47,7 @@ contract GnosisTrade is ITrade, Versioned { uint256 public initBal; // {qSellTok}, this trade's balance of `sell` when init() was called uint192 public sellAmount; // {sellTok}, quantity of whole tokens being sold, != initBal uint48 public endTime; // timestamp after which this trade's auction can be settled - uint192 public worstCasePrice; // {buyTok/sellTok}, the worst price we expect to get at Auction + uint192 public worstCasePrice; // {qBuyTok/qSellTok}, the worst price we expect to get at Auction // We expect Gnosis Auction either to meet or beat worstCasePrice, or to return the `sell` // tokens. If we actually *get* a worse clearing that worstCasePrice, we consider it an error in // our trading scheme and call broker.reportViolation() @@ -103,11 +103,8 @@ contract GnosisTrade is ITrade, Versioned { gnosis = gnosis_; endTime = uint48(block.timestamp) + batchAuctionLength; - // {buyTok/sellTok} - worstCasePrice = divuu(req.minBuyAmount, req.sellAmount).shiftl( - int8(sell.decimals()) - int8(buy.decimals()), - FLOOR - ); + // {qBuyTok/qSellTok} + worstCasePrice = divuu(req.minBuyAmount, req.sellAmount); // FLOOR // Downsize our sell amount to adjust for fee // {qSellTok} = {qSellTok} * {1} / {1} @@ -157,6 +154,7 @@ contract GnosisTrade is ITrade, Versioned { } /// Settle trade, transfer tokens to trader, and report bad trade if needed + /// @dev boughtAmt can be manipulated upwards; soldAmt upwards /// @custom:interaction reentrancy-safe b/c state-locking // checks: // state is OPEN @@ -203,6 +201,7 @@ contract GnosisTrade is ITrade, Versioned { if (sellBal != 0) IERC20Upgradeable(address(sell)).safeTransfer(origin, sellBal); if (boughtAmt != 0) IERC20Upgradeable(address(buy)).safeTransfer(origin, boughtAmt); + // Check clearing prices if (sellBal < initBal) { soldAmt = initBal - sellBal; @@ -212,14 +211,8 @@ contract GnosisTrade is ITrade, Versioned { uint256 adjustedBuyAmt = boughtAmt + 1; // {buyTok/sellTok} - uint192 clearingPrice = divuu(adjustedBuyAmt, adjustedSoldAmt).shiftl( - int8(sell.decimals()) - int8(buy.decimals()), - FLOOR - ); - - if (clearingPrice.lt(worstCasePrice)) { - broker.reportViolation(); - } + uint192 clearingPrice = divuu(adjustedBuyAmt, adjustedSoldAmt); // FLOOR + if (clearingPrice.lt(worstCasePrice)) broker.reportViolation(); } } diff --git a/tasks/validation/utils/trades.ts b/tasks/validation/utils/trades.ts index b06d1cc0ea..c37bf03284 100644 --- a/tasks/validation/utils/trades.ts +++ b/tasks/validation/utils/trades.ts @@ -1,5 +1,5 @@ import { MAX_UINT256, QUEUE_START, TradeKind, TradeStatus } from '#/common/constants' -import { bn, fp } from '#/common/numbers' +import { bn, fp, pow10 } from '#/common/numbers' import { whileImpersonating } from '#/utils/impersonation' import { networkConfig } from '../../../common/configuration' import { advanceTime, getLatestBlockTimestamp } from '#/utils/time' @@ -38,7 +38,7 @@ export const runBatchTrade = async ( `Running batch trade: sell ${logToken(tradeToken)} for ${logToken(buyTokenAddress)}...` ) const endTime = await trade.endTime() - const worstPrice = await trade.worstCasePrice() // trade.buy() per trade.sell() + const worstPrice = await trade.worstCasePrice() // trade.buy() per trade.sell(), qTok const auctionId = await trade.auctionId() const sellAmount = await trade.initBal() @@ -46,13 +46,18 @@ export const runBatchTrade = async ( const sellDecimals = await sellToken.decimals() const buytoken = await hre.ethers.getContractAt('ERC20Mock', await buyTokenAddress) const buyDecimals = await buytoken.decimals() - let buyAmount = bidExact ? sellAmount : sellAmount.mul(worstPrice).div(fp('1')) + let buyAmount = bidExact + ? sellAmount + : sellAmount + .mul(worstPrice) + .mul(pow10(buyDecimals - sellDecimals)) + .div(fp('1')) if (buyDecimals > sellDecimals) { - buyAmount = buyAmount.mul(bn(10 ** (buyDecimals - sellDecimals))) + buyAmount = buyAmount.mul(pow10(buyDecimals - sellDecimals)) } else if (sellDecimals > buyDecimals) { - buyAmount = buyAmount.div(bn(10 ** (sellDecimals - buyDecimals))) + buyAmount = buyAmount.div(pow10(sellDecimals - buyDecimals)) } - buyAmount = buyAmount.add(fp('1').div(bn(10 ** (18 - buyDecimals)))) + buyAmount = buyAmount.add(fp('1').div(pow10(18 - buyDecimals))) const gnosis = await hre.ethers.getContractAt('EasyAuction', await trade.gnosis()) const whaleAddr = whales[buyTokenAddress.toLowerCase()] diff --git a/test/Revenues.test.ts b/test/Revenues.test.ts index df4294d001..e1a572d1e7 100644 --- a/test/Revenues.test.ts +++ b/test/Revenues.test.ts @@ -1016,7 +1016,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Trade should have extremely nonzero worst-case price const trade = await getTrade(rTokenTrader, token0.address) expect(await trade.initBal()).to.equal(issueAmount) - expect(await trade.worstCasePrice()).to.be.gte(fp('0.775')) + expect(await trade.worstCasePrice()).to.be.gte(fp('0.775')) // both tokens have 18 decimals }) it('Should claim COMP and handle revenue auction correctly - small amount processed in single auction', async () => { diff --git a/test/scenario/BadCollateralPlugin.test.ts b/test/scenario/BadCollateralPlugin.test.ts index ec2e04c0ee..383589f1df 100644 --- a/test/scenario/BadCollateralPlugin.test.ts +++ b/test/scenario/BadCollateralPlugin.test.ts @@ -223,7 +223,7 @@ describe(`Bad Collateral Plugin - P${IMPLEMENTATION}`, () => { const lowSellPrice = fp('1').sub(fp('1').mul(ORACLE_ERROR).div(fp('1'))) const highBuyPrice = fp('1').add(fp('1').mul(ORACLE_ERROR).div(fp('1'))) const worstCasePrice = divCeil(unslippedPrice.mul(lowSellPrice), highBuyPrice).sub(1) - expect(await trade.worstCasePrice()).to.equal(worstCasePrice) + expect(await trade.worstCasePrice()).to.equal(worstCasePrice) // both tokens have 18 decimals }) }) diff --git a/test/scenario/RevenueHiding.test.ts b/test/scenario/RevenueHiding.test.ts index 32b26a024e..2942ac99c3 100644 --- a/test/scenario/RevenueHiding.test.ts +++ b/test/scenario/RevenueHiding.test.ts @@ -265,7 +265,7 @@ describe(`RevenueHiding basket collateral (/w CTokenFiatCollateral) - P${IMPLEME const t = await getTrade(rsrTrader, cDAI.address) const sellAmt = await t.initBal() const minBuyAmt = await toMinBuyAmt(sellAmt, fp('2').div(50), fp('1')) - const expectedPrice = minBuyAmt.mul(fp('1')).div(sellAmt) + const expectedPrice = minBuyAmt.mul(fp('1')).div(sellAmt).mul(bn('1e10')) // shift 10 decimals for cDAI which has 8 // price should be within 1 part in a 1 trillion of our discounted rate expect(await t.worstCasePrice()).to.be.closeTo(expectedPrice, expectedPrice.div(bn('1e9'))) }) From 80c2344a0b7d3c5021e49f437dccf57d475d210f Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Tue, 18 Jun 2024 19:24:47 -0400 Subject: [PATCH 16/72] lint clean --- contracts/plugins/trading/GnosisTrade.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/plugins/trading/GnosisTrade.sol b/contracts/plugins/trading/GnosisTrade.sol index e02a83ef6e..4350ce1e8f 100644 --- a/contracts/plugins/trading/GnosisTrade.sol +++ b/contracts/plugins/trading/GnosisTrade.sol @@ -47,7 +47,7 @@ contract GnosisTrade is ITrade, Versioned { uint256 public initBal; // {qSellTok}, this trade's balance of `sell` when init() was called uint192 public sellAmount; // {sellTok}, quantity of whole tokens being sold, != initBal uint48 public endTime; // timestamp after which this trade's auction can be settled - uint192 public worstCasePrice; // {qBuyTok/qSellTok}, the worst price we expect to get at Auction + uint192 public worstCasePrice; // {qBuyTok/qSellTok}, the worst price we expect to get // We expect Gnosis Auction either to meet or beat worstCasePrice, or to return the `sell` // tokens. If we actually *get* a worse clearing that worstCasePrice, we consider it an error in // our trading scheme and call broker.reportViolation() From f486bdcf23b85b3263c15df5ab6be86e68998636 Mon Sep 17 00:00:00 2001 From: Akshat Mittal Date: Wed, 19 Jun 2024 13:32:58 +0530 Subject: [PATCH 17/72] Role Registry --- contracts/registry/AssetPluginRegistry.sol | 50 +++++++++++++++++----- contracts/registry/RoleRegistry.sol | 28 ++++++++++++ contracts/registry/VersionRegistry.sol | 27 +++++++++--- 3 files changed, 88 insertions(+), 17 deletions(-) create mode 100644 contracts/registry/RoleRegistry.sol diff --git a/contracts/registry/AssetPluginRegistry.sol b/contracts/registry/AssetPluginRegistry.sol index 253009841f..6967e17dd6 100644 --- a/contracts/registry/AssetPluginRegistry.sol +++ b/contracts/registry/AssetPluginRegistry.sol @@ -3,29 +3,35 @@ pragma solidity 0.8.19; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { VersionRegistry } from "./VersionRegistry.sol"; +import { RoleRegistry } from "./RoleRegistry.sol"; /** * @title Asset Plugin Registry * @notice A tiny contract for tracking asset plugins */ -contract AssetPluginRegistry is Ownable { +contract AssetPluginRegistry { VersionRegistry public versionRegistry; + RoleRegistry public roleRegistry; // versionHash => asset => isValid - mapping(bytes32 => mapping(address => bool)) public isValidAsset; + mapping(bytes32 => mapping(address => bool)) private _isValidAsset; + mapping(address => bool) public isDeprecated; error AssetPluginRegistry__InvalidAsset(); + error AssetPluginRegistry__InvalidCaller(); error AssetPluginRegistry__InvalidVersion(); error AssetPluginRegistry__LengthMismatch(); event AssetPluginRegistryUpdated(bytes32 versionHash, address asset, bool validity); - constructor(address _versionRegistry) Ownable() { + constructor(address _versionRegistry) { versionRegistry = VersionRegistry(_versionRegistry); - - _transferOwnership(versionRegistry.owner()); + roleRegistry = versionRegistry.roleRegistry(); } - function registerAsset(address _asset, bytes32[] calldata validForVersions) external onlyOwner { + function registerAsset(address _asset, bytes32[] calldata validForVersions) external { + if (!roleRegistry.isOwner(msg.sender)) { + revert AssetPluginRegistry__InvalidCaller(); + } if (_asset == address(0)) { revert AssetPluginRegistry__InvalidAsset(); } @@ -36,7 +42,7 @@ contract AssetPluginRegistry is Ownable { revert AssetPluginRegistry__InvalidVersion(); } - isValidAsset[versionHash][_asset] = true; + _isValidAsset[versionHash][_asset] = true; emit AssetPluginRegistryUpdated(versionHash, _asset, true); } @@ -46,7 +52,10 @@ contract AssetPluginRegistry is Ownable { address _asset, bytes32[] calldata _versionHashes, bool[] calldata _validities - ) external onlyOwner { + ) external { + if (!roleRegistry.isOwner(msg.sender)) { + revert AssetPluginRegistry__InvalidCaller(); + } if (_versionHashes.length != _validities.length) { revert AssetPluginRegistry__LengthMismatch(); } @@ -61,7 +70,7 @@ contract AssetPluginRegistry is Ownable { revert AssetPluginRegistry__InvalidVersion(); } - isValidAsset[versionHash][_asset] = _validities[i]; + _isValidAsset[versionHash][_asset] = _validities[i]; emit AssetPluginRegistryUpdated(versionHash, _asset, _validities[i]); } @@ -71,7 +80,10 @@ contract AssetPluginRegistry is Ownable { bytes32 _versionHash, address[] calldata _assets, bool[] calldata _validities - ) external onlyOwner { + ) external { + if (!roleRegistry.isOwner(msg.sender)) { + revert AssetPluginRegistry__InvalidCaller(); + } if (_assets.length != _validities.length) { revert AssetPluginRegistry__LengthMismatch(); } @@ -86,9 +98,25 @@ contract AssetPluginRegistry is Ownable { revert AssetPluginRegistry__InvalidAsset(); } - isValidAsset[_versionHash][asset] = _validities[i]; + _isValidAsset[_versionHash][asset] = _validities[i]; emit AssetPluginRegistryUpdated(_versionHash, asset, _validities[i]); } } + + function deprecateAsset(address _asset) external { + if (!roleRegistry.isOwnerOrEmergencyCouncil(msg.sender)) { + revert AssetPluginRegistry__InvalidCaller(); + } + + isDeprecated[_asset] = true; + } + + function isValidAsset(bytes32 _versionHash, address _asset) external view returns (bool) { + if (!isDeprecated[_asset]) { + return _isValidAsset[_versionHash][_asset]; + } + + return false; + } } diff --git a/contracts/registry/RoleRegistry.sol b/contracts/registry/RoleRegistry.sol new file mode 100644 index 0000000000..4bc7a21cba --- /dev/null +++ b/contracts/registry/RoleRegistry.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: BlueOak-1.0.0 +pragma solidity 0.8.19; + +import { AccessControlEnumerable } from "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; + +/** + * @title RoleRegistry + * @notice Contract to manage roles for RToken <> DAO interactions + */ +contract RoleRegistry is AccessControlEnumerable { + bytes32 public constant EMERGENCY_COUNCIL = keccak256("EMERGENCY_COUNCIL"); + + constructor() { + _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); + } + + function isOwner(address account) public view returns (bool) { + return hasRole(DEFAULT_ADMIN_ROLE, account); + } + + function isEmergencyCouncil(address account) public view returns (bool) { + return hasRole(EMERGENCY_COUNCIL, account); + } + + function isOwnerOrEmergencyCouncil(address account) public view returns (bool) { + return hasRole(DEFAULT_ADMIN_ROLE, account) || hasRole(EMERGENCY_COUNCIL, account); + } +} diff --git a/contracts/registry/VersionRegistry.sol b/contracts/registry/VersionRegistry.sol index b132f5d370..2fa954fa9e 100644 --- a/contracts/registry/VersionRegistry.sol +++ b/contracts/registry/VersionRegistry.sol @@ -1,32 +1,43 @@ // SPDX-License-Identifier: BlueOak-1.0.0 pragma solidity 0.8.19; -import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IDeployer, Implementations } from "../interfaces/IDeployer.sol"; +import { RoleRegistry } from "./RoleRegistry.sol"; /** * @title VersionRegistry * @notice A tiny contract for tracking deployment versions */ -contract VersionRegistry is Ownable { +contract VersionRegistry { mapping(bytes32 => IDeployer) public deployments; mapping(bytes32 => bool) public isDeprecated; bytes32 private latestVersion; + RoleRegistry public roleRegistry; error VersionRegistry__ZeroAddress(); error VersionRegistry__InvalidRegistration(); error VersionRegistry__AlreadyDeprecated(); + error VersionRegistry__InvalidRoleRegistry(); + error VersionRegistry__InvalidCaller(); event VersionRegistered(bytes32 versionHash, IDeployer deployer); event VersionDeprecated(bytes32 versionHash); - constructor(address owner_) Ownable() { - _transferOwnership(owner_); + constructor(RoleRegistry _roleRegistry) { + if (address(_roleRegistry) == address(0)) { + revert VersionRegistry__ZeroAddress(); + } + + roleRegistry = _roleRegistry; } /// Register a deployer address, keyed by version. /// @param deployer The deployer contract address for the version to be added. - function registerVersion(IDeployer deployer) external onlyOwner { + function registerVersion(IDeployer deployer) external { + if (!roleRegistry.isOwner(msg.sender)) { + revert VersionRegistry__InvalidCaller(); + } + if (address(deployer) == address(0)) { revert VersionRegistry__ZeroAddress(); } @@ -44,7 +55,11 @@ contract VersionRegistry is Ownable { emit VersionRegistered(versionHash, deployer); } - function deprecateVersion(bytes32 versionHash) external onlyOwner { + function deprecateVersion(bytes32 versionHash) external { + if (!roleRegistry.isOwnerOrEmergencyCouncil(msg.sender)) { + revert VersionRegistry__InvalidCaller(); + } + if (isDeprecated[versionHash]) { revert VersionRegistry__AlreadyDeprecated(); } From 84440a03dafe6f668f50e7cc5cd05345daae6607 Mon Sep 17 00:00:00 2001 From: Akshat Mittal Date: Wed, 19 Jun 2024 14:40:40 +0530 Subject: [PATCH 18/72] Fix tests --- contracts/plugins/mocks/MockRoleRegistry.sol | 16 ++++++++++++++++ test/Upgradeability.test.ts | 4 +++- test/integration/UpgradeToR4.test.ts | 4 +++- .../UpgradeToR4WithRegistries.test.ts | 4 +++- 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 contracts/plugins/mocks/MockRoleRegistry.sol diff --git a/contracts/plugins/mocks/MockRoleRegistry.sol b/contracts/plugins/mocks/MockRoleRegistry.sol new file mode 100644 index 0000000000..976128f495 --- /dev/null +++ b/contracts/plugins/mocks/MockRoleRegistry.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: BlueOak-1.0.0 +pragma solidity 0.8.19; + +contract MockRoleRegistry { + function isOwner(address) public pure returns (bool) { + return true; + } + + function isEmergencyCouncil(address) public pure returns (bool) { + return true; + } + + function isOwnerOrEmergencyCouncil(address) public pure returns (bool) { + return true; + } +} diff --git a/test/Upgradeability.test.ts b/test/Upgradeability.test.ts index 0e4e24bd0d..d44697281f 100644 --- a/test/Upgradeability.test.ts +++ b/test/Upgradeability.test.ts @@ -903,7 +903,9 @@ describeP1(`Upgradeability - P${IMPLEMENTATION}`, () => { beforeEach(async () => { const versionRegistryFactory = await ethers.getContractFactory('VersionRegistry') - versionRegistry = await versionRegistryFactory.deploy(owner.address) + const mockRoleRegistryFactory = await ethers.getContractFactory('MockRoleRegistry') + const mockRoleRegistry = await mockRoleRegistryFactory.deploy() + versionRegistry = await versionRegistryFactory.deploy(mockRoleRegistry.address) const assetPluginRegistryFactory = await ethers.getContractFactory('AssetPluginRegistry') assetPluginRegistry = await assetPluginRegistryFactory.deploy(versionRegistry.address) diff --git a/test/integration/UpgradeToR4.test.ts b/test/integration/UpgradeToR4.test.ts index b5e6215c90..ce7a9673d2 100644 --- a/test/integration/UpgradeToR4.test.ts +++ b/test/integration/UpgradeToR4.test.ts @@ -98,7 +98,9 @@ describe('Upgrade from 3.4.0 to 4.0.0 (Mainnet Fork)', () => { ) const versionRegistryFactory = await ethers.getContractFactory('VersionRegistry') - versionRegistry = await versionRegistryFactory.deploy(await owner.getAddress()) + const mockRoleRegistryFactory = await ethers.getContractFactory('MockRoleRegistry') + const mockRoleRegistry = await mockRoleRegistryFactory.deploy() + versionRegistry = await versionRegistryFactory.deploy(mockRoleRegistry.address) await versionRegistry.registerVersion(deployer.address) diff --git a/test/integration/UpgradeToR4WithRegistries.test.ts b/test/integration/UpgradeToR4WithRegistries.test.ts index b0b12a7334..40b103f666 100644 --- a/test/integration/UpgradeToR4WithRegistries.test.ts +++ b/test/integration/UpgradeToR4WithRegistries.test.ts @@ -46,7 +46,9 @@ describe('Upgrade from 4.0.0 to New Version with all Registries Enabled', () => // Setup Registries const versionRegistryFactory = await ethers.getContractFactory('VersionRegistry') - versionRegistry = await versionRegistryFactory.deploy(await owner.getAddress()) + const mockRoleRegistryFactory = await ethers.getContractFactory('MockRoleRegistry') + const mockRoleRegistry = await mockRoleRegistryFactory.deploy() + versionRegistry = await versionRegistryFactory.deploy(mockRoleRegistry.address) const AssetPluginRegistryFactory = await ethers.getContractFactory('AssetPluginRegistry') assetPluginRegistry = await AssetPluginRegistryFactory.deploy(versionRegistry.address) From e4c3ed8a360c586d91c39bf6572ade0ebe98b06a Mon Sep 17 00:00:00 2001 From: Akshat Mittal Date: Wed, 19 Jun 2024 22:46:08 +0530 Subject: [PATCH 19/72] Role Registry (#1158) Co-authored-by: Taylor Brent --- contracts/plugins/mocks/MockRoleRegistry.sol | 16 ++++++ contracts/registry/AssetPluginRegistry.sol | 50 +++++++++++++++---- contracts/registry/RoleRegistry.sol | 29 +++++++++++ contracts/registry/VersionRegistry.sol | 27 +++++++--- test/Upgradeability.test.ts | 4 +- test/integration/UpgradeToR4.test.ts | 4 +- .../UpgradeToR4WithRegistries.test.ts | 4 +- 7 files changed, 114 insertions(+), 20 deletions(-) create mode 100644 contracts/plugins/mocks/MockRoleRegistry.sol create mode 100644 contracts/registry/RoleRegistry.sol diff --git a/contracts/plugins/mocks/MockRoleRegistry.sol b/contracts/plugins/mocks/MockRoleRegistry.sol new file mode 100644 index 0000000000..976128f495 --- /dev/null +++ b/contracts/plugins/mocks/MockRoleRegistry.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: BlueOak-1.0.0 +pragma solidity 0.8.19; + +contract MockRoleRegistry { + function isOwner(address) public pure returns (bool) { + return true; + } + + function isEmergencyCouncil(address) public pure returns (bool) { + return true; + } + + function isOwnerOrEmergencyCouncil(address) public pure returns (bool) { + return true; + } +} diff --git a/contracts/registry/AssetPluginRegistry.sol b/contracts/registry/AssetPluginRegistry.sol index 253009841f..6967e17dd6 100644 --- a/contracts/registry/AssetPluginRegistry.sol +++ b/contracts/registry/AssetPluginRegistry.sol @@ -3,29 +3,35 @@ pragma solidity 0.8.19; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { VersionRegistry } from "./VersionRegistry.sol"; +import { RoleRegistry } from "./RoleRegistry.sol"; /** * @title Asset Plugin Registry * @notice A tiny contract for tracking asset plugins */ -contract AssetPluginRegistry is Ownable { +contract AssetPluginRegistry { VersionRegistry public versionRegistry; + RoleRegistry public roleRegistry; // versionHash => asset => isValid - mapping(bytes32 => mapping(address => bool)) public isValidAsset; + mapping(bytes32 => mapping(address => bool)) private _isValidAsset; + mapping(address => bool) public isDeprecated; error AssetPluginRegistry__InvalidAsset(); + error AssetPluginRegistry__InvalidCaller(); error AssetPluginRegistry__InvalidVersion(); error AssetPluginRegistry__LengthMismatch(); event AssetPluginRegistryUpdated(bytes32 versionHash, address asset, bool validity); - constructor(address _versionRegistry) Ownable() { + constructor(address _versionRegistry) { versionRegistry = VersionRegistry(_versionRegistry); - - _transferOwnership(versionRegistry.owner()); + roleRegistry = versionRegistry.roleRegistry(); } - function registerAsset(address _asset, bytes32[] calldata validForVersions) external onlyOwner { + function registerAsset(address _asset, bytes32[] calldata validForVersions) external { + if (!roleRegistry.isOwner(msg.sender)) { + revert AssetPluginRegistry__InvalidCaller(); + } if (_asset == address(0)) { revert AssetPluginRegistry__InvalidAsset(); } @@ -36,7 +42,7 @@ contract AssetPluginRegistry is Ownable { revert AssetPluginRegistry__InvalidVersion(); } - isValidAsset[versionHash][_asset] = true; + _isValidAsset[versionHash][_asset] = true; emit AssetPluginRegistryUpdated(versionHash, _asset, true); } @@ -46,7 +52,10 @@ contract AssetPluginRegistry is Ownable { address _asset, bytes32[] calldata _versionHashes, bool[] calldata _validities - ) external onlyOwner { + ) external { + if (!roleRegistry.isOwner(msg.sender)) { + revert AssetPluginRegistry__InvalidCaller(); + } if (_versionHashes.length != _validities.length) { revert AssetPluginRegistry__LengthMismatch(); } @@ -61,7 +70,7 @@ contract AssetPluginRegistry is Ownable { revert AssetPluginRegistry__InvalidVersion(); } - isValidAsset[versionHash][_asset] = _validities[i]; + _isValidAsset[versionHash][_asset] = _validities[i]; emit AssetPluginRegistryUpdated(versionHash, _asset, _validities[i]); } @@ -71,7 +80,10 @@ contract AssetPluginRegistry is Ownable { bytes32 _versionHash, address[] calldata _assets, bool[] calldata _validities - ) external onlyOwner { + ) external { + if (!roleRegistry.isOwner(msg.sender)) { + revert AssetPluginRegistry__InvalidCaller(); + } if (_assets.length != _validities.length) { revert AssetPluginRegistry__LengthMismatch(); } @@ -86,9 +98,25 @@ contract AssetPluginRegistry is Ownable { revert AssetPluginRegistry__InvalidAsset(); } - isValidAsset[_versionHash][asset] = _validities[i]; + _isValidAsset[_versionHash][asset] = _validities[i]; emit AssetPluginRegistryUpdated(_versionHash, asset, _validities[i]); } } + + function deprecateAsset(address _asset) external { + if (!roleRegistry.isOwnerOrEmergencyCouncil(msg.sender)) { + revert AssetPluginRegistry__InvalidCaller(); + } + + isDeprecated[_asset] = true; + } + + function isValidAsset(bytes32 _versionHash, address _asset) external view returns (bool) { + if (!isDeprecated[_asset]) { + return _isValidAsset[_versionHash][_asset]; + } + + return false; + } } diff --git a/contracts/registry/RoleRegistry.sol b/contracts/registry/RoleRegistry.sol new file mode 100644 index 0000000000..305eae49c0 --- /dev/null +++ b/contracts/registry/RoleRegistry.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: BlueOak-1.0.0 +pragma solidity 0.8.19; + +// solhint-disable-next-line max-line-length +import { AccessControlEnumerable } from "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; + +/** + * @title RoleRegistry + * @notice Contract to manage roles for RToken <> DAO interactions + */ +contract RoleRegistry is AccessControlEnumerable { + bytes32 public constant EMERGENCY_COUNCIL = keccak256("EMERGENCY_COUNCIL"); + + constructor() { + _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); + } + + function isOwner(address account) public view returns (bool) { + return hasRole(DEFAULT_ADMIN_ROLE, account); + } + + function isEmergencyCouncil(address account) public view returns (bool) { + return hasRole(EMERGENCY_COUNCIL, account); + } + + function isOwnerOrEmergencyCouncil(address account) public view returns (bool) { + return hasRole(DEFAULT_ADMIN_ROLE, account) || hasRole(EMERGENCY_COUNCIL, account); + } +} diff --git a/contracts/registry/VersionRegistry.sol b/contracts/registry/VersionRegistry.sol index b132f5d370..2fa954fa9e 100644 --- a/contracts/registry/VersionRegistry.sol +++ b/contracts/registry/VersionRegistry.sol @@ -1,32 +1,43 @@ // SPDX-License-Identifier: BlueOak-1.0.0 pragma solidity 0.8.19; -import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IDeployer, Implementations } from "../interfaces/IDeployer.sol"; +import { RoleRegistry } from "./RoleRegistry.sol"; /** * @title VersionRegistry * @notice A tiny contract for tracking deployment versions */ -contract VersionRegistry is Ownable { +contract VersionRegistry { mapping(bytes32 => IDeployer) public deployments; mapping(bytes32 => bool) public isDeprecated; bytes32 private latestVersion; + RoleRegistry public roleRegistry; error VersionRegistry__ZeroAddress(); error VersionRegistry__InvalidRegistration(); error VersionRegistry__AlreadyDeprecated(); + error VersionRegistry__InvalidRoleRegistry(); + error VersionRegistry__InvalidCaller(); event VersionRegistered(bytes32 versionHash, IDeployer deployer); event VersionDeprecated(bytes32 versionHash); - constructor(address owner_) Ownable() { - _transferOwnership(owner_); + constructor(RoleRegistry _roleRegistry) { + if (address(_roleRegistry) == address(0)) { + revert VersionRegistry__ZeroAddress(); + } + + roleRegistry = _roleRegistry; } /// Register a deployer address, keyed by version. /// @param deployer The deployer contract address for the version to be added. - function registerVersion(IDeployer deployer) external onlyOwner { + function registerVersion(IDeployer deployer) external { + if (!roleRegistry.isOwner(msg.sender)) { + revert VersionRegistry__InvalidCaller(); + } + if (address(deployer) == address(0)) { revert VersionRegistry__ZeroAddress(); } @@ -44,7 +55,11 @@ contract VersionRegistry is Ownable { emit VersionRegistered(versionHash, deployer); } - function deprecateVersion(bytes32 versionHash) external onlyOwner { + function deprecateVersion(bytes32 versionHash) external { + if (!roleRegistry.isOwnerOrEmergencyCouncil(msg.sender)) { + revert VersionRegistry__InvalidCaller(); + } + if (isDeprecated[versionHash]) { revert VersionRegistry__AlreadyDeprecated(); } diff --git a/test/Upgradeability.test.ts b/test/Upgradeability.test.ts index 0e4e24bd0d..d44697281f 100644 --- a/test/Upgradeability.test.ts +++ b/test/Upgradeability.test.ts @@ -903,7 +903,9 @@ describeP1(`Upgradeability - P${IMPLEMENTATION}`, () => { beforeEach(async () => { const versionRegistryFactory = await ethers.getContractFactory('VersionRegistry') - versionRegistry = await versionRegistryFactory.deploy(owner.address) + const mockRoleRegistryFactory = await ethers.getContractFactory('MockRoleRegistry') + const mockRoleRegistry = await mockRoleRegistryFactory.deploy() + versionRegistry = await versionRegistryFactory.deploy(mockRoleRegistry.address) const assetPluginRegistryFactory = await ethers.getContractFactory('AssetPluginRegistry') assetPluginRegistry = await assetPluginRegistryFactory.deploy(versionRegistry.address) diff --git a/test/integration/UpgradeToR4.test.ts b/test/integration/UpgradeToR4.test.ts index b5e6215c90..ce7a9673d2 100644 --- a/test/integration/UpgradeToR4.test.ts +++ b/test/integration/UpgradeToR4.test.ts @@ -98,7 +98,9 @@ describe('Upgrade from 3.4.0 to 4.0.0 (Mainnet Fork)', () => { ) const versionRegistryFactory = await ethers.getContractFactory('VersionRegistry') - versionRegistry = await versionRegistryFactory.deploy(await owner.getAddress()) + const mockRoleRegistryFactory = await ethers.getContractFactory('MockRoleRegistry') + const mockRoleRegistry = await mockRoleRegistryFactory.deploy() + versionRegistry = await versionRegistryFactory.deploy(mockRoleRegistry.address) await versionRegistry.registerVersion(deployer.address) diff --git a/test/integration/UpgradeToR4WithRegistries.test.ts b/test/integration/UpgradeToR4WithRegistries.test.ts index b0b12a7334..40b103f666 100644 --- a/test/integration/UpgradeToR4WithRegistries.test.ts +++ b/test/integration/UpgradeToR4WithRegistries.test.ts @@ -46,7 +46,9 @@ describe('Upgrade from 4.0.0 to New Version with all Registries Enabled', () => // Setup Registries const versionRegistryFactory = await ethers.getContractFactory('VersionRegistry') - versionRegistry = await versionRegistryFactory.deploy(await owner.getAddress()) + const mockRoleRegistryFactory = await ethers.getContractFactory('MockRoleRegistry') + const mockRoleRegistry = await mockRoleRegistryFactory.deploy() + versionRegistry = await versionRegistryFactory.deploy(mockRoleRegistry.address) const AssetPluginRegistryFactory = await ethers.getContractFactory('AssetPluginRegistry') assetPluginRegistry = await AssetPluginRegistryFactory.deploy(versionRegistry.address) From 93d2831b2c5885ad69a27403de7436f7c4ca04b8 Mon Sep 17 00:00:00 2001 From: "Julian M. Rodriguez" <56316686+julianmrodri@users.noreply.github.com> Date: Wed, 19 Jun 2024 14:59:22 -0300 Subject: [PATCH 20/72] Scenario test large decimals (#1159) --- .../AppreciatingMockDecimalsCollateral.sol | 12 + test/scenario/LargeDecimals.test.ts | 791 ++++++++++++++++++ 2 files changed, 803 insertions(+) create mode 100644 test/scenario/LargeDecimals.test.ts diff --git a/contracts/plugins/mocks/AppreciatingMockDecimalsCollateral.sol b/contracts/plugins/mocks/AppreciatingMockDecimalsCollateral.sol index c4d5ec0b53..7c8c56d577 100644 --- a/contracts/plugins/mocks/AppreciatingMockDecimalsCollateral.sol +++ b/contracts/plugins/mocks/AppreciatingMockDecimalsCollateral.sol @@ -8,6 +8,7 @@ import { OracleLib } from "../assets/OracleLib.sol"; import { AppreciatingMockDecimals } from "./AppreciatingMockDecimals.sol"; import { AggregatorV3Interface } from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { shiftl_toFix } from "../../libraries/Fixed.sol"; /** @@ -16,6 +17,8 @@ import { shiftl_toFix } from "../../libraries/Fixed.sol"; contract AppreciatingMockDecimalsCollateral is AppreciatingFiatCollateral { int8 private immutable refDecimals; + IERC20 private immutable rewardToken; + /// config.erc20 must be an AppreciatingMockDecimals token /// @param config.chainlinkFeed Feed units: {UoA/ref} /// @param revenueHiding {1} A value like 1e-6 that represents the maximum refPerTok to hide @@ -25,10 +28,19 @@ contract AppreciatingMockDecimalsCollateral is AppreciatingFiatCollateral { AppreciatingMockDecimals appToken = AppreciatingMockDecimals(address(config.erc20)); refDecimals = int8(uint8(IERC20Metadata(appToken.underlying()).decimals())); require(refDecimals > 18, "only decimals > 18"); + rewardToken = IERC20(address(AppreciatingMockDecimals(address(erc20)).rewardToken())); } /// @return {ref/tok} Actual quantity of whole reference units per whole collateral tokens function underlyingRefPerTok() public view override returns (uint192) { return shiftl_toFix(AppreciatingMockDecimals(address(erc20)).rate(), -refDecimals); } + + /// Claim rewards earned by holding a balance of the ERC20 token + /// @custom:delegate-call + function claimRewards() external virtual override(Asset, IRewardable) { + uint256 _bal = rewardToken.balanceOf(address(this)); + IRewardable(address(erc20)).claimRewards(); + emit RewardsClaimed(rewardToken, rewardToken.balanceOf(address(this)) - _bal); + } } diff --git a/test/scenario/LargeDecimals.test.ts b/test/scenario/LargeDecimals.test.ts new file mode 100644 index 0000000000..c3900bfeb7 --- /dev/null +++ b/test/scenario/LargeDecimals.test.ts @@ -0,0 +1,791 @@ +import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' +import { anyValue } from '@nomicfoundation/hardhat-chai-matchers/withArgs' +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { expect } from 'chai' +import { BigNumber, ContractFactory } from 'ethers' +import { ethers } from 'hardhat' +import { IConfig } from '../../common/configuration' +import { bn, fp, pow10, toBNDecimals } from '../../common/numbers' +import { + Asset, + ERC20Mock, + FacadeTest, + GnosisMock, + IAssetRegistry, + MockV3Aggregator, + RTokenAsset, + TestIBackingManager, + TestIBasketHandler, + TestIFacade, + TestIRevenueTrader, + TestIRToken, + TestIFurnace, + TestIStRSR, + TestIDistributor, + AppreciatingMockDecimals, + AppreciatingMockDecimalsCollateral, + ERC20MockDecimals, +} from '../../typechain' +import { advanceTime, getLatestBlockTimestamp } from '../utils/time' +import { + defaultFixtureNoBasket, + IMPLEMENTATION, + ORACLE_ERROR, + ORACLE_TIMEOUT, + PRICE_TIMEOUT, + REVENUE_HIDING, +} from '../fixtures' +import { BN_SCALE_FACTOR, CollateralStatus, FURNACE_DEST, STRSR_DEST } from '../../common/constants' +import { expectTrade, getTrade, toMinBuyAmt } from '../utils/trades' +import { expectPrice, expectRTokenPrice, setOraclePrice } from '../utils/oracles' +import { expectEvents } from '../../common/events' + +const DEFAULT_THRESHOLD = fp('0.01') // 1% +const DELAY_UNTIL_DEFAULT = bn('86400') // 24h +const MAX_TRADE_VOLUME = fp('1e7') // $10M + +const point5Pct = (value: BigNumber): BigNumber => { + return value.mul(5).div(1000) +} + +describe(`Large Decimals Basket - P${IMPLEMENTATION}`, () => { + let owner: SignerWithAddress + let addr1: SignerWithAddress + + // Non-backing assets + let rsr: ERC20Mock + let underlying: ERC20MockDecimals + let rewardToken: ERC20MockDecimals + let token: AppreciatingMockDecimals + + let erc20s: ERC20Mock[] + + let rsrAsset: Asset + let rewardAsset: Asset + let rTokenAsset: RTokenAsset + + // Trading + let gnosis: GnosisMock + let rsrTrader: TestIRevenueTrader + let rTokenTrader: TestIRevenueTrader + + // Tokens and Assets + let initialBal: BigNumber + let rewardAmount: BigNumber + + let collateral: AppreciatingMockDecimalsCollateral + let targetAmt: BigNumber + + let usdToken: ERC20Mock + + // Config values + let config: IConfig + + // Contracts to retrieve after deploy + let distributor: TestIDistributor + let furnace: TestIFurnace + let rToken: TestIRToken + let stRSR: TestIStRSR + let assetRegistry: IAssetRegistry + let basketHandler: TestIBasketHandler + let facade: TestIFacade + let facadeTest: FacadeTest + let backingManager: TestIBackingManager + + // Perform tests for each of these decimal variations (> 18) + const optDecimals = [21, 27] + optDecimals.forEach((decimals) => { + describe(`With decimals: ${decimals}`, () => { + beforeEach(async () => { + ;[owner, addr1] = await ethers.getSigners() + + // Deploy fixture + ;({ + erc20s, + config, + rToken, + assetRegistry, + backingManager, + basketHandler, + facade, + facadeTest, + rsr, + rsrAsset, + furnace, + distributor, + stRSR, + rTokenTrader, + rsrTrader, + gnosis, + rTokenAsset, + } = await loadFixture(defaultFixtureNoBasket)) + + // Mint initial balances + initialBal = bn('100000000').mul(pow10(decimals)) + + usdToken = erc20s[0] // DAI Token + + // Setup Factories + const ERC20MockDecimalsFactory: ContractFactory = await ethers.getContractFactory( + 'ERC20MockDecimals' + ) + const AppreciatingMockDecimalsFactory: ContractFactory = await ethers.getContractFactory( + 'AppreciatingMockDecimals' + ) + const AppreciatingMockDecimalsCollateralFactory: ContractFactory = + await ethers.getContractFactory('AppreciatingMockDecimalsCollateral') + const MockV3AggregatorFactory: ContractFactory = await ethers.getContractFactory( + 'MockV3Aggregator' + ) + + // Replace RSRAsset + const AssetFactory = await ethers.getContractFactory('Asset') + const newRSRAsset: Asset = ( + await AssetFactory.deploy( + PRICE_TIMEOUT, + await rsrAsset.chainlinkFeed(), + ORACLE_ERROR, + rsr.address, + MAX_TRADE_VOLUME, + ORACLE_TIMEOUT + ) + ) + await assetRegistry.connect(owner).swapRegistered(newRSRAsset.address) + rsrAsset = newRSRAsset + + // Setup reward asset + rewardToken = ( + await ERC20MockDecimalsFactory.deploy( + `Reward Token ${decimals}`, + `REWARD_TKN${decimals}`, + decimals + ) + ) + const rewardChainlinkFeed = ( + await MockV3AggregatorFactory.deploy(8, bn('1e8')) + ) + rewardAsset = ( + await AssetFactory.deploy( + PRICE_TIMEOUT, + rewardChainlinkFeed.address, + ORACLE_ERROR, + rewardToken.address, + MAX_TRADE_VOLUME, + ORACLE_TIMEOUT + ) + ) + await assetRegistry.connect(owner).register(rewardAsset.address) + + /***** Setup Basket, Appreciating collateral with large decimals ***********/ + underlying = ( + await ERC20MockDecimalsFactory.deploy(`Token ${decimals}`, `TKN${decimals}`, decimals) + ) + + token = ( + await AppreciatingMockDecimalsFactory.deploy( + `AppreciatingToken_${decimals}`, + `AppreciatingToken_SYM_:${decimals}`, + decimals, + underlying.address + ) + ) + await token.setExchangeRate(fp('1')) + await token.setRewardToken(rewardToken.address) + + const chainlinkFeed = await MockV3AggregatorFactory.deploy(8, bn('1e8')) + collateral = ( + await AppreciatingMockDecimalsCollateralFactory.deploy( + { + priceTimeout: PRICE_TIMEOUT, + chainlinkFeed: chainlinkFeed.address, + oracleError: ORACLE_ERROR, + erc20: token.address, + maxTradeVolume: MAX_TRADE_VOLUME, + oracleTimeout: ORACLE_TIMEOUT, + targetName: ethers.utils.formatBytes32String('USD'), + defaultThreshold: DEFAULT_THRESHOLD, + delayUntilDefault: DELAY_UNTIL_DEFAULT, + }, + REVENUE_HIDING + ) + ) + await assetRegistry.connect(owner).register(collateral.address) + + targetAmt = fp('1') + + // Set basket + await basketHandler.setPrimeBasket([token.address], [targetAmt]) + await basketHandler.connect(owner).refreshBasket() + + // Advance time post warmup period + await advanceTime(Number(config.warmupPeriod) + 1) + + // Mint and approve initial balances + await token.mint(addr1.address, initialBal) + await token.connect(addr1).approve(rToken.address, initialBal) + + // Mint backup token + await usdToken.mint(addr1.address, initialBal) + + // Grant allowances + await backingManager.grantRTokenAllowance(token.address) + }) + + it('Should Issue/Redeem correctly', async () => { + // Basket + expect(await basketHandler.fullyCollateralized()).to.equal(true) + + // Check other values + expect(await basketHandler.timestamp()).to.be.gt(bn(0)) + expect(await basketHandler.status()).to.equal(CollateralStatus.SOUND) + expect(await facadeTest.callStatic.totalAssetValue(rToken.address)).to.equal(0) + await expectPrice(basketHandler.address, fp('1'), ORACLE_ERROR, true) + + const issueAmt = bn('10e18') + + // Get quotes + const [, quotes] = await facade.connect(addr1).callStatic.issue(rToken.address, issueAmt) + + // Issue + await rToken.connect(addr1).issue(issueAmt) + expect(await rToken.balanceOf(addr1.address)).to.equal(issueAmt) + expect(await rToken.totalSupply()).to.equal(issueAmt) + expect(await facadeTest.callStatic.totalAssetValue(rToken.address)).to.be.closeTo( + issueAmt, + fp('0.5') + ) + + await expectPrice(basketHandler.address, fp('1'), ORACLE_ERROR, true) + + // Set expected quotes + const expectedTkn: BigNumber = toBNDecimals( + issueAmt.mul(targetAmt).div(await collateral.refPerTok()), + decimals + ) + + // Check balances + expect(await token.balanceOf(backingManager.address)).to.equal(expectedTkn) + expect(await token.balanceOf(addr1.address)).to.equal(initialBal.sub(expectedTkn)) + expect(expectedTkn).to.equal(quotes[0]) + + // Redeem + await rToken.connect(addr1).redeem(issueAmt) + expect(await rToken.balanceOf(addr1.address)).to.equal(0) + expect(await rToken.totalSupply()).to.equal(0) + + // Check balances - Back to initial status + expect(await token.balanceOf(backingManager.address)).to.equal(0) + expect(await token.balanceOf(addr1.address)).to.equal(initialBal) + }) + + it('Should claim rewards correctly - All RSR', async () => { + // Set RSR price + const rsrPrice = fp('0.005') // 0.005 usd + await setOraclePrice(rsrAsset.address, toBNDecimals(rsrPrice, 8)) + + // Set reward token price + const rewardPrice = fp('50') // 50 usd + await setOraclePrice(rewardAsset.address, toBNDecimals(rewardPrice, 8)) + + // Set Reward amount = approx 5 usd + rewardAmount = bn('1').mul(pow10(decimals - 1)) + + // Mint some RSR (arbitrary) + await rsr.connect(owner).mint(addr1.address, initialBal) + + // Set f=1 // All revenues to RSR + await expect( + distributor + .connect(owner) + .setDistribution(STRSR_DEST, { rTokenDist: bn(0), rsrDist: bn(10000) }) + ) + .to.emit(distributor, 'DistributionSet') + .withArgs(STRSR_DEST, bn(0), bn(10000)) + + await expect( + distributor + .connect(owner) + .setDistribution(FURNACE_DEST, { rTokenDist: bn(0), rsrDist: bn(0) }) + ) + .to.emit(distributor, 'DistributionSet') + .withArgs(FURNACE_DEST, bn(0), bn(0)) + + // Set Rewards + await token.setRewards(backingManager.address, rewardAmount) + + // Collect revenue - Called via poke + const sellAmt: BigNumber = rewardAmount // all will be sold + const minBuyAmt = toMinBuyAmt( + sellAmt.div(pow10(decimals - 18)), // scale to 18 decimals (to obtain RSR amount) + rewardPrice, + rsrPrice, + ORACLE_ERROR, + config.maxTradeSlippage + ) + + await expectEvents(backingManager.claimRewards(), [ + { + contract: backingManager, + name: 'RewardsClaimed', + args: [rewardToken.address, rewardAmount], + emitted: true, + }, + ]) + + // Check status of destinations at this point + expect(await rsr.balanceOf(stRSR.address)).to.equal(0) + expect(await rToken.balanceOf(furnace.address)).to.equal(0) + + // Run auctions + await expectEvents(facadeTest.runAuctionsForAllTraders(rToken.address), [ + { + contract: rsrTrader, + name: 'TradeStarted', + args: [anyValue, rewardToken.address, rsr.address, sellAmt, minBuyAmt], + emitted: true, + }, + { + contract: rTokenTrader, + name: 'TradeStarted', + emitted: false, + }, + ]) + + const auctionTimestamp: number = await getLatestBlockTimestamp() + + // Check auctions registered + // RewardToken -> RSR Auction + await expectTrade(rsrTrader, { + sell: rewardToken.address, + buy: rsr.address, + endTime: auctionTimestamp + Number(config.batchAuctionLength), + externalId: bn('0'), + }) + + // Check funds in Market + expect(await rewardToken.balanceOf(gnosis.address)).to.equal(rewardAmount) + + // Advance time till auction ended + await advanceTime(config.batchAuctionLength.add(100).toString()) + + // Perform Mock Bids for RSR and RToken (addr1 has balance) + await rsr.connect(addr1).approve(gnosis.address, minBuyAmt) + await gnosis.placeBid(0, { + bidder: addr1.address, + sellAmount: sellAmt, + buyAmount: minBuyAmt, + }) + + // Close auctions + await expectEvents(facadeTest.runAuctionsForAllTraders(rToken.address), [ + { + contract: rsrTrader, + name: 'TradeSettled', + args: [anyValue, rewardToken.address, rsr.address, sellAmt, minBuyAmt], + emitted: true, + }, + { + contract: rsrTrader, + name: 'TradeStarted', + emitted: false, + }, + { + contract: rTokenTrader, + name: 'TradeStarted', + emitted: false, + }, + ]) + + // Check balances sent to corresponding destinations + // StRSR + expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo(minBuyAmt, 10000) + // Furnace + expect(await rToken.balanceOf(furnace.address)).to.equal(0) + }) + + it('Should sell collateral as it appreciates and handle revenue auction correctly', async () => { + // Set RSR price + const rsrPrice = fp('0.005') // 0.005 usd + await setOraclePrice(rsrAsset.address, toBNDecimals(rsrPrice, 8)) + + // Mint some RSR (arbitrary) + await rsr.connect(owner).mint(addr1.address, initialBal) + + // Issue 1 RToken + const issueAmount = bn('1e18') + + // Get quotes for RToken + const [, quotes] = await facade.connect(addr1).callStatic.issue(rToken.address, issueAmount) + + // Issue 1 RToken + await rToken.connect(addr1).issue(issueAmount) + + const origAssetValue = issueAmount + await expectRTokenPrice( + rTokenAsset.address, + fp('1'), + ORACLE_ERROR, + await backingManager.maxTradeSlippage(), + config.minTradeVolume.mul((await assetRegistry.erc20s()).length) + ) + expect(await facadeTest.callStatic.totalAssetValue(rToken.address)).to.be.closeTo( + origAssetValue, + fp('0.5') + ) + expect(await rToken.balanceOf(addr1.address)).to.equal(issueAmount) + expect(await rToken.totalSupply()).to.equal(issueAmount) + + // Increase redemption rate to double + await token.setExchangeRate(fp('2')) + + // Get updated quotes + const [, newQuotes] = await facade + .connect(addr1) + .callStatic.issue(rToken.address, issueAmount) + + await assetRegistry.refresh() // refresh to update refPerTok() + const expectedNewTkn: BigNumber = toBNDecimals( + issueAmount.mul(targetAmt).div(await collateral.refPerTok()), + decimals + ) + + expect(expectedNewTkn).to.equal(newQuotes[0]) + expect(newQuotes[0]).to.equal(quotes[0].div(2)) // requires half the tokens now + + // Check Price and assets value + // Excess token = 0.5 tok (50% of issued amount) + const excessQuantity: BigNumber = quotes[0].sub(newQuotes[0]) + const excessQuantity18: BigNumber = excessQuantity.div(pow10(decimals - 18)) + + const [lowPrice, highPrice] = await collateral.price() + const excessValueLow: BigNumber = excessQuantity18.mul(lowPrice).div(BN_SCALE_FACTOR) + const excessValueHigh: BigNumber = excessQuantity18.mul(highPrice).div(BN_SCALE_FACTOR) + + expect(excessQuantity).to.equal(toBNDecimals(issueAmount.div(2), decimals)) + await expectPrice(collateral.address, fp('2'), ORACLE_ERROR, true) // price doubled + expect(excessValueLow).to.be.lt(fp('1')) + expect(excessValueHigh).to.be.gt(fp('1')) + + // RToken price remains the same + await expectRTokenPrice( + rTokenAsset.address, + fp('1'), + ORACLE_ERROR, + await backingManager.maxTradeSlippage(), + config.minTradeVolume.mul((await assetRegistry.erc20s()).length) + ) + expect(await facadeTest.callStatic.totalAssetValue(rToken.address)).to.be.lt( + origAssetValue.add(excessValueHigh) + ) + expect(await facadeTest.callStatic.totalAssetValue(rToken.address)).to.be.gt( + origAssetValue.add(excessValueLow) + ) + + // Check status of destinations at this point + expect(await rsr.balanceOf(stRSR.address)).to.equal(0) + expect(await rToken.balanceOf(furnace.address)).to.equal(0) + + // Expected values + const currentTotalSupply: BigNumber = await rToken.totalSupply() + + // Excess Token will be minted into a full RToken + const excessInRToken = issueAmount + const expectedToTrader = excessInRToken.mul(60).div(100) // 60% of 1 RToken (0.6 RTokens) + const expectedToFurnace = excessInRToken.sub(expectedToTrader) // Remainder (0.4 RTokens) + expect(expectedToTrader).to.equal(fp('0.6')) + expect(expectedToFurnace).to.equal(fp('0.4')) + + // Set expected values for first auction + const sellAmt: BigNumber = expectedToTrader // everything is auctioned, below max auction + const minBuyAmt = toMinBuyAmt( + sellAmt, + fp('1'), + rsrPrice, + ORACLE_ERROR, + config.maxTradeSlippage + ) + + await expectRTokenPrice( + rTokenAsset.address, + fp('1'), + ORACLE_ERROR, + await backingManager.maxTradeSlippage(), + config.minTradeVolume.mul((await assetRegistry.erc20s()).length) + ) + + // Run auctions - Will detect excess (all will be minted in RToken, so no RToken auction) + await expectEvents(facadeTest.runAuctionsForAllTraders(rToken.address), [ + { + contract: rsrTrader, + name: 'TradeStarted', + emitted: true, + }, + { + contract: rTokenTrader, + name: 'TradeStarted', + emitted: false, + }, + ]) + + const auctionTimestamp: number = await getLatestBlockTimestamp() + + // Check auction registered + // RToken -> RSR Auction + await expectTrade(rsrTrader, { + sell: rToken.address, + buy: rsr.address, + endTime: auctionTimestamp + Number(config.batchAuctionLength), + externalId: bn('0'), + }) + + // Check trades + const trade = await getTrade(rsrTrader, rToken.address) + const auctionId = await trade.auctionId() + const [, , , auctionSellAmt, auctionbuyAmt] = await gnosis.auctions(auctionId) + expect(sellAmt).to.be.closeTo(auctionSellAmt, point5Pct(auctionSellAmt)) + expect(minBuyAmt).to.be.closeTo(auctionbuyAmt, point5Pct(auctionbuyAmt)) + + // Check Price (unchanged) and Assets value + await expectRTokenPrice( + rTokenAsset.address, + fp('1'), + ORACLE_ERROR, + await backingManager.maxTradeSlippage(), + config.minTradeVolume.mul((await assetRegistry.erc20s()).length) + ) + + // Value of backing doubled + expect(await facadeTest.callStatic.totalAssetValue(rToken.address)).to.be.closeTo( + origAssetValue.mul(2), + point5Pct(origAssetValue.mul(2)) + ) + + // Supply now doubled + expect(await rToken.totalSupply()).to.be.closeTo( + currentTotalSupply.mul(2), + point5Pct(currentTotalSupply.mul(2)) + ) + + // Check destinations at this stage (RToken already sent to furnace) + expect(await rsr.balanceOf(stRSR.address)).to.equal(0) + expect(await rToken.balanceOf(furnace.address)).to.be.closeTo( + expectedToFurnace, + point5Pct(expectedToFurnace) + ) + + // Check funds in Market and Traders + expect(await rToken.balanceOf(gnosis.address)).to.be.closeTo(sellAmt, point5Pct(sellAmt)) + + expect(await rToken.balanceOf(rsrTrader.address)).to.equal(bn(0)) + expect(await rToken.balanceOf(rTokenTrader.address)).to.equal(bn(0)) + + // Advance time till auction ended + await advanceTime(config.batchAuctionLength.add(100).toString()) + + // Mock auctions + await rsr.connect(addr1).approve(gnosis.address, auctionbuyAmt) + await gnosis.placeBid(0, { + bidder: addr1.address, + sellAmount: auctionSellAmt, + buyAmount: auctionbuyAmt, + }) + + // Close auctions - Will not open another auction + await expectEvents(facadeTest.runAuctionsForAllTraders(rToken.address), [ + { + contract: rsrTrader, + name: 'TradeSettled', + args: [anyValue, rToken.address, rsr.address, auctionSellAmt, auctionbuyAmt], + emitted: true, + }, + { + contract: rTokenTrader, + name: 'TradeSettled', + emitted: false, + }, + { + contract: rsrTrader, + name: 'TradeStarted', + emitted: false, + }, + { + contract: rTokenTrader, + name: 'TradeStarted', + emitted: false, + }, + ]) + + // Check Price (unchanged) and Assets value (unchanged) + await expectRTokenPrice( + rTokenAsset.address, + fp('1'), + ORACLE_ERROR, + await backingManager.maxTradeSlippage(), + config.minTradeVolume.mul((await assetRegistry.erc20s()).length) + ) + + expect(await facadeTest.callStatic.totalAssetValue(rToken.address)).to.be.closeTo( + origAssetValue.mul(2), + point5Pct(origAssetValue.mul(2)) + ) + + expect(await rToken.totalSupply()).to.be.closeTo( + currentTotalSupply.mul(2), + point5Pct(currentTotalSupply.mul(2)) + ) + + // Check destinations at this stage - RSR and RTokens already in StRSR and Furnace + expect(await rsr.balanceOf(stRSR.address)).to.be.closeTo( + auctionbuyAmt, + point5Pct(auctionbuyAmt) + ) + expect(await rToken.balanceOf(furnace.address)).to.be.closeTo( + expectedToFurnace, + point5Pct(expectedToFurnace) + ) + + // Check no more funds in Market and Traders + expect(await rToken.balanceOf(gnosis.address)).to.equal(0) + expect(await rToken.balanceOf(rsrTrader.address)).to.equal(0) + expect(await rToken.balanceOf(rTokenTrader.address)).to.equal(0) + }) + + it('Should recollateralize basket correctly', async () => { + // Set RSR price to 25 cts for less auctions + const rsrPrice = fp('0.25') // 0.25 usd + await setOraclePrice(rsrAsset.address, toBNDecimals(rsrPrice, 8)) + + // Stake some RSR + await rsr.connect(owner).mint(addr1.address, initialBal) + await rsr.connect(addr1).approve(stRSR.address, initialBal) + await stRSR.connect(addr1).stake(initialBal) + + // Issue + const issueAmount = bn('1e18') + + await rToken.connect(addr1).issue(issueAmount) + + expect(await basketHandler.fullyCollateralized()).to.equal(true) + + // Get quotes for RToken + const [, quotes] = await facade.connect(addr1).callStatic.issue(rToken.address, issueAmount) + const expectedTkn: BigNumber = toBNDecimals( + issueAmount.mul(targetAmt).div(await collateral.refPerTok()), + decimals + ) + + expect(quotes[0]).to.equal(toBNDecimals(fp('1'), decimals)) + expect(expectedTkn).to.equal(quotes[0]) + + // Set Backup to DAI + await basketHandler + .connect(owner) + .setBackupConfig(ethers.utils.formatBytes32String('USD'), bn(1), [usdToken.address]) + + // Basket Swapping - Default token - should be replaced by DAI + // Decrease rate to cause default + await token.setExchangeRate(fp('0.8')) + + // Mark Collateral as Defaulted + await collateral.refresh() + + expect(await collateral.status()).to.equal(CollateralStatus.DISABLED) + + // Ensure valid basket + await basketHandler.refreshBasket() + + // Advance time post warmup period + await advanceTime(Number(config.warmupPeriod) + 1) + + const [, newQuotes] = await facade + .connect(addr1) + .callStatic.issue(rToken.address, issueAmount) + expect(newQuotes[0]).to.equal(fp('1')) + + // Check new basket status + expect(await basketHandler.fullyCollateralized()).to.equal(false) + expect(await basketHandler.status()).to.equal(CollateralStatus.SOUND) + + // Running auctions will trigger recollateralization - All balance of invalid tokens will be redeemed + const sellAmt: BigNumber = await token.balanceOf(backingManager.address) + const minBuyAmt = toMinBuyAmt( + sellAmt.div(pow10(decimals - 18)), // scale down to 18 decimals + fp('0.8'), // decrease 20% + fp('1'), + ORACLE_ERROR, + config.maxTradeSlippage + ) + + await expectEvents(facadeTest.runAuctionsForAllTraders(rToken.address), [ + { + contract: backingManager, + name: 'TradeStarted', + args: [anyValue, token.address, usdToken.address, sellAmt, minBuyAmt], + emitted: true, + }, + ]) + + const auctionTimestamp = await getLatestBlockTimestamp() + + // Token (Defaulted) -> DAI (only valid backup token for that target) + await expectTrade(backingManager, { + sell: token.address, + buy: usdToken.address, + endTime: auctionTimestamp + Number(config.batchAuctionLength), + externalId: bn('0'), + }) + + // Check trade + const trade = await getTrade(backingManager, token.address) + const auctionId = await trade.auctionId() + const [, , , auctionSellAmt] = await gnosis.auctions(auctionId) + expect(sellAmt).to.be.closeTo(auctionSellAmt, point5Pct(auctionSellAmt)) + + // Check funds in Market and Traders + expect(await token.balanceOf(gnosis.address)).to.be.closeTo(sellAmt, point5Pct(sellAmt)) + expect(await token.balanceOf(backingManager.address)).to.equal(bn(0)) + + // Advance time till auction ended + await advanceTime(config.batchAuctionLength.add(100).toString()) + + // Mock auction - Get 100% of value + const auctionbuyAmt = fp('1') + await usdToken.connect(addr1).approve(gnosis.address, auctionbuyAmt) + await gnosis.placeBid(0, { + bidder: addr1.address, + sellAmount: auctionSellAmt, + buyAmount: auctionbuyAmt, + }) + + // Close auctions - Will not open new auctions + await expectEvents(facadeTest.runAuctionsForAllTraders(rToken.address), [ + { + contract: backingManager, + name: 'TradeSettled', + args: [anyValue, token.address, usdToken.address, auctionSellAmt, auctionbuyAmt], + emitted: true, + }, + { + contract: backingManager, + name: 'TradeStarted', + emitted: false, + }, + { + contract: rsrTrader, + name: 'TradeStarted', + emitted: false, + }, + { + contract: rTokenTrader, + name: 'TradeStarted', + emitted: false, + }, + ]) + + // Check new status + expect(await basketHandler.fullyCollateralized()).to.equal(true) + expect(await basketHandler.status()).to.equal(CollateralStatus.SOUND) + }) + }) + }) +}) From e17a559c6baeba30737b4cfd5a9c5bdc2f5dc9c3 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Thu, 20 Jun 2024 23:06:38 -0400 Subject: [PATCH 21/72] reserveGas() --- contracts/p0/AssetRegistry.sol | 4 ++-- contracts/p1/AssetRegistry.sol | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/contracts/p0/AssetRegistry.sol b/contracts/p0/AssetRegistry.sol index ad4239cd84..a0e8bded18 100644 --- a/contracts/p0/AssetRegistry.sol +++ b/contracts/p0/AssetRegistry.sol @@ -176,9 +176,9 @@ contract AssetRegistryP0 is ComponentP0, IAssetRegistry { function _reserveGas() private view returns (uint256) { uint256 gas = gasleft(); require( - gas > GAS_FOR_DISABLE_BASKET + GAS_FOR_BH_QTY, + gas > (64 * GAS_FOR_BH_QTY) / 63 + GAS_FOR_DISABLE_BASKET, "not enough gas to unregister safely" ); - return gas - GAS_FOR_DISABLE_BASKET; + return GAS_FOR_BH_QTY; } } diff --git a/contracts/p1/AssetRegistry.sol b/contracts/p1/AssetRegistry.sol index 883c22cff2..3918990b47 100644 --- a/contracts/p1/AssetRegistry.sol +++ b/contracts/p1/AssetRegistry.sol @@ -252,11 +252,15 @@ contract AssetRegistryP1 is ComponentP1, IAssetRegistry { function _reserveGas() private view returns (uint256) { uint256 gas = gasleft(); + // Call to quantity() restricts gas that is passed along to 63 / 64 of gasleft(). + // Therefore gasleft() must be greater than 64 * GAS_FOR_BH_QTY / 63 + // GAS_FOR_DISABLE_BASKET is a buffer which can be considerably lower without + // security implications. require( - gas > GAS_FOR_DISABLE_BASKET + GAS_FOR_BH_QTY, + gas > (64 * GAS_FOR_BH_QTY) / 63 + GAS_FOR_DISABLE_BASKET, "not enough gas to unregister safely" ); - return gas - GAS_FOR_DISABLE_BASKET; + return GAS_FOR_BH_QTY; } /** From 25a3525e94a51bcf5223cc4841bfccc590c261e5 Mon Sep 17 00:00:00 2001 From: Akshat Mittal Date: Sat, 22 Jun 2024 00:55:12 +0530 Subject: [PATCH 22/72] Update DAO Fee Registry --- contracts/registry/DAOFeeRegistry.sol | 44 +++++++++++++++++++-------- docs/aggregator-guide.md | 5 +++ 2 files changed, 36 insertions(+), 13 deletions(-) create mode 100644 docs/aggregator-guide.md diff --git a/contracts/registry/DAOFeeRegistry.sol b/contracts/registry/DAOFeeRegistry.sol index a8e1fd60e5..8e7b9adeb9 100644 --- a/contracts/registry/DAOFeeRegistry.sol +++ b/contracts/registry/DAOFeeRegistry.sol @@ -1,12 +1,14 @@ // SPDX-License-Identifier: BlueOak-1.0.0 pragma solidity 0.8.19; -import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { RoleRegistry } from "./RoleRegistry.sol"; -uint256 constant MAX_FEE_NUMERATOR = 15_00; // max 15% DAO fee +uint256 constant MAX_FEE_NUMERATOR = 15_00; // Max DAO Fee: 15% uint256 constant FEE_DENOMINATOR = 100_00; -contract DAOFeeRegistry is Ownable { +contract DAOFeeRegistry { + RoleRegistry public roleRegistry; + address private feeRecipient; uint256 private defaultFeeNumerator; // 0% @@ -16,31 +18,45 @@ contract DAOFeeRegistry is Ownable { error DAOFeeRegistry__FeeRecipientAlreadySet(); error DAOFeeRegistry__InvalidFeeRecipient(); error DAOFeeRegistry__InvalidFeeNumerator(); - error DAOFeeRegistry__InvalidOwner(); + error DAOFeeRegistry__InvalidRoleRegistry(); + error DAOFeeRegistry__InvalidCaller(); event FeeRecipientSet(address indexed feeRecipient); event DefaultFeeNumeratorSet(uint256 defaultFeeNumerator); event RTokenFeeNumeratorSet(address indexed rToken, uint256 feeNumerator, bool isActive); - constructor(address owner_) Ownable() { - if (owner_ == address(0)) { - revert DAOFeeRegistry__InvalidOwner(); + modifier onlyOwner() { + if (!roleRegistry.isOwner(msg.sender)) { + revert DAOFeeRegistry__InvalidCaller(); + } + _; + } + + constructor(RoleRegistry _roleRegistry, address _feeRecipient) { + if (address(_roleRegistry) == address(0)) { + revert DAOFeeRegistry__InvalidRoleRegistry(); } - _transferOwnership(owner_); // Ownership to DAO - feeRecipient = owner_; // DAO as initial fee recipient + roleRegistry = _roleRegistry; + feeRecipient = _feeRecipient; } function setFeeRecipient(address feeRecipient_) external onlyOwner { - if (feeRecipient_ == address(0)) revert DAOFeeRegistry__InvalidFeeRecipient(); - if (feeRecipient_ == feeRecipient) revert DAOFeeRegistry__FeeRecipientAlreadySet(); + if (feeRecipient_ == address(0)) { + revert DAOFeeRegistry__InvalidFeeRecipient(); + } + if (feeRecipient_ == feeRecipient) { + revert DAOFeeRegistry__FeeRecipientAlreadySet(); + } feeRecipient = feeRecipient_; emit FeeRecipientSet(feeRecipient_); } function setDefaultFeeNumerator(uint256 feeNumerator_) external onlyOwner { - if (feeNumerator_ > MAX_FEE_NUMERATOR) revert DAOFeeRegistry__InvalidFeeNumerator(); + if (feeNumerator_ > MAX_FEE_NUMERATOR) { + revert DAOFeeRegistry__InvalidFeeNumerator(); + } defaultFeeNumerator = feeNumerator_; emit DefaultFeeNumeratorSet(defaultFeeNumerator); @@ -48,7 +64,9 @@ contract DAOFeeRegistry is Ownable { /// @dev A fee below 1% not recommended due to poor precision in the Distributor function setRTokenFeeNumerator(address rToken, uint256 feeNumerator_) external onlyOwner { - if (feeNumerator_ > MAX_FEE_NUMERATOR) revert DAOFeeRegistry__InvalidFeeNumerator(); + if (feeNumerator_ > MAX_FEE_NUMERATOR) { + revert DAOFeeRegistry__InvalidFeeNumerator(); + } rTokenFeeNumerator[rToken] = feeNumerator_; rTokenFeeSet[rToken] = true; diff --git a/docs/aggregator-guide.md b/docs/aggregator-guide.md new file mode 100644 index 0000000000..57ff726d4e --- /dev/null +++ b/docs/aggregator-guide.md @@ -0,0 +1,5 @@ +# Aggregator Integration Guide + +This guide is intended for aggregators looking to natively integrate RToken Minting and Redemptions into their platform. The Reserve Protocol provides a set of smart contracts that allow users to mint and redeem RTokens, which are backed by a basket of assets. + +## Minting From 349c9229076035100908132dc4fead2fecf72a82 Mon Sep 17 00:00:00 2001 From: Akshat Mittal Date: Sat, 22 Jun 2024 01:42:48 +0530 Subject: [PATCH 23/72] upgrade mismatch check --- contracts/p1/Main.sol | 2 ++ docs/aggregator-guide.md | 5 ----- 2 files changed, 2 insertions(+), 5 deletions(-) delete mode 100644 docs/aggregator-guide.md diff --git a/contracts/p1/Main.sol b/contracts/p1/Main.sol index b5749c80fe..e3cbec87da 100644 --- a/contracts/p1/Main.sol +++ b/contracts/p1/Main.sol @@ -105,6 +105,7 @@ contract MainP1 is Versioned, Initializable, Auth, ComponentRegistry, UUPSUpgrad ); _upgradeProxy(address(this), address(implementation.main)); + require(keccak256(abi.encodePacked(this.version())) == versionHash, "upgrade mismatch"); } function upgradeRTokenTo( @@ -157,6 +158,7 @@ contract MainP1 is Versioned, Initializable, Auth, ComponentRegistry, UUPSUpgrad (bool success, ) = proxy.call( abi.encodeWithSelector(UUPSUpgradeable.upgradeTo.selector, implementation) ); + require(success, "upgrade failed"); } diff --git a/docs/aggregator-guide.md b/docs/aggregator-guide.md deleted file mode 100644 index 57ff726d4e..0000000000 --- a/docs/aggregator-guide.md +++ /dev/null @@ -1,5 +0,0 @@ -# Aggregator Integration Guide - -This guide is intended for aggregators looking to natively integrate RToken Minting and Redemptions into their platform. The Reserve Protocol provides a set of smart contracts that allow users to mint and redeem RTokens, which are backed by a basket of assets. - -## Minting From 6c1740c58858280ccc942909a8aac2df664439c6 Mon Sep 17 00:00:00 2001 From: Akshat Mittal Date: Sat, 22 Jun 2024 01:54:48 +0530 Subject: [PATCH 24/72] Fix test --- test/integration/UpgradeToR4.test.ts | 5 +++- .../UpgradeToR4WithRegistries.test.ts | 5 +++- test/registries/DAOFeeRegistry.test.ts | 29 +++++-------------- 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/test/integration/UpgradeToR4.test.ts b/test/integration/UpgradeToR4.test.ts index ce7a9673d2..3d6d24db09 100644 --- a/test/integration/UpgradeToR4.test.ts +++ b/test/integration/UpgradeToR4.test.ts @@ -109,7 +109,10 @@ describe('Upgrade from 3.4.0 to 4.0.0 (Mainnet Fork)', () => { (await AssetPluginRegistryFactory.deploy()) as unknown as AssetPluginRegistry const DAOFeeRegistryFactory = await ethers.getContractFactory('DAOFeeRegistry') - daoFeeRegistry = await DAOFeeRegistryFactory.deploy(await owner.getAddress()) + daoFeeRegistry = await DAOFeeRegistryFactory.deploy( + mockRoleRegistry.address, + await owner.getAddress() + ) }) describe('The Upgrade', () => { diff --git a/test/integration/UpgradeToR4WithRegistries.test.ts b/test/integration/UpgradeToR4WithRegistries.test.ts index 40b103f666..632a4d37ee 100644 --- a/test/integration/UpgradeToR4WithRegistries.test.ts +++ b/test/integration/UpgradeToR4WithRegistries.test.ts @@ -54,7 +54,10 @@ describe('Upgrade from 4.0.0 to New Version with all Registries Enabled', () => assetPluginRegistry = await AssetPluginRegistryFactory.deploy(versionRegistry.address) const DAOFeeRegistryFactory = await ethers.getContractFactory('DAOFeeRegistry') - daoFeeRegistry = await DAOFeeRegistryFactory.deploy(await owner.getAddress()) + daoFeeRegistry = await DAOFeeRegistryFactory.deploy( + mockRoleRegistry.address, + await owner.getAddress() + ) // Setup Common Dependencies const TradingLibFactory = await ethers.getContractFactory('RecollateralizationLibP1') diff --git a/test/registries/DAOFeeRegistry.test.ts b/test/registries/DAOFeeRegistry.test.ts index 4a75c0c77c..6872be6118 100644 --- a/test/registries/DAOFeeRegistry.test.ts +++ b/test/registries/DAOFeeRegistry.test.ts @@ -35,15 +35,19 @@ describeP1('DAO Fee Registry', () => { // Deploy fixture ;({ distributor, main, rToken, rsr, rsrTrader } = await loadFixture(defaultFixture)) + const mockRoleRegistryFactory = await ethers.getContractFactory('MockRoleRegistry') + const mockRoleRegistry = await mockRoleRegistryFactory.deploy() + const DAOFeeRegistryFactory = await ethers.getContractFactory('DAOFeeRegistry') - feeRegistry = await DAOFeeRegistryFactory.connect(owner).deploy(await owner.getAddress()) + feeRegistry = await DAOFeeRegistryFactory.connect(owner).deploy( + mockRoleRegistry.address, + await owner.getAddress() + ) + await main.connect(owner).setDAOFeeRegistry(feeRegistry.address) }) describe('Deployment', () => { - it('should set the owner correctly', async () => { - expect(await feeRegistry.owner()).to.eq(await owner.getAddress()) - }) it('fee should begin zero and assigned to owner', async () => { const feeDetails = await feeRegistry.getFeeDetails(rToken.address) expect(feeDetails.recipient).to.equal(owner.address) @@ -52,23 +56,6 @@ describeP1('DAO Fee Registry', () => { }) }) - describe('Ownership', () => { - it('Should be able to change owner', async () => { - expect(await feeRegistry.owner()).to.eq(await owner.getAddress()) - await feeRegistry.connect(owner).transferOwnership(other.address) - expect(await feeRegistry.owner()).to.eq(await other.getAddress()) - await expect(feeRegistry.connect(owner).setFeeRecipient(owner.address)).to.be.revertedWith( - 'Ownable: caller is not the owner' - ) - await expect(feeRegistry.connect(owner).setDefaultFeeNumerator(bn('100'))).to.be.revertedWith( - 'Ownable: caller is not the owner' - ) - await expect( - feeRegistry.connect(owner).setRTokenFeeNumerator(rToken.address, bn('100')) - ).to.be.revertedWith('Ownable: caller is not the owner') - }) - }) - describe('Negative cases', () => { it('Should not allow calling setters by anyone other than owner', async () => { await expect(feeRegistry.connect(other).setFeeRecipient(owner.address)).to.be.revertedWith( From 2f0e735d8333ad01036f9637a7fe29008b2bc248 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Mon, 24 Jun 2024 16:06:07 -0400 Subject: [PATCH 25/72] add 1e9 precision to GnosisTrade price calculations --- contracts/plugins/trading/GnosisTrade.sol | 11 ++++++----- test/Revenues.test.ts | 2 +- test/scenario/BadCollateralPlugin.test.ts | 4 ++-- test/scenario/RevenueHiding.test.ts | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/contracts/plugins/trading/GnosisTrade.sol b/contracts/plugins/trading/GnosisTrade.sol index 4350ce1e8f..d6557b5991 100644 --- a/contracts/plugins/trading/GnosisTrade.sol +++ b/contracts/plugins/trading/GnosisTrade.sol @@ -47,7 +47,7 @@ contract GnosisTrade is ITrade, Versioned { uint256 public initBal; // {qSellTok}, this trade's balance of `sell` when init() was called uint192 public sellAmount; // {sellTok}, quantity of whole tokens being sold, != initBal uint48 public endTime; // timestamp after which this trade's auction can be settled - uint192 public worstCasePrice; // {qBuyTok/qSellTok}, the worst price we expect to get + uint192 public worstCasePrice; // D27{qBuyTok/qSellTok}, the worst price we expect to get // We expect Gnosis Auction either to meet or beat worstCasePrice, or to return the `sell` // tokens. If we actually *get* a worse clearing that worstCasePrice, we consider it an error in // our trading scheme and call broker.reportViolation() @@ -103,8 +103,9 @@ contract GnosisTrade is ITrade, Versioned { gnosis = gnosis_; endTime = uint48(block.timestamp) + batchAuctionLength; - // {qBuyTok/qSellTok} - worstCasePrice = divuu(req.minBuyAmount, req.sellAmount); // FLOOR + // D27{qBuyTok/qSellTok} + worstCasePrice = shiftl_toFix(req.minBuyAmount, 9).divu(req.sellAmount, FLOOR); + // cannot overflow; cannot round to 0 unless minBuyAmount is itself 0 // Downsize our sell amount to adjust for fee // {qSellTok} = {qSellTok} * {1} / {1} @@ -210,8 +211,8 @@ contract GnosisTrade is ITrade, Versioned { uint256 adjustedSoldAmt = Math.max(soldAmt, 1); uint256 adjustedBuyAmt = boughtAmt + 1; - // {buyTok/sellTok} - uint192 clearingPrice = divuu(adjustedBuyAmt, adjustedSoldAmt); // FLOOR + // D27{buyTok/sellTok} + uint192 clearingPrice = shiftl_toFix(adjustedBuyAmt, 9).divu(adjustedSoldAmt, FLOOR); if (clearingPrice.lt(worstCasePrice)) broker.reportViolation(); } } diff --git a/test/Revenues.test.ts b/test/Revenues.test.ts index e1a572d1e7..94ca1d4730 100644 --- a/test/Revenues.test.ts +++ b/test/Revenues.test.ts @@ -1016,7 +1016,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Trade should have extremely nonzero worst-case price const trade = await getTrade(rTokenTrader, token0.address) expect(await trade.initBal()).to.equal(issueAmount) - expect(await trade.worstCasePrice()).to.be.gte(fp('0.775')) // both tokens have 18 decimals + expect(await trade.worstCasePrice()).to.be.gte(fp('0.775').mul(bn('1e9'))) // D27 precision }) it('Should claim COMP and handle revenue auction correctly - small amount processed in single auction', async () => { diff --git a/test/scenario/BadCollateralPlugin.test.ts b/test/scenario/BadCollateralPlugin.test.ts index 383589f1df..17a043be1c 100644 --- a/test/scenario/BadCollateralPlugin.test.ts +++ b/test/scenario/BadCollateralPlugin.test.ts @@ -222,8 +222,8 @@ describe(`Bad Collateral Plugin - P${IMPLEMENTATION}`, () => { const unslippedPrice = fp('1.1') const lowSellPrice = fp('1').sub(fp('1').mul(ORACLE_ERROR).div(fp('1'))) const highBuyPrice = fp('1').add(fp('1').mul(ORACLE_ERROR).div(fp('1'))) - const worstCasePrice = divCeil(unslippedPrice.mul(lowSellPrice), highBuyPrice).sub(1) - expect(await trade.worstCasePrice()).to.equal(worstCasePrice) // both tokens have 18 decimals + const worstCasePrice = divCeil(unslippedPrice.mul(bn('1e9')).mul(lowSellPrice), highBuyPrice) // D27 + expect(await trade.worstCasePrice()).to.be.closeTo(worstCasePrice, bn('1e9')) }) }) diff --git a/test/scenario/RevenueHiding.test.ts b/test/scenario/RevenueHiding.test.ts index 2942ac99c3..fe079bd4f4 100644 --- a/test/scenario/RevenueHiding.test.ts +++ b/test/scenario/RevenueHiding.test.ts @@ -265,7 +265,7 @@ describe(`RevenueHiding basket collateral (/w CTokenFiatCollateral) - P${IMPLEME const t = await getTrade(rsrTrader, cDAI.address) const sellAmt = await t.initBal() const minBuyAmt = await toMinBuyAmt(sellAmt, fp('2').div(50), fp('1')) - const expectedPrice = minBuyAmt.mul(fp('1')).div(sellAmt).mul(bn('1e10')) // shift 10 decimals for cDAI which has 8 + const expectedPrice = minBuyAmt.mul(fp('1')).div(sellAmt).mul(bn('1e10')).mul(bn('1e9')) // shift 10 decimals for cDAI; D27 precision // price should be within 1 part in a 1 trillion of our discounted rate expect(await t.worstCasePrice()).to.be.closeTo(expectedPrice, expectedPrice.div(bn('1e9'))) }) From 8702fed3fe5a4c62720e54c398ae69491cef4856 Mon Sep 17 00:00:00 2001 From: "Julian M. Rodriguez" <56316686+julianmrodri@users.noreply.github.com> Date: Wed, 26 Jun 2024 16:03:50 -0300 Subject: [PATCH 26/72] Document up to 21 decimals supported (#1162) Co-authored-by: Taylor Brent --- contracts/plugins/trading/GnosisTrade.sol | 3 +++ docs/collateral.md | 9 +++++++++ docs/solidity-style.md | 8 ++++++++ docs/system-design.md | 6 ++++++ 4 files changed, 26 insertions(+) diff --git a/contracts/plugins/trading/GnosisTrade.sol b/contracts/plugins/trading/GnosisTrade.sol index d6557b5991..391cc2ee2d 100644 --- a/contracts/plugins/trading/GnosisTrade.sol +++ b/contracts/plugins/trading/GnosisTrade.sol @@ -14,6 +14,9 @@ import "../../mixins/Versioned.sol"; // Modifications to this contract's state must only ever be made when status=PENDING! /// Trade contract against the Gnosis EasyAuction mechanism +/// Limitations on decimals due to Gnosis Auction limitations: +/// - 27 decimal tokens are not supported in practice: max auction size is ~8e1 whole tokens +/// - 21 decimal tokens are supported, with caveats: max auction size is ~8e7 whole tokens contract GnosisTrade is ITrade, Versioned { using FixLib for uint192; using SafeERC20Upgradeable for IERC20Upgradeable; diff --git a/docs/collateral.md b/docs/collateral.md index 9a98938c24..e1848332ff 100644 --- a/docs/collateral.md +++ b/docs/collateral.md @@ -250,6 +250,15 @@ To use a rebasing token as collateral backing, the rebasing ERC20 needs to be re There is a simple ERC20 wrapper that can be easily extended at [RewardableERC20Wrapper.sol](../contracts/plugins/assets/erc20/RewardableERC20Wrapper.sol). You may add additional logic by extending `_afterDeposit()` or `_beforeWithdraw()`. +### Token decimals should be <= 21 + +The protocol currently supports collateral tokens with up to 21 decimals. There are some caveats to know about: + +- For a token with 21 decimals, batch auctions can only process up to ~8e7 whole tokens in a single auction. Dollar-pegged tokens thus fit nicely within this constraint, but 21 decimal tokens that are worth <$0.1 per whole token may not. Therefore, the protocol should not be used with **low-value 21-decimal tokens**. +- For a token with 18 decimals, batch auctions can only process up to ~8e10 whole tokens in a single auction. + +Dutch auctions do not have this constraint. As long as they remain enabled they can process a larger number of tokens. + ### `refresh()` should never revert Because it’s called at the beginning of many transactions, `refresh()` should never revert. If `refresh()` encounters a critical error, it should change the Collateral contract’s state so that `status()` becomes `DISABLED`. diff --git a/docs/solidity-style.md b/docs/solidity-style.md index 4bec58a300..05a35b8aea 100644 --- a/docs/solidity-style.md +++ b/docs/solidity-style.md @@ -135,6 +135,14 @@ That is, we expect timestamps to be any uint48 value. This should work without change for around 9M years, which is more than enough. +### Collateral decimals + +`{decimals}`: [6, 21] + +The protocol only supports collateral tokens up to 21 decimals, and for these cases only supports balances up to `~8e28`. Exceeding this could end up overflowing restrictions in GnosisTrade / EasyAuction, and end up in rounding issues accross the protocol. + +21 decimal tokens must also be sufficiently valued, where that is defined as a whole token worth >$0.1. + ## Function annotations All core functions that can be called from outside our system are classified into one of the following 3 categories: diff --git a/docs/system-design.md b/docs/system-design.md index 22128c989f..127907e211 100644 --- a/docs/system-design.md +++ b/docs/system-design.md @@ -170,6 +170,12 @@ The `dutchAuctionLength` can be configured to be any value. The suggested defaul The "best plausible price" is equal to the exchange rate at the high price of the sell token and the low price of the buy token. The "worst-case price" is equal to the exchange rate at the low price of the sell token and the high price of the sell token, plus an additional discount equal to `maxTradeSlippage`. +### Collateral decimals restriction + +The protocol only supports collateral tokens with up to 21 decimals, and for these cases only supports balances up to `~8e28`. Exceeding this could end up overflowing the `uint96` restrictions in GnosisTrade / EasyAuction. We expect `~70e6` whole tokens (for 21 decimals) to always be worth more than the `minTradeVolume`. Note that even when this assumption breaks, the protocol behaves gracefully and downsizes the GnosisTrade to be within the limits. + +In terms of rounding, with a 21 decimals token, we lose 3 decimal places when rounding down to our 18 decimal fixed point numbers (up to 999 wei). Even if one whole token is worth 1 billion USD, `1e3` wei will only be worth `1e-9` USD in that case. This is an acceptable loss. + #### Trade violation fallback Dutch auctions become disabled for an asset being traded if a trade clears in the geometric phase. The rationale is that a trade that clears in this range (multiples above the plausible price) only does so because either 1) the auctioned asset's price was manipulated downwards, or 2) the bidding asset was manipulated upwards, such that the protocol accepts an unfavorable trade. All subsequent trades for that particular trading pair will be forced to use the batch auctions as a result. Dutch auctions for disabled assets must be manually re-enabled by governance. From 16b615d4e911a6634e3c4f232611ca1921d471c4 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Wed, 3 Jul 2024 21:57:22 -0400 Subject: [PATCH 27/72] add rounding to _quantity() --- contracts/p0/BasketHandler.sol | 21 +++++++++++++-------- contracts/p1/BasketHandler.sol | 16 ++++++++++------ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/contracts/p0/BasketHandler.sol b/contracts/p0/BasketHandler.sol index 2b8e9e7439..e860a1dfc9 100644 --- a/contracts/p0/BasketHandler.sol +++ b/contracts/p0/BasketHandler.sol @@ -384,7 +384,7 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { // Otherwise returns (token's basket.refAmts / token's Collateral.refPerTok()) function quantity(IERC20 erc20) public view returns (uint192) { try main.assetRegistry().toColl(erc20) returns (ICollateral coll) { - return _quantity(erc20, coll); + return _quantity(erc20, coll, CEIL); } catch { return FIX_ZERO; } @@ -399,7 +399,7 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { // Otherwise returns (token's basket.refAmts / token's Collateral.refPerTok()) function quantityUnsafe(IERC20 erc20, IAsset asset) public view returns (uint192) { if (!asset.isCollateral()) return FIX_ZERO; - return _quantity(erc20, ICollateral(address(asset))); + return _quantity(erc20, ICollateral(address(asset)), CEIL); } /// @param erc20 The token contract @@ -408,12 +408,16 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { // Returns 0 if coll is not in the basket // Returns FIX_MAX (in lieu of +infinity) if Collateral.refPerTok() is 0. // Otherwise returns (token's basket.refAmts / token's Collateral.refPerTok()) - function _quantity(IERC20 erc20, ICollateral coll) internal view returns (uint192) { + function _quantity( + IERC20 erc20, + ICollateral coll, + RoundingMode rounding + ) internal view returns (uint192) { uint192 refPerTok = coll.refPerTok(); if (refPerTok == 0) return FIX_MAX; // {tok/BU} = {ref/BU} / {ref/tok} - return basket.refAmts[erc20].div(refPerTok, CEIL); + return basket.refAmts[erc20].div(refPerTok, rounding); } /// Should not revert @@ -477,17 +481,18 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { view returns (address[] memory erc20s, uint256[] memory quantities) { + IAssetRegistry assetRegistry = main.assetRegistry(); erc20s = new address[](basket.erc20s.length); quantities = new uint256[](basket.erc20s.length); for (uint256 i = 0; i < basket.erc20s.length; ++i) { erc20s[i] = address(basket.erc20s[i]); + ICollateral coll = assetRegistry.toColl(IERC20(erc20s[i])); // {qTok} = {tok/BU} * {BU} * {tok} * {qTok/tok} - quantities[i] = quantity(basket.erc20s[i]).safeMul(amount, rounding).shiftl_toUint( - int8(IERC20Metadata(address(basket.erc20s[i])).decimals()), - rounding - ); + quantities[i] = _quantity(basket.erc20s[i], coll, rounding) + .safeMul(amount, rounding) + .shiftl_toUint(int8(IERC20Metadata(address(basket.erc20s[i])).decimals()), rounding); } } diff --git a/contracts/p1/BasketHandler.sol b/contracts/p1/BasketHandler.sol index 4c4d76535b..3408f04028 100644 --- a/contracts/p1/BasketHandler.sol +++ b/contracts/p1/BasketHandler.sol @@ -345,7 +345,7 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { // Otherwise returns (token's basket.refAmts / token's Collateral.refPerTok()) function quantity(IERC20 erc20) public view returns (uint192) { try assetRegistry.toColl(erc20) returns (ICollateral coll) { - return _quantity(erc20, coll); + return _quantity(erc20, coll, CEIL); } catch { return FIX_ZERO; } @@ -360,7 +360,7 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { // Otherwise returns (token's basket.refAmts / token's Collateral.refPerTok()) function quantityUnsafe(IERC20 erc20, IAsset asset) public view returns (uint192) { if (!asset.isCollateral()) return FIX_ZERO; - return _quantity(erc20, ICollateral(address(asset))); + return _quantity(erc20, ICollateral(address(asset)), CEIL); } /// @param erc20 The token contract @@ -369,12 +369,16 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { // Returns 0 if coll is not in the basket // Returns FIX_MAX (in lieu of +infinity) if Collateral.refPerTok() is 0. // Otherwise returns (token's basket.refAmts / token's Collateral.refPerTok()) - function _quantity(IERC20 erc20, ICollateral coll) internal view returns (uint192) { + function _quantity( + IERC20 erc20, + ICollateral coll, + RoundingMode rounding + ) internal view returns (uint192) { uint192 refPerTok = coll.refPerTok(); if (refPerTok == 0) return FIX_MAX; // {tok/BU} = {ref/BU} / {ref/tok} - return basket.refAmts[erc20].div(refPerTok, CEIL); + return basket.refAmts[erc20].div(refPerTok, rounding); } /// Should not revert @@ -405,7 +409,7 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { uint256 len = basket.erc20s.length; for (uint256 i = 0; i < len; ++i) { - uint192 qty = quantity(basket.erc20s[i]); + uint192 qty = quantity(basket.erc20s[i]); // CEIL rounding if (qty == 0) continue; (uint192 lowP, uint192 highP) = useLotPrice @@ -449,7 +453,7 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { ICollateral coll = assetRegistry.toColl(IERC20(erc20s[i])); // {qTok} = {tok/BU} * {BU} * {tok} * {qTok/tok} - quantities[i] = _quantity(basket.erc20s[i], coll) + quantities[i] = _quantity(basket.erc20s[i], coll, rounding) .safeMul(amount, rounding) .shiftl_toUint(int8(IERC20Metadata(address(basket.erc20s[i])).decimals()), rounding); } From 321a21688879bd05eca93e971f8130fbf1bdd7f1 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Fri, 5 Jul 2024 13:41:08 -0400 Subject: [PATCH 28/72] remove comment --- contracts/p0/BasketHandler.sol | 2 -- contracts/p1/BasketHandler.sol | 2 -- 2 files changed, 4 deletions(-) diff --git a/contracts/p0/BasketHandler.sol b/contracts/p0/BasketHandler.sol index e860a1dfc9..f267727fa2 100644 --- a/contracts/p0/BasketHandler.sol +++ b/contracts/p0/BasketHandler.sol @@ -576,8 +576,6 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { quantities[i] = amount .safeMulDiv(refAmtsAll[i], collsAll[i].refPerTok(), FLOOR) .shiftl_toUint(int8(collsAll[i].erc20Decimals()), FLOOR); - // marginally more penalizing than its sibling calculation that uses _quantity() - // because does not intermediately CEIL as part of the division } } diff --git a/contracts/p1/BasketHandler.sol b/contracts/p1/BasketHandler.sol index 3408f04028..f21367f6ce 100644 --- a/contracts/p1/BasketHandler.sol +++ b/contracts/p1/BasketHandler.sol @@ -545,8 +545,6 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { quantities[i] = amount .safeMulDiv(refAmtsAll[i], collsAll[i].refPerTok(), FLOOR) .shiftl_toUint(int8(collsAll[i].erc20Decimals()), FLOOR); - // marginally more penalizing than its sibling calculation that uses _quantity() - // because does not intermediately CEIL as part of the division } } From 841d92762541796b3d2d474a0eec4f7490491f40 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Fri, 5 Jul 2024 14:33:41 -0400 Subject: [PATCH 29/72] add clarifying trackStatus() comments --- contracts/p1/BasketHandler.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/p1/BasketHandler.sol b/contracts/p1/BasketHandler.sol index f21367f6ce..d65a3c667c 100644 --- a/contracts/p1/BasketHandler.sol +++ b/contracts/p1/BasketHandler.sol @@ -136,7 +136,7 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { emit BasketSet(nonce, basket.erc20s, refAmts, true); disabled = true; - trackStatus(); + trackStatus(); // does NOT interact with collateral plugins or tokens } /// Switch the basket, only callable directly by governance or after a default @@ -163,6 +163,7 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { /// Track basket status and collateralization changes // effects: lastStatus' = status(), and lastStatusTimestamp' = current timestamp + /// @dev Does NOT interact with collateral plugins or tokens when basket is disabled /// @custom:refresher function trackStatus() public { // Historical context: This is not the ideal naming for this function but it allowed From 49e83341c916cca5c2c6c48e14db7c3a642bc9d1 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Fri, 5 Jul 2024 14:47:01 -0400 Subject: [PATCH 30/72] add comment --- contracts/p1/Distributor.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/p1/Distributor.sol b/contracts/p1/Distributor.sol index 8c4e14cd63..8040eeb03f 100644 --- a/contracts/p1/Distributor.sol +++ b/contracts/p1/Distributor.sol @@ -52,6 +52,7 @@ contract DistributorP1 is ComponentP1, IDistributor { /// Set the RevenueShare for destination `dest`. Destinations `FURNACE` and `ST_RSR` refer to /// main.furnace() and main.stRSR(). + /// Consider calling `BackingManager.forwardRevenue()` before to ensure fair past distribution /// @custom:governance // checks: invariants hold in post-state // effects: @@ -71,6 +72,7 @@ contract DistributorP1 is ComponentP1, IDistributor { /// Set RevenueShares for destinations. Destinations `FURNACE` and `ST_RSR` refer to /// main.furnace() and main.stRSR(). + /// Consider calling `BackingManager.forwardRevenue()` before to ensure fair past distribution /// @custom:governance // checks: invariants hold in post-state // effects: From 0e3fd42431068d95544d66e2ad6e14ac0188fedf Mon Sep 17 00:00:00 2001 From: "Julian M. Rodriguez" <56316686+julianmrodri@users.noreply.github.com> Date: Fri, 5 Jul 2024 18:47:44 -0300 Subject: [PATCH 31/72] Add comment in version registry (#1170) --- contracts/registry/VersionRegistry.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/registry/VersionRegistry.sol b/contracts/registry/VersionRegistry.sol index 2fa954fa9e..dad73d302b 100644 --- a/contracts/registry/VersionRegistry.sol +++ b/contracts/registry/VersionRegistry.sol @@ -7,6 +7,7 @@ import { RoleRegistry } from "./RoleRegistry.sol"; /** * @title VersionRegistry * @notice A tiny contract for tracking deployment versions + * All versions registered are expected to include veRSR, so effectively 4.0.0+. */ contract VersionRegistry { mapping(bytes32 => IDeployer) public deployments; From dc42b06aa34045203c3cf3a81e26064401b0f505 Mon Sep 17 00:00:00 2001 From: "Julian M. Rodriguez" <56316686+julianmrodri@users.noreply.github.com> Date: Fri, 5 Jul 2024 18:49:24 -0300 Subject: [PATCH 32/72] Run prettier (#1168) --- common/blockchain-utils.ts | 6 +- contracts/plugins/mocks/CTokenMock.sol | 2 +- contracts/plugins/mocks/ChainlinkMock.sol | 7 +- .../plugins/mocks/InvalidChainlinkMock.sol | 7 +- contracts/plugins/mocks/UnpricedPlugins.sol | 30 +++-- .../addresses/1-tmp-assets-collateral.json | 2 +- .../421614-tmp-deployments.json | 2 +- .../8453-tmp-assets-collateral.json | 2 +- .../8453-tmp-assets-collateral.json | 2 +- .../base-3.0.1/8453-tmp-deployments.json | 2 +- .../8453-tmp-assets-collateral.json | 2 +- .../1-tmp-assets-collateral.json | 2 +- .../1-tmp-assets-collateral.json | 2 +- .../mainnet-3.0.1/1-tmp-deployments.json | 2 +- .../1-tmp-assets-collateral.json | 2 +- .../mainnet-3.3.0/1-tmp-deployments.json | 2 +- .../deploy_stargate_usdt_collateral.ts | 4 +- scripts/refresh-whales.ts | 108 ++++++++++-------- scripts/verification/assets/verify_stg.ts | 8 +- .../verify_stargate_usdc.ts | 70 ++++++------ tasks/deployment/get-addresses.ts | 42 +++---- tasks/validation/whales/whales_31337.json | 2 +- 22 files changed, 176 insertions(+), 132 deletions(-) diff --git a/common/blockchain-utils.ts b/common/blockchain-utils.ts index bf34e006b4..a5440f8147 100644 --- a/common/blockchain-utils.ts +++ b/common/blockchain-utils.ts @@ -23,13 +23,13 @@ export const getChainId = async (hre: HardhatRuntimeEnvironment): Promise { @@ -51,61 +51,66 @@ async function main() { const isGoodWhale = (whale: string) => { return !stRSRs.includes(whale) } - + const getBigWhale = async (token: string) => { const ethUrl = `https://${SCANNER_URLS[FORK_NETWORK]}/token/generic-tokenholders2?m=light&a=${token}&p=1` // const response = await axios.get(ethUrl); if (FORK_NETWORK === 'mainnet') { - const response = await axios.get(ethUrl); - const selector = cheerio.load(response.data); - let found = false; - let i = 0; - let whale = ""; + const response = await axios.get(ethUrl) + const selector = cheerio.load(response.data) + let found = false + let i = 0 + let whale = '' while (!found) { - whale = selector(selector("tbody > tr")[i]).find("td > div > .link-secondary")[0].attribs['data-clipboard-text']; + whale = selector(selector('tbody > tr')[i]).find('td > div > .link-secondary')[0].attribs[ + 'data-clipboard-text' + ] if (isGoodWhale(whale)) { - found = true; - break; + found = true + break } - i++; + i++ } return whale } else if (FORK_NETWORK === 'base') { const response = await fetch(ethUrl, { - "headers": { - "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", - "accept-language": "en-US,en;q=0.9", - "cache-control": "max-age=0", - "priority": "u=0, i", - "sec-ch-ua": "\"Chromium\";v=\"124\", \"Google Chrome\";v=\"124\", \"Not-A.Brand\";v=\"99\"", - "sec-ch-ua-mobile": "?0", - "sec-ch-ua-platform": "\"macOS\"", - "sec-fetch-dest": "document", - "sec-fetch-mode": "navigate", - "sec-fetch-site": "none", - "sec-fetch-user": "?1", - "upgrade-insecure-requests": "1" + headers: { + accept: + 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', + 'accept-language': 'en-US,en;q=0.9', + 'cache-control': 'max-age=0', + priority: 'u=0, i', + 'sec-ch-ua': '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"macOS"', + 'sec-fetch-dest': 'document', + 'sec-fetch-mode': 'navigate', + 'sec-fetch-site': 'none', + 'sec-fetch-user': '?1', + 'upgrade-insecure-requests': '1', }, - "referrerPolicy": "strict-origin-when-cross-origin", - "body": null, - "method": "GET", - "mode": "cors", - "credentials": "include" - }); - const selector = cheerio.load(await response.text()); - let found = false; - let i = 0; - let whale = ""; + referrerPolicy: 'strict-origin-when-cross-origin', + body: null, + method: 'GET', + mode: 'cors', + credentials: 'include', + }) + const selector = cheerio.load(await response.text()) + let found = false + let i = 0 + let whale = '' while (!found) { - whale = selector(selector("tbody > tr")[i]).find("td > span > a")[0].attribs['href'].split('?a=')[1]; + whale = selector(selector('tbody > tr')[i]) + .find('td > span > a')[0] + .attribs['href'].split('?a=')[1] if (isGoodWhale(whale)) { - found = true; - break; + found = true + break } - i++; + i++ } - return whale; + return whale } else { throw new Error('Invalid network') } @@ -117,7 +122,12 @@ async function main() { let tokenWhale = whales.tokens[tokenAddress] let lastUpdated = whales.lastUpdated[tokenAddress] // only get a big whale if the whale is not already set or if it was last updated more than 1 day ago - if (!FORCE_REFRESH && tokenWhale && lastUpdated && new Date().getTime() - new Date(lastUpdated).getTime() < 86400000) { + if ( + !FORCE_REFRESH && + tokenWhale && + lastUpdated && + new Date().getTime() - new Date(lastUpdated).getTime() < 86400000 + ) { console.log('Whale already set for', tokenAddress, 'skipping...') return } @@ -133,7 +143,7 @@ async function main() { console.error('Error getting whale for', tokenAddress, error) } } - + // ERC20 Collaterals const tokens: ITokensKeys = Object.keys(networkConfig[chainId].tokens) as ITokensKeys for (let i = 0; i < tokens.length; i++) { @@ -155,4 +165,4 @@ main() .catch((error) => { console.error(error) process.exit(1) - }) \ No newline at end of file + }) diff --git a/scripts/verification/assets/verify_stg.ts b/scripts/verification/assets/verify_stg.ts index 794d417834..874254e465 100644 --- a/scripts/verification/assets/verify_stg.ts +++ b/scripts/verification/assets/verify_stg.ts @@ -2,7 +2,13 @@ import hre from 'hardhat' import { getChainId } from '../../../common/blockchain-utils' import { developmentChains, networkConfig } from '../../../common/configuration' -import { getAssetCollDeploymentFilename, getDeploymentFile, getDeploymentFilename, IAssetCollDeployments, IDeployments } from '../../deployment/common' +import { + getAssetCollDeploymentFilename, + getDeploymentFile, + getDeploymentFilename, + IAssetCollDeployments, + IDeployments, +} from '../../deployment/common' import { verifyContract } from '../../deployment/utils' import { fp } from '../../../common/numbers' diff --git a/scripts/verification/collateral-plugins/verify_stargate_usdc.ts b/scripts/verification/collateral-plugins/verify_stargate_usdc.ts index 3973a5ee55..56ab328ffa 100644 --- a/scripts/verification/collateral-plugins/verify_stargate_usdc.ts +++ b/scripts/verification/collateral-plugins/verify_stargate_usdc.ts @@ -7,7 +7,13 @@ import { getAssetCollDeploymentFilename, IAssetCollDeployments, } from '../../deployment/common' -import { priceTimeout, oracleTimeout, verifyContract, combinedError, revenueHiding } from '../../deployment/utils' +import { + priceTimeout, + oracleTimeout, + verifyContract, + combinedError, + revenueHiding, +} from '../../deployment/utils' let deployments: IAssetCollDeployments @@ -33,16 +39,16 @@ async function main() { const sUSDC = networkConfig[chainId].tokens.sUSDC await verifyContract( - chainId, - deployments.erc20s.wsgUSDC, - [ - name, - symbol, - networkConfig[chainId].tokens.STG, - networkConfig[chainId].STARGATE_STAKING_CONTRACT, - sUSDC - ], - 'contracts/plugins/assets/stargate/StargateRewardableWrapper.sol:StargateRewardableWrapper' + chainId, + deployments.erc20s.wsgUSDC, + [ + name, + symbol, + networkConfig[chainId].tokens.STG, + networkConfig[chainId].STARGATE_STAKING_CONTRACT, + sUSDC, + ], + 'contracts/plugins/assets/stargate/StargateRewardableWrapper.sol:StargateRewardableWrapper' ) const oracleError = fp('0.0025') // 0.25% @@ -62,7 +68,7 @@ async function main() { defaultThreshold: fp('0.01').add(oracleError).toString(), delayUntilDefault: bn('86400').toString(), // 24h }, - revenueHiding.toString() + revenueHiding.toString(), ], 'contracts/plugins/assets/stargate/StargatePoolFiatCollateral.sol:StargatePoolFiatCollateral' ) @@ -72,16 +78,16 @@ async function main() { const sUSDC = networkConfig[chainId].tokens.sUSDbC await verifyContract( - chainId, - deployments.erc20s.wsgUSDbC, - [ - name, - symbol, - networkConfig[chainId].tokens.STG, - networkConfig[chainId].STARGATE_STAKING_CONTRACT, - sUSDC - ], - 'contracts/plugins/assets/stargate/StargateRewardableWrapper.sol:StargateRewardableWrapper' + chainId, + deployments.erc20s.wsgUSDbC, + [ + name, + symbol, + networkConfig[chainId].tokens.STG, + networkConfig[chainId].STARGATE_STAKING_CONTRACT, + sUSDC, + ], + 'contracts/plugins/assets/stargate/StargateRewardableWrapper.sol:StargateRewardableWrapper' ) const oracleError = fp('0.003') // 0.3% @@ -91,17 +97,17 @@ async function main() { deployments.collateral.wsgUSDbC, [ { - priceTimeout: priceTimeout.toString(), - chainlinkFeed: networkConfig['8453'].chainlinkFeeds.USDC!, - oracleError: oracleError.toString(), - erc20: deployments.erc20s.wsgUSDbC!, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout('8453', '86400').toString(), // 24h hr, - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.01').add(oracleError).toString(), // ~2.5% - delayUntilDefault: bn('86400').toString(), // 24h + priceTimeout: priceTimeout.toString(), + chainlinkFeed: networkConfig['8453'].chainlinkFeeds.USDC!, + oracleError: oracleError.toString(), + erc20: deployments.erc20s.wsgUSDbC!, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout('8453', '86400').toString(), // 24h hr, + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.01').add(oracleError).toString(), // ~2.5% + delayUntilDefault: bn('86400').toString(), // 24h }, - revenueHiding.toString() + revenueHiding.toString(), ], 'contracts/plugins/assets/stargate/StargatePoolFiatCollateral.sol:StargatePoolFiatCollateral' ) diff --git a/tasks/deployment/get-addresses.ts b/tasks/deployment/get-addresses.ts index f8433460d4..f230a33ec1 100644 --- a/tasks/deployment/get-addresses.ts +++ b/tasks/deployment/get-addresses.ts @@ -23,19 +23,19 @@ task('get-addys', 'Compile the deployed addresses of an RToken deployment') /* Helper functions */ - - // hacky api throttler, basescan has rate limits 5req/sec - const delay = async (ms: number) => { - return new Promise( resolve => setTimeout(resolve, ms) ); + + // hacky api throttler, basescan has rate limits 5req/sec + const delay = async (ms: number) => { + return new Promise((resolve) => setTimeout(resolve, ms)) } - + const capitalize = (s: string) => s && s[0].toUpperCase() + s.slice(1) - + const chainId = await getChainId(hre) const network: Network = hre.network.name as Network - let scannerUrl: string; - let scannerApiUrl: string; - switch(network) { + let scannerUrl: string + let scannerApiUrl: string + switch (network) { case 'mainnet': scannerUrl = 'https://etherscan.io/address/' scannerApiUrl = `https://api.etherscan.io/api` @@ -65,7 +65,9 @@ task('get-addys', 'Compile the deployed addresses of an RToken deployment') const component = await hre.ethers.getContractAt('ComponentP1', address) let row = `| ${name} | [${address}](${scannerUrl}${address}) |` if (!!implementation) { - row += `[${implementation}](${scannerUrl}${implementation}#code) | ${await getVersion(component)} |` + row += `[${implementation}](${scannerUrl}${implementation}#code) | ${await getVersion( + component + )} |` } return row } @@ -95,8 +97,8 @@ task('get-addys', 'Compile the deployed addresses of an RToken deployment') isRToken ? rows.push(await createRTokenTableRow(component.name, component.address)) : isComponent - ? rows.push(await createComponentTableRow(component.name, component.address)) - : rows.push(await createAssetTableRow(component.name, component.address)) + ? rows.push(await createComponentTableRow(component.name, component.address)) + : rows.push(await createAssetTableRow(component.name, component.address)) } return rows.join('\n') } @@ -125,10 +127,7 @@ ${govRows} ` } - const createComponentMarkdown = async ( - name: string, - rows: string - ) => { + const createComponentMarkdown = async (name: string, rows: string) => { return `# ${name} ## Component Addresses | Contract | Address | Version | @@ -181,7 +180,7 @@ ${collaterals} if (params.rtoken && params.gov) { // if rtoken address is provided, print component addresses - + const rToken = await hre.ethers.getContractAt('IRToken', params.rtoken) const symbol = await rToken.symbol() console.log(`Collecting addresses for RToken: ${symbol} (${params.rtoken}))`) @@ -239,11 +238,11 @@ ${collaterals} const rTokenFileName = await getRTokenFileName(params.rtoken) fs.writeFileSync(rTokenFileName, markdown) console.log(`Wrote ${rTokenFileName}`) - - toc[network]['rtokens'].indexOf(rTokenSymbol) === -1 && toc[network]['rtokens'].push(rTokenSymbol) + + toc[network]['rtokens'].indexOf(rTokenSymbol) === -1 && + toc[network]['rtokens'].push(rTokenSymbol) fs.writeFileSync(tocFilename, JSON.stringify(toc, null, 2)) console.log(`Updated table of contents`) - } else if (params.ver) { console.log(`Collecting addresses for Version: ${params.ver} (${hre.network.name})`) // if version is provided, print implementation addresses @@ -306,7 +305,8 @@ ${collaterals} fs.writeFileSync(componentFileName, componentMarkdown) console.log(`Wrote ${componentFileName}`) - toc[network]['components'].indexOf(componentFileId) === -1 && toc[network]['components'].push(componentFileId) + toc[network]['components'].indexOf(componentFileId) === -1 && + toc[network]['components'].push(componentFileId) toc[network]['assets'].indexOf(assetFileId) === -1 && toc[network]['assets'].push(assetFileId) fs.writeFileSync(tocFilename, JSON.stringify(toc, null, 2)) console.log(`Updated table of contents`) diff --git a/tasks/validation/whales/whales_31337.json b/tasks/validation/whales/whales_31337.json index 808ba0a19b..65eb040129 100644 --- a/tasks/validation/whales/whales_31337.json +++ b/tasks/validation/whales/whales_31337.json @@ -137,4 +137,4 @@ "0x0d86883faf4ffd7aeb116390af37746f45b6f378": "2024-05-01T16:12:40.659Z", "0x78da5799cf427fee11e9996982f4150ece7a99a7": "2024-05-01T16:12:40.776Z" } -} \ No newline at end of file +} From 297d06e5d75c5211dd3097d907d4fbf647d49e21 Mon Sep 17 00:00:00 2001 From: "Julian M. Rodriguez" <56316686+julianmrodri@users.noreply.github.com> Date: Fri, 5 Jul 2024 18:49:55 -0300 Subject: [PATCH 33/72] Add explicit rounding direction (#1167) --- contracts/facade/facets/ReadFacet.sol | 4 +--- .../curve/CurveStableMetapoolCollateral.sol | 24 +++++++++++++++---- .../yearnv2/YearnV2CurveFiatCollateral.sol | 2 +- contracts/plugins/trading/GnosisTrade.sol | 2 +- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/contracts/facade/facets/ReadFacet.sol b/contracts/facade/facets/ReadFacet.sol index f83cb5ed68..98b1be2f47 100644 --- a/contracts/facade/facets/ReadFacet.sol +++ b/contracts/facade/facets/ReadFacet.sol @@ -69,9 +69,7 @@ contract ReadFacet { uint192 mid = (low + high) / 2; // {UoA} = {tok} * {UoA/Tok} - depositsUoA[i] = shiftl_toFix(deposits[i], -int8(asset.erc20Decimals()), FLOOR).mul( - mid - ); + depositsUoA[i] = shiftl_toFix(deposits[i], -int8(asset.erc20Decimals()), CEIL).mul(mid); } } diff --git a/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol b/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol index 3a49b1bd77..3519301e67 100644 --- a/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol +++ b/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol @@ -108,7 +108,11 @@ contract CurveStableMetapoolCollateral is CurveStableCollateral { (uint192 aumLow, uint192 aumHigh) = _metapoolBalancesValue(lowPaired, highPaired); // {tok} -- FLOOR - uint192 supply = shiftl_toFix(metapoolToken.totalSupply(), -int8(metapoolToken.decimals())); + uint192 supply = shiftl_toFix( + metapoolToken.totalSupply(), + -int8(metapoolToken.decimals()), + FLOOR + ); // We can always assume that the total supply is sufficiently non-zero // {UoA/tok} = {UoA} / {tok} @@ -170,7 +174,11 @@ contract CurveStableMetapoolCollateral is CurveStableCollateral { (uint192 underlyingAumLow, uint192 underlyingAumHigh) = totalBalancesValue(); // {tokUnderlying} -- FLOOR - uint192 underlyingSupply = shiftl_toFix(lpToken.totalSupply(), -int8(lpToken.decimals())); + uint192 underlyingSupply = shiftl_toFix( + lpToken.totalSupply(), + -int8(lpToken.decimals()), + FLOOR + ); // We can always assume that the underlying supply is sufficiently non-zero // {UoA/tokUnderlying} = {UoA} / {tokUnderlying} @@ -178,14 +186,22 @@ contract CurveStableMetapoolCollateral is CurveStableCollateral { uint192 underlyingHigh = underlyingAumHigh.div(underlyingSupply, CEIL); // {tokUnderlying} -- FLOOR - uint192 balUnderlying = shiftl_toFix(metapoolToken.balances(1), -int8(lpToken.decimals())); + uint192 balUnderlying = shiftl_toFix( + metapoolToken.balances(1), + -int8(lpToken.decimals()), + FLOOR + ); // {UoA} = {UoA/tokUnderlying} * {tokUnderlying} aumLow = underlyingLow.mul(balUnderlying, FLOOR); aumHigh = underlyingHigh.mul(balUnderlying, CEIL); // {pairedTok} -- FLOOR - uint192 pairedBal = shiftl_toFix(metapoolToken.balances(0), -int8(pairedToken.decimals())); + uint192 pairedBal = shiftl_toFix( + metapoolToken.balances(0), + -int8(pairedToken.decimals()), + FLOOR + ); // Add-in contribution from pairedTok // {UoA} = {UoA} + {UoA/pairedTok} * {pairedTok} diff --git a/contracts/plugins/assets/yearnv2/YearnV2CurveFiatCollateral.sol b/contracts/plugins/assets/yearnv2/YearnV2CurveFiatCollateral.sol index 7644f58759..2bb8d26340 100644 --- a/contracts/plugins/assets/yearnv2/YearnV2CurveFiatCollateral.sol +++ b/contracts/plugins/assets/yearnv2/YearnV2CurveFiatCollateral.sol @@ -64,7 +64,7 @@ contract YearnV2CurveFiatCollateral is CurveStableCollateral { (uint192 aumLow, uint192 aumHigh) = totalBalancesValue(); // {LP token} - uint192 supply = shiftl_toFix(lpToken.totalSupply(), -int8(lpToken.decimals())); + uint192 supply = shiftl_toFix(lpToken.totalSupply(), -int8(lpToken.decimals()), FLOOR); // We can always assume that the total supply is non-zero // {UoA/LP token} = {UoA} / {LP token} diff --git a/contracts/plugins/trading/GnosisTrade.sol b/contracts/plugins/trading/GnosisTrade.sol index 391cc2ee2d..3d67a33d02 100644 --- a/contracts/plugins/trading/GnosisTrade.sol +++ b/contracts/plugins/trading/GnosisTrade.sol @@ -94,7 +94,7 @@ contract GnosisTrade is ITrade, Versioned { sell = req.sell.erc20(); buy = req.buy.erc20(); - sellAmount = shiftl_toFix(req.sellAmount, -int8(sell.decimals())); // {sellTok} + sellAmount = shiftl_toFix(req.sellAmount, -int8(sell.decimals()), FLOOR); // {sellTok} initBal = sell.balanceOf(address(this)); // {qSellTok} require(initBal >= req.sellAmount, "unfunded trade"); From f25f6c35a032fb91d91dccd04a79469813e76fe4 Mon Sep 17 00:00:00 2001 From: "Julian M. Rodriguez" <56316686+julianmrodri@users.noreply.github.com> Date: Tue, 9 Jul 2024 12:38:14 -0300 Subject: [PATCH 34/72] fix revenue hiding test (#1171) --- .../individual-collateral/mountain/USDMCollateral.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/plugins/individual-collateral/mountain/USDMCollateral.test.ts b/test/plugins/individual-collateral/mountain/USDMCollateral.test.ts index 49205edd0e..570c60345f 100644 --- a/test/plugins/individual-collateral/mountain/USDMCollateral.test.ts +++ b/test/plugins/individual-collateral/mountain/USDMCollateral.test.ts @@ -204,7 +204,7 @@ const collateralSpecificStatusTests = () => { const [, alice] = await ethers.getSigners() const tempCtx = await makeCollateralFixtureContext(alice, { erc20: ARB_WUSDM, - revenueHiding: fp('0.01'), + revenueHiding: fp('0.0101'), })() // Set correct price to maintain peg From d47d99678d471c541968b5d7860d40b263681a40 Mon Sep 17 00:00:00 2001 From: Julian R Date: Tue, 9 Jul 2024 14:10:47 -0300 Subject: [PATCH 35/72] easy auction test case --- test/integration/EasyAuction.test.ts | 74 ++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/test/integration/EasyAuction.test.ts b/test/integration/EasyAuction.test.ts index 5674ba344c..0a352269bc 100644 --- a/test/integration/EasyAuction.test.ts +++ b/test/integration/EasyAuction.test.ts @@ -23,9 +23,11 @@ import { TradeKind, QUEUE_START, MAX_UINT48, + MAX_UINT96, MAX_UINT192, ONE_ADDRESS, PAUSER, + ZERO_ADDRESS, } from '../../common/constants' import { advanceTime, getLatestBlockTimestamp } from '../utils/time' import { expectTrade, getAuctionId, getTrade } from '../utils/trades' @@ -689,6 +691,78 @@ describeFork(`Gnosis EasyAuction Mainnet Forking - P${IMPLEMENTATION}`, function }) }) + describe(`Trading limitations`, () => { + it('EasyAuction reverts when sum of bids > type(uint96).max', async () => { + const sellAmount = fp('1') + const endTime = (await getLatestBlockTimestamp()) + Number(config.batchAuctionLength) + const minBuyAmount = MAX_UINT96.sub(1) + + // Mints tokens + await token0.connect(owner).mint(owner.address, sellAmount) + await token1.connect(owner).mint(addr1.address, MAX_UINT96) + await token1.connect(owner).mint(addr2.address, MAX_UINT96) + + // Start auction + await token0.connect(owner).approve(easyAuction.address, sellAmount) + + // Get auction Id + const auctionId = await easyAuction.callStatic.initiateAuction( + token0.address, + token1.address, + endTime, + endTime, + sellAmount, + minBuyAmount, + 1, + 0, + false, + ZERO_ADDRESS, + new Uint8Array(0) + ) + + // Initiate auction + await easyAuction.initiateAuction( + token0.address, + token1.address, + endTime, + endTime, + sellAmount, + minBuyAmount, + 1, + 0, + false, + ZERO_ADDRESS, + new Uint8Array(0) + ) + + // Perform first bid + await token1.connect(addr1).approve(easyAuction.address, minBuyAmount.sub(1)) + await easyAuction.connect(addr1).placeSellOrders( + auctionId, + [1], + [minBuyAmount.sub(1)], // falls short + [QUEUE_START], + ethers.constants.HashZero + ) + + // Perform second bid + await token1.connect(addr2).approve(easyAuction.address, minBuyAmount) + await easyAuction.connect(addr2).placeSellOrders( + auctionId, + [1], + [minBuyAmount.sub(1)], // Sum will exceed uint96.MAX + [QUEUE_START], + ethers.constants.HashZero + ) + + // Attempt to settle - should revert + await advanceTime(config.batchAuctionLength.add(100).toString()) + await expect(easyAuction.settleAuction(auctionId)).to.be.revertedWith( + "SafeCast: value doesn't fit in 96 bits" + ) + }) + }) + describeExtreme(`Extreme Values ${SLOW ? 'slow mode' : 'fast mode'}`, () => { if (!(Implementation.P1 && useEnv('EXTREME') && useEnv('FORK'))) return // prevents bunch of skipped tests From d9283c67a3bc1d0d775cce420423f430a382021f Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Tue, 9 Jul 2024 15:05:41 -0400 Subject: [PATCH 36/72] document 21 decimals with caveats --- CHANGELOG.md | 6 ++++-- docs/solidity-style.md | 18 ++++++++++++++++-- docs/writing-collateral-plugins.md | 19 ++++++++++--------- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2192cd1c13..27d34ad715 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This release prepares the core protocol for veRSR through the introduction of 3 registries (`DAOFeeRegistry`, `AssetPluginRegistry`, and `VersionRegistry`) and through restricting component upgrades to be handled by `Main`, where upgrade constraints can be enforced. -The release also expands collateral decimal support from 18 to 27. +The release also expands collateral decimal support from 18 to 21, with some caveats about minimum token value. See [docs/solidity-style.md](./docs/solidity-style.md#Collateral-decimals) for more details. ## Upgrade Steps @@ -33,7 +33,9 @@ Make sure distributor table sums to >10000. ### Assets -No functional change. FLOOR rounding added explicitly to `shiftl_toFix` +No functional change. FLOOR rounding added explicitly to `shiftl_toFix`. + +Support expanded from 18 to 21 decimals, with minimum collateral token value requirement of `$0.001` at-peg. ### Trading diff --git a/docs/solidity-style.md b/docs/solidity-style.md index 05a35b8aea..35bbf87698 100644 --- a/docs/solidity-style.md +++ b/docs/solidity-style.md @@ -139,9 +139,23 @@ This should work without change for around 9M years, which is more than enough. `{decimals}`: [6, 21] -The protocol only supports collateral tokens up to 21 decimals, and for these cases only supports balances up to `~8e28`. Exceeding this could end up overflowing restrictions in GnosisTrade / EasyAuction, and end up in rounding issues accross the protocol. +The protocol only supports collateral tokens up to 21 decimals, and they must be sufficiently valuable. -21 decimal tokens must also be sufficiently valued, where that is defined as a whole token worth >$0.1. +At 21 decimals one whole collateral token must be worth `>= $1` when _at-peg_. This range enables support for `$1` tokens that have been deposited into 3 decimal offset vaults. Note that the protocol does not rely on this property for the _sale_ of collateral, only the _purchase_; therefore it is acceptable for a backing collateral to lose its peg and be worth less than `$1`, as long as its collateral plugin puts it into an IFFY state and begins the default process. + +minimum whole token value requirement (at common decimals): + +- 21 decimals: `>= $1` +- 18 decimals: `>= $0.001` +- 6 decimals: `>= $0.000000000000001` + +### Minimum RToken price + +Whole RTokens should be worth `>= $0.001` at-peg, since they must be purchasable in revenue auctions. + +### Minimum RSR price + +The protocol functions best when whole RSR is worth `>= $0.001`. This constraint is less strong than in the case of backing collateral tokens, however. The core functionality of the protocol functions properly even even below this boundary. ## Function annotations diff --git a/docs/writing-collateral-plugins.md b/docs/writing-collateral-plugins.md index 1d2fd57f7e..a323e9ac6f 100644 --- a/docs/writing-collateral-plugins.md +++ b/docs/writing-collateral-plugins.md @@ -8,26 +8,27 @@ For details of what collateral plugins are and how they function, see [collatera Here are some basic questions to answer before beginning to write a new collateral plugin. Think of the answers like an outline for an essay: they will help gauge how much work is required to write the plugin, they will guide the final implementation, and they will contain all of the human-readable details that can then be directly translated into code. +1. **Is this collateral sufficiently valuable? At-peg it must be worth at least $0.001 if it has 18 decimals, and $1 if it has 21 decimals.** 1. **How will this plugin define the different units?** - {tok}: - {ref}: - {target}: - {UoA}: -2. **Does the target collateral require a wrapper?** (eg. aTokens require the StaticAToken wrapper, to stabilize their rebasing nature) -3. **How will the 3 internal prices be defined?** (eg. chainlink feeds, exchange rate view functions, calculations involving multiple sources) For [chainlink feeds](https://data.chain.link/ethereum/mainnet), include the address, error (deviation threshold), and timeout (heartbeat). For on-chain exchange rates, include the function calls and/or github links to examples. +1. **Does the target collateral require a wrapper?** (eg. aTokens require the StaticAToken wrapper, to stabilize their rebasing nature) +1. **How will the 3 internal prices be defined?** (eg. chainlink feeds, exchange rate view functions, calculations involving multiple sources) For [chainlink feeds](https://data.chain.link/ethereum/mainnet), include the address, error (deviation threshold), and timeout (heartbeat). For on-chain exchange rates, include the function calls and/or github links to examples. - {ref/tok}: - {target/ref}: - {UoA/target}: -4. **For each of these prices, what are the critical trust assumptions? Can any of these be manipulated within the course of a transaction?** +1. **For each of these prices, what are the critical trust assumptions? Can any of these be manipulated within the course of a transaction?** - eg. chainlink feeds require trusting the chainlink protocol and the individual oracles for that price feed - eg. the frxETH/ETH exchange rate requires trusting the FRAX multisig to correctly push timely updates - eg. yearn vaults can have their `pricePerShare` increased via direct vault donations -5. **Are there any protocol-specific metrics that should be monitored to signal a default in the underlying collateral?** -6. **If this plugin requires unique unit & price abstractions, what do they look like?** -7. **What amount of revenue should this plugin hide? (a minimum of `1e-6`% is recommended, but some collateral may require higher thresholds, and, in rare cases, `0` can be used)** -8. **Are there rewards that can be claimed by holding this collateral? If so, how are they claimed?** Include a github link to the callable function or an example of how to claim. -9. **Does the collateral need to be "refreshed" in order to update its internal state before refreshing the plugin?** Include a github link to the callable function. -10. **Can the `price()` range be kept <5%? What is the largest possible % difference (while priced) between `price().high` and `price().low`?** See [RTokenAsset.tryPrice()](../contracts/plugins/assets/RTokenAsset.sol) and [docs/collateral.md](./collateral.md#price) for additional context. +1. **Are there any protocol-specific metrics that should be monitored to signal a default in the underlying collateral?** +1. **If this plugin requires unique unit & price abstractions, what do they look like?** +1. **What amount of revenue should this plugin hide? (a minimum of `1e-6`% is recommended, but some collateral may require higher thresholds, and, in rare cases, `0` can be used)** +1. **Are there rewards that can be claimed by holding this collateral? If so, how are they claimed?** Include a github link to the callable function or an example of how to claim. +1. **Does the collateral need to be "refreshed" in order to update its internal state before refreshing the plugin?** Include a github link to the callable function. +1. **Can the `price()` range be kept <5%? What is the largest possible % difference (while priced) between `price().high` and `price().low`?** See [RTokenAsset.tryPrice()](../contracts/plugins/assets/RTokenAsset.sol) and [docs/collateral.md](./collateral.md#price) for additional context. ## Implementation From 792e1936115f3f84b1a2f27afc958e05c13b1696 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Tue, 9 Jul 2024 15:19:32 -0400 Subject: [PATCH 37/72] document non-manipulable price --- .../plugins/assets/AppreciatingFiatCollateral.sol | 1 + contracts/plugins/assets/Asset.sol | 1 + contracts/plugins/assets/EURFiatCollateral.sol | 1 + contracts/plugins/assets/FiatCollateral.sol | 1 + contracts/plugins/assets/NonFiatCollateral.sol | 1 + contracts/plugins/assets/SelfReferentialCollateral.sol | 1 + .../plugins/assets/ankr/AnkrStakedEthCollateral.sol | 1 + contracts/plugins/assets/cbeth/CBETHCollateral.sol | 1 + contracts/plugins/assets/cbeth/CBETHCollateralL2.sol | 1 + .../assets/compoundv2/CTokenNonFiatCollateral.sol | 1 + .../compoundv2/CTokenSelfReferentialCollateral.sol | 1 + .../plugins/assets/curve/CurveRecursiveCollateral.sol | 1 + .../plugins/assets/curve/CurveStableCollateral.sol | 1 + .../assets/curve/CurveStableMetapoolCollateral.sol | 2 ++ .../plugins/assets/frax-eth/SFraxEthCollateral.sol | 1 + .../plugins/assets/lido/L2LidoStakedEthCollateral.sol | 1 + .../plugins/assets/lido/LidoStakedEthCollateral.sol | 1 + .../MetaMorphoSelfReferentialCollateral.sol | 1 + .../assets/morpho-aave/MorphoNonFiatCollateral.sol | 1 + .../morpho-aave/MorphoSelfReferentialCollateral.sol | 1 + contracts/plugins/assets/mountain/USDMCollateral.sol | 1 + contracts/plugins/assets/rocket-eth/RethCollateral.sol | 1 + .../assets/yearnv2/YearnV2CurveFiatCollateral.sol | 1 + docs/collateral.md | 10 +++++++--- docs/writing-collateral-plugins.md | 2 +- 25 files changed, 32 insertions(+), 4 deletions(-) diff --git a/contracts/plugins/assets/AppreciatingFiatCollateral.sol b/contracts/plugins/assets/AppreciatingFiatCollateral.sol index 85822345ae..96fb0a5008 100644 --- a/contracts/plugins/assets/AppreciatingFiatCollateral.sol +++ b/contracts/plugins/assets/AppreciatingFiatCollateral.sol @@ -45,6 +45,7 @@ abstract contract AppreciatingFiatCollateral is FiatCollateral { /// Can revert, used by other contract functions in order to catch errors /// Should not return FIX_MAX for low /// Should only return FIX_MAX for high if low is 0 + /// Should NOT be manipulable by MEV /// @dev Override this when pricing is more complicated than just a single oracle /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate diff --git a/contracts/plugins/assets/Asset.sol b/contracts/plugins/assets/Asset.sol index b28cc1bf12..5c29ac48b1 100644 --- a/contracts/plugins/assets/Asset.sol +++ b/contracts/plugins/assets/Asset.sol @@ -69,6 +69,7 @@ contract Asset is IAsset, VersionedAsset { /// Can revert, used by other contract functions in order to catch errors /// Should not return FIX_MAX for low /// Should only return FIX_MAX for high if low is 0 + /// Should NOT be manipulable by MEV /// @dev The third (unused) variable is only here for compatibility with Collateral /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate diff --git a/contracts/plugins/assets/EURFiatCollateral.sol b/contracts/plugins/assets/EURFiatCollateral.sol index f3a9e0e966..b21ee6c63d 100644 --- a/contracts/plugins/assets/EURFiatCollateral.sol +++ b/contracts/plugins/assets/EURFiatCollateral.sol @@ -36,6 +36,7 @@ contract EURFiatCollateral is FiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} diff --git a/contracts/plugins/assets/FiatCollateral.sol b/contracts/plugins/assets/FiatCollateral.sol index 136021febf..5e0c5936c1 100644 --- a/contracts/plugins/assets/FiatCollateral.sol +++ b/contracts/plugins/assets/FiatCollateral.sol @@ -94,6 +94,7 @@ contract FiatCollateral is ICollateral, Asset { /// Can revert, used by other contract functions in order to catch errors /// Should not return FIX_MAX for low /// Should only return FIX_MAX for high if low is 0 + /// Should NOT be manipulable by MEV /// @dev Override this when pricing is more complicated than just a single oracle /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate diff --git a/contracts/plugins/assets/NonFiatCollateral.sol b/contracts/plugins/assets/NonFiatCollateral.sol index b43750ab5a..bc5ccf0d3d 100644 --- a/contracts/plugins/assets/NonFiatCollateral.sol +++ b/contracts/plugins/assets/NonFiatCollateral.sol @@ -36,6 +36,7 @@ contract NonFiatCollateral is FiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} diff --git a/contracts/plugins/assets/SelfReferentialCollateral.sol b/contracts/plugins/assets/SelfReferentialCollateral.sol index fb3eb2b92b..06007e07cb 100644 --- a/contracts/plugins/assets/SelfReferentialCollateral.sol +++ b/contracts/plugins/assets/SelfReferentialCollateral.sol @@ -20,6 +20,7 @@ contract SelfReferentialCollateral is FiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} diff --git a/contracts/plugins/assets/ankr/AnkrStakedEthCollateral.sol b/contracts/plugins/assets/ankr/AnkrStakedEthCollateral.sol index ccce6ef615..871d0e248e 100644 --- a/contracts/plugins/assets/ankr/AnkrStakedEthCollateral.sol +++ b/contracts/plugins/assets/ankr/AnkrStakedEthCollateral.sol @@ -41,6 +41,7 @@ contract AnkrStakedEthCollateral is AppreciatingFiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} The actual price observed in the peg diff --git a/contracts/plugins/assets/cbeth/CBETHCollateral.sol b/contracts/plugins/assets/cbeth/CBETHCollateral.sol index 74e96eb1fa..87cf8e4d24 100644 --- a/contracts/plugins/assets/cbeth/CBETHCollateral.sol +++ b/contracts/plugins/assets/cbeth/CBETHCollateral.sol @@ -41,6 +41,7 @@ contract CBEthCollateral is AppreciatingFiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} The actual price observed in the peg diff --git a/contracts/plugins/assets/cbeth/CBETHCollateralL2.sol b/contracts/plugins/assets/cbeth/CBETHCollateralL2.sol index d384766941..e2e3eec971 100644 --- a/contracts/plugins/assets/cbeth/CBETHCollateralL2.sol +++ b/contracts/plugins/assets/cbeth/CBETHCollateralL2.sol @@ -49,6 +49,7 @@ contract CBEthCollateralL2 is L2LSDCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} The actual price observed in the peg diff --git a/contracts/plugins/assets/compoundv2/CTokenNonFiatCollateral.sol b/contracts/plugins/assets/compoundv2/CTokenNonFiatCollateral.sol index 0cb59703c3..38b7e95e61 100644 --- a/contracts/plugins/assets/compoundv2/CTokenNonFiatCollateral.sol +++ b/contracts/plugins/assets/compoundv2/CTokenNonFiatCollateral.sol @@ -37,6 +37,7 @@ contract CTokenNonFiatCollateral is CTokenFiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} diff --git a/contracts/plugins/assets/compoundv2/CTokenSelfReferentialCollateral.sol b/contracts/plugins/assets/compoundv2/CTokenSelfReferentialCollateral.sol index 8766be3d71..7a358abf46 100644 --- a/contracts/plugins/assets/compoundv2/CTokenSelfReferentialCollateral.sol +++ b/contracts/plugins/assets/compoundv2/CTokenSelfReferentialCollateral.sol @@ -41,6 +41,7 @@ contract CTokenSelfReferentialCollateral is AppreciatingFiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} diff --git a/contracts/plugins/assets/curve/CurveRecursiveCollateral.sol b/contracts/plugins/assets/curve/CurveRecursiveCollateral.sol index c1cf7461c6..966894f620 100644 --- a/contracts/plugins/assets/curve/CurveRecursiveCollateral.sol +++ b/contracts/plugins/assets/curve/CurveRecursiveCollateral.sol @@ -48,6 +48,7 @@ contract CurveRecursiveCollateral is CurveStableCollateral { /// Can revert, used by other contract functions in order to catch errors /// Should not return FIX_MAX for low /// Should only return FIX_MAX for high if low is 0 + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return {target/ref} Unused. Always 0 diff --git a/contracts/plugins/assets/curve/CurveStableCollateral.sol b/contracts/plugins/assets/curve/CurveStableCollateral.sol index 3971f4019b..e5b874a429 100644 --- a/contracts/plugins/assets/curve/CurveStableCollateral.sol +++ b/contracts/plugins/assets/curve/CurveStableCollateral.sol @@ -48,6 +48,7 @@ contract CurveStableCollateral is AppreciatingFiatCollateral, PoolTokens { /// Can revert, used by other contract functions in order to catch errors /// Should not return FIX_MAX for low /// Should only return FIX_MAX for high if low is 0 + /// Should NOT be manipulable by MEV /// @dev Override this when pricing is more complicated than just a single pool /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate diff --git a/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol b/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol index 3519301e67..f8f2af5e1e 100644 --- a/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol +++ b/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol @@ -68,6 +68,7 @@ contract CurveStableMetapoolCollateral is CurveStableCollateral { /// Can revert, used by other contract functions in order to catch errors /// Should not return FIX_MAX for low /// Should only return FIX_MAX for high if low is 0 + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} The actual price observed in the peg @@ -126,6 +127,7 @@ contract CurveStableMetapoolCollateral is CurveStableCollateral { /// Can revert, used by `_anyDepeggedOutsidePool()` /// Should not return FIX_MAX for low /// Should only return FIX_MAX for high if low is 0 + /// Should NOT be manipulable by MEV /// @return lowPaired {UoA/pairedTok} The low price estimate of the paired token /// @return highPaired {UoA/pairedTok} The high price estimate of the paired token function tryPairedPrice() public view virtual returns (uint192 lowPaired, uint192 highPaired) { diff --git a/contracts/plugins/assets/frax-eth/SFraxEthCollateral.sol b/contracts/plugins/assets/frax-eth/SFraxEthCollateral.sol index 6247a7e6bd..5c37fcd7d3 100644 --- a/contracts/plugins/assets/frax-eth/SFraxEthCollateral.sol +++ b/contracts/plugins/assets/frax-eth/SFraxEthCollateral.sol @@ -47,6 +47,7 @@ contract SFraxEthCollateral is AppreciatingFiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} The actual price observed in the peg diff --git a/contracts/plugins/assets/lido/L2LidoStakedEthCollateral.sol b/contracts/plugins/assets/lido/L2LidoStakedEthCollateral.sol index d66bcb8e86..ee3b9d533a 100644 --- a/contracts/plugins/assets/lido/L2LidoStakedEthCollateral.sol +++ b/contracts/plugins/assets/lido/L2LidoStakedEthCollateral.sol @@ -68,6 +68,7 @@ contract L2LidoStakedEthCollateral is AppreciatingFiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} The actual price observed in the peg diff --git a/contracts/plugins/assets/lido/LidoStakedEthCollateral.sol b/contracts/plugins/assets/lido/LidoStakedEthCollateral.sol index 08e465790d..e25cef35b2 100644 --- a/contracts/plugins/assets/lido/LidoStakedEthCollateral.sol +++ b/contracts/plugins/assets/lido/LidoStakedEthCollateral.sol @@ -44,6 +44,7 @@ contract LidoStakedEthCollateral is AppreciatingFiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} The actual price observed in the peg diff --git a/contracts/plugins/assets/meta-morpho/MetaMorphoSelfReferentialCollateral.sol b/contracts/plugins/assets/meta-morpho/MetaMorphoSelfReferentialCollateral.sol index 8db21fd6fe..d691d5d885 100644 --- a/contracts/plugins/assets/meta-morpho/MetaMorphoSelfReferentialCollateral.sol +++ b/contracts/plugins/assets/meta-morpho/MetaMorphoSelfReferentialCollateral.sol @@ -29,6 +29,7 @@ contract MetaMorphoSelfReferentialCollateral is ERC4626FiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} diff --git a/contracts/plugins/assets/morpho-aave/MorphoNonFiatCollateral.sol b/contracts/plugins/assets/morpho-aave/MorphoNonFiatCollateral.sol index 658309b15a..1710441b05 100644 --- a/contracts/plugins/assets/morpho-aave/MorphoNonFiatCollateral.sol +++ b/contracts/plugins/assets/morpho-aave/MorphoNonFiatCollateral.sol @@ -39,6 +39,7 @@ contract MorphoNonFiatCollateral is MorphoFiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} The actual price observed in the peg diff --git a/contracts/plugins/assets/morpho-aave/MorphoSelfReferentialCollateral.sol b/contracts/plugins/assets/morpho-aave/MorphoSelfReferentialCollateral.sol index babea4e816..0a75dc6afb 100644 --- a/contracts/plugins/assets/morpho-aave/MorphoSelfReferentialCollateral.sol +++ b/contracts/plugins/assets/morpho-aave/MorphoSelfReferentialCollateral.sol @@ -39,6 +39,7 @@ contract MorphoSelfReferentialCollateral is AppreciatingFiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} diff --git a/contracts/plugins/assets/mountain/USDMCollateral.sol b/contracts/plugins/assets/mountain/USDMCollateral.sol index d2f318c751..b49b93cbb7 100644 --- a/contracts/plugins/assets/mountain/USDMCollateral.sol +++ b/contracts/plugins/assets/mountain/USDMCollateral.sol @@ -31,6 +31,7 @@ contract USDMCollateral is ERC4626FiatCollateral { /// Can revert, used by other contract functions in order to catch errors /// Should not return FIX_MAX for low /// Should only return FIX_MAX for high if low is 0 + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} The actual price observed in the peg diff --git a/contracts/plugins/assets/rocket-eth/RethCollateral.sol b/contracts/plugins/assets/rocket-eth/RethCollateral.sol index 76074559fc..11cb1d1af9 100644 --- a/contracts/plugins/assets/rocket-eth/RethCollateral.sol +++ b/contracts/plugins/assets/rocket-eth/RethCollateral.sol @@ -40,6 +40,7 @@ contract RethCollateral is AppreciatingFiatCollateral { } /// Can revert, used by other contract functions in order to catch errors + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return pegPrice {target/ref} The actual price observed in the peg diff --git a/contracts/plugins/assets/yearnv2/YearnV2CurveFiatCollateral.sol b/contracts/plugins/assets/yearnv2/YearnV2CurveFiatCollateral.sol index 2bb8d26340..3443c68b80 100644 --- a/contracts/plugins/assets/yearnv2/YearnV2CurveFiatCollateral.sol +++ b/contracts/plugins/assets/yearnv2/YearnV2CurveFiatCollateral.sol @@ -46,6 +46,7 @@ contract YearnV2CurveFiatCollateral is CurveStableCollateral { /// Can revert, used by other contract functions in order to catch errors /// Should not return FIX_MAX for low /// Should only return FIX_MAX for high if low is 0 + /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate /// @return {target/ref} Unused. Always 0 diff --git a/docs/collateral.md b/docs/collateral.md index e1848332ff..2bb3486947 100644 --- a/docs/collateral.md +++ b/docs/collateral.md @@ -225,6 +225,10 @@ When implementing Revenue Hiding, the `price` function should NOT hide revenue; ## Important Properties for Collateral Plugins +### Oracles must not be plausibly manipulable + +It must not be possible to manipulate the oracles a collateral relies on, cheaply. In particular (though not limited to): it should not be possible to manipulate price within the block. + ### Reuse of Collateral Plugins Collateral plugins should be safe to reuse by many different Reserve Protocol instances. So: @@ -254,10 +258,10 @@ There is a simple ERC20 wrapper that can be easily extended at [RewardableERC20W The protocol currently supports collateral tokens with up to 21 decimals. There are some caveats to know about: -- For a token with 21 decimals, batch auctions can only process up to ~8e7 whole tokens in a single auction. Dollar-pegged tokens thus fit nicely within this constraint, but 21 decimal tokens that are worth <$0.1 per whole token may not. Therefore, the protocol should not be used with **low-value 21-decimal tokens**. -- For a token with 18 decimals, batch auctions can only process up to ~8e10 whole tokens in a single auction. +- Tokens with 21 decimals must be worth at least `$1` at-peg +- Tokens with 18 decimals must be worth at least `$0.001` at-peg -Dutch auctions do not have this constraint. As long as they remain enabled they can process a larger number of tokens. +These constraints only apply to pricing when the collateral is SOUND; when the collateral status is IFFY or DISABLED the price is allowed to fall below these thresholds. ### `refresh()` should never revert diff --git a/docs/writing-collateral-plugins.md b/docs/writing-collateral-plugins.md index a323e9ac6f..3e40dda8b2 100644 --- a/docs/writing-collateral-plugins.md +++ b/docs/writing-collateral-plugins.md @@ -21,8 +21,8 @@ Here are some basic questions to answer before beginning to write a new collater - {UoA/target}: 1. **For each of these prices, what are the critical trust assumptions? Can any of these be manipulated within the course of a transaction?** - eg. chainlink feeds require trusting the chainlink protocol and the individual oracles for that price feed - - eg. the frxETH/ETH exchange rate requires trusting the FRAX multisig to correctly push timely updates - eg. yearn vaults can have their `pricePerShare` increased via direct vault donations + - eg. is pricing manipuable or subject to MEV? oracle sources _must_ be manipulation resistant such as Chainlink or AMM EMA 1. **Are there any protocol-specific metrics that should be monitored to signal a default in the underlying collateral?** 1. **If this plugin requires unique unit & price abstractions, what do they look like?** 1. **What amount of revenue should this plugin hide? (a minimum of `1e-6`% is recommended, but some collateral may require higher thresholds, and, in rare cases, `0` can be used)** From 70509794359ba79a7f7ddd4c3694459e3c706aa2 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Thu, 11 Jul 2024 12:27:01 -0400 Subject: [PATCH 38/72] high price for trade sizing (#1172) --- CHANGELOG.md | 4 ++ contracts/p0/mixins/TradingLib.sol | 13 +++-- contracts/p1/mixins/TradeLib.sol | 13 +++-- test/Recollateralization.test.ts | 81 +++++++++++++++++++++++++---- test/Revenues.test.ts | 10 ++-- test/scenario/ComplexBasket.test.ts | 8 +-- 6 files changed, 104 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27d34ad715..5ade2ced66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ Make sure distributor table sums to >10000. - `AssetRegistry` - Prevent registering assets that are not in the `AssetPluginRegistry` - Add `validateCurrentAssets() view` +- `BackingManager` + - Switch from sizing trades using the low price to the high price - `Broker` - Make setters only callable by `Main` - `Distributor` @@ -28,6 +30,8 @@ Make sure distributor table sums to >10000. - Add `setVersionRegistry()`/`setAssetPluginRegistry()`/`setDaoFeeRegistry()` setters - Add `upgradeMainTo()` + `upgradeRTokenTo()` functions to handle upgrade of Main + Components - Make Main the only caller that can upgrade Main +- `RevenueTrader` + - Switch from sizing trades using the low price to the high price ## Plugins diff --git a/contracts/p0/mixins/TradingLib.sol b/contracts/p0/mixins/TradingLib.sol index 6fe87988d1..317c98c2e2 100644 --- a/contracts/p0/mixins/TradingLib.sol +++ b/contracts/p0/mixins/TradingLib.sol @@ -59,9 +59,16 @@ library TradingLibP0 { minTradeVolume ); - // Cap sell amount - uint192 maxSell = maxTradeSize(trade.sell, trade.buy, trade.prices.sellLow); // {sellTok} - uint192 s = trade.sellAmount > maxSell ? maxSell : trade.sellAmount; // {sellTok} + // Cap sell amount using the high price + // Under price decay trade.prices.sellHigh can become up to 3x the savedHighPrice before + // becoming FIX_MAX after the full price timeout + uint192 s = trade.sellAmount; + if (trade.prices.sellHigh != FIX_MAX) { + // {sellTok} + uint192 maxSell = maxTradeSize(trade.sell, trade.buy, trade.prices.sellHigh); + if (maxSell > 1 && s > maxSell) s = maxSell; + // if the high price is so high that the most we can sell is 1, sell all of it + } // Calculate equivalent buyAmount within [0, FIX_MAX] // {buyTok} = {sellTok} * {1} * {UoA/sellTok} / {UoA/buyTok} diff --git a/contracts/p1/mixins/TradeLib.sol b/contracts/p1/mixins/TradeLib.sol index f02c14f5d0..e86d6dd7ad 100644 --- a/contracts/p1/mixins/TradeLib.sol +++ b/contracts/p1/mixins/TradeLib.sol @@ -58,9 +58,16 @@ library TradeLib { minTradeVolume ); - // Cap sell amount - uint192 maxSell = maxTradeSize(trade.sell, trade.buy, trade.prices.sellLow); // {sellTok} - uint192 s = trade.sellAmount > maxSell ? maxSell : trade.sellAmount; // {sellTok} + // Cap sell amount using the high price + // Under price decay trade.prices.sellHigh can become up to 3x the savedHighPrice before + // becoming FIX_MAX after the full price timeout + uint192 s = trade.sellAmount; + if (trade.prices.sellHigh != FIX_MAX) { + // {sellTok} + uint192 maxSell = maxTradeSize(trade.sell, trade.buy, trade.prices.sellHigh); + if (maxSell > 1 && s > maxSell) s = maxSell; + // if the high price is so high that the most we can sell is 1, sell all of it + } // Calculate equivalent buyAmount within [0, FIX_MAX] // {buyTok} = {sellTok} * {1} * {UoA/sellTok} / {UoA/buyTok} diff --git a/test/Recollateralization.test.ts b/test/Recollateralization.test.ts index 7d63f9c4bd..d2d32b059f 100644 --- a/test/Recollateralization.test.ts +++ b/test/Recollateralization.test.ts @@ -2217,7 +2217,7 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { ).div(2) const sellAmt = sellAmtBeforeSlippage .mul(BN_SCALE_FACTOR) - .div(BN_SCALE_FACTOR.sub(ORACLE_ERROR)) + .div(BN_SCALE_FACTOR.add(ORACLE_ERROR)) const minBuyAmt = await toMinBuyAmt(sellAmt, fp('0.5'), fp('1')) await expect(facadeTest.runAuctionsForAllTraders(rToken.address)) @@ -2260,7 +2260,63 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { await advanceTime(config.batchAuctionLength.add(100).toString()) // Run auctions - will end current, and will open a new auction for the same amount - const leftoverSellAmt = issueAmount.sub(sellAmt) + await expectEvents(facadeTest.runAuctionsForAllTraders(rToken.address), [ + { + contract: backingManager, + name: 'TradeSettled', + args: [anyValue, token0.address, backupToken1.address, sellAmt, minBuyAmt], + emitted: true, + }, + { + contract: backingManager, + name: 'TradeStarted', + args: [anyValue, token0.address, backupToken1.address, sellAmt, minBuyAmt], + emitted: true, + }, + ]) + + // Check new auction + // Token0 -> Backup Token Auction + await expectTrade(backingManager, { + sell: token0.address, + buy: backupToken1.address, + endTime: (await getLatestBlockTimestamp()) + Number(config.batchAuctionLength), + externalId: bn('1'), + }) + + // Check state + expect(await basketHandler.status()).to.equal(CollateralStatus.SOUND) + expect(await basketHandler.fullyCollateralized()).to.equal(false) + expect(await token0.balanceOf(backingManager.address)).to.equal( + issueAmount.sub(sellAmt.mul(2)) + ) + expect(await backupToken1.balanceOf(backingManager.address)).to.equal(minBuyAmt) + expect(await rToken.totalSupply()).to.equal(issueAmount) + + // Check price in USD of the current RToken + await expectRTokenPrice(rTokenAsset.address, fp('1'), ORACLE_ERROR) + + // Perform Mock Bids (addr1 has balance) + // Pay at worst-case price + await backupToken1.connect(addr1).approve(gnosis.address, minBuyAmt) + await gnosis.placeBid(1, { + bidder: addr1.address, + sellAmount: sellAmt, + buyAmount: minBuyAmt, + }) + + // Advance time till auction ended + await advanceTime(config.batchAuctionLength.add(100).toString()) + + // Check staking situation remains unchanged + expect(await rsr.balanceOf(stRSR.address)).to.equal(stakeAmount) + expect(await stRSR.balanceOf(addr1.address)).to.equal(stakeAmount) + + // Advance time till auction ended + await advanceTime(config.batchAuctionLength.add(100).toString()) + + // Run auctions - will end current, and will open a new auction for the remaining amount + const leftoverSellAmt = issueAmount.sub(sellAmt.mul(2)) const leftoverMinBuyAmt = await toMinBuyAmt(leftoverSellAmt, fp('0.5'), fp('1')) await expectEvents(facadeTest.runAuctionsForAllTraders(rToken.address), [ { @@ -2289,14 +2345,14 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { sell: token0.address, buy: backupToken1.address, endTime: (await getLatestBlockTimestamp()) + Number(config.batchAuctionLength), - externalId: bn('1'), + externalId: bn('2'), }) // Check state expect(await basketHandler.status()).to.equal(CollateralStatus.SOUND) expect(await basketHandler.fullyCollateralized()).to.equal(false) expect(await token0.balanceOf(backingManager.address)).to.equal(0) - expect(await backupToken1.balanceOf(backingManager.address)).to.equal(minBuyAmt) + expect(await backupToken1.balanceOf(backingManager.address)).to.equal(minBuyAmt.mul(2)) expect(await rToken.totalSupply()).to.equal(issueAmount) // Check price in USD of the current RToken @@ -2305,7 +2361,7 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { // Perform Mock Bids (addr1 has balance) // Pay at worst-case price await backupToken1.connect(addr1).approve(gnosis.address, minBuyAmt) - await gnosis.placeBid(1, { + await gnosis.placeBid(2, { bidder: addr1.address, sellAmount: leftoverSellAmt, buyAmount: leftoverMinBuyAmt, @@ -2321,8 +2377,11 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { // Advance time till auction ended await advanceTime(config.batchAuctionLength.add(100).toString()) - // Run auctions - will end current, and will open a new auction for the same amount - const buyAmtBidRSR: BigNumber = issueAmount.sub(minBuyAmt.add(leftoverMinBuyAmt)).add(1) + // End current auction, should start a new one to sell RSR for collateral + // ~51e18 Tokens left to buy - Sets Buy amount as independent value + const buyAmtBidRSR: BigNumber = issueAmount + .sub(minBuyAmt.mul(2).add(leftoverMinBuyAmt)) + .add(1) await expectEvents(facadeTest.runAuctionsForAllTraders(rToken.address), [ { contract: backingManager, @@ -2352,7 +2411,7 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { sell: rsr.address, buy: backupToken1.address, endTime: auctionTimestamp + Number(config.batchAuctionLength), - externalId: bn('2'), + externalId: bn('3'), }) const t = await getTrade(backingManager, rsr.address) @@ -2363,11 +2422,11 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { expect(await basketHandler.status()).to.equal(CollateralStatus.SOUND) expect(await basketHandler.fullyCollateralized()).to.equal(false) expect(await facadeTest.callStatic.totalAssetValue(rToken.address)).to.equal( - minBuyAmt.add(leftoverMinBuyAmt) + minBuyAmt.mul(2).add(leftoverMinBuyAmt) ) expect(await token0.balanceOf(backingManager.address)).to.equal(0) expect(await backupToken1.balanceOf(backingManager.address)).to.equal( - minBuyAmt.add(leftoverMinBuyAmt) + minBuyAmt.mul(2).add(leftoverMinBuyAmt) ) expect(await rToken.totalSupply()).to.equal(issueAmount) @@ -2380,7 +2439,7 @@ describe(`Recollateralization - P${IMPLEMENTATION}`, () => { // Perform Mock Bids for RSR (addr1 has balance) // Pay at worst-case price await backupToken1.connect(addr1).approve(gnosis.address, buyAmtBidRSR) - await gnosis.placeBid(2, { + await gnosis.placeBid(3, { bidder: addr1.address, sellAmount: sellAmtRSR, buyAmount: buyAmtBidRSR, diff --git a/test/Revenues.test.ts b/test/Revenues.test.ts index 94ca1d4730..eca91f4979 100644 --- a/test/Revenues.test.ts +++ b/test/Revenues.test.ts @@ -1217,7 +1217,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { ).to.emit(rTokenTrader, 'TradeStarted') }) - it('Should only be able to start a dust auction BATCH_AUCTION (and not DUTCH_AUCTION) if oracle has failed', async () => { + it('Should be able to force through a dust BATCH auction but not DUTCH, if oracle has failed', async () => { const minTrade = bn('1e18') await rsrTrader.connect(owner).setMinTradeVolume(minTrade) @@ -1240,6 +1240,8 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { rsrTrader, 'TradeStarted' ) + + expect(await token0.balanceOf(rsrTrader.address)).to.equal(0) // should sell entire balance }) it('Should not launch an auction for 1 qTok', async () => { @@ -1603,7 +1605,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { expect(await rToken.balanceOf(furnace.address)).to.equal(0) // Expected values based on Prices between AAVE and RSR = 1 to 1 (for simplification) - const sellAmt: BigNumber = fp('1').mul(100).div(99) // due to oracle error + const sellAmt: BigNumber = fp('1').mul(100).div(101) // due to high price setting trade size const minBuyAmt: BigNumber = await toMinBuyAmt(sellAmt, fp('1'), fp('1')) // Run auctions @@ -1788,7 +1790,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Collect revenue // Expected values based on Prices between AAVE and RToken = 1 (for simplification) - const sellAmt: BigNumber = fp('1').mul(100).div(99) // due to high price setting trade size + const sellAmt: BigNumber = fp('1').mul(100).div(101) // due to high price setting trade size const minBuyAmt: BigNumber = await toMinBuyAmt(sellAmt, fp('1'), fp('1')) await expectEvents(backingManager.claimRewards(), [ @@ -1989,7 +1991,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Collect revenue // Expected values based on Prices between AAVE and RSR/RToken = 1 to 1 (for simplification) - const sellAmt: BigNumber = fp('1').mul(100).div(99) // due to high price setting trade size + const sellAmt: BigNumber = fp('1').mul(100).div(101) // due to high price setting trade size const minBuyAmt: BigNumber = await toMinBuyAmt(sellAmt, fp('1'), fp('1')) const sellAmtRToken: BigNumber = rewardAmountAAVE.mul(20).div(100) // All Rtokens can be sold - 20% of total comp based on f diff --git a/test/scenario/ComplexBasket.test.ts b/test/scenario/ComplexBasket.test.ts index f3924355e7..450cdb9460 100644 --- a/test/scenario/ComplexBasket.test.ts +++ b/test/scenario/ComplexBasket.test.ts @@ -1577,8 +1577,8 @@ describe(`Complex Basket - P${IMPLEMENTATION}`, () => { // Running auctions will trigger recollateralization - cETH partial sale for weth // Will sell about 841K of cETH, expect to receive 8167 wETH (minimum) // We would still have about 438K to sell of cETH - let [low] = await cETHCollateral.price() - const sellAmtUnscaled = MAX_TRADE_VOLUME.mul(BN_SCALE_FACTOR).div(low) + let [, high] = await cETHCollateral.price() + const sellAmtUnscaled = MAX_TRADE_VOLUME.mul(BN_SCALE_FACTOR).div(high) const sellAmt = toBNDecimals(sellAmtUnscaled, 8) const sellAmtRemainder = (await cETH.balanceOf(backingManager.address)).sub(sellAmt) // Price for cETH = 1200 / 50 = $24 at rate 50% = $12 @@ -1723,8 +1723,8 @@ describe(`Complex Basket - P${IMPLEMENTATION}`, () => { // 13K wETH @ 1200 = 15,600,000 USD of value, in RSR ~= 156,000 RSR (@100 usd) // We exceed maxTradeVolume so we need two auctions - Will first sell 10M in value // Sells about 101K RSR, for 8167 WETH minimum - ;[low] = await rsrAsset.price() - const sellAmtRSR1 = MAX_TRADE_VOLUME.mul(BN_SCALE_FACTOR).div(low) + ;[, high] = await rsrAsset.price() + const sellAmtRSR1 = MAX_TRADE_VOLUME.mul(BN_SCALE_FACTOR).div(high) const buyAmtBidRSR1 = toMinBuyAmt( sellAmtRSR1, rsrPrice, From 2b4a529e3ff96df9445fcb0eacc8ddd7c9cb3c2e Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Thu, 11 Jul 2024 21:34:00 -0400 Subject: [PATCH 39/72] few additional comments --- contracts/plugins/assets/curve/CurveStableCollateral.sol | 1 + .../plugins/assets/curve/CurveStableMetapoolCollateral.sol | 1 + contracts/plugins/trading/GnosisTrade.sol | 3 +-- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/contracts/plugins/assets/curve/CurveStableCollateral.sol b/contracts/plugins/assets/curve/CurveStableCollateral.sol index e5b874a429..c757ba4fdf 100644 --- a/contracts/plugins/assets/curve/CurveStableCollateral.sol +++ b/contracts/plugins/assets/curve/CurveStableCollateral.sol @@ -81,6 +81,7 @@ contract CurveStableCollateral is AppreciatingFiatCollateral, PoolTokens { // 1. A moving average metric (unavailable in the cases we care about) // 2. Mapping oracle prices to expected pool balances using precise knowledge about // the shape of the trading curve. (maybe we can do this in the future) + // TODO update this approach to be MEV-resistant // {UoA} (uint192 aumLow, uint192 aumHigh) = totalBalancesValue(); diff --git a/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol b/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol index f8f2af5e1e..73ad6754f7 100644 --- a/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol +++ b/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol @@ -100,6 +100,7 @@ contract CurveStableMetapoolCollateral is CurveStableCollateral { // 1. A moving average metric (unavailable in the cases we care about) // 2. Mapping oracle prices to expected pool balances using precise knowledge about // the shape of the trading curve. (maybe we can do this in the future) + // TODO update this approach to be MEV-resistant // {UoA/pairedTok} (uint192 lowPaired, uint192 highPaired) = tryPairedPrice(); diff --git a/contracts/plugins/trading/GnosisTrade.sol b/contracts/plugins/trading/GnosisTrade.sol index 3d67a33d02..794f5ff2b6 100644 --- a/contracts/plugins/trading/GnosisTrade.sol +++ b/contracts/plugins/trading/GnosisTrade.sol @@ -15,8 +15,7 @@ import "../../mixins/Versioned.sol"; /// Trade contract against the Gnosis EasyAuction mechanism /// Limitations on decimals due to Gnosis Auction limitations: -/// - 27 decimal tokens are not supported in practice: max auction size is ~8e1 whole tokens -/// - 21 decimal tokens are supported, with caveats: max auction size is ~8e7 whole tokens +/// - At 21 decimals the amount of buy tokens cannot exceed ~8e7 else the trade will not settle contract GnosisTrade is ITrade, Versioned { using FixLib for uint192; using SafeERC20Upgradeable for IERC20Upgradeable; From 72d9278656685f1de0a3a09aa211fab842fac1d2 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Mon, 15 Jul 2024 15:11:49 -0400 Subject: [PATCH 40/72] revert over selling large lot --- contracts/p0/mixins/TradingLib.sol | 4 ++-- contracts/p1/mixins/TradeLib.sol | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/p0/mixins/TradingLib.sol b/contracts/p0/mixins/TradingLib.sol index 317c98c2e2..820177da2a 100644 --- a/contracts/p0/mixins/TradingLib.sol +++ b/contracts/p0/mixins/TradingLib.sol @@ -66,8 +66,8 @@ library TradingLibP0 { if (trade.prices.sellHigh != FIX_MAX) { // {sellTok} uint192 maxSell = maxTradeSize(trade.sell, trade.buy, trade.prices.sellHigh); - if (maxSell > 1 && s > maxSell) s = maxSell; - // if the high price is so high that the most we can sell is 1, sell all of it + require(maxSell > 1, "trade size error"); + if (s > maxSell) s = maxSell; } // Calculate equivalent buyAmount within [0, FIX_MAX] diff --git a/contracts/p1/mixins/TradeLib.sol b/contracts/p1/mixins/TradeLib.sol index e86d6dd7ad..142af093c5 100644 --- a/contracts/p1/mixins/TradeLib.sol +++ b/contracts/p1/mixins/TradeLib.sol @@ -65,8 +65,8 @@ library TradeLib { if (trade.prices.sellHigh != FIX_MAX) { // {sellTok} uint192 maxSell = maxTradeSize(trade.sell, trade.buy, trade.prices.sellHigh); - if (maxSell > 1 && s > maxSell) s = maxSell; - // if the high price is so high that the most we can sell is 1, sell all of it + require(maxSell > 1, "trade size error"); + if (s > maxSell) s = maxSell; } // Calculate equivalent buyAmount within [0, FIX_MAX] From a2f9eba8cc57d788725aff87e0ddcda82b4b65f9 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Mon, 15 Jul 2024 15:24:02 -0400 Subject: [PATCH 41/72] document bm should not sell unpriced assets --- contracts/p1/mixins/RecollateralizationLib.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/p1/mixins/RecollateralizationLib.sol b/contracts/p1/mixins/RecollateralizationLib.sol index a152a5ccbb..1b1f355ef6 100644 --- a/contracts/p1/mixins/RecollateralizationLib.sol +++ b/contracts/p1/mixins/RecollateralizationLib.sol @@ -269,6 +269,8 @@ library RecollateralizationLibP1 { // Prefer selling assets in this order: DISABLED -> SOUND -> IFFY. // Sell IFFY last because it may recover value in the future. // All collateral in the basket have already been guaranteed to be SOUND by upstream checks. + // Warning: If the trading algorithm is changed to trade unpriced (0, FIX_MAX) assets it can + // result in losses in GnosisTrade. Unpriced assets should not be sold in rebalancing. function nextTradePair( TradingContext memory ctx, Registry memory reg, From a44bbb4b33ab61b95cd86365ae0669f2f630137b Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Mon, 15 Jul 2024 15:36:26 -0400 Subject: [PATCH 42/72] add revert for [>0, FIX_MAX] case --- contracts/p0/mixins/TradingLib.sol | 4 +++- contracts/p1/mixins/TradeLib.sol | 4 +++- docs/collateral.md | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/contracts/p0/mixins/TradingLib.sol b/contracts/p0/mixins/TradingLib.sol index 820177da2a..a0e0df2638 100644 --- a/contracts/p0/mixins/TradingLib.sol +++ b/contracts/p0/mixins/TradingLib.sol @@ -66,8 +66,10 @@ library TradingLibP0 { if (trade.prices.sellHigh != FIX_MAX) { // {sellTok} uint192 maxSell = maxTradeSize(trade.sell, trade.buy, trade.prices.sellHigh); - require(maxSell > 1, "trade size error"); + require(maxSell > 1, "trade sizing error"); if (s > maxSell) s = maxSell; + } else { + require(trade.prices.sellLow == 0, "trade pricing error"); } // Calculate equivalent buyAmount within [0, FIX_MAX] diff --git a/contracts/p1/mixins/TradeLib.sol b/contracts/p1/mixins/TradeLib.sol index 142af093c5..e989ea81e9 100644 --- a/contracts/p1/mixins/TradeLib.sol +++ b/contracts/p1/mixins/TradeLib.sol @@ -65,8 +65,10 @@ library TradeLib { if (trade.prices.sellHigh != FIX_MAX) { // {sellTok} uint192 maxSell = maxTradeSize(trade.sell, trade.buy, trade.prices.sellHigh); - require(maxSell > 1, "trade size error"); + require(maxSell > 1, "trade sizing error"); if (s > maxSell) s = maxSell; + } else { + require(trade.prices.sellLow == 0, "trade pricing error"); } // Calculate equivalent buyAmount within [0, FIX_MAX] diff --git a/docs/collateral.md b/docs/collateral.md index 2bb3486947..c00560d59f 100644 --- a/docs/collateral.md +++ b/docs/collateral.md @@ -385,6 +385,8 @@ Under no price data, the low estimate shoulddecay downwards and high estimate up Should return `(0, FIX_MAX)` if pricing data is _completely_ unavailable or stale. +Should NOT return `(>0, FIX_MAX)`: if the high price FIX_MAX then the low price must be 0. + Should be gas-efficient. ### lotPrice() `{UoA/tok}` From d0315e719b984406a3eea143d163f346a9b9942c Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Mon, 15 Jul 2024 15:37:55 -0400 Subject: [PATCH 43/72] nit --- docs/collateral.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/collateral.md b/docs/collateral.md index c00560d59f..41fa09f053 100644 --- a/docs/collateral.md +++ b/docs/collateral.md @@ -385,7 +385,7 @@ Under no price data, the low estimate shoulddecay downwards and high estimate up Should return `(0, FIX_MAX)` if pricing data is _completely_ unavailable or stale. -Should NOT return `(>0, FIX_MAX)`: if the high price FIX_MAX then the low price must be 0. +Should NOT return `(>0, FIX_MAX)`: if the high price is FIX_MAX then the low price must be 0. Should be gas-efficient. From a743a0559f320e1a64a41fc5ecbee9760576e4df Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Thu, 25 Jul 2024 13:19:48 -0400 Subject: [PATCH 44/72] Issuance Premium v2 (#1175) --- CHANGELOG.md | 33 +- common/configuration.ts | 1 + contracts/facade/facets/MaxIssuableFacet.sol | 6 +- contracts/facade/facets/ReadFacet.sol | 18 +- contracts/interfaces/IAsset.sol | 12 +- contracts/interfaces/IBasketHandler.sol | 46 +- contracts/interfaces/IDeployer.sol | 1 + contracts/p0/BasketHandler.sol | 216 +++++----- contracts/p0/Deployer.sol | 7 +- contracts/p0/RToken.sol | 7 +- contracts/p0/mixins/TradingLib.sol | 2 +- contracts/p1/BackingManager.sol | 2 + contracts/p1/BasketHandler.sol | 193 ++++++--- contracts/p1/Deployer.sol | 7 +- contracts/p1/RToken.sol | 8 +- contracts/p1/mixins/BasketLib.sol | 1 + .../p1/mixins/RecollateralizationLib.sol | 2 +- .../assets/AppreciatingFiatCollateral.sol | 1 + contracts/plugins/assets/FiatCollateral.sol | 3 + contracts/plugins/assets/L2LSDCollateral.sol | 1 + contracts/plugins/assets/RTokenAsset.sol | 14 +- .../assets/compoundv3/CTokenV3Collateral.sol | 1 + .../CurveAppreciatingRTokenFiatCollateral.sol | 3 +- .../assets/curve/CurveRecursiveCollateral.sol | 9 +- .../assets/curve/CurveStableCollateral.sol | 10 +- .../curve/CurveStableMetapoolCollateral.sol | 3 +- .../CurveStableRTokenMetapoolCollateral.sol | 3 +- .../plugins/mocks/BadCollateralPlugin.sol | 1 + contracts/plugins/mocks/FraxAggregator.sol | 9 + .../mocks/InvalidRefPerTokCollateral.sol | 3 +- contracts/plugins/mocks/RTokenCollateral.sol | 2 + docs/collateral.md | 26 +- docs/deployment-variables.md | 18 + tasks/validation/utils/rtokens.ts | 6 +- test/Facade.test.ts | 2 +- test/Main.test.ts | 290 +++++++------ test/RToken.test.ts | 4 +- test/Revenues.test.ts | 13 +- test/Upgradeability.test.ts | 2 +- test/fixtures.ts | 1 + test/integration/AssetPlugins.test.ts | 17 +- test/integration/fixtures.ts | 1 + test/integration/fork-block-numbers.ts | 1 + .../mainnet-test/IssuancePremium.test.ts | 402 ++++++++++++++++++ test/plugins/Collateral.test.ts | 1 + test/scenario/NestedRTokens.test.ts | 16 +- test/scenario/RevenueHiding.test.ts | 4 +- test/scenario/cETH.test.ts | 2 +- test/scenario/cWBTC.test.ts | 2 +- test/utils/oracles.ts | 20 +- 50 files changed, 1035 insertions(+), 418 deletions(-) create mode 100644 test/integration/mainnet-test/IssuancePremium.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ade2ced66..68e35e97f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,24 +6,40 @@ This release prepares the core protocol for veRSR through the introduction of 3 The release also expands collateral decimal support from 18 to 21, with some caveats about minimum token value. See [docs/solidity-style.md](./docs/solidity-style.md#Collateral-decimals) for more details. +Finally, it adds resistance to toxic issuance by charging more when the collateral is under peg. + ## Upgrade Steps -TODO +Upgrade to 4.0.0 is expected to occur by spell. This section is still TODO, but some important notes for steps that should be hit: -Make sure distributor table sums to >10000. +- Distributor table must sum to >=10000 +- Opt RTokens into the issuance premium by default +- Upgrade all collateral plugins and RTokenAsset +- ... ## Core Protocol Contracts +All components: make Main the only component that can call `upgradeTo()` + - `AssetRegistry` - Prevent registering assets that are not in the `AssetPluginRegistry` - Add `validateCurrentAssets() view` - `BackingManager` - Switch from sizing trades using the low price to the high price -- `Broker` - - Make setters only callable by `Main` +- `BasketHandler` + - Add `issuancePremium() view returns (uint192)` + - Add `setIssuancePremiumEnabled(bool)`, callable by governance. Begins disabled by default for upgraded RTokens + - Add `quote(uint192 amount, bool applyIssuancePremium, RoundingMode rounding)` + - Modify `quote(uint192 amount, RoundingMode rounding)` to include the issuance premium + - Add `price(bool applyIssuancePremium)` + - Modify `price()` to include the issuance premium + - Remove `lotPrice()` + - Minor changes to require error strings +- `Deployer` + - Add `enableIssuancePremium` parameter to `IDeployer.DeploymentParams` - `Distributor` - Add `setDistributions()` function to parallel `setDistribution()` - - Take DAO fee out account in `distribute()` and `totals()` + - Take DAO fee into account in `distribute()` and `totals()` - Add new revenue share table invariant: must sum to >=10000 (for precision reasons) - `Main` - Add `versionRegistry()`/`assetPluginRegistry()`/`daoFeeRegistry()` getters @@ -37,9 +53,12 @@ Make sure distributor table sums to >10000. ### Assets -No functional change. FLOOR rounding added explicitly to `shiftl_toFix`. +- Support expanded from 18 to 21 decimals, with minimum collateral token value requirement of `$0.001` at-peg. +- FLOOR rounding added explicitly to `shiftl_toFix` everywhere + +#### Collateral -Support expanded from 18 to 21 decimals, with minimum collateral token value requirement of `$0.001` at-peg. +Add `savedPegPrice` to `ICollateral` interface ### Trading diff --git a/common/configuration.ts b/common/configuration.ts index febedecbe3..f793d3c0d8 100644 --- a/common/configuration.ts +++ b/common/configuration.ts @@ -599,6 +599,7 @@ export interface IConfig { withdrawalLeak: BigNumber warmupPeriod: BigNumber reweightable: boolean + enableIssuancePremium: boolean tradingDelay: BigNumber batchAuctionLength: BigNumber dutchAuctionLength: BigNumber diff --git a/contracts/facade/facets/MaxIssuableFacet.sol b/contracts/facade/facets/MaxIssuableFacet.sol index c385f021a9..7581b617c3 100644 --- a/contracts/facade/facets/MaxIssuableFacet.sol +++ b/contracts/facade/facets/MaxIssuableFacet.sol @@ -5,6 +5,7 @@ import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "../../interfaces/IBasketHandler.sol"; import "../../interfaces/IRToken.sol"; import "../../libraries/Fixed.sol"; +import "../../p1/BasketHandler.sol"; /** * @title MaxIssuableFacet @@ -21,7 +22,8 @@ contract MaxIssuableFacet { /// @return {qRTok} How many RToken `account` can issue given current holdings /// @custom:static-call function maxIssuable(IRToken rToken, address account) external returns (uint256) { - (address[] memory erc20s, ) = rToken.main().basketHandler().quote(FIX_ONE, FLOOR); + BasketHandlerP1 bh = BasketHandlerP1(address(rToken.main().basketHandler())); + (address[] memory erc20s, ) = bh.quote(FIX_ONE, FLOOR); uint256[] memory balances = new uint256[](erc20s.length); for (uint256 i = 0; i < erc20s.length; ++i) { balances[i] = IERC20(erc20s[i]).balanceOf(account); @@ -45,7 +47,7 @@ contract MaxIssuableFacet { main.assetRegistry().refresh(); // Get basket ERC20s - IBasketHandler bh = main.basketHandler(); + BasketHandlerP1 bh = BasketHandlerP1(address(main.basketHandler())); (address[] memory erc20s, uint256[] memory quantities) = bh.quote(FIX_ONE, CEIL); // Compute how many baskets we can mint with the collateral amounts diff --git a/contracts/facade/facets/ReadFacet.sol b/contracts/facade/facets/ReadFacet.sol index 98b1be2f47..aee240ab4f 100644 --- a/contracts/facade/facets/ReadFacet.sol +++ b/contracts/facade/facets/ReadFacet.sol @@ -45,7 +45,7 @@ contract ReadFacet { // Cache components IRToken rTok = rToken; - IBasketHandler bh = main.basketHandler(); + BasketHandlerP1 bh = BasketHandlerP1(address(main.basketHandler())); IAssetRegistry reg = main.assetRegistry(); // Poke Main @@ -91,7 +91,7 @@ contract ReadFacet { // Cache Components IRToken rTok = rToken; - IBasketHandler bh = main.basketHandler(); + BasketHandlerP1 bh = BasketHandlerP1(address(main.basketHandler())); // Poke Main main.assetRegistry().refresh(); @@ -173,7 +173,7 @@ contract ReadFacet { { uint256[] memory deposits; IAssetRegistry assetRegistry = rToken.main().assetRegistry(); - IBasketHandler basketHandler = rToken.main().basketHandler(); + BasketHandlerP1 basketHandler = BasketHandlerP1(address(rToken.main().basketHandler())); // solhint-disable-next-line no-empty-blocks try rToken.main().furnace().melt() {} catch {} // <3.1.0 RTokens may revert while frozen @@ -299,7 +299,8 @@ contract ReadFacet { /// @return tokens The ERC20s backing the RToken function basketTokens(IRToken rToken) external view returns (address[] memory tokens) { - (tokens, ) = rToken.main().basketHandler().quote(FIX_ONE, RoundingMode.FLOOR); + BasketHandlerP1 bh = BasketHandlerP1(address(rToken.main().basketHandler())); + (tokens, ) = bh.quote(FIX_ONE, RoundingMode.FLOOR); } /// Returns the backup configuration for a given targetName @@ -335,10 +336,11 @@ contract ReadFacet { uint192 uoaNeeded; // {UoA} uint192 uoaHeldInBaskets; // {UoA} { - (address[] memory basketERC20s, uint256[] memory quantities) = rToken - .main() - .basketHandler() - .quote(basketsNeeded, FLOOR); + BasketHandlerP1 bh = BasketHandlerP1(address(rToken.main().basketHandler())); + (address[] memory basketERC20s, uint256[] memory quantities) = bh.quote( + basketsNeeded, + FLOOR + ); IAssetRegistry reg = rToken.main().assetRegistry(); IBackingManager bm = rToken.main().backingManager(); diff --git a/contracts/interfaces/IAsset.sol b/contracts/interfaces/IAsset.sol index 3196f9ce6e..4cc223a63d 100644 --- a/contracts/interfaces/IAsset.sol +++ b/contracts/interfaces/IAsset.sol @@ -32,13 +32,6 @@ interface IAsset is IRewardable { /// @return high {UoA/tok} The upper end of the price estimate function price() external view returns (uint192 low, uint192 high); - /// Should not revert - /// lotLow should be nonzero when the asset might be worth selling - /// @dev Deprecated. Phased out in 3.1.0, but left on interface for backwards compatibility - /// @return lotLow {UoA/tok} The lower end of the lot price estimate - /// @return lotHigh {UoA/tok} The upper end of the lot price estimate - function lotPrice() external view returns (uint192 lotLow, uint192 lotHigh); - /// @return {tok} The balance of the ERC20 in whole tokens function bal(address account) external view returns (uint192); @@ -114,7 +107,7 @@ interface ICollateral is IAsset { /// @dev refresh() /// Refresh exchange rates and update default status. - /// VERY IMPORTANT: In any valid implemntation, status() MUST become DISABLED in refresh() if + /// VERY IMPORTANT: In any valid implementation, status() MUST become DISABLED in refresh() if /// refPerTok() has ever decreased since last call. /// @return The canonical name of this collateral's target unit. @@ -130,6 +123,9 @@ interface ICollateral is IAsset { /// @return {target/ref} Quantity of whole target units per whole reference unit in the peg function targetPerRef() external view returns (uint192); + + /// @return {target/ref} The peg price of the token during the last update + function savedPegPrice() external view returns (uint192); } // Used only in Testing. Strictly speaking a Collateral does not need to adhere to this interface diff --git a/contracts/interfaces/IBasketHandler.sol b/contracts/interfaces/IBasketHandler.sol index 44aeace135..315790554e 100644 --- a/contracts/interfaces/IBasketHandler.sol +++ b/contracts/interfaces/IBasketHandler.sol @@ -43,6 +43,11 @@ interface IBasketHandler is IComponent { /// @param newVal The new warmup period event WarmupPeriodSet(uint48 oldVal, uint48 newVal); + /// Emitted when the issuance premium logic is changed + /// @param oldVal The old value of enableIssuancePremium + /// @param newVal The new value of enableIssuancePremium + event EnableIssuancePremiumSet(bool oldVal, bool newVal); + /// Emitted when the status of a basket has changed /// @param oldStatus The previous basket status /// @param newStatus The new basket status @@ -57,19 +62,20 @@ interface IBasketHandler is IComponent { function init( IMain main_, uint48 warmupPeriod_, - bool reweightable_ + bool reweightable_, + bool enableIssuancePremium_ ) external; - /// Set the prime basket - /// For an index RToken (reweightable = true), use forceSetPrimeBasket to skip normalization + /// Set the prime basket, checking target amounts are constant /// @param erc20s The collateral tokens for the new prime basket /// @param targetAmts The target amounts (in) {target/BU} for the new prime basket /// required range: 1e9 values; absolute range irrelevant. /// @custom:governance function setPrimeBasket(IERC20[] calldata erc20s, uint192[] calldata targetAmts) external; - /// Set the prime basket without normalizing targetAmts by the UoA of the current basket - /// Works the same as setPrimeBasket for non-index RTokens (reweightable = false) + /// Set the prime basket, skipping any constant target amount checks if RToken is reweightable + /// Warning: Reweightable RTokens SHOULD use a spell to execute this function to avoid + /// accidentally changing the UoA value of the RToken. /// @param erc20s The collateral tokens for the new prime basket /// @param targetAmts The target amounts (in) {target/BU} for the new prime basket /// required range: 1e9 values; absolute range irrelevant. @@ -110,29 +116,33 @@ interface IBasketHandler is IComponent { /// @return If the basket is ready to issue and trade function isReady() external view returns (bool); + /// Returns basket quantity rounded up, wihout any issuance premium /// @param erc20 The ERC20 token contract for the asset - /// @return {tok/BU} The whole token quantity of token in the reference basket + /// @return {tok/BU} The redemption quantity of token in the reference basket, rounded up /// Returns 0 if erc20 is not registered or not in the basket /// Returns FIX_MAX (in lieu of +infinity) if Collateral.refPerTok() is 0. /// Otherwise, returns (token's basket.refAmts / token's Collateral.refPerTok()) function quantity(IERC20 erc20) external view returns (uint192); + /// Returns basket quantity rounded up, wihout any issuance premium /// Like quantity(), but unsafe because it DOES NOT CONFIRM THAT THE ASSET IS CORRECT /// @param erc20 The ERC20 token contract for the asset /// @param asset The registered asset plugin contract for the erc20 - /// @return {tok/BU} The whole token quantity of token in the reference basket + /// @return {tok/BU} The redemption quantity of token in the reference basket, rounded up /// Returns 0 if erc20 is not registered or not in the basket /// Returns FIX_MAX (in lieu of +infinity) if Collateral.refPerTok() is 0. /// Otherwise, returns (token's basket.refAmts / token's Collateral.refPerTok()) function quantityUnsafe(IERC20 erc20, IAsset asset) external view returns (uint192); /// @param amount {BU} + /// @param applyIssuancePremium Whether to apply the issuance premium /// @return erc20s The addresses of the ERC20 tokens in the reference basket /// @return quantities {qTok} The quantity of each ERC20 token to issue `amount` baskets - function quote(uint192 amount, RoundingMode rounding) - external - view - returns (address[] memory erc20s, uint256[] memory quantities); + function quote( + uint192 amount, + bool applyIssuancePremium, + RoundingMode rounding + ) external view returns (address[] memory erc20s, uint256[] memory quantities); /// Return the redemption value of `amount` BUs for a linear combination of historical baskets /// @param basketNonces An array of basket nonces to do redemption from @@ -152,16 +162,10 @@ interface IBasketHandler is IComponent { /// Should not revert /// low should be nonzero when BUs are worth selling + /// @param applyIssuancePremium Whether to apply the issuance premium to the high price /// @return low {UoA/BU} The lower end of the price estimate /// @return high {UoA/BU} The upper end of the price estimate - function price() external view returns (uint192 low, uint192 high); - - /// Should not revert - /// lotLow should be nonzero if a BU could be worth selling - /// @dev Deprecated. Phased out in 3.1.0, but left on interface for backwards compatibility - /// @return lotLow {UoA/tok} The lower end of the lot price estimate - /// @return lotHigh {UoA/tok} The upper end of the lot price estimate - function lotPrice() external view returns (uint192 lotLow, uint192 lotHigh); + function price(bool applyIssuancePremium) external view returns (uint192 low, uint192 high); /// @return timestamp The timestamp at which the basket was last set function timestamp() external view returns (uint48); @@ -190,4 +194,8 @@ interface TestIBasketHandler is IBasketHandler { function warmupPeriod() external view returns (uint48); function setWarmupPeriod(uint48 val) external; + + function enableIssuancePremium() external view returns (bool); + + function setIssuancePremiumEnabled(bool val) external; } diff --git a/contracts/interfaces/IDeployer.sol b/contracts/interfaces/IDeployer.sol index 0a1e1ff6b5..149394fc39 100644 --- a/contracts/interfaces/IDeployer.sol +++ b/contracts/interfaces/IDeployer.sol @@ -39,6 +39,7 @@ struct DeploymentParams { // === BasketHandler === uint48 warmupPeriod; // {s} how long to wait until issuance/trading after regaining SOUND bool reweightable; // whether the target amounts in the prime basket can change + bool enableIssuancePremium; // whether to enable the issuance premium // // === BackingManager === uint48 tradingDelay; // {s} how long to wait until starting auctions after switching basket diff --git a/contracts/p0/BasketHandler.sol b/contracts/p0/BasketHandler.sol index f267727fa2..e7c132acd2 100644 --- a/contracts/p0/BasketHandler.sol +++ b/contracts/p0/BasketHandler.sol @@ -153,6 +153,8 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { // Whether the total weights of the target basket can be changed bool public reweightable; // immutable after init + bool public enableIssuancePremium; + // ==== Invariants ==== // basket is a valid Basket: // basket.erc20s is a valid collateral array and basket.erc20s == keys(basket.refAmts) @@ -166,12 +168,14 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { function init( IMain main_, uint48 warmupPeriod_, - bool reweightable_ + bool reweightable_, + bool enableIssuancePremium_ ) external initializer { __Component_init(main_); setWarmupPeriod(warmupPeriod_); reweightable = reweightable_; // immutable thereafter + enableIssuancePremium = enableIssuancePremium_; // Set last status to DISABLED (default) lastStatus = CollateralStatus.DISABLED; @@ -237,7 +241,7 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { } } - /// Set the prime basket + /// Set the prime basket, checking target amounts are constant /// @param erc20s The collateral for the new prime basket /// @param targetAmts The target amounts (in) {target/BU} for the new prime basket /// @custom:governance @@ -245,10 +249,12 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { external governance { - _setPrimeBasket(erc20s, targetAmts, true); + _setPrimeBasket(erc20s, targetAmts, false); } - /// Set the prime basket without reweighting targetAmts by UoA of the current basket + /// Set the prime basket, skipping any constant target amount checks if RToken is reweightable + /// Warning: Reweightable RTokens SHOULD use a spell to execute this function to avoid + /// accidentally changing the UoA value of the RToken. /// @param erc20s The collateral for the new prime basket /// @param targetAmts The target amounts (in) {target/BU} for the new prime basket /// @custom:governance @@ -256,13 +262,13 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { external governance { - _setPrimeBasket(erc20s, targetAmts, false); + _setPrimeBasket(erc20s, targetAmts, true); } /// Set the prime basket in the basket configuration, in terms of erc20s and target amounts /// @param erc20s The collateral for the new prime basket /// @param targetAmts The target amounts (in) {target/BU} for the new prime basket - /// @param normalize True iff targetAmts should be normalized by UoA to the reference basket + /// @param disableTargetAmountCheck If true, skips the `requireConstantConfigTargets()` check /// @custom:governance // checks: // caller is OWNER @@ -278,18 +284,18 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { function _setPrimeBasket( IERC20[] calldata erc20s, uint192[] memory targetAmts, - bool normalize + bool disableTargetAmountCheck ) internal { - require(erc20s.length > 0, "empty basket"); - require(erc20s.length == targetAmts.length, "len mismatch"); + require(erc20s.length > 0, "invalid lengths"); + require(erc20s.length == targetAmts.length, "invalid lengths"); requireValidCollArray(erc20s); - if (!reweightable && config.erc20s.length > 0) { + if ( + (!reweightable || (reweightable && !disableTargetAmountCheck)) && + config.erc20s.length != 0 + ) { // Require targets remain constant requireConstantConfigTargets(erc20s, targetAmts); - } else if (normalize && config.erc20s.length > 0) { - // Normalize targetAmts based on UoA value of reference basket - targetAmts = normalizeByPrice(erc20s, targetAmts); } // Clean up previous basket config @@ -307,8 +313,8 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { // This is a nice catch to have, but in general it is possible for // an ERC20 in the prime basket to have its asset unregistered. require(reg.toAsset(erc20s[i]).isCollateral(), "erc20 is not collateral"); - require(0 < targetAmts[i], "invalid target amount; must be nonzero"); - require(targetAmts[i] <= MAX_TARGET_AMT, "invalid target amount; too large"); + require(0 < targetAmts[i], "invalid target amount"); + require(targetAmts[i] <= MAX_TARGET_AMT, "invalid target amount"); config.erc20s.push(erc20s[i]); config.targetAmts[erc20s[i]] = targetAmts[i]; @@ -333,8 +339,8 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { uint256 max, IERC20[] calldata erc20s ) external governance { - require(max <= MAX_BACKUP_ERC20S, "max too large"); - require(erc20s.length <= MAX_BACKUP_ERC20S, "erc20s too large"); + require(max <= MAX_BACKUP_ERC20S, "too large"); + require(erc20s.length <= MAX_BACKUP_ERC20S, "too large"); requireValidCollArray(erc20s); BackupConfig storage conf = config.backups[targetName]; conf.max = max; @@ -377,8 +383,9 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { (block.timestamp >= lastStatusTimestamp + warmupPeriod); } + /// Basket quantity rounded up, without any issuance premium /// @param erc20 The token contract to check for quantity for - /// @return {tok/BU} The token-quantity of an ERC20 token in the basket. + /// @return {tok/BU} The redemption token-quantity of an ERC20 token in the basket. // Returns 0 if erc20 is not registered or not in the basket // Returns FIX_MAX (in lieu of +infinity) if Collateral.refPerTok() is 0. // Otherwise returns (token's basket.refAmts / token's Collateral.refPerTok()) @@ -390,6 +397,7 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { } } + /// Basket quantity rounded up, without any issuance premium /// Like quantity(), but unsafe because it DOES NOT CONFIRM THAT THE ASSET IS CORRECT /// @param erc20 The ERC20 token contract for the asset /// @param asset The registered asset plugin contract for the erc20 @@ -402,9 +410,27 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { return _quantity(erc20, ICollateral(address(asset)), CEIL); } + /// @param coll A collateral that has had refresh() called on it this timestamp + /// @return {1} The multiplier to charge on issuance quantities for a collateral + function issuancePremium(ICollateral coll) public view returns (uint192) { + if (!enableIssuancePremium || coll.lastSave() != block.timestamp) return FIX_ONE; + + try coll.savedPegPrice() returns (uint192 pegPrice) { + uint192 targetPerRef = coll.targetPerRef(); // {target/ref} + if (pegPrice == 0 || pegPrice >= targetPerRef) return FIX_ONE; + + // {1} = {target/ref} / {target/ref} + return targetPerRef.safeDiv(pegPrice, CEIL); + } catch { + // if savedPegPrice() does not exist on the collateral the error bytes are 0 len + return FIX_ONE; + } + } + + /// Returns the quantity of collateral token in a BU /// @param erc20 The token contract /// @param coll The registered collateral plugin contract - /// @return {tok/BU} The token-quantity of an ERC20 token in the basket. + /// @return q {tok/BU} The token-quantity of an ERC20 token in the basket // Returns 0 if coll is not in the basket // Returns FIX_MAX (in lieu of +infinity) if Collateral.refPerTok() is 0. // Otherwise returns (token's basket.refAmts / token's Collateral.refPerTok()) @@ -420,49 +446,55 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { return basket.refAmts[erc20].div(refPerTok, rounding); } + /// Returns the price of a BU (including issuance premium) + /// Included for backwards compatibility with <4.0.0 /// Should not revert /// @return low {UoA/BU} The lower end of the price estimate /// @return high {UoA/BU} The upper end of the price estimate // returns sum(quantity(erc20) * price(erc20) for erc20 in basket.erc20s) function price() external view returns (uint192 low, uint192 high) { - return _price(false); + return price(true); } /// Should not revert - /// lowLow should be nonzero when the asset might be worth selling - /// @dev Deprecated. Phased out in 3.1.0, but left on interface for backwards compatibility - /// @return lotLow {UoA/BU} The lower end of the lot price estimate - /// @return lotHigh {UoA/BU} The upper end of the lot price estimate - // returns sum(quantity(erc20) * lotPrice(erc20) for erc20 in basket.erc20s) - function lotPrice() external view returns (uint192 lotLow, uint192 lotHigh) { - return _price(true); - } - - /// Returns the price of a BU, using the lot prices if `useLotPrice` is true - /// @return low {UoA/BU} The lower end of the lot price estimate - /// @return high {UoA/BU} The upper end of the lot price estimate - function _price(bool useLotPrice) internal view returns (uint192 low, uint192 high) { + /// @param applyIssuancePremium Whether to apply the issuance premium to the high price + /// @return low {UoA/BU} The lower end of the price estimate + /// @return high {UoA/BU} The upper end of the price estimate + // returns sum(quantity(erc20) * price(erc20) for erc20 in basket.erc20s) + function price(bool applyIssuancePremium) public view returns (uint192 low, uint192 high) { IAssetRegistry reg = main.assetRegistry(); uint256 low256; uint256 high256; for (uint256 i = 0; i < basket.erc20s.length; i++) { - uint192 qty = quantity(basket.erc20s[i]); - if (qty == 0) continue; + try main.assetRegistry().toColl(basket.erc20s[i]) returns (ICollateral coll) { + uint192 qty = _quantity(basket.erc20s[i], coll, CEIL); + if (qty == 0) continue; - (uint192 lowP, uint192 highP) = useLotPrice - ? reg.toAsset(basket.erc20s[i]).lotPrice() - : reg.toAsset(basket.erc20s[i]).price(); + (uint192 lowP, uint192 highP) = reg.toAsset(basket.erc20s[i]).price(); - low256 += qty.safeMul(lowP, RoundingMode.FLOOR); + low256 += qty.safeMul(lowP, FLOOR); - if (high256 < FIX_MAX) { - if (highP == FIX_MAX) { - high256 = FIX_MAX; - } else { - high256 += qty.safeMul(highP, RoundingMode.CEIL); + if (high256 < FIX_MAX) { + if (highP == FIX_MAX) { + high256 = FIX_MAX; + continue; + } + + if (applyIssuancePremium) { + uint192 premium = issuancePremium(coll); // {1} always CEIL + + // {tok} = {tok} * {1} + if (premium > FIX_ONE) qty = qty.safeMul(premium, CEIL); + } + + high256 += qty.safeMul(highP, CEIL); } + } catch (bytes memory errData) { + // see: docs/solidity-style.md#Catching-Empty-Data + if (errData.length == 0) revert(); // solhint-disable-line reason-string + continue; } } @@ -471,8 +503,10 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { high = high256 >= FIX_MAX ? FIX_MAX : uint192(high256); } - /// Return the current issuance/redemption value of `amount` BUs + /// Return the current issuance/redemption quantities for `amount` BUs + /// Included for backwards compatibility with <4.0.0 /// @param amount {BU} + /// @param rounding If CEIL, apply issuance premium /// @return erc20s The backing collateral erc20s /// @return quantities {qTok} ERC20 token quantities equal to `amount` BUs // Returns (erc20s, [quantity(e) * amount {as qTok} for e in erc20s]) @@ -481,6 +515,19 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { view returns (address[] memory erc20s, uint256[] memory quantities) { + return quote(amount, rounding == CEIL, rounding); + } + + /// @param amount {BU} + /// @param applyIssuancePremium Whether to apply the issuance premium + /// @return erc20s The backing collateral erc20s + /// @return quantities {qTok} ERC20 token quantities equal to `amount` BUs + // Returns (erc20s, [quantity(e) * amount {as qTok} for e in erc20s]) + function quote( + uint192 amount, + bool applyIssuancePremium, + RoundingMode rounding + ) public view returns (address[] memory erc20s, uint256[] memory quantities) { IAssetRegistry assetRegistry = main.assetRegistry(); erc20s = new address[](basket.erc20s.length); quantities = new uint256[](basket.erc20s.length); @@ -489,10 +536,22 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { erc20s[i] = address(basket.erc20s[i]); ICollateral coll = assetRegistry.toColl(IERC20(erc20s[i])); - // {qTok} = {tok/BU} * {BU} * {tok} * {qTok/tok} - quantities[i] = _quantity(basket.erc20s[i], coll, rounding) - .safeMul(amount, rounding) - .shiftl_toUint(int8(IERC20Metadata(address(basket.erc20s[i])).decimals()), rounding); + // {tok} = {tok/BU} * {BU} + uint192 q = _quantity(basket.erc20s[i], coll, rounding).safeMul(amount, rounding); + + // Prevent toxic issuance by charging more when collateral is under peg + if (applyIssuancePremium) { + uint192 premium = issuancePremium(coll); // {1} always CEIL + + // {tok} = {tok} * {1} + if (premium > FIX_ONE) q = q.safeMul(premium, rounding); + } + + // {qTok} = {tok} * {qTok/tok} + quantities[i] = q.shiftl_toUint( + int8(IERC20Metadata(address(basket.erc20s[i])).decimals()), + rounding + ); } } @@ -508,7 +567,7 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { uint192[] memory portions, uint192 amount ) external view returns (address[] memory erc20s, uint256[] memory quantities) { - require(basketNonces.length == portions.length, "bad portions len"); + require(basketNonces.length == portions.length, "invalid lengths"); IERC20[] memory erc20sAll = new IERC20[](main.assetRegistry().size()); ICollateral[] memory collsAll = new ICollateral[](erc20sAll.length); @@ -594,14 +653,9 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { ICollateral coll = main.assetRegistry().toColl(basket.erc20s[i]); if (coll.status() == CollateralStatus.DISABLED) return BasketRange(FIX_ZERO, FIX_MAX); - uint192 refPerTok = coll.refPerTok(); - // If refPerTok is 0, then we have zero of coll's reference unit. - // We know that basket.refAmts[basket.erc20s[i]] > 0, so we have no baskets. - if (refPerTok == 0) return BasketRange(FIX_ZERO, FIX_MAX); - - // {tok/BU} = {ref/BU} / {ref/tok}. 0-division averted by condition above. - uint192 q = basket.refAmts[basket.erc20s[i]].div(refPerTok, CEIL); - // q > 0 because q = (n).div(_, CEIL) and n > 0 + // {tok/BU} + uint192 q = _quantity(basket.erc20s[i], coll, CEIL); + if (q == FIX_MAX) return BasketRange(FIX_ZERO, FIX_MAX); // {BU} = {tok} / {tok/BU} uint192 inBUs = coll.bal(account).div(q); @@ -619,6 +673,12 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { warmupPeriod = val; } + /// @custom:governance + function setIssuancePremiumEnabled(bool val) public governance { + emit EnableIssuancePremiumSet(enableIssuancePremium, val); + enableIssuancePremium = val; + } + /* _switchBasket computes basket' from three inputs: - the basket configuration (config: BasketConfig) - the function (isGood: erc20 -> bool), implemented here by goodCollateral() @@ -842,46 +902,6 @@ contract BasketHandlerP0 is ComponentP0, IBasketHandler { require(_targetAmts.length() == 0, "missing target weights"); } - /// Normalize the target amounts to maintain constant UoA value with the current config - /// @return newTargetAmts {target/BU} The new target amounts for the normalized basket - function normalizeByPrice(IERC20[] calldata erc20s, uint192[] memory targetAmts) - private - returns (uint192[] memory newTargetAmts) - { - main.poke(); - require(status() == CollateralStatus.SOUND, "unsound basket"); - uint256 len = erc20s.length; // assumes erc20s.length == targetAmts.length - - // Compute current basket price - (uint192 low, uint192 high) = _price(false); // {UoA/BU} - assert(low > 0 && high < FIX_MAX); // implied by SOUND status - uint192 p = low.plus(high).divu(2, FLOOR); // {UoA/BU} - - // Compute would-be new price - uint192 newP; // {UoA/BU} - for (uint256 i = 0; i < len; ++i) { - ICollateral coll = main.assetRegistry().toColl(erc20s[i]); // reverts if unregistered - require(coll.status() == CollateralStatus.SOUND, "unsound new collateral"); - - (low, high) = coll.price(); // {UoA/tok} - require(low > 0 && high < FIX_MAX, "invalid price"); - - // {UoA/BU} += {target/BU} * {UoA/tok} / ({target/ref} * {ref/tok}) - newP += targetAmts[i].mulDiv( - low.plus(high).divu(2, FLOOR), - coll.targetPerRef().mul(coll.refPerTok(), CEIL), - FLOOR - ); - } - - // Scale targetAmts by the price ratio - newTargetAmts = new uint192[](len); - for (uint256 i = 0; i < len; ++i) { - // {target/BU} = {target/BU} * {UoA/BU} / {UoA/BU} - newTargetAmts[i] = targetAmts[i].mulDiv(p, newP, CEIL); - } - } - /// Good collateral is registered, collateral, SOUND, has the expected targetName, /// and not a system token or 0 addr function goodCollateral(bytes32 targetName, IERC20 erc20) private view returns (bool) { diff --git a/contracts/p0/Deployer.sol b/contracts/p0/Deployer.sol index e26569974a..f812830044 100644 --- a/contracts/p0/Deployer.sol +++ b/contracts/p0/Deployer.sol @@ -95,7 +95,12 @@ contract DeployerP0 is IDeployer, Versioned { ); // Init Basket Handler - main.basketHandler().init(main, params.warmupPeriod, params.reweightable); + main.basketHandler().init( + main, + params.warmupPeriod, + params.reweightable, + params.enableIssuancePremium + ); // Init Revenue Traders main.rsrTrader().init(main, rsr, params.maxTradeSlippage, params.minTradeVolume); diff --git a/contracts/p0/RToken.sol b/contracts/p0/RToken.sol index 3a4b476aff..c30757f96b 100644 --- a/contracts/p0/RToken.sol +++ b/contracts/p0/RToken.sol @@ -109,7 +109,11 @@ contract RTokenP0 is ComponentP0, ERC20PermitUpgradeable, IRToken { ? basketsNeeded.muluDivu(amount, totalSupply(), CEIL) // {BU * qRTok / qRTok} : shiftl_toFix(amount, -int8(decimals())); // {qRTok / qRTok} - (address[] memory erc20s, uint256[] memory deposits) = basketHandler.quote(baskets, CEIL); + (address[] memory erc20s, uint256[] memory deposits) = basketHandler.quote( + baskets, + true, + CEIL + ); address issuer = _msgSender(); for (uint256 i = 0; i < erc20s.length; i++) { @@ -150,6 +154,7 @@ contract RTokenP0 is ComponentP0, ERC20PermitUpgradeable, IRToken { (address[] memory erc20s, uint256[] memory amounts) = main.basketHandler().quote( baskets, + false, FLOOR ); diff --git a/contracts/p0/mixins/TradingLib.sol b/contracts/p0/mixins/TradingLib.sol index a0e0df2638..ab4232dbd8 100644 --- a/contracts/p0/mixins/TradingLib.sol +++ b/contracts/p0/mixins/TradingLib.sol @@ -278,7 +278,7 @@ library TradingLibP0 { view returns (BasketRange memory range) { - (uint192 buPriceLow, uint192 buPriceHigh) = ctx.bh.price(); // {UoA/BU} + (uint192 buPriceLow, uint192 buPriceHigh) = ctx.bh.price(false); // {UoA/BU} // Cap ctx.basketsHeld.top if (ctx.basketsHeld.top > ctx.rToken.basketsNeeded()) { diff --git a/contracts/p1/BackingManager.sol b/contracts/p1/BackingManager.sol index ce477745dc..6f8c8b2ff6 100644 --- a/contracts/p1/BackingManager.sol +++ b/contracts/p1/BackingManager.sol @@ -236,6 +236,7 @@ contract BackingManagerP1 is TradingP1, IBackingManager { for (uint256 i = 0; i < length; ++i) { IAsset asset = assetRegistry.toAsset(erc20s[i]); + // Use same quantity-rounding as BasketHandler.basketsHeldBy() // {tok} = {BU} * {tok/BU} uint192 req = needed.mul(basketHandler.quantity(erc20s[i]), CEIL); uint192 bal = asset.bal(address(this)); @@ -287,6 +288,7 @@ contract BackingManagerP1 is TradingP1, IBackingManager { ctx.quantities = new uint192[](reg.erc20s.length); for (uint256 i = 0; i < reg.erc20s.length; ++i) { ctx.quantities[i] = basketHandler.quantityUnsafe(reg.erc20s[i], reg.assets[i]); + // quantities round up, without any issuance premium } ctx.bals = new uint192[](reg.erc20s.length); for (uint256 i = 0; i < reg.erc20s.length; ++i) { diff --git a/contracts/p1/BasketHandler.sol b/contracts/p1/BasketHandler.sol index d65a3c667c..4a07a81024 100644 --- a/contracts/p1/BasketHandler.sol +++ b/contracts/p1/BasketHandler.sol @@ -13,6 +13,8 @@ import "../libraries/Fixed.sol"; import "./mixins/BasketLib.sol"; import "./mixins/Component.sol"; +// solhint-disable max-states-count + /** * @title BasketHandler * @notice Handles the basket configuration, definition, and evolution over time. @@ -89,6 +91,9 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { uint48 public lastCollateralized; // {basketNonce} most recent full collateralization // === + // Added in 4.0.0 + + bool public enableIssuancePremium; // ==== Invariants ==== // basket is a valid Basket: @@ -103,7 +108,8 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { function init( IMain main_, uint48 warmupPeriod_, - bool reweightable_ + bool reweightable_, + bool enableIssuancePremium_ ) external initializer { __Component_init(main_); @@ -115,6 +121,7 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { setWarmupPeriod(warmupPeriod_); reweightable = reweightable_; // immutable thereafter + enableIssuancePremium = enableIssuancePremium_; // Set last status to DISABLED (default) lastStatus = CollateralStatus.DISABLED; @@ -183,26 +190,28 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { } } - /// Set the prime basket + /// Set the prime basket, checking target amounts are constant /// @param erc20s The collateral for the new prime basket /// @param targetAmts The target amounts (in) {target/BU} for the new prime basket /// @custom:governance function setPrimeBasket(IERC20[] calldata erc20s, uint192[] calldata targetAmts) external { - _setPrimeBasket(erc20s, targetAmts, true); + _setPrimeBasket(erc20s, targetAmts, false); } - /// Set the prime basket without reweighting targetAmts by UoA of the current basket + /// Set the prime basket, skipping any constant target amount checks if RToken is reweightable + /// Warning: Reweightable RTokens SHOULD use a spell to execute this function to avoid + /// accidentally changing the UoA value of the RToken. /// @param erc20s The collateral for the new prime basket /// @param targetAmts The target amounts (in) {target/BU} for the new prime basket /// @custom:governance function forceSetPrimeBasket(IERC20[] calldata erc20s, uint192[] calldata targetAmts) external { - _setPrimeBasket(erc20s, targetAmts, false); + _setPrimeBasket(erc20s, targetAmts, true); } /// Set the prime basket in the basket configuration, in terms of erc20s and target amounts /// @param erc20s The collateral for the new prime basket /// @param targetAmts The target amounts (in) {target/BU} for the new prime basket - /// @param normalize True iff targetAmts should be normalized by UoA to the reference basket + /// @param disableTargetAmountCheck If true, skips the `requireConstantConfigTargets()` check /// @custom:governance // checks: // caller is OWNER @@ -218,14 +227,16 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { function _setPrimeBasket( IERC20[] calldata erc20s, uint192[] memory targetAmts, - bool normalize + bool disableTargetAmountCheck ) internal { requireGovernanceOnly(); - require(erc20s.length != 0, "empty basket"); - require(erc20s.length == targetAmts.length, "len mismatch"); + require(erc20s.length != 0 && erc20s.length == targetAmts.length, "invalid lengths"); requireValidCollArray(erc20s); - if (!reweightable && config.erc20s.length != 0) { + if ( + (!reweightable || (reweightable && !disableTargetAmountCheck)) && + config.erc20s.length != 0 + ) { // Require targets remain constant BasketLibP1.requireConstantConfigTargets( assetRegistry, @@ -234,20 +245,6 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { erc20s, targetAmts ); - } else if (normalize && config.erc20s.length != 0) { - // Confirm reference basket is SOUND - assetRegistry.refresh(); // will set lastStatus - require(lastStatus == CollateralStatus.SOUND, "unsound basket"); - - // Normalize targetAmts based on UoA value of reference basket - (uint192 low, uint192 high) = _price(false); - assert(low != 0 && high != FIX_MAX); // implied by SOUND status - targetAmts = BasketLibP1.normalizeByPrice( - assetRegistry, - erc20s, - targetAmts, - (low + high + 1) / 2 - ); } // Clean up previous basket config @@ -264,8 +261,7 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { // This is a nice catch to have, but in general it is possible for // an ERC20 in the prime basket to have its asset unregistered. require(assetRegistry.toAsset(erc20s[i]).isCollateral(), "erc20 is not collateral"); - require(0 < targetAmts[i], "invalid target amount; must be nonzero"); - require(targetAmts[i] <= MAX_TARGET_AMT, "invalid target amount; too large"); + require(0 < targetAmts[i] && targetAmts[i] <= MAX_TARGET_AMT, "invalid target amount"); config.erc20s.push(erc20s[i]); config.targetAmts[erc20s[i]] = targetAmts[i]; @@ -291,8 +287,7 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { IERC20[] calldata erc20s ) external { requireGovernanceOnly(); - require(max <= MAX_BACKUP_ERC20S, "max too large"); - require(erc20s.length <= MAX_BACKUP_ERC20S, "erc20s too large"); + require(max <= MAX_BACKUP_ERC20S && erc20s.length <= MAX_BACKUP_ERC20S, "too large"); requireValidCollArray(erc20s); BackupConfig storage conf = config.backups[targetName]; conf.max = max; @@ -301,7 +296,7 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { for (uint256 i = 0; i < erc20s.length; ++i) { // This is a nice catch to have, but in general it is possible for // an ERC20 in the backup config to have its asset altered. - require(assetRegistry.toAsset(erc20s[i]).isCollateral(), "erc20 is not collateral"); + assetRegistry.toColl(erc20s[i]); // reverts if not collateral conf.erc20s.push(erc20s[i]); } emit BackupConfigSet(targetName, max, erc20s); @@ -339,6 +334,7 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { (block.timestamp >= lastStatusTimestamp + warmupPeriod); } + /// Basket quantity rounded up, without any issuance premium /// @param erc20 The token contract to check for quantity for /// @return {tok/BU} The token-quantity of an ERC20 token in the basket. // Returns 0 if erc20 is not registered or not in the basket @@ -352,6 +348,7 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { } } + /// Basket quantity rounded up, without any issuance premium /// Like quantity(), but unsafe because it DOES NOT CONFIRM THAT THE ASSET IS CORRECT /// @param erc20 The ERC20 token contract for the asset /// @param asset The registered asset plugin contract for the erc20 @@ -364,9 +361,30 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { return _quantity(erc20, ICollateral(address(asset)), CEIL); } + /// @param coll A collateral that has had refresh() called on it this timestamp + /// @return {1} The multiplier to charge on issuance quantities for a collateral + function issuancePremium(ICollateral coll) public view returns (uint192) { + // `coll` does not need validation + if (!enableIssuancePremium || coll.lastSave() != block.timestamp) return FIX_ONE; + + // Use try-catch for safety since `savedPegPrice()` was only added in 4.0.0 to ICollateral + try coll.savedPegPrice() returns (uint192 pegPrice) { + if (pegPrice == 0) return FIX_ONE; + uint192 targetPerRef = coll.targetPerRef(); // {target/ref} + if (pegPrice >= targetPerRef) return FIX_ONE; + + // {1} = {target/ref} / {target/ref} + return targetPerRef.safeDiv(pegPrice, CEIL); + } catch { + // if savedPegPrice() does not exist on the collateral the error bytes are 0 len + return FIX_ONE; + } + } + + /// Returns the quantity of collateral token in a BU /// @param erc20 The token contract /// @param coll The registered collateral plugin contract - /// @return {tok/BU} The token-quantity of an ERC20 token in the basket. + /// @return {tok/BU} The token-quantity of an ERC20 token in the basket // Returns 0 if coll is not in the basket // Returns FIX_MAX (in lieu of +infinity) if Collateral.refPerTok() is 0. // Otherwise returns (token's basket.refAmts / token's Collateral.refPerTok()) @@ -382,49 +400,55 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { return basket.refAmts[erc20].div(refPerTok, rounding); } + /// Returns the price of a BU (including issuance premium) + /// Included for backwards compatibility with <4.0.0 /// Should not revert /// @return low {UoA/BU} The lower end of the price estimate /// @return high {UoA/BU} The upper end of the price estimate // returns sum(quantity(erc20) * price(erc20) for erc20 in basket.erc20s) function price() external view returns (uint192 low, uint192 high) { - return _price(false); + return price(true); } + /// Returns the price of a BU /// Should not revert - /// lowLow should be nonzero when the asset might be worth selling - /// @dev Deprecated. Phased out in 3.1.0, but left on interface for backwards compatibility - /// @return lotLow {UoA/BU} The lower end of the lot price estimate - /// @return lotHigh {UoA/BU} The upper end of the lot price estimate - // returns sum(quantity(erc20) * lotPrice(erc20) for erc20 in basket.erc20s) - function lotPrice() external view returns (uint192 lotLow, uint192 lotHigh) { - return _price(true); - } - - /// Returns the price of a BU, using the lot prices if `useLotPrice` is true - /// @param useLotPrice Whether to use lotPrice() or price() + /// @param applyIssuancePremium Whether to apply the issuance premium to the high price /// @return low {UoA/BU} The lower end of the price estimate /// @return high {UoA/BU} The upper end of the price estimate - function _price(bool useLotPrice) internal view returns (uint192 low, uint192 high) { + // returns sum(quantity(erc20) * price(erc20) for erc20 in basket.erc20s) + function price(bool applyIssuancePremium) public view returns (uint192 low, uint192 high) { uint256 low256; uint256 high256; uint256 len = basket.erc20s.length; for (uint256 i = 0; i < len; ++i) { - uint192 qty = quantity(basket.erc20s[i]); // CEIL rounding - if (qty == 0) continue; + try assetRegistry.toColl(basket.erc20s[i]) returns (ICollateral coll) { + uint192 qty = _quantity(basket.erc20s[i], coll, CEIL); + if (qty == 0) continue; - (uint192 lowP, uint192 highP) = useLotPrice - ? assetRegistry.toAsset(basket.erc20s[i]).lotPrice() - : assetRegistry.toAsset(basket.erc20s[i]).price(); + (uint192 lowP, uint192 highP) = coll.price(); - low256 += qty.safeMul(lowP, RoundingMode.FLOOR); + low256 += qty.safeMul(lowP, FLOOR); - if (high256 < FIX_MAX) { - if (highP == FIX_MAX) { - high256 = FIX_MAX; - } else { - high256 += qty.safeMul(highP, RoundingMode.CEIL); + if (high256 < FIX_MAX) { + if (highP == FIX_MAX) { + high256 = FIX_MAX; + continue; + } + + if (applyIssuancePremium) { + uint192 premium = issuancePremium(coll); // {1} always CEIL + + // {tok} = {tok} * {1} + if (premium > FIX_ONE) qty = qty.safeMul(premium, CEIL); + } + + high256 += qty.safeMul(highP, CEIL); } + } catch (bytes memory errData) { + // see: docs/solidity-style.md#Catching-Empty-Data + if (errData.length == 0) revert(); // solhint-disable-line reason-string + continue; } } @@ -433,9 +457,9 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { high = high256 >= FIX_MAX ? FIX_MAX : uint192(high256); } - /// Return the current issuance/redemption value of `amount` BUs - /// Any approvals needed to issue RTokens should be set to the values returned by this function - /// @dev Subset of logic of quoteCustomRedemption; more gas efficient for current nonce + /// Return the current issuance/redemption quantities for `amount` BUs + /// Included for backwards compatibility with <4.0.0 + /// @param rounding If CEIL, apply issuance premium /// @param amount {BU} /// @return erc20s The backing collateral erc20s /// @return quantities {qTok} ERC20 token quantities equal to `amount` BUs @@ -445,6 +469,21 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { view returns (address[] memory erc20s, uint256[] memory quantities) { + return quote(amount, rounding == CEIL, rounding); + } + + /// Return the current issuance/redemption quantities for `amount` BUs + /// @dev Subset of logic of quoteCustomRedemption; more gas efficient for current nonce + /// @param amount {BU} + /// @param applyIssuancePremium Whether to apply the issuance premium + /// @return erc20s The backing collateral erc20s + /// @return quantities {qTok} ERC20 token quantities equal to `amount` BUs + // Returns (erc20s, [quantity(e) * amount {as qTok} for e in erc20s]) + function quote( + uint192 amount, + bool applyIssuancePremium, + RoundingMode rounding + ) public view returns (address[] memory erc20s, uint256[] memory quantities) { uint256 length = basket.erc20s.length; erc20s = new address[](length); quantities = new uint256[](length); @@ -453,10 +492,22 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { erc20s[i] = address(basket.erc20s[i]); ICollateral coll = assetRegistry.toColl(IERC20(erc20s[i])); - // {qTok} = {tok/BU} * {BU} * {tok} * {qTok/tok} - quantities[i] = _quantity(basket.erc20s[i], coll, rounding) - .safeMul(amount, rounding) - .shiftl_toUint(int8(IERC20Metadata(address(basket.erc20s[i])).decimals()), rounding); + // {tok} = {tok/BU} * {BU} + uint192 q = _quantity(basket.erc20s[i], coll, rounding).safeMul(amount, rounding); + + // Prevent toxic issuance by charging more when collateral is under peg + if (applyIssuancePremium) { + uint192 premium = issuancePremium(coll); // {1} always CEIL by definition + + // {tok} = {tok} * {1} + if (premium > FIX_ONE) q = q.safeMul(premium, rounding); + } + + // {qTok} = {tok} * {qTok/tok} + quantities[i] = q.shiftl_toUint( + int8(IERC20Metadata(address(basket.erc20s[i])).decimals()), + rounding + ); } } @@ -472,7 +523,7 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { uint192[] memory portions, uint192 amount ) external view returns (address[] memory erc20s, uint256[] memory quantities) { - require(basketNonces.length == portions.length, "bad portions len"); + require(basketNonces.length == portions.length, "invalid lengths"); IERC20[] memory erc20sAll = new IERC20[](assetRegistry.size()); ICollateral[] memory collsAll = new ICollateral[](erc20sAll.length); @@ -565,14 +616,9 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { ICollateral coll = assetRegistry.toColl(basket.erc20s[i]); if (coll.status() == CollateralStatus.DISABLED) return BasketRange(FIX_ZERO, FIX_MAX); - uint192 refPerTok = coll.refPerTok(); - // If refPerTok is 0, then we have zero of coll's reference unit. - // We know that basket.refAmts[basket.erc20s[i]] > 0, so we have no baskets. - if (refPerTok == 0) return BasketRange(FIX_ZERO, FIX_MAX); - - // {tok/BU} = {ref/BU} / {ref/tok}. 0-division averted by condition above. - uint192 q = basket.refAmts[basket.erc20s[i]].div(refPerTok, CEIL); - // q > 0 because q = (n).div(_, CEIL) and n > 0 + // {tok/BU} + uint192 q = _quantity(basket.erc20s[i], coll, CEIL); + if (q == FIX_MAX) return BasketRange(FIX_ZERO, FIX_MAX); // {BU} = {tok} / {tok/BU} uint192 inBUs = coll.bal(account).div(q); @@ -591,6 +637,13 @@ contract BasketHandlerP1 is ComponentP1, IBasketHandler { warmupPeriod = val; } + /// @custom:governance + function setIssuancePremiumEnabled(bool val) public { + requireGovernanceOnly(); + emit EnableIssuancePremiumSet(enableIssuancePremium, val); + enableIssuancePremium = val; + } + // === Private === // contract-size-saver diff --git a/contracts/p1/Deployer.sol b/contracts/p1/Deployer.sol index bf5608a52f..073c7c19e4 100644 --- a/contracts/p1/Deployer.sol +++ b/contracts/p1/Deployer.sol @@ -192,7 +192,12 @@ contract DeployerP1 is IDeployer, Versioned { ); // Init Basket Handler - components.basketHandler.init(main, params.warmupPeriod, params.reweightable); + components.basketHandler.init( + main, + params.warmupPeriod, + params.reweightable, + params.enableIssuancePremium + ); // Init Revenue Traders components.rsrTrader.init(main, rsr, params.maxTradeSlippage, params.minTradeVolume); diff --git a/contracts/p1/RToken.sol b/contracts/p1/RToken.sol index 16033d664e..e6350c81ad 100644 --- a/contracts/p1/RToken.sol +++ b/contracts/p1/RToken.sol @@ -135,8 +135,10 @@ contract RTokenP1 is ComponentP1, ERC20PermitUpgradeable, IRToken { : _safeWrap(amount); emit Issuance(issuer, recipient, amount, amtBaskets); + // Get quote from BasketHandler including issuance premium (address[] memory erc20s, uint256[] memory deposits) = basketHandler.quote( amtBaskets, + true, CEIL ); @@ -201,7 +203,11 @@ contract RTokenP1 is ComponentP1, ERC20PermitUpgradeable, IRToken { uint192 baskets = _scaleDown(caller, amount); emit Redemption(caller, recipient, amount, baskets); - (address[] memory erc20s, uint256[] memory amounts) = basketHandler.quote(baskets, FLOOR); + (address[] memory erc20s, uint256[] memory amounts) = basketHandler.quote( + baskets, + false, + FLOOR + ); // === Interactions === diff --git a/contracts/p1/mixins/BasketLib.sol b/contracts/p1/mixins/BasketLib.sol index e8e96ad4ac..3e5c3eb02a 100644 --- a/contracts/p1/mixins/BasketLib.sol +++ b/contracts/p1/mixins/BasketLib.sol @@ -345,6 +345,7 @@ library BasketLibP1 { } /// Normalize the target amounts to maintain constant UoA value with the current config + /// @dev Unused; left in for future use in reweightable RToken forceSetPrimeBasket() spell /// @param price {UoA/BU} Price of the reference basket (point estimate) /// @return newTargetAmts {target/BU} The new target amounts for the normalized basket function normalizeByPrice( diff --git a/contracts/p1/mixins/RecollateralizationLib.sol b/contracts/p1/mixins/RecollateralizationLib.sol index 1b1f355ef6..402aabc2be 100644 --- a/contracts/p1/mixins/RecollateralizationLib.sol +++ b/contracts/p1/mixins/RecollateralizationLib.sol @@ -113,7 +113,7 @@ library RecollateralizationLibP1 { // tradesOpen will be 0 when called by prepareRecollateralizationTrade() // tradesOpen can be > 0 when called by RTokenAsset.basketRange() - (uint192 buPriceLow, uint192 buPriceHigh) = ctx.bh.price(); // {UoA/BU} + (uint192 buPriceLow, uint192 buPriceHigh) = ctx.bh.price(false); // {UoA/BU} require(buPriceLow != 0 && buPriceHigh != FIX_MAX, "BUs unpriced"); uint192 basketsNeeded = ctx.rToken.basketsNeeded(); // {BU} diff --git a/contracts/plugins/assets/AppreciatingFiatCollateral.sol b/contracts/plugins/assets/AppreciatingFiatCollateral.sol index 96fb0a5008..4c6b9b76b8 100644 --- a/contracts/plugins/assets/AppreciatingFiatCollateral.sol +++ b/contracts/plugins/assets/AppreciatingFiatCollateral.sol @@ -104,6 +104,7 @@ abstract contract AppreciatingFiatCollateral is FiatCollateral { if (high != FIX_MAX) { savedLowPrice = low; savedHighPrice = high; + savedPegPrice = pegPrice; lastSave = uint48(block.timestamp); } else { // must be unpriced diff --git a/contracts/plugins/assets/FiatCollateral.sol b/contracts/plugins/assets/FiatCollateral.sol index 5e0c5936c1..ff043fa9f5 100644 --- a/contracts/plugins/assets/FiatCollateral.sol +++ b/contracts/plugins/assets/FiatCollateral.sol @@ -58,6 +58,8 @@ contract FiatCollateral is ICollateral, Asset { uint192 public immutable pegTop; // {target/ref} The top of the peg + uint192 public savedPegPrice; // {target/ref} The peg price of the token during the last update + /// @param config.chainlinkFeed Feed units: {UoA/ref} constructor(CollateralConfig memory config) Asset( @@ -136,6 +138,7 @@ contract FiatCollateral is ICollateral, Asset { if (high != FIX_MAX) { savedLowPrice = low; savedHighPrice = high; + savedPegPrice = pegPrice; lastSave = uint48(block.timestamp); } else { // must be unpriced diff --git a/contracts/plugins/assets/L2LSDCollateral.sol b/contracts/plugins/assets/L2LSDCollateral.sol index 81047c456d..4167bea7cd 100644 --- a/contracts/plugins/assets/L2LSDCollateral.sol +++ b/contracts/plugins/assets/L2LSDCollateral.sol @@ -70,6 +70,7 @@ abstract contract L2LSDCollateral is AppreciatingFiatCollateral { if (high != FIX_MAX) { savedLowPrice = low; savedHighPrice = high; + savedPegPrice = pegPrice; lastSave = uint48(block.timestamp); } else { // must be unpriced diff --git a/contracts/plugins/assets/RTokenAsset.sol b/contracts/plugins/assets/RTokenAsset.sol index 4dd8e47e9f..18eb3b4f3a 100644 --- a/contracts/plugins/assets/RTokenAsset.sol +++ b/contracts/plugins/assets/RTokenAsset.sol @@ -54,10 +54,16 @@ contract RTokenAsset is IAsset, VersionedAsset, IRTokenOracle { /// less RSR overcollateralization in % terms than the average (weighted) oracleError. /// This arises from the use of oracleErrors inside of `basketRange()` and inside /// `basketHandler.price()`. When `range.bottom == range.top` then there is no compounding. + /// @dev This method should not be relied upon to provide precise bounds for secondary market + /// prices. It is a "reasonable" estimate of the range the RToken is expected to trade in + /// given what the protocol knows about its internal state, but strictly speaking RTokens + /// can trade outside this range for periods of time (ie increased demand during IFFY state) + /// It is therefore NOT recommended to rely on this pricing method to price RTokens + /// in lending markets or anywhere where secondary market price is the central concern. /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate function tryPrice() external view virtual returns (uint192 low, uint192 high) { - (uint192 lowBUPrice, uint192 highBUPrice) = basketHandler.price(); // {UoA/BU} + (uint192 lowBUPrice, uint192 highBUPrice) = basketHandler.price(true); // {UoA/BU} require(lowBUPrice != 0 && highBUPrice != FIX_MAX, "invalid price"); assert(lowBUPrice <= highBUPrice); // not obviously true just by inspection @@ -67,8 +73,8 @@ contract RTokenAsset is IAsset, VersionedAsset, IRTokenOracle { if (supply == 0) return (lowBUPrice, highBUPrice); - // The RToken's price is not symmetric like other assets! - // range.bottom is lower because of the slippage from the shortfall + // The RToken's basket range is not symmetric! + // range.bottom is additionally lower because of the slippage from the shortfall BasketRange memory range = basketRange(); // {BU} // {UoA/tok} = {BU} * {UoA/BU} / {tok} @@ -88,7 +94,7 @@ contract RTokenAsset is IAsset, VersionedAsset, IRTokenOracle { } /// Should not revert - /// @dev See `tryPrice` caveat about possible compounding error in calculating price + /// @dev See `tryPrice` caveats /// @return {UoA/tok} The lower end of the price estimate /// @return {UoA/tok} The upper end of the price estimate function price() public view virtual returns (uint192, uint192) { diff --git a/contracts/plugins/assets/compoundv3/CTokenV3Collateral.sol b/contracts/plugins/assets/compoundv3/CTokenV3Collateral.sol index 416b5d5f36..42784057f5 100644 --- a/contracts/plugins/assets/compoundv3/CTokenV3Collateral.sol +++ b/contracts/plugins/assets/compoundv3/CTokenV3Collateral.sol @@ -84,6 +84,7 @@ contract CTokenV3Collateral is AppreciatingFiatCollateral { if (high != FIX_MAX) { savedLowPrice = low; savedHighPrice = high; + savedPegPrice = pegPrice; lastSave = uint48(block.timestamp); } else { // must be unpriced diff --git a/contracts/plugins/assets/curve/CurveAppreciatingRTokenFiatCollateral.sol b/contracts/plugins/assets/curve/CurveAppreciatingRTokenFiatCollateral.sol index e74f88aa4c..887371ee0c 100644 --- a/contracts/plugins/assets/curve/CurveAppreciatingRTokenFiatCollateral.sol +++ b/contracts/plugins/assets/curve/CurveAppreciatingRTokenFiatCollateral.sol @@ -71,7 +71,7 @@ contract CurveAppreciatingRTokenFiatCollateral is CurveStableCollateral { } // Check for soft default + save prices - try this.tryPrice() returns (uint192 low, uint192 high, uint192) { + try this.tryPrice() returns (uint192 low, uint192 high, uint192 pegPrice) { // {UoA/tok}, {UoA/tok}, {UoA/tok} // (0, 0) is a valid price; (0, FIX_MAX) is unpriced @@ -79,6 +79,7 @@ contract CurveAppreciatingRTokenFiatCollateral is CurveStableCollateral { if (high != FIX_MAX) { savedLowPrice = low; savedHighPrice = high; + savedPegPrice = pegPrice; lastSave = uint48(block.timestamp); } else { // must be unpriced diff --git a/contracts/plugins/assets/curve/CurveRecursiveCollateral.sol b/contracts/plugins/assets/curve/CurveRecursiveCollateral.sol index 966894f620..3e593e2c15 100644 --- a/contracts/plugins/assets/curve/CurveRecursiveCollateral.sol +++ b/contracts/plugins/assets/curve/CurveRecursiveCollateral.sol @@ -51,7 +51,7 @@ contract CurveRecursiveCollateral is CurveStableCollateral { /// Should NOT be manipulable by MEV /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate - /// @return {target/ref} Unused. Always 0 + /// @return pegPrice {target/ref} The actual price observed in the peg function tryPrice() external view @@ -60,7 +60,7 @@ contract CurveRecursiveCollateral is CurveStableCollateral { returns ( uint192 low, uint192 high, - uint192 + uint192 pegPrice ) { // This pricing method is MEV-resistant, but only gives a lower-bound @@ -70,6 +70,7 @@ contract CurveRecursiveCollateral is CurveStableCollateral { // Get reference token price (uint192 refLow, uint192 refHigh) = this.tokenPrice(0); // reference token + pegPrice = refLow.plus(refHigh).divu(2, FLOOR); // Multiply by the underlyingRefPerTok() uint192 rate = underlyingRefPerTok(); @@ -77,7 +78,6 @@ contract CurveRecursiveCollateral is CurveStableCollateral { high = refHigh.mul(rate, CEIL); assert(low <= high); // not obviously true by inspection - return (low, high, 0); } /// Should not revert @@ -123,7 +123,7 @@ contract CurveRecursiveCollateral is CurveStableCollateral { // === Check for soft default === // Check for soft default + save prices - try this.tryPrice() returns (uint192 low, uint192 high, uint192) { + try this.tryPrice() returns (uint192 low, uint192 high, uint192 pegPrice) { // {UoA/tok}, {UoA/tok}, {UoA/tok} // (0, 0) is a valid price; (0, FIX_MAX) is unpriced @@ -131,6 +131,7 @@ contract CurveRecursiveCollateral is CurveStableCollateral { if (high < FIX_MAX) { savedLowPrice = low; savedHighPrice = high; + savedPegPrice = pegPrice; lastSave = uint48(block.timestamp); } else { // must be unpriced diff --git a/contracts/plugins/assets/curve/CurveStableCollateral.sol b/contracts/plugins/assets/curve/CurveStableCollateral.sol index c757ba4fdf..2ba1ada96b 100644 --- a/contracts/plugins/assets/curve/CurveStableCollateral.sol +++ b/contracts/plugins/assets/curve/CurveStableCollateral.sol @@ -52,7 +52,7 @@ contract CurveStableCollateral is AppreciatingFiatCollateral, PoolTokens { /// @dev Override this when pricing is more complicated than just a single pool /// @return low {UoA/tok} The low price estimate /// @return high {UoA/tok} The high price estimate - /// @return {target/ref} Unused. Always 0 + /// @return pegPrice {target/ref} The actual price observed in the peg function tryPrice() external view @@ -61,7 +61,7 @@ contract CurveStableCollateral is AppreciatingFiatCollateral, PoolTokens { returns ( uint192 low, uint192 high, - uint192 + uint192 pegPrice ) { // Assumption: the pool is balanced @@ -95,7 +95,8 @@ contract CurveStableCollateral is AppreciatingFiatCollateral, PoolTokens { high = aumHigh.div(supply, CEIL); assert(low <= high); // not obviously true just by inspection - return (low, high, 0); + pegPrice = 0; // can't deduce from MEV-manipulable pricing unfortunately + // no issuance premium! more dangerous to be used inside RTokens as a result } /// Should not revert @@ -121,7 +122,7 @@ contract CurveStableCollateral is AppreciatingFiatCollateral, PoolTokens { } // Check for soft default + save prices - try this.tryPrice() returns (uint192 low, uint192 high, uint192) { + try this.tryPrice() returns (uint192 low, uint192 high, uint192 pegPrice) { // {UoA/tok}, {UoA/tok}, {UoA/tok} // (0, 0) is a valid price; (0, FIX_MAX) is unpriced @@ -129,6 +130,7 @@ contract CurveStableCollateral is AppreciatingFiatCollateral, PoolTokens { if (high != FIX_MAX) { savedLowPrice = low; savedHighPrice = high; + savedPegPrice = pegPrice; lastSave = uint48(block.timestamp); } else { // must be unpriced diff --git a/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol b/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol index 73ad6754f7..fa5d3b9a1d 100644 --- a/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol +++ b/contracts/plugins/assets/curve/CurveStableMetapoolCollateral.sol @@ -122,7 +122,8 @@ contract CurveStableMetapoolCollateral is CurveStableCollateral { high = aumHigh.div(supply, CEIL); assert(low <= high); // not obviously true just by inspection - return (low, high, 0); + pegPrice = 0; // can't deduce from MEV-manipulable pricing unfortunately + // no issuance premium! more dangerous to be used inside RTokens as a result } /// Can revert, used by `_anyDepeggedOutsidePool()` diff --git a/contracts/plugins/assets/curve/CurveStableRTokenMetapoolCollateral.sol b/contracts/plugins/assets/curve/CurveStableRTokenMetapoolCollateral.sol index 50300f0765..63c5024b52 100644 --- a/contracts/plugins/assets/curve/CurveStableRTokenMetapoolCollateral.sol +++ b/contracts/plugins/assets/curve/CurveStableRTokenMetapoolCollateral.sol @@ -73,7 +73,7 @@ contract CurveStableRTokenMetapoolCollateral is CurveStableMetapoolCollateral { } // Check for soft default + save prices - try this.tryPrice() returns (uint192 low, uint192 high, uint192) { + try this.tryPrice() returns (uint192 low, uint192 high, uint192 pegPrice) { // {UoA/tok}, {UoA/tok}, {UoA/tok} // (0, 0) is a valid price; (0, FIX_MAX) is unpriced @@ -81,6 +81,7 @@ contract CurveStableRTokenMetapoolCollateral is CurveStableMetapoolCollateral { if (high != FIX_MAX) { savedLowPrice = low; savedHighPrice = high; + savedPegPrice = pegPrice; lastSave = uint48(block.timestamp); } else { // must be unpriced diff --git a/contracts/plugins/mocks/BadCollateralPlugin.sol b/contracts/plugins/mocks/BadCollateralPlugin.sol index b6038eab2b..954484f888 100644 --- a/contracts/plugins/mocks/BadCollateralPlugin.sol +++ b/contracts/plugins/mocks/BadCollateralPlugin.sol @@ -55,6 +55,7 @@ contract BadCollateralPlugin is ATokenFiatCollateral { // Save prices savedLowPrice = low; savedHighPrice = high; + savedPegPrice = pegPrice; lastSave = uint48(block.timestamp); } diff --git a/contracts/plugins/mocks/FraxAggregator.sol b/contracts/plugins/mocks/FraxAggregator.sol index e3b867dd49..9bb33bc2d3 100644 --- a/contracts/plugins/mocks/FraxAggregator.sol +++ b/contracts/plugins/mocks/FraxAggregator.sol @@ -6,6 +6,15 @@ import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; interface FraxAggregatorV3Interface is AggregatorV3Interface { function priceSource() external view returns (address); + function getPrices() + external + view + returns ( + bool _isBadData, + uint256 _priceLow, + uint256 _priceHigh + ); + function addRoundData( bool _isBadData, uint104 _priceLow, diff --git a/contracts/plugins/mocks/InvalidRefPerTokCollateral.sol b/contracts/plugins/mocks/InvalidRefPerTokCollateral.sol index 7861f6aeff..8c41902248 100644 --- a/contracts/plugins/mocks/InvalidRefPerTokCollateral.sol +++ b/contracts/plugins/mocks/InvalidRefPerTokCollateral.sol @@ -33,7 +33,7 @@ contract InvalidRefPerTokCollateralMock is AppreciatingFiatCollateral { exposedReferencePrice = hiddenReferencePrice; // Check for soft default + save prices - try this.tryPrice() returns (uint192 low, uint192 high, uint192) { + try this.tryPrice() returns (uint192 low, uint192 high, uint192 pegPrice) { // {UoA/tok}, {UoA/tok}, {target/ref} // (0, 0) is a valid price; (0, FIX_MAX) is unpriced @@ -41,6 +41,7 @@ contract InvalidRefPerTokCollateralMock is AppreciatingFiatCollateral { if (high != FIX_MAX) { savedLowPrice = low; savedHighPrice = high; + savedPegPrice = pegPrice; lastSave = uint48(block.timestamp); } } catch (bytes memory errData) { diff --git a/contracts/plugins/mocks/RTokenCollateral.sol b/contracts/plugins/mocks/RTokenCollateral.sol index 0e5cca0eca..f10f01287a 100644 --- a/contracts/plugins/mocks/RTokenCollateral.sol +++ b/contracts/plugins/mocks/RTokenCollateral.sol @@ -34,6 +34,8 @@ contract RTokenCollateral is RTokenAsset, ICollateral { // targetName: The canonical name of this collateral's target unit. bytes32 public immutable targetName; + uint192 public savedPegPrice; // {target/ref} The peg price of the token during the last update + /// @param maxTradeVolume_ {UoA} The max trade volume, in UoA constructor( IRToken erc20_, diff --git a/docs/collateral.md b/docs/collateral.md index 41fa09f053..d72e63010c 100644 --- a/docs/collateral.md +++ b/docs/collateral.md @@ -42,18 +42,11 @@ interface IAsset is IRewardable { function refresh() external; /// Should not revert - /// low should be nonzero when the asset might be worth selling + /// low should be nonzero if the asset could be worth selling /// @return low {UoA/tok} The lower end of the price estimate /// @return high {UoA/tok} The upper end of the price estimate function price() external view returns (uint192 low, uint192 high); - /// Should not revert - /// lotLow should be nonzero when the asset might be worth selling - /// @dev Deprecated. Phased out in 3.1.0, but left on interface for backwards compatibility - /// @return lotLow {UoA/tok} The lower end of the lot price estimate - /// @return lotHigh {UoA/tok} The upper end of the lot price estimate - function lotPrice() external view returns (uint192 lotLow, uint192 lotHigh); - /// @return {tok} The balance of the ERC20 in whole tokens function bal(address account) external view returns (uint192); @@ -113,6 +106,9 @@ interface ICollateral is IAsset { /// @return {target/ref} Quantity of whole target units per whole reference unit in the peg function targetPerRef() external view returns (uint192); + + /// @return {target/ref} The peg price of the token during the last update + function savedPegPrice() external view returns (uint192); } ``` @@ -389,12 +385,6 @@ Should NOT return `(>0, FIX_MAX)`: if the high price is FIX_MAX then the low pri Should be gas-efficient. -### lotPrice() `{UoA/tok}` - -Deprecated. Phased out in 3.1.0, but left on interface for backwards compatibility. - -Recommend implement `lotPrice()` by calling `price()`. If you are inheriting from any of our existing collateral plugins, this is already done for you. See [Asset.sol](../contracts/plugins/Asset.sol) for the implementation. - ### refPerTok() `{ref/tok}` Should never revert. @@ -424,6 +414,14 @@ The target name is just a bytes32 serialization of the target unit string. Here For a collateral plugin that uses a novel target unit, get the targetName with `ethers.utils.formatBytes32String(unitName)`. +### savedPegPrice() `{target/ref}` + +A return value of 0 indicates _no_ issuance premium should be applied to this collateral during de-peg. Collateral that return 0 are more dangerous to be used inside RTokens as a result. + +Should never revert. + +Should be gas-efficient. + ## Practical Advice from Previous Work In most cases [Fiat Collateral](../contracts/plugins/assets/FiatCollateral.sol) or [AppreciatingFiatCollateral.sol](../contracts/plugins/assets/AppreciatingFiatCollateral.sol) can be extended, pretty easily, to support a new collateral type. This allows the collateral developer to limit their attention to the overriding of three functions: `tryPrice()`, `refPerTok()`, `targetPerRef()`. diff --git a/docs/deployment-variables.md b/docs/deployment-variables.md index eeef1d6c15..c1a66a799f 100644 --- a/docs/deployment-variables.md +++ b/docs/deployment-variables.md @@ -78,6 +78,24 @@ The warmup period is how many seconds should pass after the basket regained the Default value: `900` = 15 minutes Reasonable range: 0 to 604800 +### `reweightable` + +Dimension: `{bool}` + +A reweightable RToken can have its target amounts changed by governance via `forceSetPrimeBasket()`. In general RTokens should be non-reweightable, unless their usecase requires it. The work required to change the target amounts of a reweightable RToken responsibly is non-trivial, and should be done by a spell. + +Default value: `false` + +### `enableIssuancePremium` + +Dimension: `{bool}` + +An RToken with issuance premium enabled will increase issuance costs to compensate for any (partial) de-pegs observed in the underlying collateral. This protects RToken holders and RSR stakers from toxic issuance that may occur on the way to a default, or simply when a collateral reliably trades below its peg, such as frxETH. + +This also creates an additional revenue stream for the RToken that scales with issuance velocity. + +Default value: `true` + ### `batchAuctionLength` Dimension: `{seconds}` diff --git a/tasks/validation/utils/rtokens.ts b/tasks/validation/utils/rtokens.ts index 933eb46ade..1d0417e0d1 100644 --- a/tasks/validation/utils/rtokens.ts +++ b/tasks/validation/utils/rtokens.ts @@ -53,7 +53,11 @@ export const redeemRTokens = async ( await assetRegistry.refresh() const basketsNeeded = await rToken.basketsNeeded() const totalSupply = await rToken.totalSupply() - const redeemQuote = await basketHandler.quote(redeemAmount.mul(basketsNeeded).div(totalSupply), 0) + const redeemQuote = await basketHandler.quote( + redeemAmount.mul(basketsNeeded).div(totalSupply), + false, + 0 + ) const expectedTokens = redeemQuote.erc20s const expectedBalances: Balances = {} let log = '' diff --git a/test/Facade.test.ts b/test/Facade.test.ts index e04376a349..981a64911f 100644 --- a/test/Facade.test.ts +++ b/test/Facade.test.ts @@ -283,7 +283,7 @@ describe('Facade + FacadeMonitor contracts', () => { }) it('Should return maxIssuableByAmounts correctly', async () => { - const [erc20Addrs] = await basketHandler.quote(fp('1'), 0) + const [erc20Addrs] = await basketHandler.quote(fp('1'), false, 0) const erc20s = await Promise.all(erc20Addrs.map((a) => ethers.getContractAt('ERC20Mock', a))) const addr1Amounts = await Promise.all(erc20s.map((e) => e.balanceOf(addr1.address))) const addr2Amounts = await Promise.all(erc20s.map((e) => e.balanceOf(addr2.address))) diff --git a/test/Main.test.ts b/test/Main.test.ts index 0ae0ae4cdb..3d77877a26 100644 --- a/test/Main.test.ts +++ b/test/Main.test.ts @@ -89,6 +89,11 @@ const describeP1 = IMPLEMENTATION == Implementation.P1 ? describe : describe.ski const describeGas = IMPLEMENTATION == Implementation.P1 && useEnv('REPORT_GAS') ? describe.only : describe.skip +const oldBHInterface = [ + 'function quote(uint192,uint8) view returns (address[] erc20s,uint256[] quantities)', + 'function price() view returns (uint192 low,uint192 high)', +] + describe(`MainP${IMPLEMENTATION} contract`, () => { let owner: SignerWithAddress let addr1: SignerWithAddress @@ -380,7 +385,12 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { // Attempt to reinitialize - Basket Handler await expect( - basketHandler.init(main.address, config.warmupPeriod, config.reweightable) + basketHandler.init( + main.address, + config.warmupPeriod, + config.reweightable, + config.enableIssuancePremium + ) ).to.be.revertedWith('Initializable: contract is already initialized') // Attempt to reinitialize - Distributor @@ -963,6 +973,25 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { ).to.be.revertedWith('invalid warmupPeriod') }) + it('Should allow to update enableIssuancePremium if OWNER', async () => { + // Check existing value + expect(await basketHandler.enableIssuancePremium()).to.equal(true) + + // If not owner cannot update + await expect(basketHandler.connect(other).setIssuancePremiumEnabled(false)).to.be.reverted + + // Check value did not change + expect(await basketHandler.enableIssuancePremium()).to.equal(true) + + // Update with owner + await expect(basketHandler.connect(owner).setIssuancePremiumEnabled(false)) + .to.emit(basketHandler, 'EnableIssuancePremiumSet') + .withArgs(true, false) + + // Check value was updated + expect(await basketHandler.enableIssuancePremium()).to.equal(false) + }) + it('Should allow to update tradingDelay if OWNER and perform validations', async () => { const newValue: BigNumber = bn('360') @@ -1232,7 +1261,7 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { await basketHandler.setPrimeBasket(erc20s, targetAmts) await basketHandler.refreshBasket() expect(await basketHandler.status()).to.equal(CollateralStatus.SOUND) - const [quoteERC20s, tokAmts] = await basketHandler.quote(fp('1'), 0) + const [quoteERC20s, tokAmts] = await basketHandler.quote(fp('1'), false, 0) expect(quoteERC20s.length).to.equal(128) expect(tokAmts.length).to.equal(128) @@ -1708,16 +1737,18 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { const newBasketHandler = async (): Promise => { if (IMPLEMENTATION == Implementation.P0) { const BasketHandlerFactory = await ethers.getContractFactory('BasketHandlerP0') - return ((await BasketHandlerFactory.deploy()) as unknown) + const bh = await BasketHandlerFactory.deploy() + return await ethers.getContractAt('TestIBasketHandler', bh.address) } else if (IMPLEMENTATION == Implementation.P1) { const basketLib = await (await ethers.getContractFactory('BasketLibP1')).deploy() const BasketHandlerFactory = await ethers.getContractFactory('BasketHandlerP1', { libraries: { BasketLibP1: basketLib.address }, }) - return await upgrades.deployProxy(BasketHandlerFactory, [], { + const bh = await upgrades.deployProxy(BasketHandlerFactory, [], { kind: 'uups', unsafeAllow: ['external-library-linking'], // BasketLibP1 }) + return await ethers.getContractAt('TestIBasketHandler', bh.address) } else { throw new Error('PROTO_IMPL must be set to either `0` or `1`') } @@ -1725,7 +1756,7 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { beforeEach(async () => { indexBH = await newBasketHandler() - await indexBH.init(main.address, config.warmupPeriod, true) + await indexBH.init(main.address, config.warmupPeriod, true, config.enableIssuancePremium) eurToken = await (await ethers.getContractFactory('ERC20Mock')).deploy('EURO Token', 'EUR') const FiatCollateralFactory: ContractFactory = await ethers.getContractFactory( @@ -1762,10 +1793,10 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { it('Should not allow to set prime Basket with invalid length', async () => { await expect( basketHandler.connect(owner).setPrimeBasket([token0.address], []) - ).to.be.revertedWith('len mismatch') + ).to.be.revertedWith('invalid lengths') await expect( basketHandler.connect(owner).forceSetPrimeBasket([token0.address], []) - ).to.be.revertedWith('len mismatch') + ).to.be.revertedWith('invalid lengths') }) it('Should not allow to set prime Basket with non-collateral tokens', async () => { @@ -1830,10 +1861,10 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { it('Should not allow to set prime Basket with an empty basket', async () => { await expect(basketHandler.connect(owner).setPrimeBasket([], [])).to.be.revertedWith( - 'empty basket' + 'invalid lengths' ) await expect(basketHandler.connect(owner).forceSetPrimeBasket([], [])).to.be.revertedWith( - 'empty basket' + 'invalid lengths' ) }) @@ -1847,13 +1878,13 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { // for non-reweightable baskets, also try setting a zero amount as the *original* basket const newBH = await newBasketHandler() - await newBH.init(main.address, config.warmupPeriod, false) + await newBH.init(main.address, config.warmupPeriod, false, config.enableIssuancePremium) await expect(newBH.connect(owner).setPrimeBasket([token0.address], [0])).to.be.revertedWith( - 'invalid target amount; must be nonzero' + 'invalid target amount' ) await expect( newBH.connect(owner).forceSetPrimeBasket([token0.address], [0]) - ).to.be.revertedWith('invalid target amount; must be nonzero') + ).to.be.revertedWith('invalid target amount') }) it('Should be able to set exactly same basket', async () => { @@ -2046,6 +2077,22 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { ) ).to.be.revertedWith('new target weights') }) + + it('Should retain backwards-compatible quote() -- FLOOR', async () => { + const bh = new ethers.Contract(basketHandler.address, oldBHInterface, owner) + const quote = await basketHandler.quote(fp('1'), false, RoundingMode.FLOOR) + const quote2 = await bh.quote(fp('1'), RoundingMode.FLOOR) + expectEqualArrays(quote.erc20s, quote2.erc20s) + expectEqualArrays(quote.quantities, quote2.quantities) + }) + + it('Should retain backwards-compatible quote() -- CEIL', async () => { + const bh = new ethers.Contract(basketHandler.address, oldBHInterface, owner) + const quote = await basketHandler.quote(fp('1'), true, RoundingMode.CEIL) + const quote2 = await bh.quote(fp('1'), RoundingMode.CEIL) + expectEqualArrays(quote.erc20s, quote2.erc20s) + expectEqualArrays(quote.quantities, quote2.quantities) + }) }) context('Index BasketHandler', () => { @@ -2065,10 +2112,10 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { it('Should not allow to set prime Basket with invalid length', async () => { await expect( indexBH.connect(owner).setPrimeBasket([token0.address], []) - ).to.be.revertedWith('len mismatch') + ).to.be.revertedWith('invalid lengths') await expect( indexBH.connect(owner).forceSetPrimeBasket([token0.address], []) - ).to.be.revertedWith('len mismatch') + ).to.be.revertedWith('invalid lengths') }) it('Should not allow to set prime Basket with non-collateral tokens', async () => { @@ -2115,28 +2162,28 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { // not possible on non-fresh basketHandler await expect( indexBH.connect(owner).setPrimeBasket([token0.address], [MAX_TARGET_AMT.add(1)]) - ).to.be.revertedWith('invalid target amount; too large') + ).to.be.revertedWith('invalid target amount') await expect( indexBH.connect(owner).forceSetPrimeBasket([token0.address], [MAX_TARGET_AMT.add(1)]) - ).to.be.revertedWith('invalid target amount; too large') + ).to.be.revertedWith('invalid target amount') }) it('Should not allow to set prime Basket with an empty basket', async () => { await expect(indexBH.connect(owner).setPrimeBasket([], [])).to.be.revertedWith( - 'empty basket' + 'invalid lengths' ) await expect(indexBH.connect(owner).forceSetPrimeBasket([], [])).to.be.revertedWith( - 'empty basket' + 'invalid lengths' ) }) it('Should not allow to set prime Basket with a zero amount', async () => { await expect( indexBH.connect(owner).setPrimeBasket([token0.address], [0]) - ).to.be.revertedWith('invalid target amount; must be nonzero') + ).to.be.revertedWith('invalid target amount') await expect( indexBH.connect(owner).forceSetPrimeBasket([token0.address], [0]) - ).to.be.revertedWith('invalid target amount; must be nonzero') + ).to.be.revertedWith('invalid target amount') }) it('Should be able to set exactly same basket', async () => { @@ -2210,102 +2257,20 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { ).to.be.revertedWith('invalid collateral') }) - it('Should normalize by price for index RTokens', async () => { - // Throughout this test the $ value of the RToken should remain - - // Set initial basket - await indexBH.connect(owner).setPrimeBasket([token0.address], [fp('1')]) - await indexBH.connect(owner).refreshBasket() - let [erc20s, tokAmts] = await indexBH.quote(fp('1'), 0) - expect(erc20s.length).to.equal(1) - expect(tokAmts[0]).to.equal(fp('1')) - - // Add EURO into the basket as a pure addition, changing price to $0.80 in USD and $0.20 in EURO - await indexBH - .connect(owner) - .setPrimeBasket([token0.address, eurToken.address], [fp('1'), fp('0.25')]) - await indexBH.connect(owner).refreshBasket() - ;[erc20s, tokAmts] = await indexBH.quote(fp('1'), 0) - expect(erc20s.length).to.equal(2) - expect(erc20s[0]).to.equal(token0.address) - expect(erc20s[1]).to.equal(eurToken.address) - expect(tokAmts[0]).to.equal(fp('0.8')) - expect(tokAmts[1]).to.equal(fp('0.2')) - - // Remove USD from the basket entirely, changing price to $1 in EURO - await indexBH.connect(owner).setPrimeBasket([eurToken.address], [fp('1000')]) - await indexBH.connect(owner).refreshBasket() - ;[erc20s, tokAmts] = await indexBH.quote(fp('1'), 0) - expect(erc20s.length).to.equal(1) - expect(erc20s[0]).to.equal(eurToken.address) - expect(tokAmts[0]).to.equal(fp('1')) // still $1! - - // No change by simply resizing the basket - await indexBH.connect(owner).setPrimeBasket([eurToken.address], [fp('0.000001')]) - await indexBH.connect(owner).refreshBasket() - ;[erc20s, tokAmts] = await indexBH.quote(fp('1'), 0) - expect(erc20s.length).to.equal(1) - expect(erc20s[0]).to.equal(eurToken.address) - expect(tokAmts[0]).to.equal(fp('1')) // still $1! - - // Not refreshing the basket in between should still allow a consecutive setPrimeBasket - await indexBH.connect(owner).setPrimeBasket([token0.address], [fp('1')]) - ;[erc20s, tokAmts] = await indexBH.quote(fp('1'), 0) - expect(erc20s.length).to.equal(1) - expect(erc20s[0]).to.equal(eurToken.address) // not token0 yet - expect(tokAmts[0]).to.equal(fp('1')) - await indexBH - .connect(owner) - .setPrimeBasket([token0.address, eurToken.address], [fp('0.25'), fp('0.25')]) - await indexBH.connect(owner).refreshBasket() - - // $0.50 USD / $0.50 EURO by the end - ;[erc20s, tokAmts] = await indexBH.quote(fp('1'), 0) - expect(erc20s.length).to.equal(2) - expect(erc20s[0]).to.equal(token0.address) - expect(erc20s[1]).to.equal(eurToken.address) - expect(tokAmts[0]).to.equal(fp('0.5')) - expect(tokAmts[1]).to.equal(fp('0.5')) + it('Should retain backwards-compatible quote() -- FLOOR', async () => { + const bh = new ethers.Contract(indexBH.address, oldBHInterface, owner) + const quote = await indexBH.quote(fp('1'), false, RoundingMode.FLOOR) + const quote2 = await bh.quote(fp('1'), RoundingMode.FLOOR) + expectEqualArrays(quote.erc20s, quote2.erc20s) + expectEqualArrays(quote.quantities, quote2.quantities) }) - it('Should not normalize by price when the current basket is unpriced', async () => { - await indexBH.connect(owner).setPrimeBasket([token0.address], [fp('1')]) - await indexBH.connect(owner).refreshBasket() - - // Set Token0 to unpriced - stale oracle - await advanceTime(DECAY_DELAY.add(PRICE_TIMEOUT).toString()) - await expectUnpriced(collateral0.address) - - // Attempt to add EURO, basket is not SOUND - await expect( - indexBH - .connect(owner) - .setPrimeBasket([token0.address, eurToken.address], [fp('1'), fp('0.25')]) - ).to.be.revertedWith('unsound basket') - }) - - it('Should not normalize by price when the current basket is unsound', async () => { - await indexBH.connect(owner).setPrimeBasket([token0.address], [fp('1')]) - await indexBH.connect(owner).refreshBasket() - await setOraclePrice(collateral0.address, fp('0.5')) - await assetRegistry.refresh() - expect(await collateral0.status()).to.equal(CollateralStatus.IFFY) - expect(await collateral1.status()).to.equal(CollateralStatus.SOUND) - await expect( - indexBH.connect(owner).setPrimeBasket([token1.address], [fp('1')]) - ).to.be.revertedWith('unsound basket') - }) - - it('Should not normalize by price if the new collateral is unsound', async () => { - await indexBH.connect(owner).setPrimeBasket([token0.address], [fp('1')]) - await indexBH.connect(owner).refreshBasket() - await setOraclePrice(collateral1.address, fp('0.5')) - await assetRegistry.refresh() - expect(await collateral0.status()).to.equal(CollateralStatus.SOUND) - expect(await collateral1.status()).to.equal(CollateralStatus.IFFY) - await expect( - indexBH.connect(owner).setPrimeBasket([token1.address], [fp('1')]) - ).to.be.revertedWith('unsound new collateral') + it('Should retain backwards-compatible quote() -- CEIL', async () => { + const bh = new ethers.Contract(indexBH.address, oldBHInterface, owner) + const quote = await indexBH.quote(fp('1'), true, RoundingMode.CEIL) + const quote2 = await bh.quote(fp('1'), RoundingMode.CEIL) + expectEqualArrays(quote.erc20s, quote2.erc20s) + expectEqualArrays(quote.quantities, quote2.quantities) }) }) @@ -2370,7 +2335,7 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { const amount = fp('10000') await expect( indexBH.quoteCustomRedemption(basketNonces, portions, amount) - ).to.be.revertedWith('bad portions len') + ).to.be.revertedWith('invalid lengths') }) it('Should correctly quote the current basket, same as quote()', async () => { @@ -2380,7 +2345,7 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { const basketNonces = [1] const portions = [fp('1')] const amount = fp('10000') - const baseline = await indexBH.quote(amount, RoundingMode.FLOOR) + const baseline = await indexBH.quote(amount, false, RoundingMode.FLOOR) const quote = await indexBH.quoteCustomRedemption(basketNonces, portions, amount) expectEqualArrays(quote.erc20s, baseline.erc20s) expectEqualArrays(quote.quantities, baseline.quantities) @@ -2532,7 +2497,7 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { fp('0.1'), ] const amount = fp('10000') - const baseline = await indexBH.quote(amount, RoundingMode.FLOOR) + const baseline = await indexBH.quote(amount, false, RoundingMode.FLOOR) const quote = await indexBH.quoteCustomRedemption(basketNonces, portions, amount) expectEqualArrays(quote.erc20s, baseline.erc20s) expectEqualArrays(quote.quantities, baseline.quantities) @@ -2957,7 +2922,7 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { basketHandler .connect(owner) .setBackupConfig(ethers.utils.formatBytes32String('USD'), bn(1), erc20s) - ).to.not.be.revertedWith('erc20s too large') + ).to.not.be.revertedWith('too large') // Should fail at 65 erc20s.push(ONE_ADDRESS) @@ -2965,21 +2930,21 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { basketHandler .connect(owner) .setBackupConfig(ethers.utils.formatBytes32String('USD'), bn(1), erc20s) - ).to.be.revertedWith('erc20s too large') + ).to.be.revertedWith('too large') // Should succeed at 64 await expect( basketHandler .connect(owner) .setBackupConfig(ethers.utils.formatBytes32String('USD'), bn(64), []) - ).to.not.be.revertedWith('max too large') + ).to.not.be.revertedWith('too large') // Should fail at 65 await expect( basketHandler .connect(owner) .setBackupConfig(ethers.utils.formatBytes32String('USD'), bn(65), []) - ).to.be.revertedWith('max too large') + ).to.be.revertedWith('too large') }) it('Should allow to set backup Config if OWNER', async () => { @@ -3122,7 +3087,68 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { // expect(toks.length).to.equal(0) }) - it('Should include value of defaulted collateral when checking basket price', async () => { + it('Should include value of defaulted collateral when checking basket price -- /w premium', async () => { + // Check status and price + expect(await basketHandler.status()).to.equal(CollateralStatus.SOUND) + await expectPrice(basketHandler.address, fp('1'), ORACLE_ERROR, true) + + // Default one of the collaterals + // Set Token1 to default - 50% price reduction + await setOraclePrice(collateral1.address, bn('0.5e8')) + + // Mark default as probable + await collateral1.refresh() + + // Advance time post delayUntilDefault + await advanceTime((await collateral1.delayUntilDefault()).toString()) + + // Mark default as confirmed + await collateral1.refresh() + + // Check status and price again + expect(await basketHandler.status()).to.equal(CollateralStatus.DISABLED) + + // Check BU price -- 1/4 of the basket has lost half its value + const avgPrice = fp('0.875') + let [lowPrice, highPrice] = await basketHandler.price(true) + const expectedLow = avgPrice.sub(avgPrice.mul(ORACLE_ERROR).div(fp('1'))) + const expectedHigh = fp('1').add(fp('1').mul(ORACLE_ERROR).div(fp('1'))) // at-peg! + + const tolerance = avgPrice.div(bn('1e15')) + expect(lowPrice).to.be.closeTo(expectedLow, tolerance) + expect(lowPrice).to.be.gte(expectedLow) + expect(highPrice).to.be.closeTo(expectedHigh, tolerance) + expect(highPrice).to.be.lte(expectedHigh) + + // Set collateral1 price to [0, FIX_MAX] + await advanceTime(DECAY_DELAY.add(PRICE_TIMEOUT).toString()) + await setOraclePrice(collateral0.address, bn('1e8')) + await assetRegistry.refresh() + + // Check BU price -- 1/4 of the basket has lost all its value + ;[lowPrice, highPrice] = await basketHandler.price(true) + expect(lowPrice).to.be.closeTo(fp('0.75'), fp('0.75').div(100)) // within 1% + expect(highPrice).to.equal(MAX_UINT192) + + // Set basket config + await expect( + basketHandler + .connect(owner) + .setBackupConfig(ethers.utils.formatBytes32String('USD'), bn(1), [ + token0.address, + token2.address, + token3.address, + ]) + ).to.emit(basketHandler, 'BackupConfigSet') + + // After basket refresh, price should increase + await basketHandler.refreshBasket() + + // Check BU price + await expectPrice(basketHandler.address, fp('1'), ORACLE_ERROR, true) + }) + + it('Should include value of defaulted collateral when checking basket price -- w/o premium', async () => { // Check status and price expect(await basketHandler.status()).to.equal(CollateralStatus.SOUND) await expectPrice(basketHandler.address, fp('1'), ORACLE_ERROR, true) @@ -3152,8 +3178,7 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { await assetRegistry.refresh() // Check BU price -- 1/4 of the basket has lost all its value - const asset = await ethers.getContractAt('Asset', basketHandler.address) - const [lowPrice, highPrice] = await asset.price() + const [lowPrice, highPrice] = await basketHandler.price(false) expect(lowPrice).to.be.closeTo(fp('0.75'), fp('0.75').div(100)) // within 1% expect(highPrice).to.equal(MAX_UINT192) @@ -3208,7 +3233,7 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { await setOraclePrice(collateral1.address, bn('1e8')) // Check status and price again - const p = await basketHandler.price() + const p = await basketHandler.price(false) expect(p[0]).to.be.closeTo(fp('1').div(4), fp('1').div(4).div(100)) // within 1% expect(p[0]).to.be.lt(fp('1').div(4)) expect(p[1]).to.equal(MAX_UINT192) @@ -3275,7 +3300,7 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { const newPrice: BigNumber = MAX_UINT192.div(bn('1e10')) await setOraclePrice(collateral2.address, newPrice.sub(newPrice.div(100))) // oracle error - const [lowPrice, highPrice] = await indexBH.price() + const [lowPrice, highPrice] = await indexBH.price(false) expect(lowPrice).to.equal(MAX_UINT192) expect(highPrice).to.equal(MAX_UINT192) }) @@ -3288,7 +3313,7 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { const newPrice: BigNumber = MAX_UINT192.div(bn('1e10')) await setOraclePrice(collateral0.address, newPrice.sub(newPrice.div(100))) // oracle error - const [lowPrice, highPrice] = await indexBH.price() + const [lowPrice, highPrice] = await indexBH.price(false) expect(lowPrice).to.equal(MAX_UINT192) expect(highPrice).to.equal(MAX_UINT192) }) @@ -3538,15 +3563,6 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { await expectPrice(basketHandler.address, fp('0.75'), ORACLE_ERROR, true) }) - it('lotPrice (deprecated) is equal to price()', async () => { - const lotPrice = await basketHandler.lotPrice() - const price = await basketHandler.price() - expect(price.length).to.equal(2) - expect(lotPrice.length).to.equal(price.length) - expect(lotPrice[0]).to.equal(price[0]) - expect(lotPrice[1]).to.equal(price[1]) - }) - it('Should not put backup tokens with different targetName in the basket', async () => { // Swap out collateral for bad target name const CollFactory = await ethers.getContractFactory('FiatCollateral') @@ -3611,7 +3627,7 @@ describe(`MainP${IMPLEMENTATION} contract`, () => { expect(await basketHandler.status()).to.equal(CollateralStatus.IFFY) await basketHandler.connect(owner).refreshBasket() expect(await basketHandler.status()).to.equal(CollateralStatus.SOUND) - const [tokens] = await basketHandler.quote(fp('1'), 0) + const [tokens] = await basketHandler.quote(fp('1'), false, 0) expect(tokens.length).to.equal(3) expect(tokens[0]).to.not.equal(collateral1.address) expect(tokens[1]).to.not.equal(collateral1.address) diff --git a/test/RToken.test.ts b/test/RToken.test.ts index aadd8e62f1..6d5f2a54db 100644 --- a/test/RToken.test.ts +++ b/test/RToken.test.ts @@ -305,7 +305,7 @@ describe(`RTokenP${IMPLEMENTATION} contract`, () => { }) it('Should return a price of 0 if the assets become unregistered', async () => { - const startPrice = await basketHandler.price() + const startPrice = await basketHandler.price(false) expect(startPrice[0]).to.gt(0) expect(startPrice[1]).to.gt(0) @@ -314,7 +314,7 @@ describe(`RTokenP${IMPLEMENTATION} contract`, () => { await assetRegistry.connect(owner).unregister(basket[i].address) } - const endPrice = await basketHandler.price() + const endPrice = await basketHandler.price(false) expect(endPrice[0]).to.eq(0) expect(endPrice[1]).to.eq(0) diff --git a/test/Revenues.test.ts b/test/Revenues.test.ts index eca91f4979..0babf9da13 100644 --- a/test/Revenues.test.ts +++ b/test/Revenues.test.ts @@ -474,18 +474,9 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { await setOraclePrice(collateral0.address, bn('7e7')) await collateral0.refresh() await token0.connect(addr1).transfer(rTokenTrader.address, issueAmount) - const rtokenPrice = await basketHandler.price() - const realRtokenPrice = rtokenPrice.low.add(rtokenPrice.high).div(2) - const minBuyAmt = await toMinBuyAmt(issueAmount, fp('0.7'), realRtokenPrice) await expect(rTokenTrader.manageTokens([token0.address], [TradeKind.BATCH_AUCTION])) .to.emit(rTokenTrader, 'TradeStarted') - .withArgs( - anyValue, - token0.address, - rToken.address, - issueAmount, - withinTolerance(minBuyAmt) - ) + .withArgs(anyValue, token0.address, rToken.address, issueAmount, anyValue) }) it('Should forward revenue to traders', async () => { @@ -1016,7 +1007,7 @@ describe(`Revenues - P${IMPLEMENTATION}`, () => { // Trade should have extremely nonzero worst-case price const trade = await getTrade(rTokenTrader, token0.address) expect(await trade.initBal()).to.equal(issueAmount) - expect(await trade.worstCasePrice()).to.be.gte(fp('0.775').mul(bn('1e9'))) // D27 precision + expect(await trade.worstCasePrice()).to.be.gte(fp('0.485').mul(bn('1e9'))) // D27 precision }) it('Should claim COMP and handle revenue auction correctly - small amount processed in single auction', async () => { diff --git a/test/Upgradeability.test.ts b/test/Upgradeability.test.ts index d44697281f..8a610f7c4a 100644 --- a/test/Upgradeability.test.ts +++ b/test/Upgradeability.test.ts @@ -257,7 +257,7 @@ describeP1(`Upgradeability - P${IMPLEMENTATION}`, () => { it('Should deploy valid implementation - BasketHandler', async () => { const newBasketHandler: BasketHandlerP1 = await upgrades.deployProxy( BasketHandlerFactory, - [main.address, config.warmupPeriod, config.reweightable], + [main.address, config.warmupPeriod, config.reweightable, config.enableIssuancePremium], { initializer: 'init', kind: 'uups', diff --git a/test/fixtures.ts b/test/fixtures.ts index cf52748cba..d916eaa2fe 100644 --- a/test/fixtures.ts +++ b/test/fixtures.ts @@ -457,6 +457,7 @@ const makeDefaultFixture = async (setBasket: boolean): Promise = withdrawalLeak: fp('0'), // 0%; always refresh warmupPeriod: bn('60'), // (the delay _after_ SOUND was regained) reweightable: false, + enableIssuancePremium: true, tradingDelay: bn('0'), // (the delay _after_ default has been confirmed) batchAuctionLength: bn('900'), // 15 minutes dutchAuctionLength: bn('1800'), // 30 minutes diff --git a/test/integration/AssetPlugins.test.ts b/test/integration/AssetPlugins.test.ts index 91187af0ff..b35cf5f5e6 100644 --- a/test/integration/AssetPlugins.test.ts +++ b/test/integration/AssetPlugins.test.ts @@ -2425,11 +2425,16 @@ describeFork(`Asset Plugins - Integration - Mainnet Forking P${IMPLEMENTATION}`, await expect(rToken.connect(addr1).issue(issueAmount)).to.emit(rToken, 'Issuance') // Check Balances after - expect(await usdt.balanceOf(backingManager.address)).to.equal(toBNDecimals(issueAmount, 6)) //1 full unit + const usdtBal = toBNDecimals(issueAmount, 6) + expect(await usdt.balanceOf(backingManager.address)).to.be.gt(usdtBal) + expect(await usdt.balanceOf(backingManager.address)).to.be.closeTo(usdtBal, 1000) //1 full unit + // Balances for user - expect(await usdt.balanceOf(addr1.address)).to.equal( - toBNDecimals(initialBal.sub(issueAmount), 6) + const expected = toBNDecimals( + initialBal.sub(await usdt.balanceOf(backingManager.address)), + 6 ) + expect(await usdt.balanceOf(addr1.address)).to.be.closeTo(expected, point1Pct(expected)) // Check RTokens issued to user expect(await rToken.balanceOf(addr1.address)).to.equal(issueAmount) @@ -2449,11 +2454,11 @@ describeFork(`Asset Plugins - Integration - Mainnet Forking P${IMPLEMENTATION}`, expect(await rToken.balanceOf(addr1.address)).to.equal(0) expect(await rToken.totalSupply()).to.equal(0) - // Check balances after - Backing Manager is empty - expect(await usdt.balanceOf(backingManager.address)).to.equal(0) + // Check balances after - Backing Manager is basically empty + expect(await usdt.balanceOf(backingManager.address)).to.be.closeTo(0, 1000) // Check funds returned to user - expect(await usdt.balanceOf(addr1.address)).to.equal(toBNDecimals(initialBal, 6)) + expect(await usdt.balanceOf(addr1.address)).to.be.closeTo(toBNDecimals(initialBal, 6), 1000) // Check asset value left expect(await facadeTest.callStatic.totalAssetValue(rToken.address)).to.be.closeTo( diff --git a/test/integration/fixtures.ts b/test/integration/fixtures.ts index 97630e1ba6..49ff961a8d 100644 --- a/test/integration/fixtures.ts +++ b/test/integration/fixtures.ts @@ -644,6 +644,7 @@ const makeDefaultFixture = async (setBasket: boolean): Promise = withdrawalLeak: fp('0'), // 0%; always refresh warmupPeriod: bn('60'), // (the delay _after_ SOUND was regained) reweightable: false, + enableIssuancePremium: true, tradingDelay: bn('0'), // (the delay _after_ default has been confirmed) batchAuctionLength: bn('900'), // 15 minutes dutchAuctionLength: bn('1800'), // 30 minutes diff --git a/test/integration/fork-block-numbers.ts b/test/integration/fork-block-numbers.ts index bd346d05a5..70b563090c 100644 --- a/test/integration/fork-block-numbers.ts +++ b/test/integration/fork-block-numbers.ts @@ -8,6 +8,7 @@ const forkBlockNumber = { 'facade-monitor': 18742016, // Ethereum 'old-curve-plugins': 16915576, // Ethereum 'new-curve-plugins': 19626711, // Ethereum + 'mainnet-3.4.0': 20328530, // Ethereum // TODO add all the block numbers we fork from to benefit from caching default: 19742528, // Ethereum diff --git a/test/integration/mainnet-test/IssuancePremium.test.ts b/test/integration/mainnet-test/IssuancePremium.test.ts new file mode 100644 index 0000000000..7c014d2428 --- /dev/null +++ b/test/integration/mainnet-test/IssuancePremium.test.ts @@ -0,0 +1,402 @@ +import { expect } from 'chai' +import { BigNumber } from 'ethers' +import hre, { ethers } from 'hardhat' +import { evmRevert, evmSnapshot } from '../utils' +import { bn, fp } from '../../../common/numbers' +import { IMPLEMENTATION } from '../../fixtures' +import { getChainId } from '../../../common/blockchain-utils' +import { networkConfig } from '../../../common/configuration' +import forkBlockNumber from '../fork-block-numbers' +import { whileImpersonating } from '../../utils/impersonation' +import { + AssetRegistryP1, + EmaPriceOracleStableSwapMock, + LidoStakedEthCollateral, + RTokenAsset, + SFraxEthCollateral, + TestIBasketHandler, + RethCollateral, +} from '../../../typechain' +import { useEnv } from '#/utils/env' +import { combinedError } from '#/scripts/deployment/utils' + +const describeFork = useEnv('FORK') ? describe : describe.skip + +const ASSET_REGISTRY_ADDR = '0xf526f058858E4cD060cFDD775077999562b31bE0' // ETH+ asset registry +const BASKET_HANDLER_ADDR = '0x56f40A33e3a3fE2F1614bf82CBeb35987ac10194' // ETH+ basket handler +const BASKET_LIB_ADDR = '0xf383dC60D29A5B9ba461F40A0606870d80d1EA88' // BasketLibP1 +const RTOKEN_ASSET_ADDR = '0x3f11C47E7ed54b24D7EFC222FD406d8E1F49Fb69' // ETH+ RTokenAsset +const OWNER = '0x5d8A7DC9405F08F14541BA918c1Bf7eb2dACE556' // ETH+ timelock + +// run on mainnet only + +describeFork(`ETH+ Issuance Premium - Mainnet Forking P${IMPLEMENTATION}`, function () { + let assetRegistry: AssetRegistryP1 + let basketHandler: TestIBasketHandler + let rTokenAsset: RTokenAsset + let chainId: string + + let snap: string + + let oldRTokenPrice: BigNumber[] // <4.0.0 + let newRTokenPrice: BigNumber[] // >= <4.0.0 + let oldPrice: BigNumber[] // <4.0.0 + let newPriceF: BigNumber[] // >= 4.0.0 price(false) + let newPriceT: BigNumber[] // >= 4.0.0 price(true) + let oldQs: BigNumber[] // <4.0.0 quantities + let newQs: BigNumber[] // >= 4.0.0 quantities + + let sfrxETH: SFraxEthCollateral + let sfraxEmaOracle: EmaPriceOracleStableSwapMock + + // Setup test environment + const setup = async (blockNumber: number) => { + // Use Mainnet fork + await hre.network.provider.request({ + method: 'hardhat_reset', + params: [ + { + forking: { + jsonRpcUrl: useEnv('MAINNET_RPC_URL'), + blockNumber: blockNumber, + }, + }, + ], + }) + } + + before(async () => { + await setup(forkBlockNumber['mainnet-3.4.0']) + + chainId = await getChainId(hre) + if (!networkConfig[chainId]) { + throw new Error(`Missing network configuration for ${hre.network.name}`) + } + + assetRegistry = ( + await ethers.getContractAt('AssetRegistryP1', ASSET_REGISTRY_ADDR) + ) + basketHandler = ( + await ethers.getContractAt('TestIBasketHandler', BASKET_HANDLER_ADDR) + ) + rTokenAsset = await ethers.getContractAt('RTokenAsset', RTOKEN_ASSET_ADDR) + + const oldBasketHandler = await ethers.getContractAt('BasketHandlerP1', BASKET_HANDLER_ADDR) + oldRTokenPrice = await rTokenAsset.price() + oldPrice = await oldBasketHandler['price()']() + oldQs = (await oldBasketHandler['quote(uint192,uint8)'](fp('1'), 2)).quantities + + // frxETH/ETH EMA oracle + const currentEmaOracle = await ethers.getContractAt( + 'contracts/plugins/assets/frax-eth/SFraxEthCollateral.sol:IEmaPriceOracleStableSwap', + networkConfig[chainId].CURVE_POOL_WETH_FRXETH! + ) + const EmaPriceOracleStableSwapMockFactory = await ethers.getContractFactory( + 'EmaPriceOracleStableSwapMock' + ) + sfraxEmaOracle = ( + await EmaPriceOracleStableSwapMockFactory.deploy(await currentEmaOracle.price_oracle()) + ) + + // === Upgrade to 4.0.0 (minimally)=== + + // RTokenAsset + const RTokenAssetFactory = await ethers.getContractFactory('RTokenAsset') + rTokenAsset = await RTokenAssetFactory.deploy( + await rTokenAsset.erc20(), + await rTokenAsset.maxTradeVolume() + ) + + // BasketHandler + const BasketHandlerFactory = await ethers.getContractFactory('BasketHandlerP1', { + libraries: { + BasketLibP1: BASKET_LIB_ADDR, + }, + }) + const newBasketHandlerImpl = await BasketHandlerFactory.deploy() + + // SFraxEthCollateral + const SFraxEthCollateralFactory = await hre.ethers.getContractFactory('SFraxEthCollateral') + let oracleError = combinedError(fp('0.005'), fp('0.0002')) // 0.5% & 0.02% + const newSfrxETH = await SFraxEthCollateralFactory.deploy( + { + priceTimeout: '604800', + chainlinkFeed: networkConfig[chainId].chainlinkFeeds.ETH!, + oracleError: oracleError.toString(), + erc20: networkConfig[chainId].tokens.sfrxETH!, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: '3600', // 1 hr + targetName: hre.ethers.utils.formatBytes32String('ETH'), + defaultThreshold: fp('0.02').add(oracleError).toString(), // ~2.5% + delayUntilDefault: bn('86400').toString(), // 24h + }, + fp('1e-4').toString(), // revenueHiding = 0.01% + sfraxEmaOracle.address + ) + sfrxETH = newSfrxETH + await sfrxETH.refresh() + + // LidoStakedEthCollateral + const WSTETHCollateralFactory = await hre.ethers.getContractFactory('LidoStakedEthCollateral') + const newWstETH = await WSTETHCollateralFactory.deploy( + { + priceTimeout: '604800', + chainlinkFeed: networkConfig[chainId].chainlinkFeeds.stETHUSD!, + oracleError: fp('0.01').toString(), // 1%: only for stETHUSD feed + erc20: networkConfig[chainId].tokens.wstETH!, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: '3600', // 1 hr, + targetName: hre.ethers.utils.formatBytes32String('ETH'), + defaultThreshold: fp('0.025').toString(), // 2.5% = 2% + 0.5% stethEth feed oracleError + delayUntilDefault: bn('86400').toString(), // 24h + }, + fp('1e-4').toString(), // revenueHiding = 0.01% + networkConfig[chainId].chainlinkFeeds.stETHETH!, // targetPerRefChainlinkFeed + '86400' // targetPerRefChainlinkTimeout + ) + await newWstETH.refresh() + + // RethCollateral + const RethCollateralFactory = await hre.ethers.getContractFactory('RethCollateral') + oracleError = combinedError(fp('0.005'), fp('0.02')) // 0.5% & 2% + const newRETH = await RethCollateralFactory.deploy( + { + priceTimeout: '604800', + chainlinkFeed: networkConfig[chainId].chainlinkFeeds.ETH!, + oracleError: oracleError.toString(), // 1%: only for rETH feed + erc20: networkConfig[chainId].tokens.rETH!, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: '3600', // 1 hr, + targetName: hre.ethers.utils.formatBytes32String('ETH'), + defaultThreshold: fp('0.02').add(oracleError).toString(), // ~4.5% + delayUntilDefault: bn('86400').toString(), // 24h + }, + fp('1e-4').toString(), // revenueHiding = 0.01% + networkConfig[chainId].chainlinkFeeds.rETH!, + '86400' // refPerTokChainlinkTimeout + ) + await newRETH.refresh() + + // Putting it all together... + await whileImpersonating(OWNER, async (timelockSigner) => { + const bh = await ethers.getContractAt('BasketHandlerP1', BASKET_HANDLER_ADDR) + await bh.connect(timelockSigner).upgradeTo(newBasketHandlerImpl.address) + await assetRegistry.connect(timelockSigner).swapRegistered(newSfrxETH.address) + await assetRegistry.connect(timelockSigner).swapRegistered(newWstETH.address) + await assetRegistry.connect(timelockSigner).swapRegistered(newRETH.address) + await assetRegistry.connect(timelockSigner).swapRegistered(rTokenAsset.address) + await basketHandler.connect(timelockSigner).setIssuancePremiumEnabled(true) + }) + await basketHandler.refreshBasket() + expect(await basketHandler.status()).to.equal(0) + expect(await basketHandler.fullyCollateralized()).to.equal(true) + + newRTokenPrice = await rTokenAsset.price() + newPriceF = await basketHandler.price(false) + newPriceT = await basketHandler.price(true) + newQs = (await basketHandler.quote(fp('1'), true, 2)).quantities + + snap = await evmSnapshot() // what are testing frameworks for if not this in all its glory + }) + + beforeEach(async () => { + await evmRevert(snap) + snap = await evmSnapshot() + }) + + after(async () => { + await evmRevert(snap) + }) + + it('from 3.4.0 to 4.0.0', async () => { + // this test case compares the state before the 4.0.0 upgrade to the state after the 4.0.0 upgrade + // USD issuance costs rise ~0.04% due to sfrxETH's ~0.12% premium, as given by basketHandler.price(true) + + // rTokenAsset.price() + const lowRTokenPriceChange = newRTokenPrice[0] + .sub(oldRTokenPrice[0]) + .mul(fp('1')) + .div(oldRTokenPrice[0]) + const highRTokenPriceChange = newRTokenPrice[1] + .sub(oldRTokenPrice[1]) + .mul(fp('1')) + .div(oldRTokenPrice[1]) + expect(lowRTokenPriceChange).to.be.closeTo(fp('0'), fp('1e-4')) // low RToken price no change + expect(highRTokenPriceChange).to.be.closeTo(fp('0.0004'), fp('1e-4')) // high RToken price +0.04% + + // basketHandler.price(false) + const lowPriceChangeF = newPriceF[0].sub(oldPrice[0]).mul(fp('1')).div(oldPrice[0]) + const highPriceChangeF = newPriceF[1].sub(oldPrice[1]).mul(fp('1')).div(oldPrice[1]) + expect(lowPriceChangeF).to.be.closeTo(fp('0'), fp('1e-4')) // low price no change + expect(highPriceChangeF).to.be.closeTo(fp('0'), fp('1e-4')) // high price no change + + // basketHandler.price(true) + const lowPriceChangeT = newPriceT[0].sub(oldPrice[0]).mul(fp('1')).div(oldPrice[0]) + const highPriceChangeT = newPriceT[1].sub(oldPrice[1]).mul(fp('1')).div(oldPrice[1]) + expect(lowPriceChangeT).to.be.closeTo(fp('0'), fp('1e-4')) // low price no change + expect(highPriceChangeT).to.be.closeTo(fp('0.0004'), fp('1e-4')) // high price +0.04% + + // basketHandler.quote() + const sfrxETHChange = newQs[0].sub(oldQs[0]).mul(fp('1')).div(oldQs[0]) + const wstETHChange = newQs[1].sub(oldQs[1]).mul(fp('1')).div(oldQs[1]) + const rETHChange = newQs[2].sub(oldQs[2]).mul(fp('1')).div(oldQs[2]) + expect(sfrxETHChange).to.be.closeTo(fp('0.0012'), fp('1e-4')) // sFraxETH +0.12% + expect(wstETHChange).to.be.closeTo(fp('0.0001'), fp('1e-4')) // wstETH +0.01% + expect(rETHChange).to.be.equal(0) // rETH no change + }) + + it('from 4.0.0 to 4.0.0 at-peg', async () => { + // this test case compares the state after the 4.0.0 upgrade to the state when frxETH is at peg + // as given by basketHandler.price(true), USD issuance costs do not change since the premium compensates completely + + await sfraxEmaOracle.setPrice(fp('1')) + + const parRTokenPrice = await rTokenAsset.price() + const parPriceF = await basketHandler.price(false) + const parPriceT = await basketHandler.price(true) + const parQs = (await basketHandler.quote(fp('1'), true, 2)).quantities + + // rTokenAsset.price() + const lowRTokenPriceChange = parRTokenPrice[0] + .sub(newRTokenPrice[0]) + .mul(fp('1')) + .div(newRTokenPrice[0]) + const highRTokenPriceChange = parRTokenPrice[1] + .sub(newRTokenPrice[1]) + .mul(fp('1')) + .div(newRTokenPrice[1]) + expect(lowRTokenPriceChange).to.be.closeTo(fp('0.0004'), fp('1e-4')) // low price +0.04% + expect(highRTokenPriceChange).to.be.closeTo(fp('0'), fp('1e-4')) // high price no change + + // basketHandler.price(false) + const lowPriceChangeF = parPriceF[0].sub(newPriceF[0]).mul(fp('1')).div(newPriceF[0]) + const highPriceChangeF = parPriceF[1].sub(newPriceF[1]).mul(fp('1')).div(newPriceF[1]) + expect(lowPriceChangeF).to.be.closeTo(fp('0.0004'), fp('1e-4')) // low price +0.04% + expect(highPriceChangeF).to.be.closeTo(fp('0.0004'), fp('1e-4')) // high price +0.04%% + + // basketHandler.price(true) + const lowPriceChangeT = parPriceT[0].sub(newPriceT[0]).mul(fp('1')).div(newPriceT[0]) + const highPriceChangeT = parPriceT[1].sub(newPriceT[1]).mul(fp('1')).div(newPriceT[1]) + expect(lowPriceChangeT).to.be.closeTo(fp('0.0004'), fp('1e-4')) // low price +0.04% + expect(highPriceChangeT).to.be.closeTo(fp('0'), fp('1e-4')) // high price no change + + // basketHandler.quote() + const sfrxETHChange = parQs[0].sub(newQs[0]).mul(fp('1')).div(newQs[0]) + const wstETHChange = parQs[1].sub(newQs[1]).mul(fp('1')).div(newQs[1]) + const rETHChange = parQs[2].sub(newQs[2]).mul(fp('1')).div(newQs[2]) + expect(sfrxETHChange).to.be.closeTo(fp('-0.0012'), fp('1e-4')) // sFraxETH -0.12%% + expect(wstETHChange).to.be.closeTo(fp('-0.0001'), fp('1e-4')) // wstETH -0.01% + expect(rETHChange).to.be.equal(0) // rETH no change + }) + + it('from 4.0.0 at-peg to 2% below peg', async () => { + // this test case compares the state from at-peg to the state after a 2% de-peg of frxETH + // which is well within the default threshold. + // as given by basketHandler.price(true), USD issuance costs do not change since the premium compensates completely + + await sfraxEmaOracle.setPrice(fp('1')) + + const parRTokenPrice = await rTokenAsset.price() + const parPriceF = await basketHandler.price(false) + const parPriceT = await basketHandler.price(true) + const parQs = (await basketHandler.quote(fp('1'), true, 2)).quantities + + // de-peg by 2% + + await sfraxEmaOracle.setPrice(fp('0.98')) + const depeggedRTokenPrice = await rTokenAsset.price() + await sfrxETH.refresh() + expect(await sfrxETH.savedPegPrice()).to.equal(fp('0.98')) + + const depeggedPriceF = await basketHandler.price(false) + const depeggedPriceT = await basketHandler.price(true) + const depeggedQs = (await basketHandler.quote(fp('1'), true, 2)).quantities + + // rTokenAsset.price() + const lowRTokenPriceChange = depeggedRTokenPrice[0] + .sub(parRTokenPrice[0]) + .mul(fp('1')) + .div(parRTokenPrice[0]) + const highRTokenPriceChange = depeggedRTokenPrice[1] + .sub(parRTokenPrice[1]) + .mul(fp('1')) + .div(parRTokenPrice[1]) + expect(lowRTokenPriceChange).to.be.closeTo(fp('-0.0067'), fp('1e-4')) // low RToken price -0.67% + expect(highRTokenPriceChange).be.closeTo(fp('-0.0065'), fp('1e-4')) // high RToken -0.66% + + // basketHandler.price(false) + const lowPriceChangeF = depeggedPriceF[0].sub(parPriceF[0]).mul(fp('1')).div(parPriceF[0]) + const highPriceChangeF = depeggedPriceF[1].sub(parPriceF[1]).mul(fp('1')).div(parPriceF[1]) + expect(lowPriceChangeF).to.be.closeTo(fp('-0.0067'), fp('1e-4')) // low price -0.67% + expect(highPriceChangeF).be.closeTo(fp('-0.0065'), fp('1e-4')) // high price -0.66% + + // basketHandler.price(true) + const lowPriceChangeT = depeggedPriceT[0].sub(parPriceT[0]).mul(fp('1')).div(parPriceT[0]) + const highPriceChangeT = depeggedPriceT[1].sub(parPriceT[1]).mul(fp('1')).div(parPriceT[1]) + expect(lowPriceChangeT).to.be.closeTo(fp('-0.0067'), fp('1e-4')) // low price -0.67% + expect(highPriceChangeT).be.closeTo(0, fp('1e-4')) // high price no change + + // basketHandler.quote() + const sfrxETHChange = depeggedQs[0].sub(parQs[0]).mul(fp('1')).div(parQs[0]) + const wstETHChange = depeggedQs[1].sub(parQs[1]).mul(fp('1')).div(parQs[1]) + const rETHChange = depeggedQs[2].sub(parQs[2]).mul(fp('1')).div(parQs[2]) + expect(sfrxETHChange).to.be.closeTo(fp('0.0204'), fp('1e-4')) // sFraxETH +2.04 + expect(wstETHChange).to.be.closeTo(0, fp('1e-4')) // wstETH no change + expect(rETHChange).to.be.equal(0) // rETH no change + }) + + it('from 4.0.0 at-peg to 50% below peg', async () => { + // this test case compares the state from at-peg to the state after a 50% de-peg of frxETH + // as given by basketHandler.price(true), USD issuance costs do not change since the premium compensates completely + + await sfraxEmaOracle.setPrice(fp('1')) + + const parRTokenPrice = await rTokenAsset.price() + const parPriceF = await basketHandler.price(false) + const parPriceT = await basketHandler.price(true) + const parQs = (await basketHandler.quote(fp('1'), true, 2)).quantities + + // de-peg by 50% + + await sfraxEmaOracle.setPrice(fp('0.5')) + const depeggedRTokenPrice = await rTokenAsset.price() + await sfrxETH.refresh() + expect(await sfrxETH.savedPegPrice()).to.equal(fp('0.5')) + + const depeggedPriceF = await basketHandler.price(false) + const depeggedPriceT = await basketHandler.price(true) + const depeggedQs = (await basketHandler.quote(fp('1'), true, 2)).quantities + + // rTokenAsset.price() + const lowRTokenPriceChange = depeggedRTokenPrice[0] + .sub(parRTokenPrice[0]) + .mul(fp('1')) + .div(parRTokenPrice[0]) + const highRTokenPriceChange = depeggedRTokenPrice[1] + .sub(parRTokenPrice[1]) + .mul(fp('1')) + .div(parRTokenPrice[1]) + expect(lowRTokenPriceChange).to.be.closeTo(fp('-0.1676'), fp('1e-4')) // low RToken price -16.76% + expect(highRTokenPriceChange).to.be.closeTo(fp('-0.1649'), fp('1e-4')) // high RToken price -16.49% + + // basketHandler.price(false) + const lowPriceChangeF = depeggedPriceF[0].sub(parPriceF[0]).mul(fp('1')).div(parPriceF[0]) + const highPriceChangeF = depeggedPriceF[1].sub(parPriceF[1]).mul(fp('1')).div(parPriceF[1]) + expect(lowPriceChangeF).to.be.closeTo(fp('-0.1676'), fp('1e-4')) // low price -16.76% + expect(highPriceChangeF).be.closeTo(fp('-0.1649'), fp('1e-4')) // high price -16.49% + + // basketHandler.price(true) + const lowPriceChangeT = depeggedPriceT[0].sub(parPriceT[0]).mul(fp('1')).div(parPriceT[0]) + const highPriceChangeT = depeggedPriceT[1].sub(parPriceT[1]).mul(fp('1')).div(parPriceT[1]) + expect(lowPriceChangeT).to.be.closeTo(fp('-0.1676'), fp('1e-4')) // low price -16.76% + expect(highPriceChangeT).be.closeTo(0, fp('1e-4')) // high price no change + + // basketHandler.quote() + const sfrxETHChange = depeggedQs[0].sub(parQs[0]).mul(fp('1')).div(parQs[0]) + const wstETHChange = depeggedQs[1].sub(parQs[1]).mul(fp('1')).div(parQs[1]) + const rETHChange = depeggedQs[2].sub(parQs[2]).mul(fp('1')).div(parQs[2]) + expect(sfrxETHChange).to.be.closeTo(fp('1'), fp('1e-4')) // sFraxETH +100% + expect(wstETHChange).to.be.closeTo(0, fp('1e-4')) // wstETH no change + expect(rETHChange).to.be.equal(0) // rETH no change + }) +}) diff --git a/test/plugins/Collateral.test.ts b/test/plugins/Collateral.test.ts index b07978fb52..833cc4e225 100644 --- a/test/plugins/Collateral.test.ts +++ b/test/plugins/Collateral.test.ts @@ -28,6 +28,7 @@ import { TestIBackingManager, TestIRToken, UnpricedAppreciatingFiatCollateralMock, + UnpricedFiatCollateralMock, USDCMock, WETH9, } from '../../typechain' diff --git a/test/scenario/NestedRTokens.test.ts b/test/scenario/NestedRTokens.test.ts index eff96b200d..446aca601d 100644 --- a/test/scenario/NestedRTokens.test.ts +++ b/test/scenario/NestedRTokens.test.ts @@ -374,19 +374,29 @@ describe(`Nested RTokens - P${IMPLEMENTATION}`, () => { { contract: one.rToken, name: 'Transfer', - args: [ZERO_ADDRESS, one.backingManager.address, issueAmt.div(2).sub(75)], + args: [ + ZERO_ADDRESS, + one.backingManager.address, + withinTolerance(issueAmt.div(2).sub(75)), + ], emitted: true, }, { contract: one.rToken, name: 'Transfer', - args: [one.rTokenTrader.address, one.furnace.address, rTokSellAmt], + args: [one.rTokenTrader.address, one.furnace.address, withinTolerance(rTokSellAmt)], emitted: true, }, { contract: one.rsrTrader, name: 'TradeStarted', - args: [anyValue, one.rToken.address, one.rsr.address, rsrSellAmt, rsrMinBuyAmt], + args: [ + anyValue, + one.rToken.address, + one.rsr.address, + withinTolerance(rsrSellAmt), + withinTolerance(rsrMinBuyAmt), + ], emitted: true, }, ]) diff --git a/test/scenario/RevenueHiding.test.ts b/test/scenario/RevenueHiding.test.ts index fe079bd4f4..fb04851245 100644 --- a/test/scenario/RevenueHiding.test.ts +++ b/test/scenario/RevenueHiding.test.ts @@ -229,7 +229,7 @@ describe(`RevenueHiding basket collateral (/w CTokenFiatCollateral) - P${IMPLEME expect(high).to.equal(mid.add(mid.mul(ORACLE_ERROR).div(fp('1')))) // BasketHandler BU price - should overprice at the high end - const [lowBaskets, highBaskets] = await basketHandler.price() + const [lowBaskets, highBaskets] = await basketHandler.price(false) mid = fp('2') // because DAI collateral const delta = mid.mul(ORACLE_ERROR).div(fp('1')) @@ -241,7 +241,7 @@ describe(`RevenueHiding basket collateral (/w CTokenFiatCollateral) - P${IMPLEME expect(highBaskets).to.be.closeTo(mid.add(delta), mid.add(delta).div(bn('1e6'))) // Same goes for RToken price - const [lowRToken, highRToken] = await basketHandler.price() + const [lowRToken, highRToken] = await basketHandler.price(false) expect(lowRToken).to.be.gt(mid.sub(delta)) expect(lowRToken).to.be.closeTo(mid.sub(delta), mid.sub(delta).div(bn('1e6'))) expect(highRToken).to.be.gt(mid.add(delta)) // should be above expected diff --git a/test/scenario/cETH.test.ts b/test/scenario/cETH.test.ts index 590623d245..7c862d7b1b 100644 --- a/test/scenario/cETH.test.ts +++ b/test/scenario/cETH.test.ts @@ -325,7 +325,7 @@ describe(`CToken of self-referential collateral (eg cETH) - P${IMPLEMENTATION}`, await advanceTime(Number(config.warmupPeriod) + 1) // Should swap WETH in for cETH - const [tokens] = await basketHandler.quote(fp('1'), 2) + const [tokens] = await basketHandler.quote(fp('1'), true, 2) expect(tokens[0]).to.equal(token0.address) expect(tokens[1]).to.equal(weth.address) diff --git a/test/scenario/cWBTC.test.ts b/test/scenario/cWBTC.test.ts index df5478210c..963d909e0e 100644 --- a/test/scenario/cWBTC.test.ts +++ b/test/scenario/cWBTC.test.ts @@ -350,7 +350,7 @@ describe(`CToken of non-fiat collateral (eg cWBTC) - P${IMPLEMENTATION}`, () => await advanceTime(Number(config.warmupPeriod) + 1) // Should swap WBTC in for cWBTC - const [tokens] = await basketHandler.quote(fp('1'), 2) + const [tokens] = await basketHandler.quote(fp('1'), false, 2) expect(tokens[0]).to.equal(token0.address) expect(tokens[1]).to.equal(wbtc.address) diff --git a/test/utils/oracles.ts b/test/utils/oracles.ts index 6dde6dec02..6498315c3d 100644 --- a/test/utils/oracles.ts +++ b/test/utils/oracles.ts @@ -26,8 +26,14 @@ export const expectPrice = async ( near: boolean, overrideToleranceDiv?: BigNumber ) => { - const asset = await ethers.getContractAt('Asset', assetAddr) - const [lowPrice, highPrice] = await asset.price() + let lowPrice, highPrice + try { + const bh = await ethers.getContractAt('IBasketHandler', assetAddr) + ;[lowPrice, highPrice] = await bh.price(false) // without issuance premium + } catch { + const asset = await ethers.getContractAt('Asset', assetAddr) + ;[lowPrice, highPrice] = await asset.price() + } const delta = avgPrice.mul(oracleError).div(fp('1')) const expectedLow = avgPrice.sub(delta) const expectedHigh = avgPrice.add(delta) @@ -106,8 +112,14 @@ export const expectDecayedPrice = async (assetAddr: string) => { // Expects an unpriced asset with low = 0 and high = FIX_MAX export const expectUnpriced = async (assetAddr: string) => { - const asset = await ethers.getContractAt('Asset', assetAddr) - const [lowPrice, highPrice] = await asset.price() + let lowPrice, highPrice + try { + const asset = await ethers.getContractAt('Asset', assetAddr) + ;[lowPrice, highPrice] = await asset.price() + } catch (e) { + const bh = await ethers.getContractAt('IBasketHandler', assetAddr) + ;[lowPrice, highPrice] = await bh.price(false) // without issuance premium + } expect(lowPrice).to.equal(0) expect(highPrice).to.equal(MAX_UINT192) } From 1c961c93c0452e770d124559e9a4cdcb7e9e0c6d Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Fri, 26 Jul 2024 12:00:06 -0700 Subject: [PATCH 45/72] upload 4.0.0 audit --- audits/Reserve_PR_4_0_0_v1.pdf | Bin 0 -> 547401 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 audits/Reserve_PR_4_0_0_v1.pdf diff --git a/audits/Reserve_PR_4_0_0_v1.pdf b/audits/Reserve_PR_4_0_0_v1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c22c9db747097d9eb60374bbf1b2670fe19420e8 GIT binary patch literal 547401 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�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

{~k21rovqL^_(J!Y{6Yp79o# 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

--nz9tn%J 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 p4sjD={rHC)Fe@{VG Date: Mon, 29 Jul 2024 18:19:30 -0400 Subject: [PATCH 46/72] Registry tests (#1176) --- .github/workflows/tests.yml | 14 +++++++++ contracts/mocks/DeployerMock.sol | 4 +++ package.json | 1 + test/registries/AssetPluginRegistry.test.ts | 22 +++++++++---- test/registries/DAOFeeRegistry.test.ts | 34 +++++++++++---------- test/registries/VersionRegistry.test.ts | 22 ++++++++----- 6 files changed, 68 insertions(+), 29 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1b74a763d6..def1110b17 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -314,3 +314,17 @@ jobs: FORK_NETWORK: mainnet FORK: 1 PROTO_IMPL: 1 + + registry-tests: + name: 'Registry Tests' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16.x + cache: 'yarn' + - run: yarn install --immutable + - run: yarn test:registries + env: + NODE_OPTIONS: '--max-old-space-size=32768' diff --git a/contracts/mocks/DeployerMock.sol b/contracts/mocks/DeployerMock.sol index e8beb8b07c..d6e57d03d9 100644 --- a/contracts/mocks/DeployerMock.sol +++ b/contracts/mocks/DeployerMock.sol @@ -16,6 +16,10 @@ contract DeployerMock is Versioned { function implementations() external view returns (Implementations memory) { return _implementations; } + + function version() public pure virtual override returns (string memory) { + return "V1"; // make different from '4.0.0' on purpose + } } contract DeployerMockV2 is DeployerMock { diff --git a/package.json b/package.json index 9442079bf1..976ba27d97 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "test:fast": "bash tools/fast-test.sh", "test:p0": "PROTO_IMPL=0 hardhat test test/*.test.ts", "test:p1": "PROTO_IMPL=1 hardhat test test/*.test.ts ", + "test:registries": "PROTO_IMPL=1 hardhat test test/registries/*.test.ts", "test:plugins": "hardhat test test/{libraries,plugins}/*.test.ts", "test:plugins:integration": "PROTO_IMPL=1 FORK=1 hardhat test test/plugins/individual-collateral/**/*.test.ts", "test:integration": "PROTO_IMPL=1 FORK=1 hardhat test test/integration/**/*.test.ts", diff --git a/test/registries/AssetPluginRegistry.test.ts b/test/registries/AssetPluginRegistry.test.ts index 0c727afb9e..2b3287c550 100644 --- a/test/registries/AssetPluginRegistry.test.ts +++ b/test/registries/AssetPluginRegistry.test.ts @@ -4,7 +4,13 @@ import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' import { expect } from 'chai' import { ZERO_ADDRESS } from '#/common/constants' import { Collateral, Implementation, IMPLEMENTATION, defaultFixture } from '../fixtures' -import { AssetPluginRegistry, TestIDeployer, VersionRegistry, DeployerMock } from '../../typechain' +import { + AssetPluginRegistry, + RoleRegistry, + TestIDeployer, + VersionRegistry, + DeployerMock, +} from '../../typechain' const describeP1 = IMPLEMENTATION == Implementation.P1 ? describe : describe.skip @@ -25,6 +31,7 @@ describeP1('Asset Plugin Registry', () => { // Registries let versionRegistry: VersionRegistry let assetPluginRegistry: AssetPluginRegistry + let roleRegistry: RoleRegistry beforeEach(async () => { ;[owner, other] = await ethers.getSigners() @@ -32,8 +39,11 @@ describeP1('Asset Plugin Registry', () => { // Deploy fixture ;({ deployer, basket } = await loadFixture(defaultFixture)) + const RoleRegistryFactory = await ethers.getContractFactory('RoleRegistry') + roleRegistry = await RoleRegistryFactory.connect(owner).deploy() + const versionRegistryFactory = await ethers.getContractFactory('VersionRegistry') - versionRegistry = await versionRegistryFactory.deploy(await owner.getAddress()) + versionRegistry = await versionRegistryFactory.deploy(roleRegistry.address) const assetPluginRegistryFactory = await ethers.getContractFactory('AssetPluginRegistry') assetPluginRegistry = await assetPluginRegistryFactory.deploy(versionRegistry.address) @@ -50,7 +60,7 @@ describeP1('Asset Plugin Registry', () => { describe('Deployment', () => { it('should set the owner/version registry correctly', async () => { - expect(await assetPluginRegistry.owner()).to.eq(await owner.getAddress()) + expect(await assetPluginRegistry.roleRegistry()).to.eq(roleRegistry.address) expect(await assetPluginRegistry.versionRegistry()).to.eq(versionRegistry.address) }) }) @@ -130,7 +140,7 @@ describeP1('Asset Plugin Registry', () => { // If not owner cannot register asset await expect( assetPluginRegistry.connect(other).registerAsset(tokenAsset.address, [versionHash]) - ).to.be.revertedWith('Ownable: caller is not the owner') + ).to.be.revertedWithCustomError(assetPluginRegistry, 'AssetPluginRegistry__InvalidCaller') // Invalid registration with zero address is also rejected await expect( @@ -260,7 +270,7 @@ describeP1('Asset Plugin Registry', () => { assetPluginRegistry .connect(other) .updateVersionsByAsset(tokenAsset.address, [versionHash], [true]) - ).to.be.revertedWith('Ownable: caller is not the owner') + ).to.be.revertedWithCustomError(assetPluginRegistry, 'AssetPluginRegistry__InvalidCaller') // Fails if any of the versions is not registered const versionV1Hash = ethers.utils.keccak256( @@ -385,7 +395,7 @@ describeP1('Asset Plugin Registry', () => { assetPluginRegistry .connect(other) .updateAssetsByVersion(versionHash, [tokenAsset.address], [true]) - ).to.be.revertedWith('Ownable: caller is not the owner') + ).to.be.revertedWithCustomError(assetPluginRegistry, 'AssetPluginRegistry__InvalidCaller') // Fails if any of the assets is zero address await expect( diff --git a/test/registries/DAOFeeRegistry.test.ts b/test/registries/DAOFeeRegistry.test.ts index 6872be6118..4c67a2e361 100644 --- a/test/registries/DAOFeeRegistry.test.ts +++ b/test/registries/DAOFeeRegistry.test.ts @@ -9,6 +9,7 @@ import { whileImpersonating } from '../utils/impersonation' import { DAOFeeRegistry, ERC20Mock, + RoleRegistry, TestIDistributor, TestIRevenueTrader, TestIMain, @@ -28,6 +29,7 @@ describeP1('DAO Fee Registry', () => { let rsrTrader: TestIRevenueTrader let feeRegistry: DAOFeeRegistry + let roleRegistry: RoleRegistry beforeEach(async () => { ;[owner, other] = await ethers.getSigners() @@ -35,12 +37,12 @@ describeP1('DAO Fee Registry', () => { // Deploy fixture ;({ distributor, main, rToken, rsr, rsrTrader } = await loadFixture(defaultFixture)) - const mockRoleRegistryFactory = await ethers.getContractFactory('MockRoleRegistry') - const mockRoleRegistry = await mockRoleRegistryFactory.deploy() + const RoleRegistryFactory = await ethers.getContractFactory('RoleRegistry') + roleRegistry = await RoleRegistryFactory.connect(owner).deploy() const DAOFeeRegistryFactory = await ethers.getContractFactory('DAOFeeRegistry') feeRegistry = await DAOFeeRegistryFactory.connect(owner).deploy( - mockRoleRegistry.address, + roleRegistry.address, await owner.getAddress() ) @@ -58,18 +60,18 @@ describeP1('DAO Fee Registry', () => { describe('Negative cases', () => { it('Should not allow calling setters by anyone other than owner', async () => { - await expect(feeRegistry.connect(other).setFeeRecipient(owner.address)).to.be.revertedWith( - 'Ownable: caller is not the owner' - ) - await expect(feeRegistry.connect(other).setDefaultFeeNumerator(bn('100'))).to.be.revertedWith( - 'Ownable: caller is not the owner' - ) + await expect( + feeRegistry.connect(other).setFeeRecipient(owner.address) + ).to.be.revertedWithCustomError(feeRegistry, 'DAOFeeRegistry__InvalidCaller') + await expect( + feeRegistry.connect(other).setDefaultFeeNumerator(bn('100')) + ).to.be.revertedWithCustomError(feeRegistry, 'DAOFeeRegistry__InvalidCaller') await expect( feeRegistry.connect(other).setRTokenFeeNumerator(rToken.address, bn('100')) - ).to.be.revertedWith('Ownable: caller is not the owner') - await expect(feeRegistry.connect(other).resetRTokenFee(rToken.address)).to.be.revertedWith( - 'Ownable: caller is not the owner' - ) + ).to.be.revertedWithCustomError(feeRegistry, 'DAOFeeRegistry__InvalidCaller') + await expect( + feeRegistry.connect(other).resetRTokenFee(rToken.address) + ).to.be.revertedWithCustomError(feeRegistry, 'DAOFeeRegistry__InvalidCaller') }) it('Should not allow setting fee recipient to zero address', async () => { @@ -192,9 +194,9 @@ describeP1('DAO Fee Registry', () => { expect(await rsr.balanceOf(owner.address)).to.equal(0) await distributor.connect(signer).distribute(rsr.address, amt) - // Expected returned amount is for the fee times 5/3 to account for rev share split - const expectedAmt = amt.mul(defaultFee).div(bn('1e4')).mul(5).div(3) - expect(await rsr.balanceOf(owner.address)).to.equal(expectedAmt) + const feeShares = bn('1e4').mul(defaultFee).div(bn('1e4').sub(defaultFee)) + const expectedAmt = amt.mul(feeShares).div(feeShares.add(6000)) + expect(await rsr.balanceOf(owner.address)).to.be.closeTo(expectedAmt, 10000) }) }) } diff --git a/test/registries/VersionRegistry.test.ts b/test/registries/VersionRegistry.test.ts index 9edfc493d7..789a3a3c1b 100644 --- a/test/registries/VersionRegistry.test.ts +++ b/test/registries/VersionRegistry.test.ts @@ -4,12 +4,13 @@ import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' import { expect } from 'chai' import { ONE_ADDRESS, ZERO_ADDRESS, ZERO_BYTES } from '#/common/constants' import { IImplementations } from '#/common/configuration' -import { DeployerMock, TestIDeployer, VersionRegistry } from '../../typechain' +import { DeployerMock, RoleRegistry, TestIDeployer, VersionRegistry } from '../../typechain' import { Implementation, IMPLEMENTATION, defaultFixture } from '../fixtures' const describeP1 = IMPLEMENTATION == Implementation.P1 ? describe : describe.skip describeP1('Version Registry', () => { + let roleRegistry: RoleRegistry let versionRegistry: VersionRegistry let deployer: TestIDeployer let deployerMockV1: DeployerMock @@ -21,8 +22,11 @@ describeP1('Version Registry', () => { ;[owner, other] = await ethers.getSigners() ;({ deployer } = await loadFixture(defaultFixture)) + const RoleRegistryFactory = await ethers.getContractFactory('RoleRegistry') + roleRegistry = await RoleRegistryFactory.connect(owner).deploy() + const versionRegistryFactory = await ethers.getContractFactory('VersionRegistry') - versionRegistry = await versionRegistryFactory.deploy(await owner.getAddress()) + versionRegistry = await versionRegistryFactory.deploy(roleRegistry.address) const DeployerMockFactoryV1 = await ethers.getContractFactory('DeployerMock') deployerMockV1 = await DeployerMockFactoryV1.deploy() @@ -32,8 +36,8 @@ describeP1('Version Registry', () => { }) describe('Deployment', () => { - it('should set the owner to the specified address', async () => { - expect(await versionRegistry.owner()).to.eq(await owner.getAddress()) + it('should set the role registry to the specified address', async () => { + expect(await versionRegistry.roleRegistry()).to.eq(roleRegistry.address) }) }) @@ -48,7 +52,9 @@ describeP1('Version Registry', () => { expect(versionData.versionHash).not.be.eq(ZERO_BYTES) expect(versionData.deprecated).be.eq(false) - const expectedVersionHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('V1')) + const expectedVersionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await deployerMockV1.version()) + ) expect(versionData.versionHash).to.eq(expectedVersionHash) expect(await versionRegistry.deployments(expectedVersionHash)).to.not.equal(ZERO_ADDRESS) expect(await versionRegistry.deployments(expectedVersionHash)).to.equal( @@ -60,7 +66,7 @@ describeP1('Version Registry', () => { // If not owner, should be rejected await expect( versionRegistry.connect(other).registerVersion(deployer.address) - ).to.be.revertedWith('Ownable: caller is not the owner') + ).to.be.revertedWithCustomError(versionRegistry, 'VersionRegistry__InvalidCaller') // Same version, different deployer, should be rejected. const DeployerMockFactory = await ethers.getContractFactory('DeployerMock') @@ -79,7 +85,9 @@ describeP1('Version Registry', () => { const initialVersionData = await versionRegistry.getLatestVersion() // Register new version - const expectedV2Hash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes('V2')) + const expectedV2Hash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(await deployerMockV2.version()) + ) await expect(versionRegistry.connect(owner).registerVersion(deployerMockV2.address)) .to.emit(versionRegistry, 'VersionRegistered') .withArgs(expectedV2Hash, deployerMockV2.address) From baad94de807c03f40bb79f78e243d8ded1fec2f9 Mon Sep 17 00:00:00 2001 From: Akshat Mittal Date: Tue, 20 Aug 2024 05:29:04 +0530 Subject: [PATCH 47/72] Housekeeping (#1181) --- .env.yarn | 1 + .github/workflows/4byte.yml | 2 +- .github/workflows/docgen-netlify.yml | 8 +- .github/workflows/tests.yml | 44 +- .../@yarnpkg/plugin-interactive-tools.cjs | 363 - .yarn/releases/yarn-3.3.1.cjs | 823 -- .yarn/releases/yarn-4.3.1.cjs | 894 +++ .yarnrc.yml | 6 +- package.json | 6 +- yarn.lock | 6794 ++++++++--------- 10 files changed, 4311 insertions(+), 4630 deletions(-) create mode 100644 .env.yarn delete mode 100644 .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs delete mode 100644 .yarn/releases/yarn-3.3.1.cjs create mode 100644 .yarn/releases/yarn-4.3.1.cjs diff --git a/.env.yarn b/.env.yarn new file mode 100644 index 0000000000..e017950ff7 --- /dev/null +++ b/.env.yarn @@ -0,0 +1 @@ +NODE_OPTIONS='--max-old-space-size=32768' diff --git a/.github/workflows/4byte.yml b/.github/workflows/4byte.yml index 3e456ddbae..5add1693e8 100644 --- a/.github/workflows/4byte.yml +++ b/.github/workflows/4byte.yml @@ -21,7 +21,7 @@ jobs: fetch-depth: 1 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - run: yarn run:4byte diff --git a/.github/workflows/docgen-netlify.yml b/.github/workflows/docgen-netlify.yml index 7326b95c60..037a96e784 100644 --- a/.github/workflows/docgen-netlify.yml +++ b/.github/workflows/docgen-netlify.yml @@ -20,7 +20,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 cache: yarn - name: Install Foundry @@ -45,8 +45,8 @@ jobs: with: NETLIFY_AUTH_TOKEN: ${{ env.NETLIFY_AUTH_TOKEN }} NETLIFY_SITE_ID: ${{ env.NETLIFY_SITE_ID }} - NETLIFY_DEPLOY_MESSAGE: "Prod deploy v${{ github.ref }}" + NETLIFY_DEPLOY_MESSAGE: 'Prod deploy v${{ github.ref }}' NETLIFY_DEPLOY_TO_PROD: true build_directory: tools/docgen/book - install_command: "echo Skipping installing the dependencies" - build_command: "echo Skipping building the web files" + install_command: 'echo Skipping installing the dependencies' + build_command: 'echo Skipping building the web files' diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index def1110b17..9234f27175 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -3,9 +3,13 @@ name: Tests on: push: branches: - - main + - master pull_request: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/master' }} + jobs: deployment-scripts: name: 'Deployment Scripts' @@ -16,12 +20,12 @@ jobs: fetch-depth: 1 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - run: yarn devchain & env: - MAINNET_RPC_URL: https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161 + MAINNET_RPC_URL: https://eth-mainnet.alchemyapi.io/v2/${{ secrets.ALCHEMY_MAINNET_KEY }} FORK_NETWORK: mainnet - run: yarn deploy:run --network localhost env: @@ -34,7 +38,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - run: yarn lint @@ -51,7 +55,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - run: yarn test:plugins @@ -63,7 +67,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - name: 'Cache hardhat network fork' @@ -90,7 +94,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - name: 'Cache hardhat network fork' @@ -117,7 +121,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - name: 'Cache hardhat network fork' @@ -144,7 +148,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - name: 'Cache hardhat network fork' @@ -155,7 +159,7 @@ jobs: restore-keys: | hardhat-network-fork-${{ runner.os }}- hardhat-network-fork- - - run: npx hardhat test ./test/plugins/individual-collateral/{cbeth,aave-v3,compoundv3,stargate,lido}/*.test.ts + - run: yarn hardhat test ./test/plugins/individual-collateral/{cbeth,aave-v3,compoundv3,stargate,lido}/*.test.ts env: NODE_OPTIONS: '--max-old-space-size=32768' TS_NODE_SKIP_IGNORE: true @@ -172,7 +176,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - name: 'Cache hardhat network fork' @@ -183,7 +187,7 @@ jobs: restore-keys: | hardhat-network-fork-${{ runner.os }}- hardhat-network-fork- - - run: npx hardhat test ./test/plugins/individual-collateral/{aave-v3,compoundv3,curve/cvx,mountain}/*.test.ts + - run: yarn hardhat test ./test/plugins/individual-collateral/{aave-v3,compoundv3,curve/cvx,mountain}/*.test.ts env: NODE_OPTIONS: '--max-old-space-size=32768' TS_NODE_SKIP_IGNORE: true @@ -200,7 +204,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - run: yarn test:p0 @@ -214,7 +218,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - run: yarn test:p1 @@ -228,7 +232,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - run: yarn test:scenario @@ -242,7 +246,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - run: yarn test:extreme @@ -270,7 +274,7 @@ jobs: fetch-depth: 1 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - name: 'Cache hardhat network fork' uses: actions/cache@v3 @@ -295,7 +299,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - name: 'Cache hardhat network fork' @@ -306,7 +310,7 @@ jobs: restore-keys: | hardhat-network-fork-${{ runner.os }}- hardhat-network-fork- - - run: npx hardhat test ./test/monitor/*.test.ts + - run: yarn hardhat test ./test/monitor/*.test.ts env: NODE_OPTIONS: '--max-old-space-size=32768' TS_NODE_SKIP_IGNORE: true @@ -322,7 +326,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x cache: 'yarn' - run: yarn install --immutable - run: yarn test:registries diff --git a/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs b/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs deleted file mode 100644 index 527659ff97..0000000000 --- a/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs +++ /dev/null @@ -1,363 +0,0 @@ -/* eslint-disable */ -//prettier-ignore -module.exports = { -name: "@yarnpkg/plugin-interactive-tools", -factory: function (require) { -var plugin=(()=>{var PR=Object.create,J1=Object.defineProperty,MR=Object.defineProperties,FR=Object.getOwnPropertyDescriptor,LR=Object.getOwnPropertyDescriptors,RR=Object.getOwnPropertyNames,hh=Object.getOwnPropertySymbols,NR=Object.getPrototypeOf,Z4=Object.prototype.hasOwnProperty,aD=Object.prototype.propertyIsEnumerable;var dD=(i,u,f)=>u in i?J1(i,u,{enumerable:!0,configurable:!0,writable:!0,value:f}):i[u]=f,dt=(i,u)=>{for(var f in u||(u={}))Z4.call(u,f)&&dD(i,f,u[f]);if(hh)for(var f of hh(u))aD.call(u,f)&&dD(i,f,u[f]);return i},zn=(i,u)=>MR(i,LR(u)),BR=i=>J1(i,"__esModule",{value:!0});var Si=(i,u)=>{var f={};for(var c in i)Z4.call(i,c)&&u.indexOf(c)<0&&(f[c]=i[c]);if(i!=null&&hh)for(var c of hh(i))u.indexOf(c)<0&&aD.call(i,c)&&(f[c]=i[c]);return f};var Me=(i,u)=>()=>(u||i((u={exports:{}}).exports,u),u.exports),jR=(i,u)=>{for(var f in u)J1(i,f,{get:u[f],enumerable:!0})},UR=(i,u,f)=>{if(u&&typeof u=="object"||typeof u=="function")for(let c of RR(u))!Z4.call(i,c)&&c!=="default"&&J1(i,c,{get:()=>u[c],enumerable:!(f=FR(u,c))||f.enumerable});return i},Er=i=>UR(BR(J1(i!=null?PR(NR(i)):{},"default",i&&i.__esModule&&"default"in i?{get:()=>i.default,enumerable:!0}:{value:i,enumerable:!0})),i);var ey=Me((YH,pD)=>{"use strict";var hD=Object.getOwnPropertySymbols,qR=Object.prototype.hasOwnProperty,zR=Object.prototype.propertyIsEnumerable;function WR(i){if(i==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(i)}function HR(){try{if(!Object.assign)return!1;var i=new String("abc");if(i[5]="de",Object.getOwnPropertyNames(i)[0]==="5")return!1;for(var u={},f=0;f<10;f++)u["_"+String.fromCharCode(f)]=f;var c=Object.getOwnPropertyNames(u).map(function(t){return u[t]});if(c.join("")!=="0123456789")return!1;var g={};return"abcdefghijklmnopqrst".split("").forEach(function(t){g[t]=t}),Object.keys(Object.assign({},g)).join("")==="abcdefghijklmnopqrst"}catch(t){return!1}}pD.exports=HR()?Object.assign:function(i,u){for(var f,c=WR(i),g,t=1;t{"use strict";var ty=ey(),as=typeof Symbol=="function"&&Symbol.for,Q1=as?Symbol.for("react.element"):60103,bR=as?Symbol.for("react.portal"):60106,GR=as?Symbol.for("react.fragment"):60107,VR=as?Symbol.for("react.strict_mode"):60108,YR=as?Symbol.for("react.profiler"):60114,$R=as?Symbol.for("react.provider"):60109,KR=as?Symbol.for("react.context"):60110,XR=as?Symbol.for("react.forward_ref"):60112,JR=as?Symbol.for("react.suspense"):60113,QR=as?Symbol.for("react.memo"):60115,ZR=as?Symbol.for("react.lazy"):60116,mD=typeof Symbol=="function"&&Symbol.iterator;function Z1(i){for(var u="https://reactjs.org/docs/error-decoder.html?invariant="+i,f=1;fmh.length&&mh.push(i)}function uy(i,u,f,c){var g=typeof i;(g==="undefined"||g==="boolean")&&(i=null);var t=!1;if(i===null)t=!0;else switch(g){case"string":case"number":t=!0;break;case"object":switch(i.$$typeof){case Q1:case bR:t=!0}}if(t)return f(c,i,u===""?"."+sy(i,0):u),1;if(t=0,u=u===""?".":u+":",Array.isArray(i))for(var C=0;C{"use strict";kD.exports=xD()});var AD=Me((ga,e2)=>{(function(){var i,u="4.17.21",f=200,c="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",g="Expected a function",t="Invalid `variable` option passed into `_.template`",C="__lodash_hash_undefined__",A=500,x="__lodash_placeholder__",D=1,L=2,N=4,j=1,$=2,h=1,re=2,ce=4,Q=8,oe=16,Se=32,me=64,De=128,J=256,Te=512,Oe=30,Le="...",ot=800,ct=16,Ue=1,be=2,At=3,Ot=1/0,Nt=9007199254740991,Je=17976931348623157e292,V=0/0,ne=4294967295,ge=ne-1,Z=ne>>>1,Ae=[["ary",De],["bind",h],["bindKey",re],["curry",Q],["curryRight",oe],["flip",Te],["partial",Se],["partialRight",me],["rearg",J]],at="[object Arguments]",it="[object Array]",Ft="[object AsyncFunction]",jt="[object Boolean]",hn="[object Date]",Un="[object DOMException]",Jt="[object Error]",Yt="[object Function]",cr="[object GeneratorFunction]",w="[object Map]",pt="[object Number]",Mn="[object Null]",Bn="[object Object]",Xn="[object Promise]",vr="[object Proxy]",gr="[object RegExp]",r0="[object Set]",Ci="[object String]",yo="[object Symbol]",Ds="[object Undefined]",Mu="[object WeakMap]",Gf="[object WeakSet]",iu="[object ArrayBuffer]",ou="[object DataView]",ol="[object Float32Array]",ul="[object Float64Array]",Es="[object Int8Array]",Uo="[object Int16Array]",sl="[object Int32Array]",Ss="[object Uint8Array]",Cs="[object Uint8ClampedArray]",Ti="[object Uint16Array]",Fu="[object Uint32Array]",ll=/\b__p \+= '';/g,fl=/\b(__p \+=) '' \+/g,cl=/(__e\(.*?\)|\b__t\)) \+\n'';/g,al=/&(?:amp|lt|gt|quot|#39);/g,Ui=/[&<>"']/g,Mr=RegExp(al.source),Ac=RegExp(Ui.source),of=/<%-([\s\S]+?)%>/g,Ts=/<%([\s\S]+?)%>/g,xs=/<%=([\s\S]+?)%>/g,dl=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,qi=/^\w*$/,qo=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,kr=/[\\^$.*+?()[\]{}|]/g,Fr=RegExp(kr.source),si=/^\s+/,H0=/\s/,b0=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Bt=/\{\n\/\* \[wrapped with (.+)\] \*/,Lu=/,? & /,c0=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Ru=/[()=,{}\[\]\/\s]/,ks=/\\(\\)?/g,As=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,uu=/\w*$/,wo=/^[-+]0x[0-9a-f]+$/i,zo=/^0b[01]+$/i,Os=/^\[object .+?Constructor\]$/,Is=/^0o[0-7]+$/i,uf=/^(?:0|[1-9]\d*)$/,_n=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Nu=/($^)/,Wo=/['\n\r\u2028\u2029\\]/g,su="\\ud800-\\udfff",Ps="\\u0300-\\u036f",pl="\\ufe20-\\ufe2f",Vf="\\u20d0-\\u20ff",hl=Ps+pl+Vf,Bu="\\u2700-\\u27bf",ju="a-z\\xdf-\\xf6\\xf8-\\xff",sf="\\xac\\xb1\\xd7\\xf7",ro="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",Ms="\\u2000-\\u206f",ml=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Uu="A-Z\\xc0-\\xd6\\xd8-\\xde",G0="\\ufe0e\\ufe0f",Fs=sf+ro+Ms+ml,tt="['\u2019]",zi="["+su+"]",lu="["+Fs+"]",Ho="["+hl+"]",O0="\\d+",vl="["+Bu+"]",gl="["+ju+"]",fu="[^"+su+Fs+O0+Bu+ju+Uu+"]",_l="\\ud83c[\\udffb-\\udfff]",Sn="(?:"+Ho+"|"+_l+")",gt="[^"+su+"]",en="(?:\\ud83c[\\udde6-\\uddff]){2}",I0="[\\ud800-\\udbff][\\udc00-\\udfff]",li="["+Uu+"]",qu="\\u200d",Wi="(?:"+gl+"|"+fu+")",zu="(?:"+li+"|"+fu+")",Wu="(?:"+tt+"(?:d|ll|m|re|s|t|ve))?",Ls="(?:"+tt+"(?:D|LL|M|RE|S|T|VE))?",fi=Sn+"?",e0="["+G0+"]?",io="(?:"+qu+"(?:"+[gt,en,I0].join("|")+")"+e0+fi+")*",D0="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Do="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",i0=e0+fi+io,Rs="(?:"+[vl,en,I0].join("|")+")"+i0,a0="(?:"+[gt+Ho+"?",Ho,en,I0,zi].join("|")+")",Hu=RegExp(tt,"g"),V0=RegExp(Ho,"g"),bu=RegExp(_l+"(?="+_l+")|"+a0+i0,"g"),Ns=RegExp([li+"?"+gl+"+"+Wu+"(?="+[lu,li,"$"].join("|")+")",zu+"+"+Ls+"(?="+[lu,li+Wi,"$"].join("|")+")",li+"?"+Wi+"+"+Wu,li+"+"+Ls,Do,D0,O0,Rs].join("|"),"g"),bo=RegExp("["+qu+su+hl+G0+"]"),P0=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ln=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],lf=-1,nr={};nr[ol]=nr[ul]=nr[Es]=nr[Uo]=nr[sl]=nr[Ss]=nr[Cs]=nr[Ti]=nr[Fu]=!0,nr[at]=nr[it]=nr[iu]=nr[jt]=nr[ou]=nr[hn]=nr[Jt]=nr[Yt]=nr[w]=nr[pt]=nr[Bn]=nr[gr]=nr[r0]=nr[Ci]=nr[Mu]=!1;var rr={};rr[at]=rr[it]=rr[iu]=rr[ou]=rr[jt]=rr[hn]=rr[ol]=rr[ul]=rr[Es]=rr[Uo]=rr[sl]=rr[w]=rr[pt]=rr[Bn]=rr[gr]=rr[r0]=rr[Ci]=rr[yo]=rr[Ss]=rr[Cs]=rr[Ti]=rr[Fu]=!0,rr[Jt]=rr[Yt]=rr[Mu]=!1;var Go={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},Gu={"&":"&","<":"<",">":">",'"':""","'":"'"},yl={"&":"&","<":"<",">":">",""":'"',"'":"'"},cu={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Bs=parseFloat,Vu=parseInt,M0=typeof global=="object"&&global&&global.Object===Object&&global,au=typeof self=="object"&&self&&self.Object===Object&&self,Lr=M0||au||Function("return this")(),F=typeof ga=="object"&&ga&&!ga.nodeType&&ga,R=F&&typeof e2=="object"&&e2&&!e2.nodeType&&e2,U=R&&R.exports===F,H=U&&M0.process,fe=function(){try{var ae=R&&R.require&&R.require("util").types;return ae||H&&H.binding&&H.binding("util")}catch(Be){}}(),ue=fe&&fe.isArrayBuffer,de=fe&&fe.isDate,W=fe&&fe.isMap,ve=fe&&fe.isRegExp,Fe=fe&&fe.isSet,Ge=fe&&fe.isTypedArray;function K(ae,Be,Ie){switch(Ie.length){case 0:return ae.call(Be);case 1:return ae.call(Be,Ie[0]);case 2:return ae.call(Be,Ie[0],Ie[1]);case 3:return ae.call(Be,Ie[0],Ie[1],Ie[2])}return ae.apply(Be,Ie)}function xe(ae,Be,Ie,ht){for(var mt=-1,wn=ae==null?0:ae.length;++mt-1}function wt(ae,Be,Ie){for(var ht=-1,mt=ae==null?0:ae.length;++ht-1;);return Ie}function js(ae,Be){for(var Ie=ae.length;Ie--&&Qe(Be,ae[Ie],0)>-1;);return Ie}function Dl(ae,Be){for(var Ie=ae.length,ht=0;Ie--;)ae[Ie]===Be&&++ht;return ht}var du=Cn(Go),Yu=Cn(Gu);function Us(ae){return"\\"+cu[ae]}function oo(ae,Be){return ae==null?i:ae[Be]}function Hi(ae){return bo.test(ae)}function qs(ae){return P0.test(ae)}function F0(ae){for(var Be,Ie=[];!(Be=ae.next()).done;)Ie.push(Be.value);return Ie}function Gr(ae){var Be=-1,Ie=Array(ae.size);return ae.forEach(function(ht,mt){Ie[++Be]=[mt,ht]}),Ie}function ir(ae,Be){return function(Ie){return ae(Be(Ie))}}function L0(ae,Be){for(var Ie=-1,ht=ae.length,mt=0,wn=[];++Ie-1}function Ju(a,p){var E=this.__data__,I=hf(E,a);return I<0?(++this.size,E.push([a,p])):E[I][1]=p,this}Z0.prototype.clear=df,Z0.prototype.delete=Ba,Z0.prototype.get=Oc,Z0.prototype.has=mu,Z0.prototype.set=Ju;function ei(a){var p=-1,E=a==null?0:a.length;for(this.clear();++p=p?a:p)),a}function vi(a,p,E,I,B,G){var te,se=p&D,Ee=p&L,$e=p&N;if(E&&(te=B?E(a,I,B,G):E(a)),te!==i)return te;if(!Jr(a))return a;var Ke=On(a);if(Ke){if(te=f1(a),!se)return Xr(a,te)}else{var nt=U0(a),Ct=nt==Yt||nt==cr;if(Eu(a))return Od(a,se);if(nt==Bn||nt==at||Ct&&!B){if(te=Ee||Ct?{}:zd(a),!se)return Ee?Zu(a,Wa(te,a)):j0(a,mf(te,a))}else{if(!rr[nt])return B?a:{};te=Wd(a,nt,se)}}G||(G=new co);var Gt=G.get(a);if(Gt)return Gt;G.set(a,te),kp(a)?a.forEach(function(dn){te.add(vi(dn,p,E,dn,a,G))}):Tp(a)&&a.forEach(function(dn,Yn){te.set(Yn,vi(dn,p,E,Yn,a,G))});var an=$e?Ee?Dn:r1:Ee?Yi:q0,qn=Ke?i:an(a);return je(qn||a,function(dn,Yn){qn&&(Yn=dn,dn=a[Yn]),xl(te,Yn,vi(dn,p,E,Yn,a,G))}),te}function Xf(a){var p=q0(a);return function(E){return Rc(E,a,p)}}function Rc(a,p,E){var I=E.length;if(a==null)return!I;for(a=$t(a);I--;){var B=E[I],G=p[B],te=a[B];if(te===i&&!(B in a)||!G(te))return!1}return!0}function Jf(a,p,E){if(typeof a!="function")throw new Yr(g);return wf(function(){a.apply(i,E)},p)}function ao(a,p,E,I){var B=-1,G=xt,te=!0,se=a.length,Ee=[],$e=p.length;if(!se)return Ee;E&&(p=lt(p,qr(E))),I?(G=wt,te=!1):p.length>=f&&(G=So,te=!1,p=new vu(p));e:for(;++BB?0:B+E),I=I===i||I>B?B:jn(I),I<0&&(I+=B),I=E>I?0:Ip(I);E0&&E(se)?p>1?k0(se,p-1,E,I,B):Rt(B,se):I||(B[B.length]=se)}return B}var v=ec(),m=ec(!0);function S(a,p){return a&&v(a,p,q0)}function O(a,p){return a&&m(a,p,q0)}function M(a,p){return st(p,function(E){return rs(a[E])})}function b(a,p){p=Gs(p,a);for(var E=0,I=p.length;a!=null&&Ep}function ut(a,p){return a!=null&&or.call(a,p)}function In(a,p){return a!=null&&p in $t(a)}function A0(a,p,E){return a>=kn(p,E)&&a=120&&Ke.length>=120)?new vu(te&&Ke):i}Ke=a[0];var nt=-1,Ct=se[0];e:for(;++nt-1;)se!==a&&C0.call(se,Ee,1),C0.call(a,Ee,1);return a}function jc(a,p){for(var E=a?p.length:0,I=E-1;E--;){var B=p[E];if(E==I||B!==G){var G=B;es(B)?C0.call(a,B,1):$a(a,B)}}return a}function Ga(a,p){return a+hu(Ai()*(p-a+1))}function Lm(a,p,E,I){for(var B=-1,G=wr(B0((p-a)/(E||1)),0),te=Ie(G);G--;)te[I?G:++B]=a,a+=E;return te}function Va(a,p){var E="";if(!a||p<1||p>Nt)return E;do p%2&&(E+=a),p=hu(p/2),p&&(a+=a);while(p);return E}function Wn(a,p){return m1(Gd(a,p,$i),a+"")}function wd(a){return Fc(Ef(a))}function Dd(a,p){var E=Ef(a);return Yc(E,mi(p,0,E.length))}function Ol(a,p,E,I){if(!Jr(a))return a;p=Gs(p,a);for(var B=-1,G=p.length,te=G-1,se=a;se!=null&&++BB?0:B+p),E=E>B?B:E,E<0&&(E+=B),B=p>E?0:E-p>>>0,p>>>=0;for(var G=Ie(B);++I>>1,te=a[G];te!==null&&!mo(te)&&(E?te<=p:te=f){var $e=p?null:bm(a);if($e)return Y0($e);te=!1,B=So,Ee=new vu}else Ee=p?[]:se;e:for(;++I=I?a:Oo(a,p,E)}var Ad=pu||function(a){return Lr.clearTimeout(a)};function Od(a,p){if(p)return a.slice();var E=a.length,I=Nr?Nr(E):new a.constructor(E);return a.copy(I),I}function Qa(a){var p=new a.constructor(a.byteLength);return new R0(p).set(new R0(a)),p}function jm(a,p){var E=p?Qa(a.buffer):a.buffer;return new a.constructor(E,a.byteOffset,a.byteLength)}function Um(a){var p=new a.constructor(a.source,uu.exec(a));return p.lastIndex=a.lastIndex,p}function qm(a){return Wr?$t(Wr.call(a)):{}}function Id(a,p){var E=p?Qa(a.buffer):a.buffer;return new a.constructor(E,a.byteOffset,a.length)}function Pd(a,p){if(a!==p){var E=a!==i,I=a===null,B=a===a,G=mo(a),te=p!==i,se=p===null,Ee=p===p,$e=mo(p);if(!se&&!$e&&!G&&a>p||G&&te&&Ee&&!se&&!$e||I&&te&&Ee||!E&&Ee||!B)return 1;if(!I&&!G&&!$e&&a=se)return Ee;var $e=E[I];return Ee*($e=="desc"?-1:1)}}return a.index-p.index}function gf(a,p,E,I){for(var B=-1,G=a.length,te=E.length,se=-1,Ee=p.length,$e=wr(G-te,0),Ke=Ie(Ee+$e),nt=!I;++se1?E[B-1]:i,te=B>2?E[2]:i;for(G=a.length>3&&typeof G=="function"?(B--,G):i,te&&Ii(E[0],E[1],te)&&(G=B<3?i:G,B=1),p=$t(p);++I-1?B[G?p[te]:te]:i}}function Rd(a){return yu(function(p){var E=p.length,I=E,B=Qn.prototype.thru;for(a&&p.reverse();I--;){var G=p[I];if(typeof G!="function")throw new Yr(g);if(B&&!te&&Gc(G)=="wrapper")var te=new Qn([],!0)}for(I=te?I:E;++I1&&er.reverse(),Ke&&Eese))return!1;var $e=G.get(a),Ke=G.get(p);if($e&&Ke)return $e==p&&Ke==a;var nt=-1,Ct=!0,Gt=E&$?new vu:i;for(G.set(a,p),G.set(p,a);++nt1?"& ":"")+p[I],p=p.join(E>2?", ":" "),a.replace(b0,`{ -/* [wrapped with `+p+`] */ -`)}function Xm(a){return On(a)||Ll(a)||!!(di&&a&&a[di])}function es(a,p){var E=typeof a;return p=p==null?Nt:p,!!p&&(E=="number"||E!="symbol"&&uf.test(a))&&a>-1&&a%1==0&&a0){if(++p>=ot)return arguments[0]}else p=0;return a.apply(i,arguments)}}function Yc(a,p){var E=-1,I=a.length,B=I-1;for(p=p===i?I:p;++E1?a[p-1]:i;return E=typeof E=="function"?(a.pop(),E):i,sp(a,E)});function fp(a){var p=z(a);return p.__chain__=!0,p}function cp(a,p){return p(a),a}function Kc(a,p){return p(a)}var Wv=yu(function(a){var p=a.length,E=p?a[0]:0,I=this.__wrapped__,B=function(G){return Hs(G,a)};return p>1||this.__actions__.length||!(I instanceof nn)||!es(E)?this.thru(B):(I=I.slice(E,+E+(p?1:0)),I.__actions__.push({func:Kc,args:[B],thisArg:i}),new Qn(I,this.__chain__).thru(function(G){return p&&!G.length&&G.push(i),G}))});function Hv(){return fp(this)}function bv(){return new Qn(this.value(),this.__chain__)}function Gv(){this.__values__===i&&(this.__values__=Op(this.value()));var a=this.__index__>=this.__values__.length,p=a?i:this.__values__[this.__index__++];return{done:a,value:p}}function Vv(){return this}function Yv(a){for(var p,E=this;E instanceof Or;){var I=Jd(E);I.__index__=0,I.__values__=i,p?B.__wrapped__=I:p=I;var B=I;E=E.__wrapped__}return B.__wrapped__=a,p}function Ml(){var a=this.__wrapped__;if(a instanceof nn){var p=a;return this.__actions__.length&&(p=new nn(this)),p=p.reverse(),p.__actions__.push({func:Kc,args:[g1],thisArg:i}),new Qn(p,this.__chain__)}return this.thru(g1)}function Fl(){return xd(this.__wrapped__,this.__actions__)}var Xc=_f(function(a,p,E){or.call(a,E)?++a[E]:ti(a,E,1)});function $v(a,p,E){var I=On(a)?rt:Nc;return E&&Ii(a,p,E)&&(p=i),I(a,cn(p,3))}function Kv(a,p){var E=On(a)?st:Qf;return E(a,cn(p,3))}var Xv=Ld(Qd),D1=Ld($c);function Jv(a,p){return k0(Jc(a,p),1)}function Qv(a,p){return k0(Jc(a,p),Ot)}function ap(a,p,E){return E=E===i?1:jn(E),k0(Jc(a,p),E)}function dp(a,p){var E=On(a)?je:$o;return E(a,cn(p,3))}function pp(a,p){var E=On(a)?Xe:kl;return E(a,cn(p,3))}var Zv=_f(function(a,p,E){or.call(a,E)?a[E].push(p):ti(a,E,[p])});function eg(a,p,E,I){a=Vi(a)?a:Ef(a),E=E&&!I?jn(E):0;var B=a.length;return E<0&&(E=wr(B+E,0)),ia(a)?E<=B&&a.indexOf(p,E)>-1:!!B&&Qe(a,p,E)>-1}var tg=Wn(function(a,p,E){var I=-1,B=typeof p=="function",G=Vi(a)?Ie(a.length):[];return $o(a,function(te){G[++I]=B?K(p,te,E):po(te,p,E)}),G}),hp=_f(function(a,p,E){ti(a,E,p)});function Jc(a,p){var E=On(a)?lt:vd;return E(a,cn(p,3))}function ng(a,p,E,I){return a==null?[]:(On(p)||(p=p==null?[]:[p]),E=I?i:E,On(E)||(E=E==null?[]:[E]),Oi(a,p,E))}var rg=_f(function(a,p,E){a[E?0:1].push(p)},function(){return[[],[]]});function mp(a,p,E){var I=On(a)?yn:bn,B=arguments.length<3;return I(a,cn(p,4),E,B,$o)}function ig(a,p,E){var I=On(a)?sn:bn,B=arguments.length<3;return I(a,cn(p,4),E,B,kl)}function og(a,p){var E=On(a)?st:Qf;return E(a,Zc(cn(p,3)))}function ug(a){var p=On(a)?Fc:wd;return p(a)}function sg(a,p,E){(E?Ii(a,p,E):p===i)?p=1:p=jn(p);var I=On(a)?Lc:Dd;return I(a,p)}function lg(a){var p=On(a)?Kf:Ao;return p(a)}function E1(a){if(a==null)return 0;if(Vi(a))return ia(a)?Rr(a):a.length;var p=U0(a);return p==w||p==r0?a.size:Zf(a).length}function fg(a,p,E){var I=On(a)?ar:Nm;return E&&Ii(a,p,E)&&(p=i),I(a,cn(p,3))}var cg=Wn(function(a,p){if(a==null)return[];var E=p.length;return E>1&&Ii(a,p[0],p[1])?p=[]:E>2&&Ii(p[0],p[1],p[2])&&(p=[p[0]]),Oi(a,k0(p,1),[])}),rc=Sl||function(){return Lr.Date.now()};function ag(a,p){if(typeof p!="function")throw new Yr(g);return a=jn(a),function(){if(--a<1)return p.apply(this,arguments)}}function vp(a,p,E){return p=E?i:p,p=a&&p==null?a.length:p,Lt(a,De,i,i,i,i,p)}function gp(a,p){var E;if(typeof p!="function")throw new Yr(g);return a=jn(a),function(){return--a>0&&(E=p.apply(this,arguments)),a<=1&&(p=i),E}}var S1=Wn(function(a,p,E){var I=h;if(E.length){var B=L0(E,An(S1));I|=Se}return Lt(a,I,p,E,B)}),_p=Wn(function(a,p,E){var I=h|re;if(E.length){var B=L0(E,An(_p));I|=Se}return Lt(p,I,a,E,B)});function C1(a,p,E){p=E?i:p;var I=Lt(a,Q,i,i,i,i,i,p);return I.placeholder=C1.placeholder,I}function yp(a,p,E){p=E?i:p;var I=Lt(a,oe,i,i,i,i,i,p);return I.placeholder=yp.placeholder,I}function wp(a,p,E){var I,B,G,te,se,Ee,$e=0,Ke=!1,nt=!1,Ct=!0;if(typeof a!="function")throw new Yr(g);p=Fo(p)||0,Jr(E)&&(Ke=!!E.leading,nt="maxWait"in E,G=nt?wr(Fo(E.maxWait)||0,p):G,Ct="trailing"in E?!!E.trailing:Ct);function Gt(f0){var Jo=I,Su=B;return I=B=i,$e=f0,te=a.apply(Su,Jo),te}function an(f0){return $e=f0,se=wf(Yn,p),Ke?Gt(f0):te}function qn(f0){var Jo=f0-Ee,Su=f0-$e,Zp=p-Jo;return nt?kn(Zp,G-Su):Zp}function dn(f0){var Jo=f0-Ee,Su=f0-$e;return Ee===i||Jo>=p||Jo<0||nt&&Su>=G}function Yn(){var f0=rc();if(dn(f0))return er(f0);se=wf(Yn,qn(f0))}function er(f0){return se=i,Ct&&I?Gt(f0):(I=B=i,te)}function vo(){se!==i&&Ad(se),$e=0,I=Ee=B=se=i}function Pi(){return se===i?te:er(rc())}function Mi(){var f0=rc(),Jo=dn(f0);if(I=arguments,B=this,Ee=f0,Jo){if(se===i)return an(Ee);if(nt)return Ad(se),se=wf(Yn,p),Gt(Ee)}return se===i&&(se=wf(Yn,p)),te}return Mi.cancel=vo,Mi.flush=Pi,Mi}var dg=Wn(function(a,p){return Jf(a,1,p)}),Dp=Wn(function(a,p,E){return Jf(a,Fo(p)||0,E)});function pg(a){return Lt(a,Te)}function Qc(a,p){if(typeof a!="function"||p!=null&&typeof p!="function")throw new Yr(g);var E=function(){var I=arguments,B=p?p.apply(this,I):I[0],G=E.cache;if(G.has(B))return G.get(B);var te=a.apply(this,I);return E.cache=G.set(B,te)||G,te};return E.cache=new(Qc.Cache||ei),E}Qc.Cache=ei;function Zc(a){if(typeof a!="function")throw new Yr(g);return function(){var p=arguments;switch(p.length){case 0:return!a.call(this);case 1:return!a.call(this,p[0]);case 2:return!a.call(this,p[0],p[1]);case 3:return!a.call(this,p[0],p[1],p[2])}return!a.apply(this,p)}}function ea(a){return gp(2,a)}var hg=Bm(function(a,p){p=p.length==1&&On(p[0])?lt(p[0],qr(cn())):lt(k0(p,1),qr(cn()));var E=p.length;return Wn(function(I){for(var B=-1,G=kn(I.length,E);++B=p}),Ll=_i(function(){return arguments}())?_i:function(a){return n0(a)&&or.call(a,"callee")&&!N0.call(a,"callee")},On=Ie.isArray,x1=ue?qr(ue):Re;function Vi(a){return a!=null&&na(a.length)&&!rs(a)}function l0(a){return n0(a)&&Vi(a)}function kg(a){return a===!0||a===!1||n0(a)&&Ye(a)==jt}var Eu=pi||W1,Ag=de?qr(de):Ce;function Og(a){return n0(a)&&a.nodeType===1&&!ic(a)}function Cp(a){if(a==null)return!0;if(Vi(a)&&(On(a)||typeof a=="string"||typeof a.splice=="function"||Eu(a)||Df(a)||Ll(a)))return!a.length;var p=U0(a);if(p==w||p==r0)return!a.size;if(nc(a))return!Zf(a).length;for(var E in a)if(or.call(a,E))return!1;return!0}function Ig(a,p){return ze(a,p)}function Pg(a,p,E){E=typeof E=="function"?E:i;var I=E?E(a,p):i;return I===i?ze(a,p,i,E):!!I}function k1(a){if(!n0(a))return!1;var p=Ye(a);return p==Jt||p==Un||typeof a.message=="string"&&typeof a.name=="string"&&!ic(a)}function Mg(a){return typeof a=="number"&&Br(a)}function rs(a){if(!Jr(a))return!1;var p=Ye(a);return p==Yt||p==cr||p==Ft||p==vr}function A1(a){return typeof a=="number"&&a==jn(a)}function na(a){return typeof a=="number"&&a>-1&&a%1==0&&a<=Nt}function Jr(a){var p=typeof a;return a!=null&&(p=="object"||p=="function")}function n0(a){return a!=null&&typeof a=="object"}var Tp=W?qr(W):on;function Fg(a,p){return a===p||sr(a,p,Nn(p))}function Lg(a,p,E){return E=typeof E=="function"?E:i,sr(a,p,Nn(p),E)}function Rg(a){return xp(a)&&a!=+a}function Ng(a){if(Zm(a))throw new mt(c);return mn(a)}function Bg(a){return a===null}function O1(a){return a==null}function xp(a){return typeof a=="number"||n0(a)&&Ye(a)==pt}function ic(a){if(!n0(a)||Ye(a)!=Bn)return!1;var p=uo(a);if(p===null)return!0;var E=or.call(p,"constructor")&&p.constructor;return typeof E=="function"&&E instanceof E&&bi.call(E)==af}var ra=ve?qr(ve):pr;function jg(a){return A1(a)&&a>=-Nt&&a<=Nt}var kp=Fe?qr(Fe):Hr;function ia(a){return typeof a=="string"||!On(a)&&n0(a)&&Ye(a)==Ci}function mo(a){return typeof a=="symbol"||n0(a)&&Ye(a)==yo}var Df=Ge?qr(Ge):Vn;function Ap(a){return a===i}function Ug(a){return n0(a)&&U0(a)==Mu}function qg(a){return n0(a)&&Ye(a)==Gf}var zg=bc(Ha),Wg=bc(function(a,p){return a<=p});function Op(a){if(!a)return[];if(Vi(a))return ia(a)?Jn(a):Xr(a);if(u0&&a[u0])return F0(a[u0]());var p=U0(a),E=p==w?Gr:p==r0?Y0:Ef;return E(a)}function is(a){if(!a)return a===0?a:0;if(a=Fo(a),a===Ot||a===-Ot){var p=a<0?-1:1;return p*Je}return a===a?a:0}function jn(a){var p=is(a),E=p%1;return p===p?E?p-E:p:0}function Ip(a){return a?mi(jn(a),0,ne):0}function Fo(a){if(typeof a=="number")return a;if(mo(a))return V;if(Jr(a)){var p=typeof a.valueOf=="function"?a.valueOf():a;a=Jr(p)?p+"":p}if(typeof a!="string")return a===0?a:+a;a=E0(a);var E=zo.test(a);return E||Is.test(a)?Vu(a.slice(2),E?2:8):wo.test(a)?V:+a}function oa(a){return yi(a,Yi(a))}function Hg(a){return a?mi(jn(a),-Nt,Nt):a===0?a:0}function yr(a){return a==null?"":ho(a)}var Pp=Io(function(a,p){if(nc(p)||Vi(p)){yi(p,q0(p),a);return}for(var E in p)or.call(p,E)&&xl(a,E,p[E])}),Mp=Io(function(a,p){yi(p,Yi(p),a)}),ua=Io(function(a,p,E,I){yi(p,Yi(p),a,I)}),bg=Io(function(a,p,E,I){yi(p,q0(p),a,I)}),Gg=yu(Hs);function Vg(a,p){var E=dr(a);return p==null?E:mf(E,p)}var Fp=Wn(function(a,p){a=$t(a);var E=-1,I=p.length,B=I>2?p[2]:i;for(B&&Ii(p[0],p[1],B)&&(I=1);++E1),G}),yi(a,Dn(a),E),I&&(E=vi(E,D|L|N,Gm));for(var B=p.length;B--;)$a(E,p[B]);return E});function l_(a,p){return Bp(a,Zc(cn(p)))}var f_=yu(function(a,p){return a==null?{}:Fm(a,p)});function Bp(a,p){if(a==null)return{};var E=lt(Dn(a),function(I){return[I]});return p=cn(p),yd(a,E,function(I,B){return p(I,B[0])})}function c_(a,p,E){p=Gs(p,a);var I=-1,B=p.length;for(B||(B=1,a=i);++Ip){var I=a;a=p,p=I}if(E||a%1||p%1){var B=Ai();return kn(a+B*(p-a+Bs("1e-"+((B+"").length-1))),p)}return Ga(a,p)}var __=yf(function(a,p,E){return p=p.toLowerCase(),a+(E?Wp(p):p)});function Wp(a){return L1(yr(a).toLowerCase())}function Hp(a){return a=yr(a),a&&a.replace(_n,du).replace(V0,"")}function y_(a,p,E){a=yr(a),p=ho(p);var I=a.length;E=E===i?I:mi(jn(E),0,I);var B=E;return E-=p.length,E>=0&&a.slice(E,B)==p}function M1(a){return a=yr(a),a&&Ac.test(a)?a.replace(Ui,Yu):a}function w_(a){return a=yr(a),a&&Fr.test(a)?a.replace(kr,"\\$&"):a}var D_=yf(function(a,p,E){return a+(E?"-":"")+p.toLowerCase()}),bp=yf(function(a,p,E){return a+(E?" ":"")+p.toLowerCase()}),E_=Fd("toLowerCase");function S_(a,p,E){a=yr(a),p=jn(p);var I=p?Rr(a):0;if(!p||I>=p)return a;var B=(p-I)/2;return Hc(hu(B),E)+a+Hc(B0(B),E)}function C_(a,p,E){a=yr(a),p=jn(p);var I=p?Rr(a):0;return p&&I>>0,E?(a=yr(a),a&&(typeof p=="string"||p!=null&&!ra(p))&&(p=ho(p),!p&&Hi(a))?Vs(Jn(a),0,E):a.split(p,E)):[]}var I_=yf(function(a,p,E){return a+(E?" ":"")+L1(p)});function P_(a,p,E){return a=yr(a),E=E==null?0:mi(jn(E),0,a.length),p=ho(p),a.slice(E,E+p.length)==p}function M_(a,p,E){var I=z.templateSettings;E&&Ii(a,p,E)&&(p=i),a=yr(a),p=ua({},p,I,n1);var B=ua({},p.imports,I.imports,n1),G=q0(B),te=Eo(B,G),se,Ee,$e=0,Ke=p.interpolate||Nu,nt="__p += '",Ct=X0((p.escape||Nu).source+"|"+Ke.source+"|"+(Ke===xs?As:Nu).source+"|"+(p.evaluate||Nu).source+"|$","g"),Gt="//# sourceURL="+(or.call(p,"sourceURL")?(p.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++lf+"]")+` -`;a.replace(Ct,function(dn,Yn,er,vo,Pi,Mi){return er||(er=vo),nt+=a.slice($e,Mi).replace(Wo,Us),Yn&&(se=!0,nt+=`' + -__e(`+Yn+`) + -'`),Pi&&(Ee=!0,nt+=`'; -`+Pi+`; -__p += '`),er&&(nt+=`' + -((__t = (`+er+`)) == null ? '' : __t) + -'`),$e=Mi+dn.length,dn}),nt+=`'; -`;var an=or.call(p,"variable")&&p.variable;if(!an)nt=`with (obj) { -`+nt+` -} -`;else if(Ru.test(an))throw new mt(t);nt=(Ee?nt.replace(ll,""):nt).replace(fl,"$1").replace(cl,"$1;"),nt="function("+(an||"obj")+`) { -`+(an?"":`obj || (obj = {}); -`)+"var __t, __p = ''"+(se?", __e = _.escape":"")+(Ee?`, __j = Array.prototype.join; -function print() { __p += __j.call(arguments, '') } -`:`; -`)+nt+`return __p -}`;var qn=$p(function(){return wn(G,Gt+"return "+nt).apply(i,te)});if(qn.source=nt,k1(qn))throw qn;return qn}function F_(a){return yr(a).toLowerCase()}function L_(a){return yr(a).toUpperCase()}function R_(a,p,E){if(a=yr(a),a&&(E||p===i))return E0(a);if(!a||!(p=ho(p)))return a;var I=Jn(a),B=Jn(p),G=wl(I,B),te=js(I,B)+1;return Vs(I,G,te).join("")}function F1(a,p,E){if(a=yr(a),a&&(E||p===i))return a.slice(0,ai(a)+1);if(!a||!(p=ho(p)))return a;var I=Jn(a),B=js(I,Jn(p))+1;return Vs(I,0,B).join("")}function N_(a,p,E){if(a=yr(a),a&&(E||p===i))return a.replace(si,"");if(!a||!(p=ho(p)))return a;var I=Jn(a),B=wl(I,Jn(p));return Vs(I,B).join("")}function B_(a,p){var E=Oe,I=Le;if(Jr(p)){var B="separator"in p?p.separator:B;E="length"in p?jn(p.length):E,I="omission"in p?ho(p.omission):I}a=yr(a);var G=a.length;if(Hi(a)){var te=Jn(a);G=te.length}if(E>=G)return a;var se=E-Rr(I);if(se<1)return I;var Ee=te?Vs(te,0,se).join(""):a.slice(0,se);if(B===i)return Ee+I;if(te&&(se+=Ee.length-se),ra(B)){if(a.slice(se).search(B)){var $e,Ke=Ee;for(B.global||(B=X0(B.source,yr(uu.exec(B))+"g")),B.lastIndex=0;$e=B.exec(Ke);)var nt=$e.index;Ee=Ee.slice(0,nt===i?se:nt)}}else if(a.indexOf(ho(B),se)!=se){var Ct=Ee.lastIndexOf(B);Ct>-1&&(Ee=Ee.slice(0,Ct))}return Ee+I}function Vp(a){return a=yr(a),a&&Mr.test(a)?a.replace(al,o0):a}var j_=yf(function(a,p,E){return a+(E?" ":"")+p.toUpperCase()}),L1=Fd("toUpperCase");function Yp(a,p,E){return a=yr(a),p=E?i:p,p===i?qs(a)?cf(a):d0(a):a.match(p)||[]}var $p=Wn(function(a,p){try{return K(a,i,p)}catch(E){return k1(E)?E:new mt(E)}}),U_=yu(function(a,p){return je(p,function(E){E=Xo(E),ti(a,E,S1(a[E],a))}),a});function Kp(a){var p=a==null?0:a.length,E=cn();return a=p?lt(a,function(I){if(typeof I[1]!="function")throw new Yr(g);return[E(I[0]),I[1]]}):[],Wn(function(I){for(var B=-1;++BNt)return[];var E=ne,I=kn(a,ne);p=cn(p),a-=ne;for(var B=ci(I,p);++E0||p<0)?new nn(E):(a<0?E=E.takeRight(-a):a&&(E=E.drop(a)),p!==i&&(p=jn(p),E=p<0?E.dropRight(-p):E.take(p-a)),E)},nn.prototype.takeRightWhile=function(a){return this.reverse().takeWhile(a).reverse()},nn.prototype.toArray=function(){return this.take(ne)},S(nn.prototype,function(a,p){var E=/^(?:filter|find|map|reject)|While$/.test(p),I=/^(?:head|last)$/.test(p),B=z[I?"take"+(p=="last"?"Right":""):p],G=I||/^find/.test(p);!B||(z.prototype[p]=function(){var te=this.__wrapped__,se=I?[1]:arguments,Ee=te instanceof nn,$e=se[0],Ke=Ee||On(te),nt=function(Yn){var er=B.apply(z,Rt([Yn],se));return I&&Ct?er[0]:er};Ke&&E&&typeof $e=="function"&&$e.length!=1&&(Ee=Ke=!1);var Ct=this.__chain__,Gt=!!this.__actions__.length,an=G&&!Ct,qn=Ee&&!Gt;if(!G&&Ke){te=qn?te:new nn(this);var dn=a.apply(te,se);return dn.__actions__.push({func:Kc,args:[nt],thisArg:i}),new Qn(dn,Ct)}return an&&qn?a.apply(this,se):(dn=this.thru(nt),an?I?dn.value()[0]:dn.value():dn)})}),je(["pop","push","shift","sort","splice","unshift"],function(a){var p=$r[a],E=/^(?:push|sort|unshift)$/.test(a)?"tap":"thru",I=/^(?:pop|shift)$/.test(a);z.prototype[a]=function(){var B=arguments;if(I&&!this.__chain__){var G=this.value();return p.apply(On(G)?G:[],B)}return this[E](function(te){return p.apply(On(te)?te:[],B)})}}),S(nn.prototype,function(a,p){var E=z[p];if(E){var I=E.name+"";or.call(bt,I)||(bt[I]=[]),bt[I].push({name:p,func:E})}}),bt[zc(i,re).name]=[{name:"wrapper",func:i}],nn.prototype.clone=s0,nn.prototype.reverse=t0,nn.prototype.value=g0,z.prototype.at=Wv,z.prototype.chain=Hv,z.prototype.commit=bv,z.prototype.next=Gv,z.prototype.plant=Yv,z.prototype.reverse=Ml,z.prototype.toJSON=z.prototype.valueOf=z.prototype.value=Fl,z.prototype.first=z.prototype.head,u0&&(z.prototype[u0]=Vv),z},K0=$0();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Lr._=K0,define(function(){return K0})):R?((R.exports=K0)._=K0,F._=K0):Lr._=K0}).call(ga)});var ay=Me((XH,cy)=>{"use strict";var fr=cy.exports;cy.exports.default=fr;var Pr="[",t2="]",ya="\x07",vh=";",OD=process.env.TERM_PROGRAM==="Apple_Terminal";fr.cursorTo=(i,u)=>{if(typeof i!="number")throw new TypeError("The `x` argument is required");return typeof u!="number"?Pr+(i+1)+"G":Pr+(u+1)+";"+(i+1)+"H"};fr.cursorMove=(i,u)=>{if(typeof i!="number")throw new TypeError("The `x` argument is required");let f="";return i<0?f+=Pr+-i+"D":i>0&&(f+=Pr+i+"C"),u<0?f+=Pr+-u+"A":u>0&&(f+=Pr+u+"B"),f};fr.cursorUp=(i=1)=>Pr+i+"A";fr.cursorDown=(i=1)=>Pr+i+"B";fr.cursorForward=(i=1)=>Pr+i+"C";fr.cursorBackward=(i=1)=>Pr+i+"D";fr.cursorLeft=Pr+"G";fr.cursorSavePosition=OD?"7":Pr+"s";fr.cursorRestorePosition=OD?"8":Pr+"u";fr.cursorGetPosition=Pr+"6n";fr.cursorNextLine=Pr+"E";fr.cursorPrevLine=Pr+"F";fr.cursorHide=Pr+"?25l";fr.cursorShow=Pr+"?25h";fr.eraseLines=i=>{let u="";for(let f=0;f[t2,"8",vh,vh,u,ya,i,t2,"8",vh,vh,ya].join("");fr.image=(i,u={})=>{let f=`${t2}1337;File=inline=1`;return u.width&&(f+=`;width=${u.width}`),u.height&&(f+=`;height=${u.height}`),u.preserveAspectRatio===!1&&(f+=";preserveAspectRatio=0"),f+":"+i.toString("base64")+ya};fr.iTerm={setCwd:(i=process.cwd())=>`${t2}50;CurrentDir=${i}${ya}`,annotation:(i,u={})=>{let f=`${t2}1337;`,c=typeof u.x!="undefined",g=typeof u.y!="undefined";if((c||g)&&!(c&&g&&typeof u.length!="undefined"))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return i=i.replace(/\|/g,""),f+=u.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",u.length>0?f+=(c?[i,u.length,u.x,u.y]:[u.length,i]).join("|"):f+=i,f+ya}}});var PD=Me((JH,dy)=>{"use strict";var ID=(i,u)=>{for(let f of Reflect.ownKeys(u))Object.defineProperty(i,f,Object.getOwnPropertyDescriptor(u,f));return i};dy.exports=ID;dy.exports.default=ID});var FD=Me((QH,gh)=>{"use strict";var oN=PD(),_h=new WeakMap,MD=(i,u={})=>{if(typeof i!="function")throw new TypeError("Expected a function");let f,c=!1,g=0,t=i.displayName||i.name||"",C=function(...A){if(_h.set(C,++g),c){if(u.throw===!0)throw new Error(`Function \`${t}\` can only be called once`);return f}return c=!0,f=i.apply(this,A),i=null,f};return oN(C,i),_h.set(C,g),C};gh.exports=MD;gh.exports.default=MD;gh.exports.callCount=i=>{if(!_h.has(i))throw new Error(`The given function \`${i.name}\` is not wrapped by the \`onetime\` package`);return _h.get(i)}});var LD=Me((ZH,yh)=>{yh.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];process.platform!=="win32"&&yh.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&yh.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var vy=Me((eb,n2)=>{var uN=require("assert"),r2=LD(),sN=/^win/i.test(process.platform),wh=require("events");typeof wh!="function"&&(wh=wh.EventEmitter);var Bi;process.__signal_exit_emitter__?Bi=process.__signal_exit_emitter__:(Bi=process.__signal_exit_emitter__=new wh,Bi.count=0,Bi.emitted={});Bi.infinite||(Bi.setMaxListeners(Infinity),Bi.infinite=!0);n2.exports=function(i,u){uN.equal(typeof i,"function","a callback must be provided for exit handler"),i2===!1&&RD();var f="exit";u&&u.alwaysLast&&(f="afterexit");var c=function(){Bi.removeListener(f,i),Bi.listeners("exit").length===0&&Bi.listeners("afterexit").length===0&&py()};return Bi.on(f,i),c};n2.exports.unload=py;function py(){!i2||(i2=!1,r2.forEach(function(i){try{process.removeListener(i,hy[i])}catch(u){}}),process.emit=my,process.reallyExit=ND,Bi.count-=1)}function wa(i,u,f){Bi.emitted[i]||(Bi.emitted[i]=!0,Bi.emit(i,u,f))}var hy={};r2.forEach(function(i){hy[i]=function(){var f=process.listeners(i);f.length===Bi.count&&(py(),wa("exit",null,i),wa("afterexit",null,i),sN&&i==="SIGHUP"&&(i="SIGINT"),process.kill(process.pid,i))}});n2.exports.signals=function(){return r2};n2.exports.load=RD;var i2=!1;function RD(){i2||(i2=!0,Bi.count+=1,r2=r2.filter(function(i){try{return process.on(i,hy[i]),!0}catch(u){return!1}}),process.emit=fN,process.reallyExit=lN)}var ND=process.reallyExit;function lN(i){process.exitCode=i||0,wa("exit",process.exitCode,null),wa("afterexit",process.exitCode,null),ND.call(process,process.exitCode)}var my=process.emit;function fN(i,u){if(i==="exit"){u!==void 0&&(process.exitCode=u);var f=my.apply(this,arguments);return wa("exit",process.exitCode,null),wa("afterexit",process.exitCode,null),f}else return my.apply(this,arguments)}});var jD=Me((tb,BD)=>{"use strict";var cN=FD(),aN=vy();BD.exports=cN(()=>{aN(()=>{process.stderr.write("[?25h")},{alwaysLast:!0})})});var gy=Me(Da=>{"use strict";var dN=jD(),Dh=!1;Da.show=(i=process.stderr)=>{!i.isTTY||(Dh=!1,i.write("[?25h"))};Da.hide=(i=process.stderr)=>{!i.isTTY||(dN(),Dh=!0,i.write("[?25l"))};Da.toggle=(i,u)=>{i!==void 0&&(Dh=i),Dh?Da.show(u):Da.hide(u)}});var WD=Me(o2=>{"use strict";var UD=o2&&o2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(o2,"__esModule",{value:!0});var qD=UD(ay()),zD=UD(gy()),pN=(i,{showCursor:u=!1}={})=>{let f=0,c="",g=!1,t=C=>{!u&&!g&&(zD.default.hide(),g=!0);let A=C+` -`;A!==c&&(c=A,i.write(qD.default.eraseLines(f)+A),f=A.split(` -`).length)};return t.clear=()=>{i.write(qD.default.eraseLines(f)),c="",f=0},t.done=()=>{c="",f=0,u||(zD.default.show(),g=!1)},t};o2.default={create:pN}});var bD=Me((ib,HD)=>{HD.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY_BUILD_BASE",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}}]});var YD=Me(ru=>{"use strict";var GD=bD(),nl=process.env;Object.defineProperty(ru,"_vendors",{value:GD.map(function(i){return i.constant})});ru.name=null;ru.isPR=null;GD.forEach(function(i){var u=Array.isArray(i.env)?i.env:[i.env],f=u.every(function(c){return VD(c)});if(ru[i.constant]=f,f)switch(ru.name=i.name,typeof i.pr){case"string":ru.isPR=!!nl[i.pr];break;case"object":"env"in i.pr?ru.isPR=i.pr.env in nl&&nl[i.pr.env]!==i.pr.ne:"any"in i.pr?ru.isPR=i.pr.any.some(function(c){return!!nl[c]}):ru.isPR=VD(i.pr);break;default:ru.isPR=null}});ru.isCI=!!(nl.CI||nl.CONTINUOUS_INTEGRATION||nl.BUILD_NUMBER||nl.RUN_ID||ru.name);function VD(i){return typeof i=="string"?!!nl[i]:Object.keys(i).every(function(u){return nl[u]===i[u]})}});var KD=Me((ub,$D)=>{"use strict";$D.exports=YD().isCI});var JD=Me((sb,XD)=>{"use strict";var hN=i=>{let u=new Set;do for(let f of Reflect.ownKeys(i))u.add([i,f]);while((i=Reflect.getPrototypeOf(i))&&i!==Object.prototype);return u};XD.exports=(i,{include:u,exclude:f}={})=>{let c=g=>{let t=C=>typeof C=="string"?g===C:C.test(g);return u?u.some(t):f?!f.some(t):!0};for(let[g,t]of hN(i.constructor.prototype)){if(t==="constructor"||!c(t))continue;let C=Reflect.getOwnPropertyDescriptor(g,t);C&&typeof C.value=="function"&&(i[t]=i[t].bind(i))}return i}});var iE=Me(Sr=>{"use strict";Object.defineProperty(Sr,"__esModule",{value:!0});var Ea,u2,Eh,Sh,_y;typeof window=="undefined"||typeof MessageChannel!="function"?(Sa=null,yy=null,wy=function(){if(Sa!==null)try{var i=Sr.unstable_now();Sa(!0,i),Sa=null}catch(u){throw setTimeout(wy,0),u}},QD=Date.now(),Sr.unstable_now=function(){return Date.now()-QD},Ea=function(i){Sa!==null?setTimeout(Ea,0,i):(Sa=i,setTimeout(wy,0))},u2=function(i,u){yy=setTimeout(i,u)},Eh=function(){clearTimeout(yy)},Sh=function(){return!1},_y=Sr.unstable_forceFrameRate=function(){}):(Ch=window.performance,Dy=window.Date,ZD=window.setTimeout,eE=window.clearTimeout,typeof console!="undefined"&&(tE=window.cancelAnimationFrame,typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),typeof tE!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")),typeof Ch=="object"&&typeof Ch.now=="function"?Sr.unstable_now=function(){return Ch.now()}:(nE=Dy.now(),Sr.unstable_now=function(){return Dy.now()-nE}),s2=!1,l2=null,Th=-1,Ey=5,Sy=0,Sh=function(){return Sr.unstable_now()>=Sy},_y=function(){},Sr.unstable_forceFrameRate=function(i){0>i||125kh(C,f))x!==void 0&&0>kh(x,C)?(i[c]=x,i[A]=f,c=A):(i[c]=C,i[t]=f,c=t);else if(x!==void 0&&0>kh(x,f))i[c]=x,i[A]=f,c=A;else break e}}return u}return null}function kh(i,u){var f=i.sortIndex-u.sortIndex;return f!==0?f:i.id-u.id}var ds=[],Nf=[],mN=1,_o=null,to=3,Oh=!1,pc=!1,f2=!1;function Ih(i){for(var u=Iu(Nf);u!==null;){if(u.callback===null)Ah(Nf);else if(u.startTime<=i)Ah(Nf),u.sortIndex=u.expirationTime,Ty(ds,u);else break;u=Iu(Nf)}}function xy(i){if(f2=!1,Ih(i),!pc)if(Iu(ds)!==null)pc=!0,Ea(ky);else{var u=Iu(Nf);u!==null&&u2(xy,u.startTime-i)}}function ky(i,u){pc=!1,f2&&(f2=!1,Eh()),Oh=!0;var f=to;try{for(Ih(u),_o=Iu(ds);_o!==null&&(!(_o.expirationTime>u)||i&&!Sh());){var c=_o.callback;if(c!==null){_o.callback=null,to=_o.priorityLevel;var g=c(_o.expirationTime<=u);u=Sr.unstable_now(),typeof g=="function"?_o.callback=g:_o===Iu(ds)&&Ah(ds),Ih(u)}else Ah(ds);_o=Iu(ds)}if(_o!==null)var t=!0;else{var C=Iu(Nf);C!==null&&u2(xy,C.startTime-u),t=!1}return t}finally{_o=null,to=f,Oh=!1}}function rE(i){switch(i){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var vN=_y;Sr.unstable_ImmediatePriority=1;Sr.unstable_UserBlockingPriority=2;Sr.unstable_NormalPriority=3;Sr.unstable_IdlePriority=5;Sr.unstable_LowPriority=4;Sr.unstable_runWithPriority=function(i,u){switch(i){case 1:case 2:case 3:case 4:case 5:break;default:i=3}var f=to;to=i;try{return u()}finally{to=f}};Sr.unstable_next=function(i){switch(to){case 1:case 2:case 3:var u=3;break;default:u=to}var f=to;to=u;try{return i()}finally{to=f}};Sr.unstable_scheduleCallback=function(i,u,f){var c=Sr.unstable_now();if(typeof f=="object"&&f!==null){var g=f.delay;g=typeof g=="number"&&0c?(i.sortIndex=g,Ty(Nf,i),Iu(ds)===null&&i===Iu(Nf)&&(f2?Eh():f2=!0,u2(xy,g-c))):(i.sortIndex=f,Ty(ds,i),pc||Oh||(pc=!0,Ea(ky))),i};Sr.unstable_cancelCallback=function(i){i.callback=null};Sr.unstable_wrapCallback=function(i){var u=to;return function(){var f=to;to=u;try{return i.apply(this,arguments)}finally{to=f}}};Sr.unstable_getCurrentPriorityLevel=function(){return to};Sr.unstable_shouldYield=function(){var i=Sr.unstable_now();Ih(i);var u=Iu(ds);return u!==_o&&_o!==null&&u!==null&&u.callback!==null&&u.startTime<=i&&u.expirationTime<_o.expirationTime||Sh()};Sr.unstable_requestPaint=vN;Sr.unstable_continueExecution=function(){pc||Oh||(pc=!0,Ea(ky))};Sr.unstable_pauseExecution=function(){};Sr.unstable_getFirstCallbackNode=function(){return Iu(ds)};Sr.unstable_Profiling=null});var Ay=Me((fb,oE)=>{"use strict";oE.exports=iE()});var uE=Me((cb,c2)=>{c2.exports=function i(u){"use strict";var f=ey(),c=lr(),g=Ay();function t(v){for(var m="https://reactjs.org/docs/error-decoder.html?invariant="+v,S=1;Sqo||(v.current=qi[qo],qi[qo]=null,qo--)}function Fr(v,m){qo++,qi[qo]=v.current,v.current=m}var si={},H0={current:si},b0={current:!1},Bt=si;function Lu(v,m){var S=v.type.contextTypes;if(!S)return si;var O=v.stateNode;if(O&&O.__reactInternalMemoizedUnmaskedChildContext===m)return O.__reactInternalMemoizedMaskedChildContext;var M={},b;for(b in S)M[b]=m[b];return O&&(v=v.stateNode,v.__reactInternalMemoizedUnmaskedChildContext=m,v.__reactInternalMemoizedMaskedChildContext=M),M}function c0(v){return v=v.childContextTypes,v!=null}function Ru(v){kr(b0,v),kr(H0,v)}function ks(v){kr(b0,v),kr(H0,v)}function As(v,m,S){if(H0.current!==si)throw Error(t(168));Fr(H0,m,v),Fr(b0,S,v)}function uu(v,m,S){var O=v.stateNode;if(v=m.childContextTypes,typeof O.getChildContext!="function")return S;O=O.getChildContext();for(var M in O)if(!(M in v))throw Error(t(108,Oe(m)||"Unknown",M));return f({},S,{},O)}function wo(v){var m=v.stateNode;return m=m&&m.__reactInternalMemoizedMergedChildContext||si,Bt=H0.current,Fr(H0,m,v),Fr(b0,b0.current,v),!0}function zo(v,m,S){var O=v.stateNode;if(!O)throw Error(t(169));S?(m=uu(v,m,Bt),O.__reactInternalMemoizedMergedChildContext=m,kr(b0,v),kr(H0,v),Fr(H0,m,v)):kr(b0,v),Fr(b0,S,v)}var Os=g.unstable_runWithPriority,Is=g.unstable_scheduleCallback,uf=g.unstable_cancelCallback,_n=g.unstable_shouldYield,Nu=g.unstable_requestPaint,Wo=g.unstable_now,su=g.unstable_getCurrentPriorityLevel,Ps=g.unstable_ImmediatePriority,pl=g.unstable_UserBlockingPriority,Vf=g.unstable_NormalPriority,hl=g.unstable_LowPriority,Bu=g.unstable_IdlePriority,ju={},sf=Nu!==void 0?Nu:function(){},ro=null,Ms=null,ml=!1,Uu=Wo(),G0=1e4>Uu?Wo:function(){return Wo()-Uu};function Fs(){switch(su()){case Ps:return 99;case pl:return 98;case Vf:return 97;case hl:return 96;case Bu:return 95;default:throw Error(t(332))}}function tt(v){switch(v){case 99:return Ps;case 98:return pl;case 97:return Vf;case 96:return hl;case 95:return Bu;default:throw Error(t(332))}}function zi(v,m){return v=tt(v),Os(v,m)}function lu(v,m,S){return v=tt(v),Is(v,m,S)}function Ho(v){return ro===null?(ro=[v],Ms=Is(Ps,vl)):ro.push(v),ju}function O0(){if(Ms!==null){var v=Ms;Ms=null,uf(v)}vl()}function vl(){if(!ml&&ro!==null){ml=!0;var v=0;try{var m=ro;zi(99,function(){for(;v=m&&(ai=!0),v.firstContext=null)}function D0(v,m){if(zu!==v&&m!==!1&&m!==0)if((typeof m!="number"||m===1073741823)&&(zu=v,m=1073741823),m={context:v,observedBits:m,next:null},Wi===null){if(qu===null)throw Error(t(308));Wi=m,qu.dependencies={expirationTime:0,firstContext:m,responders:null}}else Wi=Wi.next=m;return Jt?v._currentValue:v._currentValue2}var Do=!1;function i0(v){return{baseState:v,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Rs(v){return{baseState:v.baseState,firstUpdate:v.firstUpdate,lastUpdate:v.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function a0(v,m){return{expirationTime:v,suspenseConfig:m,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function Hu(v,m){v.lastUpdate===null?v.firstUpdate=v.lastUpdate=m:(v.lastUpdate.next=m,v.lastUpdate=m)}function V0(v,m){var S=v.alternate;if(S===null){var O=v.updateQueue,M=null;O===null&&(O=v.updateQueue=i0(v.memoizedState))}else O=v.updateQueue,M=S.updateQueue,O===null?M===null?(O=v.updateQueue=i0(v.memoizedState),M=S.updateQueue=i0(S.memoizedState)):O=v.updateQueue=Rs(M):M===null&&(M=S.updateQueue=Rs(O));M===null||O===M?Hu(O,m):O.lastUpdate===null||M.lastUpdate===null?(Hu(O,m),Hu(M,m)):(Hu(O,m),M.lastUpdate=m)}function bu(v,m){var S=v.updateQueue;S=S===null?v.updateQueue=i0(v.memoizedState):Ns(v,S),S.lastCapturedUpdate===null?S.firstCapturedUpdate=S.lastCapturedUpdate=m:(S.lastCapturedUpdate.next=m,S.lastCapturedUpdate=m)}function Ns(v,m){var S=v.alternate;return S!==null&&m===S.updateQueue&&(m=v.updateQueue=Rs(m)),m}function bo(v,m,S,O,M,b){switch(S.tag){case 1:return v=S.payload,typeof v=="function"?v.call(b,O,M):v;case 3:v.effectTag=v.effectTag&-4097|64;case 0:if(v=S.payload,M=typeof v=="function"?v.call(b,O,M):v,M==null)break;return f({},O,M);case 2:Do=!0}return O}function P0(v,m,S,O,M){Do=!1,m=Ns(v,m);for(var b=m.baseState,ee=null,Ye=0,Ze=m.firstUpdate,ut=b;Ze!==null;){var In=Ze.expirationTime;Inpr?(Hr=mn,mn=null):Hr=mn.sibling;var Vn=jr(Re,mn,ze[pr],Et);if(Vn===null){mn===null&&(mn=Hr);break}v&&mn&&Vn.alternate===null&&m(Re,mn),Ce=b(Vn,Ce,pr),sr===null?on=Vn:sr.sibling=Vn,sr=Vn,mn=Hr}if(pr===ze.length)return S(Re,mn),on;if(mn===null){for(;prpr?(Hr=mn,mn=null):Hr=mn.sibling;var ni=jr(Re,mn,Vn.value,Et);if(ni===null){mn===null&&(mn=Hr);break}v&&mn&&ni.alternate===null&&m(Re,mn),Ce=b(ni,Ce,pr),sr===null?on=ni:sr.sibling=ni,sr=ni,mn=Hr}if(Vn.done)return S(Re,mn),on;if(mn===null){for(;!Vn.done;pr++,Vn=ze.next())Vn=A0(Re,Vn.value,Et),Vn!==null&&(Ce=b(Vn,Ce,pr),sr===null?on=Vn:sr.sibling=Vn,sr=Vn);return on}for(mn=O(Re,mn);!Vn.done;pr++,Vn=ze.next())Vn=gi(mn,Re,pr,Vn.value,Et),Vn!==null&&(v&&Vn.alternate!==null&&mn.delete(Vn.key===null?pr:Vn.key),Ce=b(Vn,Ce,pr),sr===null?on=Vn:sr.sibling=Vn,sr=Vn);return v&&mn.forEach(function(Zf){return m(Re,Zf)}),on}return function(Re,Ce,ze,Et){var on=typeof ze=="object"&&ze!==null&&ze.type===L&&ze.key===null;on&&(ze=ze.props.children);var sr=typeof ze=="object"&&ze!==null;if(sr)switch(ze.$$typeof){case x:e:{for(sr=ze.key,on=Ce;on!==null;){if(on.key===sr)if(on.tag===7?ze.type===L:on.elementType===ze.type){S(Re,on.sibling),Ce=M(on,ze.type===L?ze.props.children:ze.props,Et),Ce.ref=au(Re,on,ze),Ce.return=Re,Re=Ce;break e}else{S(Re,on);break}else m(Re,on);on=on.sibling}ze.type===L?(Ce=mi(ze.props.children,Re.mode,Et,ze.key),Ce.return=Re,Re=Ce):(Et=Hs(ze.type,ze.key,ze.props,null,Re.mode,Et),Et.ref=au(Re,Ce,ze),Et.return=Re,Re=Et)}return ee(Re);case D:e:{for(on=ze.key;Ce!==null;){if(Ce.key===on)if(Ce.tag===4&&Ce.stateNode.containerInfo===ze.containerInfo&&Ce.stateNode.implementation===ze.implementation){S(Re,Ce.sibling),Ce=M(Ce,ze.children||[],Et),Ce.return=Re,Re=Ce;break e}else{S(Re,Ce);break}else m(Re,Ce);Ce=Ce.sibling}Ce=Xf(ze,Re.mode,Et),Ce.return=Re,Re=Ce}return ee(Re)}if(typeof ze=="string"||typeof ze=="number")return ze=""+ze,Ce!==null&&Ce.tag===6?(S(Re,Ce.sibling),Ce=M(Ce,ze,Et),Ce.return=Re,Re=Ce):(S(Re,Ce),Ce=vi(ze,Re.mode,Et),Ce.return=Re,Re=Ce),ee(Re);if(M0(ze))return po(Re,Ce,ze,Et);if(J(ze))return _i(Re,Ce,ze,Et);if(sr&&Lr(Re,ze),typeof ze=="undefined"&&!on)switch(Re.tag){case 1:case 0:throw Re=Re.type,Error(t(152,Re.displayName||Re.name||"Component"))}return S(Re,Ce)}}var R=F(!0),U=F(!1),H={},fe={current:H},ue={current:H},de={current:H};function W(v){if(v===H)throw Error(t(174));return v}function ve(v,m){Fr(de,m,v),Fr(ue,v,v),Fr(fe,H,v),m=Ot(m),kr(fe,v),Fr(fe,m,v)}function Fe(v){kr(fe,v),kr(ue,v),kr(de,v)}function Ge(v){var m=W(de.current),S=W(fe.current);m=Nt(S,v.type,m),S!==m&&(Fr(ue,v,v),Fr(fe,m,v))}function K(v){ue.current===v&&(kr(fe,v),kr(ue,v))}var xe={current:0};function je(v){for(var m=v;m!==null;){if(m.tag===13){var S=m.memoizedState;if(S!==null&&(S=S.dehydrated,S===null||ll(S)||fl(S)))return m}else if(m.tag===19&&m.memoizedProps.revealOrder!==void 0){if((m.effectTag&64)!=0)return m}else if(m.child!==null){m.child.return=m,m=m.child;continue}if(m===v)break;for(;m.sibling===null;){if(m.return===null||m.return===v)return null;m=m.return}m.sibling.return=m.return,m=m.sibling}return null}function Xe(v,m){return{responder:v,props:m}}var rt=C.ReactCurrentDispatcher,st=C.ReactCurrentBatchConfig,xt=0,wt=null,lt=null,Rt=null,yn=null,sn=null,ar=null,rn=0,Hn=null,d0=0,Cr=!1,He=null,Qe=0;function Ne(){throw Error(t(321))}function ft(v,m){if(m===null)return!1;for(var S=0;Srn&&(rn=In,pf(rn))):(Yf(In,Ze.suspenseConfig),b=Ze.eagerReducer===v?Ze.eagerState:v(b,Ze.action)),ee=Ze,Ze=Ze.next}while(Ze!==null&&Ze!==O);ut||(Ye=ee,M=b),Sn(b,m.memoizedState)||(ai=!0),m.memoizedState=b,m.baseUpdate=Ye,m.baseState=M,S.lastRenderedState=b}return[m.memoizedState,S.dispatch]}function ci(v){var m=Cn();return typeof v=="function"&&(v=v()),m.memoizedState=m.baseState=v,v=m.queue={last:null,dispatch:null,lastRenderedReducer:p0,lastRenderedState:v},v=v.dispatch=Us.bind(null,wt,v),[m.memoizedState,v]}function xi(v){return h0(p0,v)}function E0(v,m,S,O){return v={tag:v,create:m,destroy:S,deps:O,next:null},Hn===null?(Hn={lastEffect:null},Hn.lastEffect=v.next=v):(m=Hn.lastEffect,m===null?Hn.lastEffect=v.next=v:(S=m.next,m.next=v,v.next=S,Hn.lastEffect=v)),v}function qr(v,m,S,O){var M=Cn();d0|=v,M.memoizedState=E0(m,S,void 0,O===void 0?null:O)}function Eo(v,m,S,O){var M=bn();O=O===void 0?null:O;var b=void 0;if(lt!==null){var ee=lt.memoizedState;if(b=ee.destroy,O!==null&&ft(O,ee.deps)){E0(0,S,b,O);return}}d0|=v,M.memoizedState=E0(m,S,b,O)}function So(v,m){return qr(516,192,v,m)}function wl(v,m){return Eo(516,192,v,m)}function js(v,m){if(typeof m=="function")return v=v(),m(v),function(){m(null)};if(m!=null)return v=v(),m.current=v,function(){m.current=null}}function Dl(){}function du(v,m){return Cn().memoizedState=[v,m===void 0?null:m],v}function Yu(v,m){var S=bn();m=m===void 0?null:m;var O=S.memoizedState;return O!==null&&m!==null&&ft(m,O[1])?O[0]:(S.memoizedState=[v,m],v)}function Us(v,m,S){if(!(25>Qe))throw Error(t(301));var O=v.alternate;if(v===wt||O!==null&&O===wt)if(Cr=!0,v={expirationTime:xt,suspenseConfig:null,action:S,eagerReducer:null,eagerState:null,next:null},He===null&&(He=new Map),S=He.get(m),S===void 0)He.set(m,v);else{for(m=S;m.next!==null;)m=m.next;m.next=v}else{var M=g0(),b=nr.suspense;M=Kr(M,v,b),b={expirationTime:M,suspenseConfig:b,action:S,eagerReducer:null,eagerState:null,next:null};var ee=m.last;if(ee===null)b.next=b;else{var Ye=ee.next;Ye!==null&&(b.next=Ye),ee.next=b}if(m.last=b,v.expirationTime===0&&(O===null||O.expirationTime===0)&&(O=m.lastRenderedReducer,O!==null))try{var Ze=m.lastRenderedState,ut=O(Ze,S);if(b.eagerReducer=O,b.eagerState=ut,Sn(ut,Ze))return}catch(In){}finally{}_0(v,M)}}var oo={readContext:D0,useCallback:Ne,useContext:Ne,useEffect:Ne,useImperativeHandle:Ne,useLayoutEffect:Ne,useMemo:Ne,useReducer:Ne,useRef:Ne,useState:Ne,useDebugValue:Ne,useResponder:Ne,useDeferredValue:Ne,useTransition:Ne},Hi={readContext:D0,useCallback:du,useContext:D0,useEffect:So,useImperativeHandle:function(v,m,S){return S=S!=null?S.concat([v]):null,qr(4,36,js.bind(null,m,v),S)},useLayoutEffect:function(v,m){return qr(4,36,v,m)},useMemo:function(v,m){var S=Cn();return m=m===void 0?null:m,v=v(),S.memoizedState=[v,m],v},useReducer:function(v,m,S){var O=Cn();return m=S!==void 0?S(m):m,O.memoizedState=O.baseState=m,v=O.queue={last:null,dispatch:null,lastRenderedReducer:v,lastRenderedState:m},v=v.dispatch=Us.bind(null,wt,v),[O.memoizedState,v]},useRef:function(v){var m=Cn();return v={current:v},m.memoizedState=v},useState:ci,useDebugValue:Dl,useResponder:Xe,useDeferredValue:function(v,m){var S=ci(v),O=S[0],M=S[1];return So(function(){g.unstable_next(function(){var b=st.suspense;st.suspense=m===void 0?null:m;try{M(v)}finally{st.suspense=b}})},[v,m]),O},useTransition:function(v){var m=ci(!1),S=m[0],O=m[1];return[du(function(M){O(!0),g.unstable_next(function(){var b=st.suspense;st.suspense=v===void 0?null:v;try{O(!1),M()}finally{st.suspense=b}})},[v,S]),S]}},qs={readContext:D0,useCallback:Yu,useContext:D0,useEffect:wl,useImperativeHandle:function(v,m,S){return S=S!=null?S.concat([v]):null,Eo(4,36,js.bind(null,m,v),S)},useLayoutEffect:function(v,m){return Eo(4,36,v,m)},useMemo:function(v,m){var S=bn();m=m===void 0?null:m;var O=S.memoizedState;return O!==null&&m!==null&&ft(m,O[1])?O[0]:(v=v(),S.memoizedState=[v,m],v)},useReducer:h0,useRef:function(){return bn().memoizedState},useState:xi,useDebugValue:Dl,useResponder:Xe,useDeferredValue:function(v,m){var S=xi(v),O=S[0],M=S[1];return wl(function(){g.unstable_next(function(){var b=st.suspense;st.suspense=m===void 0?null:m;try{M(v)}finally{st.suspense=b}})},[v,m]),O},useTransition:function(v){var m=xi(!1),S=m[0],O=m[1];return[Yu(function(M){O(!0),g.unstable_next(function(){var b=st.suspense;st.suspense=v===void 0?null:v;try{O(!1),M()}finally{st.suspense=b}})},[v,S]),S]}},F0=null,Gr=null,ir=!1;function L0(v,m){var S=xo(5,null,null,0);S.elementType="DELETED",S.type="DELETED",S.stateNode=m,S.return=v,S.effectTag=8,v.lastEffect!==null?(v.lastEffect.nextEffect=S,v.lastEffect=S):v.firstEffect=v.lastEffect=S}function Y0(v,m){switch(v.tag){case 5:return m=Ti(m,v.type,v.pendingProps),m!==null?(v.stateNode=m,!0):!1;case 6:return m=Fu(m,v.pendingProps),m!==null?(v.stateNode=m,!0):!1;case 13:return!1;default:return!1}}function Co(v){if(ir){var m=Gr;if(m){var S=m;if(!Y0(v,m)){if(m=cl(S),!m||!Y0(v,m)){v.effectTag=v.effectTag&-1025|2,ir=!1,F0=v;return}L0(F0,S)}F0=v,Gr=al(m)}else v.effectTag=v.effectTag&-1025|2,ir=!1,F0=v}}function $u(v){for(v=v.return;v!==null&&v.tag!==5&&v.tag!==3&&v.tag!==13;)v=v.return;F0=v}function Vo(v){if(!w||v!==F0)return!1;if(!ir)return $u(v),ir=!0,!1;var m=v.type;if(v.tag!==5||m!=="head"&&m!=="body"&&!at(m,v.memoizedProps))for(m=Gr;m;)L0(v,m),m=cl(m);if($u(v),v.tag===13){if(!w)throw Error(t(316));if(v=v.memoizedState,v=v!==null?v.dehydrated:null,!v)throw Error(t(317));Gr=Ac(v)}else Gr=F0?cl(v.stateNode):null;return!0}function Rr(){w&&(Gr=F0=null,ir=!1)}var Jn=C.ReactCurrentOwner,ai=!1;function o0(v,m,S,O){m.child=v===null?U(m,null,S,O):R(m,v.child,S,O)}function Vr(v,m,S,O,M){S=S.render;var b=m.ref;return io(m,M),O=St(v,m,S,O,b,M),v!==null&&!ai?(m.updateQueue=v.updateQueue,m.effectTag&=-517,v.expirationTime<=M&&(v.expirationTime=0),X0(v,m,M)):(m.effectTag|=1,o0(v,m,O,M),m.child)}function ff(v,m,S,O,M,b){if(v===null){var ee=S.type;return typeof ee=="function"&&!mf(ee)&&ee.defaultProps===void 0&&S.compare===null&&S.defaultProps===void 0?(m.tag=15,m.type=ee,cf(v,m,ee,O,M,b)):(v=Hs(S.type,null,O,null,m.mode,b),v.ref=m.ref,v.return=m,m.child=v)}return ee=v.child,Mm)&&Qn.set(v,m)))}}function Gi(v,m){v.expirationTimev?m:v)}function x0(v){if(v.lastExpiredTime!==0)v.callbackExpirationTime=1073741823,v.callbackPriority=99,v.callbackNode=Ho(Z0.bind(null,v));else{var m=fo(v),S=v.callbackNode;if(m===0)S!==null&&(v.callbackNode=null,v.callbackExpirationTime=0,v.callbackPriority=90);else{var O=g0();if(m===1073741823?O=99:m===1||m===2?O=95:(O=10*(1073741821-m)-10*(1073741821-O),O=0>=O?99:250>=O?98:5250>=O?97:95),S!==null){var M=v.callbackPriority;if(v.callbackExpirationTime===m&&M>=O)return;S!==ju&&uf(S)}v.callbackExpirationTime=m,v.callbackPriority=O,m=m===1073741823?Ho(Z0.bind(null,v)):lu(O,Xu.bind(null,v),{timeout:10*(1073741821-m)-G0()}),v.callbackNode=m}}}function Xu(v,m){if(t0=0,m)return m=g0(),kl(v,m),x0(v),null;var S=fo(v);if(S!==0){if(m=v.callbackNode,(Kt&(Br|zr))!==Fn)throw Error(t(327));if(Ws(),v===X&&S===ye||mu(v,S),Y!==null){var O=Kt;Kt|=Br;var M=ei(v);do try{Ua();break}catch(Ye){Ju(v,Ye)}while(1);if(Wu(),Kt=O,B0.current=M,he===wr)throw m=We,mu(v,S),ao(v,S),x0(v),m;if(Y===null)switch(M=v.finishedWork=v.current.alternate,v.finishedExpirationTime=S,O=he,X=null,O){case lo:case wr:throw Error(t(345));case kn:kl(v,2=S){v.lastPingedTime=S,mu(v,S);break}}if(b=fo(v),b!==0&&b!==S)break;if(O!==0&&O!==S){v.lastPingedTime=O;break}v.timeoutHandle=jt(gu.bind(null,v),M);break}gu(v);break;case hi:if(ao(v,S),O=v.lastSuspendedTime,S===O&&(v.nextKnownPendingLevel=$f(M)),qt&&(M=v.lastPingedTime,M===0||M>=S)){v.lastPingedTime=S,mu(v,S);break}if(M=fo(v),M!==0&&M!==S)break;if(O!==0&&O!==S){v.lastPingedTime=O;break}if(Dt!==1073741823?O=10*(1073741821-Dt)-G0():et===1073741823?O=0:(O=10*(1073741821-et)-5e3,M=G0(),S=10*(1073741821-S)-M,O=M-O,0>O&&(O=0),O=(120>O?120:480>O?480:1080>O?1080:1920>O?1920:3e3>O?3e3:4320>O?4320:1960*Cl(O/1960))-O,S=O?O=0:(M=ee.busyDelayMs|0,b=G0()-(10*(1073741821-b)-(ee.timeoutMs|0||5e3)),O=b<=M?0:M+O-b),10 component higher in the tree to provide a loading indicator or placeholder to display.`+dl(M))}he!==Ai&&(he=kn),b=zs(b,M),Ze=O;do{switch(Ze.tag){case 3:ee=b,Ze.effectTag|=4096,Ze.expirationTime=m;var Ce=pu(Ze,ee,m);bu(Ze,Ce);break e;case 1:ee=b;var ze=Ze.type,Et=Ze.stateNode;if((Ze.effectTag&64)==0&&(typeof ze.getDerivedStateFromError=="function"||Et!==null&&typeof Et.componentDidCatch=="function"&&(Ar===null||!Ar.has(Et)))){Ze.effectTag|=4096,Ze.expirationTime=m;var on=Sl(Ze,ee,m);bu(Ze,on);break e}}Ze=Ze.return}while(Ze!==null)}Y=vu(Y)}catch(sr){m=sr;continue}break}while(1)}function ei(){var v=B0.current;return B0.current=oo,v===null?oo:v}function Yf(v,m){vZt&&(Zt=v)}function ja(){for(;Y!==null;)Y=Ic(Y)}function Ua(){for(;Y!==null&&!_n();)Y=Ic(Y)}function Ic(v){var m=Lc(v.alternate,v,ye);return v.memoizedProps=v.pendingProps,m===null&&(m=vu(v)),hu.current=null,m}function vu(v){Y=v;do{var m=Y.alternate;if(v=Y.return,(Y.effectTag&2048)==0){e:{var S=m;m=Y;var O=ye,M=m.pendingProps;switch(m.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:c0(m.type)&&Ru(m);break;case 3:Fe(m),ks(m),M=m.stateNode,M.pendingContext&&(M.context=M.pendingContext,M.pendingContext=null),(S===null||S.child===null)&&Vo(m)&&ki(m),$r(m);break;case 5:K(m);var b=W(de.current);if(O=m.type,S!==null&&m.stateNode!=null)m0(S,m,O,M,b),S.ref!==m.ref&&(m.effectTag|=128);else if(M){if(S=W(fe.current),Vo(m)){if(M=m,!w)throw Error(t(175));S=Ui(M.stateNode,M.type,M.memoizedProps,b,S,M),M.updateQueue=S,S=S!==null,S&&ki(m)}else{var ee=ne(O,M,b,S,m);Yr(ee,m,!1,!1),m.stateNode=ee,Z(ee,O,M,b,S)&&ki(m)}m.ref!==null&&(m.effectTag|=128)}else if(m.stateNode===null)throw Error(t(166));break;case 6:if(S&&m.stateNode!=null)Tn(S,m,S.memoizedProps,M);else{if(typeof M!="string"&&m.stateNode===null)throw Error(t(166));if(S=W(de.current),b=W(fe.current),Vo(m)){if(S=m,!w)throw Error(t(176));(S=Mr(S.stateNode,S.memoizedProps,S))&&ki(m)}else m.stateNode=Ft(M,S,b,m)}break;case 11:break;case 13:if(kr(xe,m),M=m.memoizedState,(m.effectTag&64)!=0){m.expirationTime=O;break e}M=M!==null,b=!1,S===null?m.memoizedProps.fallback!==void 0&&Vo(m):(O=S.memoizedState,b=O!==null,M||O===null||(O=S.child.sibling,O!==null&&(ee=m.firstEffect,ee!==null?(m.firstEffect=O,O.nextEffect=ee):(m.firstEffect=m.lastEffect=O,O.nextEffect=null),O.effectTag=8))),M&&!b&&(m.mode&2)!=0&&(S===null&&m.memoizedProps.unstable_avoidThisFallback!==!0||(xe.current&1)!=0?he===lo&&(he=T0):((he===lo||he===T0)&&(he=hi),Zt!==0&&X!==null&&(ao(X,ye),$o(X,Zt)))),cr&&M&&(m.effectTag|=4),Yt&&(M||b)&&(m.effectTag|=4);break;case 7:break;case 8:break;case 12:break;case 4:Fe(m),$r(m);break;case 10:fi(m);break;case 9:break;case 14:break;case 17:c0(m.type)&&Ru(m);break;case 19:if(kr(xe,m),M=m.memoizedState,M===null)break;if(b=(m.effectTag&64)!=0,ee=M.rendering,ee===null){if(b)bi(M,!1);else if(he!==lo||S!==null&&(S.effectTag&64)!=0)for(S=m.child;S!==null;){if(ee=je(S),ee!==null){for(m.effectTag|=64,bi(M,!1),S=ee.updateQueue,S!==null&&(m.updateQueue=S,m.effectTag|=4),M.lastEffect===null&&(m.firstEffect=null),m.lastEffect=M.lastEffect,S=O,M=m.child;M!==null;)b=M,O=S,b.effectTag&=2,b.nextEffect=null,b.firstEffect=null,b.lastEffect=null,ee=b.alternate,ee===null?(b.childExpirationTime=0,b.expirationTime=O,b.child=null,b.memoizedProps=null,b.memoizedState=null,b.updateQueue=null,b.dependencies=null):(b.childExpirationTime=ee.childExpirationTime,b.expirationTime=ee.expirationTime,b.child=ee.child,b.memoizedProps=ee.memoizedProps,b.memoizedState=ee.memoizedState,b.updateQueue=ee.updateQueue,O=ee.dependencies,b.dependencies=O===null?null:{expirationTime:O.expirationTime,firstContext:O.firstContext,responders:O.responders}),M=M.sibling;Fr(xe,xe.current&1|2,m),m=m.child;break e}S=S.sibling}}else{if(!b)if(S=je(ee),S!==null){if(m.effectTag|=64,b=!0,S=S.updateQueue,S!==null&&(m.updateQueue=S,m.effectTag|=4),bi(M,!0),M.tail===null&&M.tailMode==="hidden"&&!ee.alternate){m=m.lastEffect=M.lastEffect,m!==null&&(m.nextEffect=null);break}}else G0()>M.tailExpiration&&1M&&(M=O),ee>M&&(M=ee),b=b.sibling;S.childExpirationTime=M}if(m!==null)return m;v!==null&&(v.effectTag&2048)==0&&(v.firstEffect===null&&(v.firstEffect=Y.firstEffect),Y.lastEffect!==null&&(v.lastEffect!==null&&(v.lastEffect.nextEffect=Y.firstEffect),v.lastEffect=Y.lastEffect),1v?m:v}function gu(v){var m=Fs();return zi(99,co.bind(null,v,m)),null}function co(v,m){do Ws();while(dr!==null);if((Kt&(Br|zr))!==Fn)throw Error(t(327));var S=v.finishedWork,O=v.finishedExpirationTime;if(S===null)return null;if(v.finishedWork=null,v.finishedExpirationTime=0,S===v.current)throw Error(t(177));v.callbackNode=null,v.callbackExpirationTime=0,v.callbackPriority=90,v.nextKnownPendingLevel=0;var M=$f(S);if(v.firstPendingTime=M,O<=v.lastSuspendedTime?v.firstSuspendedTime=v.lastSuspendedTime=v.nextKnownPendingLevel=0:O<=v.firstSuspendedTime&&(v.firstSuspendedTime=O-1),O<=v.lastPingedTime&&(v.lastPingedTime=0),O<=v.lastExpiredTime&&(v.lastExpiredTime=0),v===X&&(Y=X=null,ye=0),1=S?mt(v,m,S):(Fr(xe,xe.current&1,m),m=X0(v,m,S),m!==null?m.sibling:null);Fr(xe,xe.current&1,m);break;case 19:if(O=m.childExpirationTime>=S,(v.effectTag&64)!=0){if(O)return $t(v,m,S);m.effectTag|=64}if(M=m.memoizedState,M!==null&&(M.rendering=null,M.tail=null),Fr(xe,xe.current,m),!O)return null}return X0(v,m,S)}ai=!1}}else ai=!1;switch(m.expirationTime=0,m.tag){case 2:if(O=m.type,v!==null&&(v.alternate=null,m.alternate=null,m.effectTag|=2),v=m.pendingProps,M=Lu(m,H0.current),io(m,S),M=St(null,m,O,v,M,S),m.effectTag|=1,typeof M=="object"&&M!==null&&typeof M.render=="function"&&M.$$typeof===void 0){if(m.tag=1,Qt(),c0(O)){var b=!0;wo(m)}else b=!1;m.memoizedState=M.state!==null&&M.state!==void 0?M.state:null;var ee=O.getDerivedStateFromProps;typeof ee=="function"&&Go(m,O,ee,v),M.updater=Gu,m.stateNode=M,M._reactInternalFiber=m,Vu(m,O,v,S),m=Be(null,m,O,!0,b,S)}else m.tag=0,o0(null,m,M,S),m=m.child;return m;case 16:if(M=m.elementType,v!==null&&(v.alternate=null,m.alternate=null,m.effectTag|=2),v=m.pendingProps,Te(M),M._status!==1)throw M._result;switch(M=M._result,m.type=M,b=m.tag=Wa(M),v=I0(M,v),b){case 0:m=K0(null,m,M,v,S);break;case 1:m=ae(null,m,M,v,S);break;case 11:m=Vr(null,m,M,v,S);break;case 14:m=ff(null,m,M,I0(M.type,v),O,S);break;default:throw Error(t(306,M,""))}return m;case 0:return O=m.type,M=m.pendingProps,M=m.elementType===O?M:I0(O,M),K0(v,m,O,M,S);case 1:return O=m.type,M=m.pendingProps,M=m.elementType===O?M:I0(O,M),ae(v,m,O,M,S);case 3:if(Ie(m),O=m.updateQueue,O===null)throw Error(t(282));if(M=m.memoizedState,M=M!==null?M.element:null,P0(m,O,m.pendingProps,null,S),O=m.memoizedState.element,O===M)Rr(),m=X0(v,m,S);else{if((M=m.stateNode.hydrate)&&(w?(Gr=al(m.stateNode.containerInfo),F0=m,M=ir=!0):M=!1),M)for(S=U(m,null,O,S),m.child=S;S;)S.effectTag=S.effectTag&-3|1024,S=S.sibling;else o0(v,m,O,S),Rr();m=m.child}return m;case 5:return Ge(m),v===null&&Co(m),O=m.type,M=m.pendingProps,b=v!==null?v.memoizedProps:null,ee=M.children,at(O,M)?ee=null:b!==null&&at(O,b)&&(m.effectTag|=16),$0(v,m),m.mode&4&&S!==1&&it(O,M)?(m.expirationTime=m.childExpirationTime=1,m=null):(o0(v,m,ee,S),m=m.child),m;case 6:return v===null&&Co(m),null;case 13:return mt(v,m,S);case 4:return ve(m,m.stateNode.containerInfo),O=m.pendingProps,v===null?m.child=R(m,null,O,S):o0(v,m,O,S),m.child;case 11:return O=m.type,M=m.pendingProps,M=m.elementType===O?M:I0(O,M),Vr(v,m,O,M,S);case 7:return o0(v,m,m.pendingProps,S),m.child;case 8:return o0(v,m,m.pendingProps.children,S),m.child;case 12:return o0(v,m,m.pendingProps.children,S),m.child;case 10:e:{if(O=m.type._context,M=m.pendingProps,ee=m.memoizedProps,b=M.value,Ls(m,b),ee!==null){var Ye=ee.value;if(b=Sn(Ye,b)?0:(typeof O._calculateChangedBits=="function"?O._calculateChangedBits(Ye,b):1073741823)|0,b===0){if(ee.children===M.children&&!b0.current){m=X0(v,m,S);break e}}else for(Ye=m.child,Ye!==null&&(Ye.return=m);Ye!==null;){var Ze=Ye.dependencies;if(Ze!==null){ee=Ye.child;for(var ut=Ze.firstContext;ut!==null;){if(ut.context===O&&(ut.observedBits&b)!=0){Ye.tag===1&&(ut=a0(S,null),ut.tag=2,V0(Ye,ut)),Ye.expirationTime=m&&v<=m}function ao(v,m){var S=v.firstSuspendedTime,O=v.lastSuspendedTime;Sm||S===0)&&(v.lastSuspendedTime=m),m<=v.lastPingedTime&&(v.lastPingedTime=0),m<=v.lastExpiredTime&&(v.lastExpiredTime=0)}function $o(v,m){m>v.firstPendingTime&&(v.firstPendingTime=m);var S=v.firstSuspendedTime;S!==0&&(m>=S?v.firstSuspendedTime=v.lastSuspendedTime=v.nextKnownPendingLevel=0:m>=v.lastSuspendedTime&&(v.lastSuspendedTime=m+1),m>v.nextKnownPendingLevel&&(v.nextKnownPendingLevel=m))}function kl(v,m){var S=v.lastExpiredTime;(S===0||S>m)&&(v.lastExpiredTime=m)}function Nc(v){var m=v._reactInternalFiber;if(m===void 0)throw typeof v.render=="function"?Error(t(188)):Error(t(268,Object.keys(v)));return v=Ue(m),v===null?null:v.stateNode}function Al(v,m){v=v.memoizedState,v!==null&&v.dehydrated!==null&&v.retryTime{"use strict";sE.exports=uE()});var cE=Me((db,fE)=>{"use strict";var gN={ALIGN_COUNT:8,ALIGN_AUTO:0,ALIGN_FLEX_START:1,ALIGN_CENTER:2,ALIGN_FLEX_END:3,ALIGN_STRETCH:4,ALIGN_BASELINE:5,ALIGN_SPACE_BETWEEN:6,ALIGN_SPACE_AROUND:7,DIMENSION_COUNT:2,DIMENSION_WIDTH:0,DIMENSION_HEIGHT:1,DIRECTION_COUNT:3,DIRECTION_INHERIT:0,DIRECTION_LTR:1,DIRECTION_RTL:2,DISPLAY_COUNT:2,DISPLAY_FLEX:0,DISPLAY_NONE:1,EDGE_COUNT:9,EDGE_LEFT:0,EDGE_TOP:1,EDGE_RIGHT:2,EDGE_BOTTOM:3,EDGE_START:4,EDGE_END:5,EDGE_HORIZONTAL:6,EDGE_VERTICAL:7,EDGE_ALL:8,EXPERIMENTAL_FEATURE_COUNT:1,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:0,FLEX_DIRECTION_COUNT:4,FLEX_DIRECTION_COLUMN:0,FLEX_DIRECTION_COLUMN_REVERSE:1,FLEX_DIRECTION_ROW:2,FLEX_DIRECTION_ROW_REVERSE:3,JUSTIFY_COUNT:6,JUSTIFY_FLEX_START:0,JUSTIFY_CENTER:1,JUSTIFY_FLEX_END:2,JUSTIFY_SPACE_BETWEEN:3,JUSTIFY_SPACE_AROUND:4,JUSTIFY_SPACE_EVENLY:5,LOG_LEVEL_COUNT:6,LOG_LEVEL_ERROR:0,LOG_LEVEL_WARN:1,LOG_LEVEL_INFO:2,LOG_LEVEL_DEBUG:3,LOG_LEVEL_VERBOSE:4,LOG_LEVEL_FATAL:5,MEASURE_MODE_COUNT:3,MEASURE_MODE_UNDEFINED:0,MEASURE_MODE_EXACTLY:1,MEASURE_MODE_AT_MOST:2,NODE_TYPE_COUNT:2,NODE_TYPE_DEFAULT:0,NODE_TYPE_TEXT:1,OVERFLOW_COUNT:3,OVERFLOW_VISIBLE:0,OVERFLOW_HIDDEN:1,OVERFLOW_SCROLL:2,POSITION_TYPE_COUNT:2,POSITION_TYPE_RELATIVE:0,POSITION_TYPE_ABSOLUTE:1,PRINT_OPTIONS_COUNT:3,PRINT_OPTIONS_LAYOUT:1,PRINT_OPTIONS_STYLE:2,PRINT_OPTIONS_CHILDREN:4,UNIT_COUNT:4,UNIT_UNDEFINED:0,UNIT_POINT:1,UNIT_PERCENT:2,UNIT_AUTO:3,WRAP_COUNT:3,WRAP_NO_WRAP:0,WRAP_WRAP:1,WRAP_WRAP_REVERSE:2};fE.exports=gN});var hE=Me((pb,aE)=>{"use strict";var _N=Object.assign||function(i){for(var u=1;u"}}]),i}(),dE=function(){Ph(i,null,[{key:"fromJS",value:function(f){var c=f.width,g=f.height;return new i(c,g)}}]);function i(u,f){Iy(this,i),this.width=u,this.height=f}return Ph(i,[{key:"fromJS",value:function(f){f(this.width,this.height)}},{key:"toString",value:function(){return""}}]),i}(),pE=function(){function i(u,f){Iy(this,i),this.unit=u,this.value=f}return Ph(i,[{key:"fromJS",value:function(f){f(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case ps.UNIT_POINT:return String(this.value);case ps.UNIT_PERCENT:return this.value+"%";case ps.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),i}();aE.exports=function(i,u){function f(C,A,x){var D=C[A];C[A]=function(){for(var L=arguments.length,N=Array(L),j=0;j1?N-1:0),$=1;$1&&arguments[1]!==void 0?arguments[1]:NaN,x=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,D=arguments.length>3&&arguments[3]!==void 0?arguments[3]:ps.DIRECTION_LTR;return C.call(this,A,x,D)}),_N({Config:u.Config,Node:u.Node,Layout:i("Layout",yN),Size:i("Size",dE),Value:i("Value",pE),getInstanceCount:function(){return u.getInstanceCount.apply(u,arguments)}},ps)}});var mE=Me((exports,module)=>{(function(i,u){typeof define=="function"&&define.amd?define([],function(){return u}):typeof module=="object"&&module.exports?module.exports=u:(i.nbind=i.nbind||{}).init=u})(exports,function(Module,cb){typeof Module=="function"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(i,u){return function(){i&&i.apply(this,arguments);try{Module.ccall("nbind_init")}catch(f){u(f);return}u(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module!="undefined"?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT==="WEB")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT==="WORKER")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT==="NODE")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT==="SHELL")ENVIRONMENT_IS_SHELL=!0;else throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof importScripts=="function",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof require=="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn);var nodeFS,nodePath;Module.read=function(u,f){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),u=nodePath.normalize(u);var c=nodeFS.readFileSync(u);return f?c:c.toString()},Module.readBinary=function(u){var f=Module.read(u,!0);return f.buffer||(f=new Uint8Array(f)),assert(f.buffer),f},Module.load=function(u){globalEval(read(u))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),typeof module!="undefined"&&(module.exports=Module),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr!="undefined"&&(Module.printErr=printErr),typeof read!="undefined"?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(u){if(typeof readbuffer=="function")return new Uint8Array(readbuffer(u));var f=read(u,"binary");return assert(typeof f=="object"),f},typeof scriptArgs!="undefined"?Module.arguments=scriptArgs:typeof arguments!="undefined"&&(Module.arguments=arguments),typeof quit=="function"&&(Module.quit=function(i,u){quit(i)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(u){var f=new XMLHttpRequest;return f.open("GET",u,!1),f.send(null),f.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(u){var f=new XMLHttpRequest;return f.open("GET",u,!1),f.responseType="arraybuffer",f.send(null),new Uint8Array(f.response)}),Module.readAsync=function(u,f,c){var g=new XMLHttpRequest;g.open("GET",u,!0),g.responseType="arraybuffer",g.onload=function(){g.status==200||g.status==0&&g.response?f(g.response):c()},g.onerror=c,g.send(null)},typeof arguments!="undefined"&&(Module.arguments=arguments),typeof console!="undefined")Module.print||(Module.print=function(u){console.log(u)}),Module.printErr||(Module.printErr=function(u){console.warn(u)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump!="undefined"?function(i){dump(i)}:function(i){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle=="undefined"&&(Module.setWindowTitle=function(i){document.title=i})}else throw"Unknown runtime environment. Where are we?";function globalEval(i){eval.call(null,i)}!Module.load&&Module.read&&(Module.load=function(u){globalEval(Module.read(u))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.quit||(Module.quit=function(i,u){throw u}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(i){return tempRet0=i,i},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(i){STACKTOP=i},getNativeTypeSize:function(i){switch(i){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(i[i.length-1]==="*")return Runtime.QUANTUM_SIZE;if(i[0]==="i"){var u=parseInt(i.substr(1));return assert(u%8==0),u/8}else return 0}}},getNativeFieldSize:function(i){return Math.max(Runtime.getNativeTypeSize(i),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(i,u){return u==="double"||u==="i64"?i&7&&(assert((i&7)==4),i+=4):assert((i&3)==0),i},getAlignSize:function(i,u,f){return!f&&(i=="i64"||i=="double")?8:i?Math.min(u||(i?Runtime.getNativeFieldSize(i):0),Runtime.QUANTUM_SIZE):Math.min(u,8)},dynCall:function(i,u,f){return f&&f.length?Module["dynCall_"+i].apply(null,[u].concat(f)):Module["dynCall_"+i].call(null,u)},functionPointers:[],addFunction:function(i){for(var u=0;u>2],f=(u+i+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=f,f>=TOTAL_MEMORY){var c=enlargeMemory();if(!c)return HEAP32[DYNAMICTOP_PTR>>2]=u,0}return u},alignMemory:function(i,u){var f=i=Math.ceil(i/(u||16))*(u||16);return f},makeBigInt:function(i,u,f){var c=f?+(i>>>0)+ +(u>>>0)*4294967296:+(i>>>0)+ +(u|0)*4294967296;return c},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(i,u){i||abort("Assertion failed: "+u)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(i){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(i){var u=Runtime.stackAlloc(i.length);return writeArrayToMemory(i,u),u},stringToC:function(i){var u=0;if(i!=null&&i!==0){var f=(i.length<<2)+1;u=Runtime.stackAlloc(f),stringToUTF8(i,u,f)}return u}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(u,f,c,g,t){var C=getCFunc(u),A=[],x=0;if(g)for(var D=0;D>0]=u;break;case"i8":HEAP8[i>>0]=u;break;case"i16":HEAP16[i>>1]=u;break;case"i32":HEAP32[i>>2]=u;break;case"i64":tempI64=[u>>>0,(tempDouble=u,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[i>>2]=tempI64[0],HEAP32[i+4>>2]=tempI64[1];break;case"float":HEAPF32[i>>2]=u;break;case"double":HEAPF64[i>>3]=u;break;default:abort("invalid type for setValue: "+f)}}Module.setValue=setValue;function getValue(i,u,f){switch(u=u||"i8",u.charAt(u.length-1)==="*"&&(u="i32"),u){case"i1":return HEAP8[i>>0];case"i8":return HEAP8[i>>0];case"i16":return HEAP16[i>>1];case"i32":return HEAP32[i>>2];case"i64":return HEAP32[i>>2];case"float":return HEAPF32[i>>2];case"double":return HEAPF64[i>>3];default:abort("invalid type for setValue: "+u)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE;function allocate(i,u,f,c){var g,t;typeof i=="number"?(g=!0,t=i):(g=!1,t=i.length);var C=typeof u=="string"?u:null,A;if(f==ALLOC_NONE?A=c:A=[typeof _malloc=="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][f===void 0?ALLOC_STATIC:f](Math.max(t,C?1:u.length)),g){var c=A,x;for(assert((A&3)==0),x=A+(t&~3);c>2]=0;for(x=A+t;c>0]=0;return A}if(C==="i8")return i.subarray||i.slice?HEAPU8.set(i,A):HEAPU8.set(new Uint8Array(i),A),A;for(var D=0,L,N,j;D>0],f|=c,!(c==0&&!u||(g++,u&&g==u)););u||(u=g);var t="";if(f<128){for(var C=1024,A;u>0;)A=String.fromCharCode.apply(String,HEAPU8.subarray(i,i+Math.min(u,C))),t=t?t+A:A,i+=C,u-=C;return t}return Module.UTF8ToString(i)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(i){for(var u="";;){var f=HEAP8[i++>>0];if(!f)return u;u+=String.fromCharCode(f)}}Module.AsciiToString=AsciiToString;function stringToAscii(i,u){return writeAsciiToMemory(i,u,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(i,u){for(var f=u;i[f];)++f;if(f-u>16&&i.subarray&&UTF8Decoder)return UTF8Decoder.decode(i.subarray(u,f));for(var c,g,t,C,A,x,D="";;){if(c=i[u++],!c)return D;if(!(c&128)){D+=String.fromCharCode(c);continue}if(g=i[u++]&63,(c&224)==192){D+=String.fromCharCode((c&31)<<6|g);continue}if(t=i[u++]&63,(c&240)==224?c=(c&15)<<12|g<<6|t:(C=i[u++]&63,(c&248)==240?c=(c&7)<<18|g<<12|t<<6|C:(A=i[u++]&63,(c&252)==248?c=(c&3)<<24|g<<18|t<<12|C<<6|A:(x=i[u++]&63,c=(c&1)<<30|g<<24|t<<18|C<<12|A<<6|x))),c<65536)D+=String.fromCharCode(c);else{var L=c-65536;D+=String.fromCharCode(55296|L>>10,56320|L&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(i){return UTF8ArrayToString(HEAPU8,i)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(i,u,f,c){if(!(c>0))return 0;for(var g=f,t=f+c-1,C=0;C=55296&&A<=57343&&(A=65536+((A&1023)<<10)|i.charCodeAt(++C)&1023),A<=127){if(f>=t)break;u[f++]=A}else if(A<=2047){if(f+1>=t)break;u[f++]=192|A>>6,u[f++]=128|A&63}else if(A<=65535){if(f+2>=t)break;u[f++]=224|A>>12,u[f++]=128|A>>6&63,u[f++]=128|A&63}else if(A<=2097151){if(f+3>=t)break;u[f++]=240|A>>18,u[f++]=128|A>>12&63,u[f++]=128|A>>6&63,u[f++]=128|A&63}else if(A<=67108863){if(f+4>=t)break;u[f++]=248|A>>24,u[f++]=128|A>>18&63,u[f++]=128|A>>12&63,u[f++]=128|A>>6&63,u[f++]=128|A&63}else{if(f+5>=t)break;u[f++]=252|A>>30,u[f++]=128|A>>24&63,u[f++]=128|A>>18&63,u[f++]=128|A>>12&63,u[f++]=128|A>>6&63,u[f++]=128|A&63}}return u[f]=0,f-g}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(i,u,f){return stringToUTF8Array(i,HEAPU8,u,f)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(i){for(var u=0,f=0;f=55296&&c<=57343&&(c=65536+((c&1023)<<10)|i.charCodeAt(++f)&1023),c<=127?++u:c<=2047?u+=2:c<=65535?u+=3:c<=2097151?u+=4:c<=67108863?u+=5:u+=6}return u}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):void 0;function demangle(i){var u=Module.___cxa_demangle||Module.__cxa_demangle;if(u){try{var f=i.substr(1),c=lengthBytesUTF8(f)+1,g=_malloc(c);stringToUTF8(f,g,c);var t=_malloc(4),C=u(g,0,0,t);if(getValue(t,"i32")===0&&C)return Pointer_stringify(C)}catch(A){}finally{g&&_free(g),t&&_free(t),C&&_free(C)}return i}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),i}function demangleAll(i){var u=/__Z[\w\d_]+/g;return i.replace(u,function(f){var c=demangle(f);return f===c?f:f+" ["+c+"]"})}function jsStackTrace(){var i=new Error;if(!i.stack){try{throw new Error(0)}catch(u){i=u}if(!i.stack)return"(no stack trace available)"}return i.stack.toString()}function stackTrace(){var i=jsStackTrace();return Module.extraStackTrace&&(i+=` -`+Module.extraStackTrace()),demangleAll(i)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY0;){var u=i.shift();if(typeof u=="function"){u();continue}var f=u.func;typeof f=="number"?u.arg===void 0?Module.dynCall_v(f):Module.dynCall_vi(f,u.arg):f(u.arg===void 0?null:u.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun=="function"&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for(typeof Module.postRun=="function"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(i){__ATPRERUN__.unshift(i)}Module.addOnPreRun=addOnPreRun;function addOnInit(i){__ATINIT__.unshift(i)}Module.addOnInit=addOnInit;function addOnPreMain(i){__ATMAIN__.unshift(i)}Module.addOnPreMain=addOnPreMain;function addOnExit(i){__ATEXIT__.unshift(i)}Module.addOnExit=addOnExit;function addOnPostRun(i){__ATPOSTRUN__.unshift(i)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(i,u,f){var c=f>0?f:lengthBytesUTF8(i)+1,g=new Array(c),t=stringToUTF8Array(i,g,0,g.length);return u&&(g.length=t),g}Module.intArrayFromString=intArrayFromString;function intArrayToString(i){for(var u=[],f=0;f255&&(c&=255),u.push(String.fromCharCode(c))}return u.join("")}Module.intArrayToString=intArrayToString;function writeStringToMemory(i,u,f){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var c,g;f&&(g=u+lengthBytesUTF8(i),c=HEAP8[g]),stringToUTF8(i,u,Infinity),f&&(HEAP8[g]=c)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(i,u){HEAP8.set(i,u)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(i,u,f){for(var c=0;c>0]=i.charCodeAt(c);f||(HEAP8[u>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function(u,f){var c=u>>>16,g=u&65535,t=f>>>16,C=f&65535;return g*C+(c*C+g*t<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(i){return froundBuffer[0]=i,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(i){i=i>>>0;for(var u=0;u<32;u++)if(i&1<<31-u)return u;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(i){return i<0?Math.ceil(i):Math.floor(i)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function getUniqueRunDependency(i){return i}function addRunDependency(i){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(i){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var u=dependenciesFulfilled;dependenciesFulfilled=null,u()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(i,u,f,c,g,t,C,A){return _nbind.callbackSignatureList[i].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(i,u,f,c,g,t,C,A){return ASM_CONSTS[i](u,f,c,g,t,C,A)}function _emscripten_asm_const_iiiii(i,u,f,c,g){return ASM_CONSTS[i](u,f,c,g)}function _emscripten_asm_const_iiidddddd(i,u,f,c,g,t,C,A,x){return ASM_CONSTS[i](u,f,c,g,t,C,A,x)}function _emscripten_asm_const_iiididi(i,u,f,c,g,t,C){return ASM_CONSTS[i](u,f,c,g,t,C)}function _emscripten_asm_const_iiii(i,u,f,c){return ASM_CONSTS[i](u,f,c)}function _emscripten_asm_const_iiiid(i,u,f,c,g){return ASM_CONSTS[i](u,f,c,g)}function _emscripten_asm_const_iiiiii(i,u,f,c,g,t){return ASM_CONSTS[i](u,f,c,g,t)}STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+12800,__ATINIT__.push({func:function(){__GLOBAL__sub_I_Yoga_cpp()}},{func:function(){__GLOBAL__sub_I_nbind_cc()}},{func:function(){__GLOBAL__sub_I_common_cc()}},{func:function(){__GLOBAL__sub_I_Binding_cc()}}),allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,192,127,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,128,191,0,0,128,191,0,0,192,127,0,0,0,0,0,0,0,0,0,0,128,63,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,190,12,0,0,200,12,0,0,208,12,0,0,216,12,0,0,230,12,0,0,242,12,0,0,1,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,192,127,3,0,0,0,180,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,182,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,183,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,184,45,0,0,185,45,0,0,181,45,0,0,181,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,148,4,0,0,3,0,0,0,187,45,0,0,164,4,0,0,188,45,0,0,2,0,0,0,189,45,0,0,164,4,0,0,188,45,0,0,185,45,0,0,164,4,0,0,185,45,0,0,164,4,0,0,188,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,183,45,0,0,182,45,0,0,181,45,0,0,190,45,0,0,190,45,0,0,182,45,0,0,182,45,0,0,185,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,185,45,0,0,48,5,0,0,3,0,0,0,56,5,0,0,1,0,0,0,189,45,0,0,185,45,0,0,164,4,0,0,76,5,0,0,2,0,0,0,191,45,0,0,186,45,0,0,182,45,0,0,185,45,0,0,192,45,0,0,185,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,76,5,0,0,76,5,0,0,136,5,0,0,182,45,0,0,181,45,0,0,2,0,0,0,190,45,0,0,136,5,0,0,56,19,0,0,156,5,0,0,2,0,0,0,184,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,204,5,0,0,181,45,0,0,181,45,0,0,2,0,0,0,180,45,0,0,204,5,0,0,2,0,0,0,195,45,0,0,236,5,0,0,97,19,0,0,198,45,0,0,211,45,0,0,212,45,0,0,213,45,0,0,214,45,0,0,215,45,0,0,188,45,0,0,182,45,0,0,216,45,0,0,217,45,0,0,218,45,0,0,219,45,0,0,192,45,0,0,181,45,0,0,0,0,0,0,185,45,0,0,110,19,0,0,186,45,0,0,115,19,0,0,221,45,0,0,120,19,0,0,148,4,0,0,132,19,0,0,96,6,0,0,145,19,0,0,222,45,0,0,164,19,0,0,223,45,0,0,173,19,0,0,0,0,0,0,3,0,0,0,104,6,0,0,1,0,0,0,187,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,11,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,185,45,0,0,224,45,0,0,164,6,0,0,188,45,0,0,172,6,0,0,180,6,0,0,2,0,0,0,188,6,0,0,7,0,0,0,224,45,0,0,7,0,0,0,164,6,0,0,1,0,0,0,213,45,0,0,185,45,0,0,224,45,0,0,172,6,0,0,185,45,0,0,224,45,0,0,164,6,0,0,185,45,0,0,224,45,0,0,211,45,0,0,211,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,172,6,0,0,222,45,0,0,211,45,0,0,224,45,0,0,188,45,0,0,222,45,0,0,211,45,0,0,40,7,0,0,188,45,0,0,2,0,0,0,224,45,0,0,185,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,222,45,0,0,224,45,0,0,148,4,0,0,185,45,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,185,45,0,0,164,6,0,0,148,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,14,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,148,7,0,0,2,0,0,0,225,45,0,0,183,45,0,0,188,45,0,0,168,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,234,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,242,45,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,110,111,100,101,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,119,104,105,99,104,32,115,116,105,108,108,32,104,97,115,32,99,104,105,108,100,114,101,110,32,97,116,116,97,99,104,101,100,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,115,116,105,108,108,32,97,116,116,97,99,104,101,100,32,116,111,32,97,32,112,97,114,101,110,116,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,99,111,110,102,105,103,0,67,97,110,110,111,116,32,115,101,116,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,67,104,105,108,100,32,97,108,114,101,97,100,121,32,104,97,115,32,97,32,112,97,114,101,110,116,44,32,105,116,32,109,117,115,116,32,98,101,32,114,101,109,111,118,101,100,32,102,105,114,115,116,46,0,67,97,110,110,111,116,32,97,100,100,32,99,104,105,108,100,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,79,110,108,121,32,108,101,97,102,32,110,111,100,101,115,32,119,105,116,104,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,115,104,111,117,108,100,32,109,97,110,117,97,108,108,121,32,109,97,114,107,32,116,104,101,109,115,101,108,118,101,115,32,97,115,32,100,105,114,116,121,0,67,97,110,110,111,116,32,103,101,116,32,108,97,121,111,117,116,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,109,117,108,116,105,45,101,100,103,101,32,115,104,111,114,116,104,97,110,100,115,0,37,115,37,100,46,123,91,115,107,105,112,112,101,100,93,32,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,61,62,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,37,115,37,100,46,123,37,115,0,42,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,37,115,10,0,37,115,37,100,46,125,37,115,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,79,117,116,32,111,102,32,99,97,99,104,101,32,101,110,116,114,105,101,115,33,10,0,83,99,97,108,101,32,102,97,99,116,111,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,122,101,114,111,0,105,110,105,116,105,97,108,0,37,115,10,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,85,78,68,69,70,73,78,69,68,0,69,88,65,67,84,76,89,0,65,84,95,77,79,83,84,0,76,65,89,95,85,78,68,69,70,73,78,69,68,0,76,65,89,95,69,88,65,67,84,76,89,0,76,65,89,95,65,84,95,77,79,83,84,0,97,118,97,105,108,97,98,108,101,87,105,100,116,104,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,119,105,100,116,104,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,97,118,97,105,108,97,98,108,101,72,101,105,103,104,116,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,104,101,105,103,104,116,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,102,108,101,120,0,115,116,114,101,116,99,104,0,109,117,108,116,105,108,105,110,101,45,115,116,114,101,116,99,104,0,69,120,112,101,99,116,101,100,32,110,111,100,101,32,116,111,32,104,97,118,101,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,0,109,101,97,115,117,114,101,0,69,120,112,101,99,116,32,99,117,115,116,111,109,32,98,97,115,101,108,105,110,101,32,102,117,110,99,116,105,111,110,32,116,111,32,110,111,116,32,114,101,116,117,114,110,32,78,97,78,0,97,98,115,45,109,101,97,115,117,114,101,0,97,98,115,45,108,97,121,111,117,116,0,78,111,100,101,0,99,114,101,97,116,101,68,101,102,97,117,108,116,0,99,114,101,97,116,101,87,105,116,104,67,111,110,102,105,103,0,100,101,115,116,114,111,121,0,114,101,115,101,116,0,99,111,112,121,83,116,121,108,101,0,115,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,115,101,116,80,111,115,105,116,105,111,110,0,115,101,116,80,111,115,105,116,105,111,110,80,101,114,99,101,110,116,0,115,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,115,101,116,65,108,105,103,110,73,116,101,109,115,0,115,101,116,65,108,105,103,110,83,101,108,102,0,115,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,115,101,116,70,108,101,120,87,114,97,112,0,115,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,115,101,116,77,97,114,103,105,110,0,115,101,116,77,97,114,103,105,110,80,101,114,99,101,110,116,0,115,101,116,77,97,114,103,105,110,65,117,116,111,0,115,101,116,79,118,101,114,102,108,111,119,0,115,101,116,68,105,115,112,108,97,121,0,115,101,116,70,108,101,120,0,115,101,116,70,108,101,120,66,97,115,105,115,0,115,101,116,70,108,101,120,66,97,115,105,115,80,101,114,99,101,110,116,0,115,101,116,70,108,101,120,71,114,111,119,0,115,101,116,70,108,101,120,83,104,114,105,110,107,0,115,101,116,87,105,100,116,104,0,115,101,116,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,87,105,100,116,104,65,117,116,111,0,115,101,116,72,101,105,103,104,116,0,115,101,116,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,72,101,105,103,104,116,65,117,116,111,0,115,101,116,77,105,110,87,105,100,116,104,0,115,101,116,77,105,110,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,105,110,72,101,105,103,104,116,0,115,101,116,77,105,110,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,77,97,120,87,105,100,116,104,0,115,101,116,77,97,120,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,97,120,72,101,105,103,104,116,0,115,101,116,77,97,120,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,65,115,112,101,99,116,82,97,116,105,111,0,115,101,116,66,111,114,100,101,114,0,115,101,116,80,97,100,100,105,110,103,0,115,101,116,80,97,100,100,105,110,103,80,101,114,99,101,110,116,0,103,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,103,101,116,80,111,115,105,116,105,111,110,0,103,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,103,101,116,65,108,105,103,110,73,116,101,109,115,0,103,101,116,65,108,105,103,110,83,101,108,102,0,103,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,103,101,116,70,108,101,120,87,114,97,112,0,103,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,103,101,116,77,97,114,103,105,110,0,103,101,116,70,108,101,120,66,97,115,105,115,0,103,101,116,70,108,101,120,71,114,111,119,0,103,101,116,70,108,101,120,83,104,114,105,110,107,0,103,101,116,87,105,100,116,104,0,103,101,116,72,101,105,103,104,116,0,103,101,116,77,105,110,87,105,100,116,104,0,103,101,116,77,105,110,72,101,105,103,104,116,0,103,101,116,77,97,120,87,105,100,116,104,0,103,101,116,77,97,120,72,101,105,103,104,116,0,103,101,116,65,115,112,101,99,116,82,97,116,105,111,0,103,101,116,66,111,114,100,101,114,0,103,101,116,79,118,101,114,102,108,111,119,0,103,101,116,68,105,115,112,108,97,121,0,103,101,116,80,97,100,100,105,110,103,0,105,110,115,101,114,116,67,104,105,108,100,0,114,101,109,111,118,101,67,104,105,108,100,0,103,101,116,67,104,105,108,100,67,111,117,110,116,0,103,101,116,80,97,114,101,110,116,0,103,101,116,67,104,105,108,100,0,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,117,110,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,109,97,114,107,68,105,114,116,121,0,105,115,68,105,114,116,121,0,99,97,108,99,117,108,97,116,101,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,76,101,102,116,0,103,101,116,67,111,109,112,117,116,101,100,82,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,84,111,112,0,103,101,116,67,111,109,112,117,116,101,100,66,111,116,116,111,109,0,103,101,116,67,111,109,112,117,116,101,100,87,105,100,116,104,0,103,101,116,67,111,109,112,117,116,101,100,72,101,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,77,97,114,103,105,110,0,103,101,116,67,111,109,112,117,116,101,100,66,111,114,100,101,114,0,103,101,116,67,111,109,112,117,116,101,100,80,97,100,100,105,110,103,0,67,111,110,102,105,103,0,99,114,101,97,116,101,0,115,101,116,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,115,101,116,80,111,105,110,116,83,99,97,108,101,70,97,99,116,111,114,0,105,115,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,86,97,108,117,101,0,76,97,121,111,117,116,0,83,105,122,101,0,103,101,116,73,110,115,116,97,110,99,101,67,111,117,110,116,0,73,110,116,54,52,0,1,1,1,2,2,4,4,4,4,8,8,4,8,118,111,105,100,0,98,111,111,108,0,115,116,100,58,58,115,116,114,105,110,103,0,99,98,70,117,110,99,116,105,111,110,32,38,0,99,111,110,115,116,32,99,98,70,117,110,99,116,105,111,110,32,38,0,69,120,116,101,114,110,97,108,0,66,117,102,102,101,114,0,78,66,105,110,100,73,68,0,78,66,105,110,100,0,98,105,110,100,95,118,97,108,117,101,0,114,101,102,108,101,99,116,0,113,117,101,114,121,84,121,112,101,0,108,97,108,108,111,99,0,108,114,101,115,101,116,0,123,114,101,116,117,114,110,40,95,110,98,105,110,100,46,99,97,108,108,98,97,99,107,83,105,103,110,97,116,117,114,101,76,105,115,116,91,36,48,93,46,97,112,112,108,121,40,116,104,105,115,44,97,114,103,117,109,101,110,116,115,41,41,59,125,0,95,110,98,105,110,100,95,110,101,119,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;function _atexit(i,u){__ATEXIT__.unshift({func:i,arg:u})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function _abort(){Module.abort()}function __ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj(){Module.printErr("missing function: _ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj"),abort(-1)}function __decorate(i,u,f,c){var g=arguments.length,t=g<3?u:c===null?c=Object.getOwnPropertyDescriptor(u,f):c,C;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")t=Reflect.decorate(i,u,f,c);else for(var A=i.length-1;A>=0;A--)(C=i[A])&&(t=(g<3?C(t):g>3?C(u,f,t):C(u,f))||t);return g>3&&t&&Object.defineProperty(u,f,t),t}function _defineHidden(i){return function(u,f){Object.defineProperty(u,f,{configurable:!1,enumerable:!1,value:i,writable:!0})}}var _nbind={};function __nbind_free_external(i){_nbind.externalList[i].dereference(i)}function __nbind_reference_external(i){_nbind.externalList[i].reference()}function _llvm_stackrestore(i){var u=_llvm_stacksave,f=u.LLVM_SAVEDSTACKS[i];u.LLVM_SAVEDSTACKS.splice(i,1),Runtime.stackRestore(f)}function __nbind_register_pool(i,u,f,c){_nbind.Pool.pageSize=i,_nbind.Pool.usedPtr=u/4,_nbind.Pool.rootPtr=f,_nbind.Pool.pagePtr=c/4,HEAP32[u/4]=16909060,HEAP8[u]==1&&(_nbind.bigEndian=!0),HEAP32[u/4]=0,_nbind.makeTypeKindTbl=(t={},t[1024]=_nbind.PrimitiveType,t[64]=_nbind.Int64Type,t[2048]=_nbind.BindClass,t[3072]=_nbind.BindClassPtr,t[4096]=_nbind.SharedClassPtr,t[5120]=_nbind.ArrayType,t[6144]=_nbind.ArrayType,t[7168]=_nbind.CStringType,t[9216]=_nbind.CallbackType,t[10240]=_nbind.BindType,t),_nbind.makeTypeNameTbl={Buffer:_nbind.BufferType,External:_nbind.ExternalType,Int64:_nbind.Int64Type,_nbind_new:_nbind.CreateValueType,bool:_nbind.BooleanType,"cbFunction &":_nbind.CallbackType,"const cbFunction &":_nbind.CallbackType,"const std::string &":_nbind.StringType,"std::string":_nbind.StringType},Module.toggleLightGC=_nbind.toggleLightGC,_nbind.callUpcast=Module.dynCall_ii;var g=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});g.proto=Module,_nbind.BindClass.list.push(g);var t}function _emscripten_set_main_loop_timing(i,u){if(Browser.mainLoop.timingMode=i,Browser.mainLoop.timingValue=u,!Browser.mainLoop.func)return 1;if(i==0)Browser.mainLoop.scheduler=function(){var C=Math.max(0,Browser.mainLoop.tickStartTime+u-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,C)},Browser.mainLoop.method="timeout";else if(i==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(i==2){if(!window.setImmediate){let t=function(C){C.source===window&&C.data===c&&(C.stopPropagation(),f.shift()())};var g=t,f=[],c="setimmediate";window.addEventListener("message",t,!0),window.setImmediate=function(A){f.push(A),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(A),window.postMessage({target:c})):window.postMessage(c,"*")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method="immediate"}return 0}function _emscripten_get_now(){abort()}function _emscripten_set_main_loop(i,u,f,c,g){Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."),Browser.mainLoop.func=i,Browser.mainLoop.arg=c;var t;typeof c!="undefined"?t=function(){Module.dynCall_vi(i,c)}:t=function(){Module.dynCall_v(i)};var C=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var x=Date.now(),D=Browser.mainLoop.queue.shift();if(D.func(D.arg),Browser.mainLoop.remainingBlockers){var L=Browser.mainLoop.remainingBlockers,N=L%1==0?L-1:Math.floor(L);D.counted?Browser.mainLoop.remainingBlockers=N:(N=N+.5,Browser.mainLoop.remainingBlockers=(8*L+N)/9)}if(console.log('main loop blocker "'+D.name+'" took '+(Date.now()-x)+" ms"),Browser.mainLoop.updateStatus(),C1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method==="timeout"&&Module.ctx&&(Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),Browser.mainLoop.method=""),Browser.mainLoop.runIter(t),!(C0?_emscripten_set_main_loop_timing(0,1e3/u):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),f)throw"SimulateInfiniteLoop"}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var i=Browser.mainLoop.timingMode,u=Browser.mainLoop.timingValue,f=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(f,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(i,u),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var i=Module.statusMessage||"Please wait...",u=Browser.mainLoop.remainingBlockers,f=Browser.mainLoop.expectedBlockers;u?u=6;){var Le=J>>Te-6&63;Te-=6,De+=Se[Le]}return Te==2?(De+=Se[(J&3)<<4],De+=me+me):Te==4&&(De+=Se[(J&15)<<2],De+=me),De}h.src="data:audio/x-"+C.substr(-3)+";base64,"+Q(t),L(h)},h.src=$,Browser.safeSetTimeout(function(){L(h)},1e4)}else return N()},Module.preloadPlugins.push(u);function f(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var c=Module.canvas;c&&(c.requestPointerLock=c.requestPointerLock||c.mozRequestPointerLock||c.webkitRequestPointerLock||c.msRequestPointerLock||function(){},c.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},c.exitPointerLock=c.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",f,!1),document.addEventListener("mozpointerlockchange",f,!1),document.addEventListener("webkitpointerlockchange",f,!1),document.addEventListener("mspointerlockchange",f,!1),Module.elementPointerLock&&c.addEventListener("click",function(g){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),g.preventDefault())},!1))},createContext:function(i,u,f,c){if(u&&Module.ctx&&i==Module.canvas)return Module.ctx;var g,t;if(u){var C={antialias:!1,alpha:!1};if(c)for(var A in c)C[A]=c[A];t=GL.createContext(i,C),t&&(g=GL.getContext(t).GLctx)}else g=i.getContext("2d");return g?(f&&(u||assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=g,u&&GL.makeContextCurrent(t),Module.useWebGL=u,Browser.moduleContextCreatedCallbacks.forEach(function(x){x()}),Browser.init()),g):null},destroyContext:function(i,u,f){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(i,u,f){Browser.lockPointer=i,Browser.resizeCanvas=u,Browser.vrDevice=f,typeof Browser.lockPointer=="undefined"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas=="undefined"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice=="undefined"&&(Browser.vrDevice=null);var c=Module.canvas;function g(){Browser.isFullscreen=!1;var C=c.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===C?(c.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},c.exitFullscreen=c.exitFullscreen.bind(document),Browser.lockPointer&&c.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(C.parentNode.insertBefore(c,C),C.parentNode.removeChild(C),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(c)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",g,!1),document.addEventListener("mozfullscreenchange",g,!1),document.addEventListener("webkitfullscreenchange",g,!1),document.addEventListener("MSFullscreenChange",g,!1));var t=document.createElement("div");c.parentNode.insertBefore(t,c),t.appendChild(c),t.requestFullscreen=t.requestFullscreen||t.mozRequestFullScreen||t.msRequestFullscreen||(t.webkitRequestFullscreen?function(){t.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(t.webkitRequestFullScreen?function(){t.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),f?t.requestFullscreen({vrDisplay:f}):t.requestFullscreen()},requestFullScreen:function(i,u,f){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(c,g,t){return Browser.requestFullscreen(c,g,t)},Browser.requestFullscreen(i,u,f)},nextRAF:0,fakeRequestAnimationFrame:function(i){var u=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=u+1e3/60;else for(;u+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var f=Math.max(Browser.nextRAF-u,0);setTimeout(i,f)},requestAnimationFrame:function(u){typeof window=="undefined"?Browser.fakeRequestAnimationFrame(u):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(u))},safeCallback:function(i){return function(){if(!ABORT)return i.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var i=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],i.forEach(function(u){u()})}},safeRequestAnimationFrame:function(i){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?i():Browser.queuedAsyncCallbacks.push(i))})},safeSetTimeout:function(i,u){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?i():Browser.queuedAsyncCallbacks.push(i))},u)},safeSetInterval:function(i,u){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&i()},u)},getMimetype:function(i){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[i.substr(i.lastIndexOf(".")+1)]},getUserMedia:function(i){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(i)},getMovementX:function(i){return i.movementX||i.mozMovementX||i.webkitMovementX||0},getMovementY:function(i){return i.movementY||i.mozMovementY||i.webkitMovementY||0},getMouseWheelDelta:function(i){var u=0;switch(i.type){case"DOMMouseScroll":u=i.detail;break;case"mousewheel":u=i.wheelDelta;break;case"wheel":u=i.deltaY;break;default:throw"unrecognized mouse wheel event: "+i.type}return u},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(i){if(Browser.pointerLock)i.type!="mousemove"&&"mozMovementX"in i?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(i),Browser.mouseMovementY=Browser.getMovementY(i)),typeof SDL!="undefined"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var u=Module.canvas.getBoundingClientRect(),f=Module.canvas.width,c=Module.canvas.height,g=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset,t=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(i.type==="touchstart"||i.type==="touchend"||i.type==="touchmove"){var C=i.touch;if(C===void 0)return;var A=C.pageX-(g+u.left),x=C.pageY-(t+u.top);A=A*(f/u.width),x=x*(c/u.height);var D={x:A,y:x};if(i.type==="touchstart")Browser.lastTouches[C.identifier]=D,Browser.touches[C.identifier]=D;else if(i.type==="touchend"||i.type==="touchmove"){var L=Browser.touches[C.identifier];L||(L=D),Browser.lastTouches[C.identifier]=L,Browser.touches[C.identifier]=D}return}var N=i.pageX-(g+u.left),j=i.pageY-(t+u.top);N=N*(f/u.width),j=j*(c/u.height),Browser.mouseMovementX=N-Browser.mouseX,Browser.mouseMovementY=j-Browser.mouseY,Browser.mouseX=N,Browser.mouseY=j}},asyncLoad:function(i,u,f,c){var g=c?"":getUniqueRunDependency("al "+i);Module.readAsync(i,function(t){assert(t,'Loading data file "'+i+'" failed (no arrayBuffer).'),u(new Uint8Array(t)),g&&removeRunDependency(g)},function(t){if(f)f();else throw'Loading data file "'+i+'" failed.'}),g&&addRunDependency(g)},resizeListeners:[],updateResizeListeners:function(){var i=Module.canvas;Browser.resizeListeners.forEach(function(u){u(i.width,i.height)})},setCanvasSize:function(i,u,f){var c=Module.canvas;Browser.updateCanvasDimensions(c,i,u),f||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var i=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];i=i|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=i}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var i=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];i=i&~8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=i}Browser.updateResizeListeners()},updateCanvasDimensions:function(i,u,f){u&&f?(i.widthNative=u,i.heightNative=f):(u=i.widthNative,f=i.heightNative);var c=u,g=f;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(c/g>2];return u},getStr:function(){var i=Pointer_stringify(SYSCALLS.get());return i},get64:function(){var i=SYSCALLS.get(),u=SYSCALLS.get();return i>=0?assert(u===0):assert(u===-1),i},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(i,u){SYSCALLS.varargs=u;try{var f=SYSCALLS.getStreamFromFD();return FS.close(f),0}catch(c){return(typeof FS=="undefined"||!(c instanceof FS.ErrnoError))&&abort(c),-c.errno}}function ___syscall54(i,u){SYSCALLS.varargs=u;try{return 0}catch(f){return(typeof FS=="undefined"||!(f instanceof FS.ErrnoError))&&abort(f),-f.errno}}function _typeModule(i){var u=[[0,1,"X"],[1,1,"const X"],[128,1,"X *"],[256,1,"X &"],[384,1,"X &&"],[512,1,"std::shared_ptr"],[640,1,"std::unique_ptr"],[5120,1,"std::vector"],[6144,2,"std::array"],[9216,-1,"std::function"]];function f(x,D,L,N,j,$){if(D==1){var h=N&896;(h==128||h==256||h==384)&&(x="X const")}var re;return $?re=L.replace("X",x).replace("Y",j):re=x.replace("X",L).replace("Y",j),re.replace(/([*&]) (?=[*&])/g,"$1")}function c(x,D,L,N,j){throw new Error(x+" type "+L.replace("X",D+"?")+(N?" with flag "+N:"")+" in "+j)}function g(x,D,L,N,j,$,h,re){$===void 0&&($="X"),re===void 0&&(re=1);var ce=L(x);if(ce)return ce;var Q=N(x),oe=Q.placeholderFlag,Se=u[oe];h&&Se&&($=f(h[2],h[0],$,Se[0],"?",!0));var me;oe==0&&(me="Unbound"),oe>=10&&(me="Corrupt"),re>20&&(me="Deeply nested"),me&&c(me,x,$,oe,j||"?");var De=Q.paramList[0],J=g(De,D,L,N,j,$,Se,re+1),Te,Oe={flags:Se[0],id:x,name:"",paramList:[J]},Le=[],ot="?";switch(Q.placeholderFlag){case 1:Te=J.spec;break;case 2:if((J.flags&15360)==1024&&J.spec.ptrSize==1){Oe.flags=7168;break}case 3:case 6:case 5:Te=J.spec,(J.flags&15360)!=2048;break;case 8:ot=""+Q.paramList[1],Oe.paramList.push(Q.paramList[1]);break;case 9:for(var ct=0,Ue=Q.paramList[1];ct>2]=i),i}function _llvm_stacksave(){var i=_llvm_stacksave;return i.LLVM_SAVEDSTACKS||(i.LLVM_SAVEDSTACKS=[]),i.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),i.LLVM_SAVEDSTACKS.length-1}function ___syscall140(i,u){SYSCALLS.varargs=u;try{var f=SYSCALLS.getStreamFromFD(),c=SYSCALLS.get(),g=SYSCALLS.get(),t=SYSCALLS.get(),C=SYSCALLS.get(),A=g;return FS.llseek(f,A,C),HEAP32[t>>2]=f.position,f.getdents&&A===0&&C===0&&(f.getdents=null),0}catch(x){return(typeof FS=="undefined"||!(x instanceof FS.ErrnoError))&&abort(x),-x.errno}}function ___syscall146(i,u){SYSCALLS.varargs=u;try{var f=SYSCALLS.get(),c=SYSCALLS.get(),g=SYSCALLS.get(),t=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(L,N){var j=___syscall146.buffers[L];assert(j),N===0||N===10?((L===1?Module.print:Module.printErr)(UTF8ArrayToString(j,0)),j.length=0):j.push(N)});for(var C=0;C>2],x=HEAP32[c+(C*8+4)>>2],D=0;Di.pageSize/2||u>i.pageSize-f){var c=_nbind.typeNameTbl.NBind.proto;return c.lalloc(u)}else return HEAPU32[i.usedPtr]=f+u,i.rootPtr+f},i.lreset=function(u,f){var c=HEAPU32[i.pagePtr];if(c){var g=_nbind.typeNameTbl.NBind.proto;g.lreset(u,f)}else HEAPU32[i.usedPtr]=u},i}();_nbind.Pool=Pool;function constructType(i,u){var f=i==10240?_nbind.makeTypeNameTbl[u.name]||_nbind.BindType:_nbind.makeTypeKindTbl[i],c=new f(u);return typeIdTbl[u.id]=c,_nbind.typeNameTbl[u.name]=c,c}_nbind.constructType=constructType;function getType(i){return typeIdTbl[i]}_nbind.getType=getType;function queryType(i){var u=HEAPU8[i],f=_nbind.structureList[u][1];i/=4,f<0&&(++i,f=HEAPU32[i]+1);var c=Array.prototype.slice.call(HEAPU32.subarray(i+1,i+1+f));return u==9&&(c=[c[0],c.slice(1)]),{paramList:c,placeholderFlag:u}}_nbind.queryType=queryType;function getTypes(i,u){return i.map(function(f){return typeof f=="number"?_nbind.getComplexType(f,constructType,getType,queryType,u):_nbind.typeNameTbl[f]})}_nbind.getTypes=getTypes;function readTypeIdList(i,u){return Array.prototype.slice.call(HEAPU32,i/4,i/4+u)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(i){for(var u=i;HEAPU8[u++];);return String.fromCharCode.apply("",HEAPU8.subarray(i,u-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(i){var u={};if(i)for(;;){var f=HEAPU32[i/4];if(!f)break;u[readAsciiString(f)]=!0,i+=4}return u}_nbind.readPolicyList=readPolicyList;function getDynCall(i,u){var f={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},c=i.map(function(t){return f[t.name]||"i"}).join(""),g=Module["dynCall_"+c];if(!g)throw new Error("dynCall_"+c+" not found for "+u+"("+i.map(function(t){return t.name}).join(", ")+")");return g}_nbind.getDynCall=getDynCall;function addMethod(i,u,f,c){var g=i[u];i.hasOwnProperty(u)&&g?((g.arity||g.arity===0)&&(g=_nbind.makeOverloader(g,g.arity),i[u]=g),g.addMethod(f,c)):(f.arity=c,i[u]=f)}_nbind.addMethod=addMethod;function throwError(i){throw new Error(i)}_nbind.throwError=throwError,_nbind.bigEndian=!1,_a=_typeModule(_typeModule),_nbind.Type=_a.Type,_nbind.makeType=_a.makeType,_nbind.getComplexType=_a.getComplexType,_nbind.structureList=_a.structureList;var BindType=function(i){__extends(u,i);function u(){var f=i!==null&&i.apply(this,arguments)||this;return f.heap=HEAPU32,f.ptrSize=4,f}return u.prototype.needsWireRead=function(f){return!!this.wireRead||!!this.makeWireRead},u.prototype.needsWireWrite=function(f){return!!this.wireWrite||!!this.makeWireWrite},u}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(i){__extends(u,i);function u(f){var c=i.call(this,f)||this,g=f.flags&32?{32:HEAPF32,64:HEAPF64}:f.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return c.heap=g[f.ptrSize*8],c.ptrSize=f.ptrSize,c}return u.prototype.needsWireWrite=function(f){return!!f&&!!f.Strict},u.prototype.makeWireWrite=function(f,c){return c&&c.Strict&&function(g){if(typeof g=="number")return g;throw new Error("Type mismatch")}},u}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(i,u){if(i==null){if(u&&u.Nullable)return 0;throw new Error("Type mismatch")}if(u&&u.Strict){if(typeof i!="string")throw new Error("Type mismatch")}else i=i.toString();var f=Module.lengthBytesUTF8(i)+1,c=_nbind.Pool.lalloc(f);return Module.stringToUTF8Array(i,HEAPU8,c,f),c}_nbind.pushCString=pushCString;function popCString(i){return i===0?null:Module.Pointer_stringify(i)}_nbind.popCString=popCString;var CStringType=function(i){__extends(u,i);function u(){var f=i!==null&&i.apply(this,arguments)||this;return f.wireRead=popCString,f.wireWrite=pushCString,f.readResources=[_nbind.resources.pool],f.writeResources=[_nbind.resources.pool],f}return u.prototype.makeWireWrite=function(f,c){return function(g){return pushCString(g,c)}},u}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(i){__extends(u,i);function u(){var f=i!==null&&i.apply(this,arguments)||this;return f.wireRead=function(c){return!!c},f}return u.prototype.needsWireWrite=function(f){return!!f&&!!f.Strict},u.prototype.makeWireRead=function(f){return"!!("+f+")"},u.prototype.makeWireWrite=function(f,c){return c&&c.Strict&&function(g){if(typeof g=="boolean")return g;throw new Error("Type mismatch")}||f},u}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function i(){}return i.prototype.persist=function(){this.__nbindState|=1},i}();_nbind.Wrapper=Wrapper;function makeBound(i,u){var f=function(c){__extends(g,c);function g(t,C,A,x){var D=c.call(this)||this;if(!(D instanceof g))return new(Function.prototype.bind.apply(g,Array.prototype.concat.apply([null],arguments)));var L=C,N=A,j=x;if(t!==_nbind.ptrMarker){var $=D.__nbindConstructor.apply(D,arguments);L=4096|512,j=HEAPU32[$/4],N=HEAPU32[$/4+1]}var h={configurable:!0,enumerable:!1,value:null,writable:!1},re={__nbindFlags:L,__nbindPtr:N};j&&(re.__nbindShared=j,_nbind.mark(D));for(var ce=0,Q=Object.keys(re);ce>=1;var f=_nbind.valueList[i];return _nbind.valueList[i]=firstFreeValue,firstFreeValue=i,f}else{if(u)return _nbind.popShared(i,u);throw new Error("Invalid value slot "+i)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(i){return typeof i=="number"?i:pushValue(i)*4096+valueBase}function pop64(i){return i=3?C=Buffer.from(t):C=new Buffer(t),C.copy(c)}else getBuffer(c).set(t)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var i=0,u=dirtyList;i>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(i,u,f,c,g,t){try{Module.dynCall_viiiii(i,u,f,c,g,t)}catch(C){if(typeof C!="number"&&C!=="longjmp")throw C;Module.setThrew(1,0)}}function invoke_vif(i,u,f){try{Module.dynCall_vif(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_vid(i,u,f){try{Module.dynCall_vid(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_fiff(i,u,f,c){try{return Module.dynCall_fiff(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_vi(i,u){try{Module.dynCall_vi(i,u)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_vii(i,u,f){try{Module.dynCall_vii(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_ii(i,u){try{return Module.dynCall_ii(i,u)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_viddi(i,u,f,c,g){try{Module.dynCall_viddi(i,u,f,c,g)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}function invoke_vidd(i,u,f,c){try{Module.dynCall_vidd(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_iiii(i,u,f,c){try{return Module.dynCall_iiii(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_diii(i,u,f,c){try{return Module.dynCall_diii(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_di(i,u){try{return Module.dynCall_di(i,u)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_iid(i,u,f){try{return Module.dynCall_iid(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_iii(i,u,f){try{return Module.dynCall_iii(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_viiddi(i,u,f,c,g,t){try{Module.dynCall_viiddi(i,u,f,c,g,t)}catch(C){if(typeof C!="number"&&C!=="longjmp")throw C;Module.setThrew(1,0)}}function invoke_viiiiii(i,u,f,c,g,t,C){try{Module.dynCall_viiiiii(i,u,f,c,g,t,C)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_dii(i,u,f){try{return Module.dynCall_dii(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_i(i){try{return Module.dynCall_i(i)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_iiiiii(i,u,f,c,g,t){try{return Module.dynCall_iiiiii(i,u,f,c,g,t)}catch(C){if(typeof C!="number"&&C!=="longjmp")throw C;Module.setThrew(1,0)}}function invoke_viiid(i,u,f,c,g){try{Module.dynCall_viiid(i,u,f,c,g)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}function invoke_viififi(i,u,f,c,g,t,C){try{Module.dynCall_viififi(i,u,f,c,g,t,C)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_viii(i,u,f,c){try{Module.dynCall_viii(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_v(i){try{Module.dynCall_v(i)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viid(i,u,f,c){try{Module.dynCall_viid(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_idd(i,u,f){try{return Module.dynCall_idd(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_viiii(i,u,f,c,g){try{Module.dynCall_viiii(i,u,f,c,g)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:Infinity},Module.asmLibraryArg={abort,assert,enlargeMemory,getTotalMemory,abortOnCannotGrowMemory,invoke_viiiii,invoke_vif,invoke_vid,invoke_fiff,invoke_vi,invoke_vii,invoke_ii,invoke_viddi,invoke_vidd,invoke_iiii,invoke_diii,invoke_di,invoke_iid,invoke_iii,invoke_viiddi,invoke_viiiiii,invoke_dii,invoke_i,invoke_iiiiii,invoke_viiid,invoke_viififi,invoke_viii,invoke_v,invoke_viid,invoke_idd,invoke_viiii,_emscripten_asm_const_iiiii,_emscripten_asm_const_iiidddddd,_emscripten_asm_const_iiiid,__nbind_reference_external,_emscripten_asm_const_iiiiiiii,_removeAccessorPrefix,_typeModule,__nbind_register_pool,__decorate,_llvm_stackrestore,___cxa_atexit,__extends,__nbind_get_value_object,__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,_emscripten_set_main_loop_timing,__nbind_register_primitive,__nbind_register_type,_emscripten_memcpy_big,__nbind_register_function,___setErrNo,__nbind_register_class,__nbind_finish,_abort,_nbind_value,_llvm_stacksave,___syscall54,_defineHidden,_emscripten_set_main_loop,_emscripten_get_now,__nbind_register_callback_signature,_emscripten_asm_const_iiiiii,__nbind_free_external,_emscripten_asm_const_iiii,_emscripten_asm_const_iiididi,___syscall6,_atexit,___syscall140,___syscall146,DYNAMICTOP_PTR,tempDoublePtr,ABORT,STACKTOP,STACK_MAX,cttz_i8,___dso_handle};var asm=function(i,u,f){var c=new i.Int8Array(f),g=new i.Int16Array(f),t=new i.Int32Array(f),C=new i.Uint8Array(f),A=new i.Uint16Array(f),x=new i.Uint32Array(f),D=new i.Float32Array(f),L=new i.Float64Array(f),N=u.DYNAMICTOP_PTR|0,j=u.tempDoublePtr|0,$=u.ABORT|0,h=u.STACKTOP|0,re=u.STACK_MAX|0,ce=u.cttz_i8|0,Q=u.___dso_handle|0,oe=0,Se=0,me=0,De=0,J=i.NaN,Te=i.Infinity,Oe=0,Le=0,ot=0,ct=0,Ue=0,be=0,At=i.Math.floor,Ot=i.Math.abs,Nt=i.Math.sqrt,Je=i.Math.pow,V=i.Math.cos,ne=i.Math.sin,ge=i.Math.tan,Z=i.Math.acos,Ae=i.Math.asin,at=i.Math.atan,it=i.Math.atan2,Ft=i.Math.exp,jt=i.Math.log,hn=i.Math.ceil,Un=i.Math.imul,Jt=i.Math.min,Yt=i.Math.max,cr=i.Math.clz32,w=i.Math.fround,pt=u.abort,Mn=u.assert,Bn=u.enlargeMemory,Xn=u.getTotalMemory,vr=u.abortOnCannotGrowMemory,gr=u.invoke_viiiii,r0=u.invoke_vif,Ci=u.invoke_vid,yo=u.invoke_fiff,Ds=u.invoke_vi,Mu=u.invoke_vii,Gf=u.invoke_ii,iu=u.invoke_viddi,ou=u.invoke_vidd,ol=u.invoke_iiii,ul=u.invoke_diii,Es=u.invoke_di,Uo=u.invoke_iid,sl=u.invoke_iii,Ss=u.invoke_viiddi,Cs=u.invoke_viiiiii,Ti=u.invoke_dii,Fu=u.invoke_i,ll=u.invoke_iiiiii,fl=u.invoke_viiid,cl=u.invoke_viififi,al=u.invoke_viii,Ui=u.invoke_v,Mr=u.invoke_viid,Ac=u.invoke_idd,of=u.invoke_viiii,Ts=u._emscripten_asm_const_iiiii,xs=u._emscripten_asm_const_iiidddddd,dl=u._emscripten_asm_const_iiiid,qi=u.__nbind_reference_external,qo=u._emscripten_asm_const_iiiiiiii,kr=u._removeAccessorPrefix,Fr=u._typeModule,si=u.__nbind_register_pool,H0=u.__decorate,b0=u._llvm_stackrestore,Bt=u.___cxa_atexit,Lu=u.__extends,c0=u.__nbind_get_value_object,Ru=u.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,ks=u._emscripten_set_main_loop_timing,As=u.__nbind_register_primitive,uu=u.__nbind_register_type,wo=u._emscripten_memcpy_big,zo=u.__nbind_register_function,Os=u.___setErrNo,Is=u.__nbind_register_class,uf=u.__nbind_finish,_n=u._abort,Nu=u._nbind_value,Wo=u._llvm_stacksave,su=u.___syscall54,Ps=u._defineHidden,pl=u._emscripten_set_main_loop,Vf=u._emscripten_get_now,hl=u.__nbind_register_callback_signature,Bu=u._emscripten_asm_const_iiiiii,ju=u.__nbind_free_external,sf=u._emscripten_asm_const_iiii,ro=u._emscripten_asm_const_iiididi,Ms=u.___syscall6,ml=u._atexit,Uu=u.___syscall140,G0=u.___syscall146,Fs=w(0);let tt=w(0);function zi(e){e=e|0;var n=0;return n=h,h=h+e|0,h=h+15&-16,n|0}function lu(){return h|0}function Ho(e){e=e|0,h=e}function O0(e,n){e=e|0,n=n|0,h=e,re=n}function vl(e,n){e=e|0,n=n|0,oe||(oe=e,Se=n)}function gl(e){e=e|0,be=e}function fu(){return be|0}function _l(){var e=0,n=0;vn(8104,8,400)|0,vn(8504,408,540)|0,e=9044,n=e+44|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));c[9088]=0,c[9089]=1,t[2273]=0,t[2274]=948,t[2275]=948,Bt(17,8104,Q|0)|0}function Sn(e){e=e|0,lf(e+948|0)}function gt(e){return e=w(e),((Ar(e)|0)&2147483647)>>>0>2139095040|0}function en(e,n,r){e=e|0,n=n|0,r=r|0;e:do if(t[e+(n<<3)+4>>2]|0)e=e+(n<<3)|0;else{if((n|2|0)==3?t[e+60>>2]|0:0){e=e+56|0;break}switch(n|0){case 0:case 2:case 4:case 5:{if(t[e+52>>2]|0){e=e+48|0;break e}break}default:}if(t[e+68>>2]|0){e=e+64|0;break}else{e=(n|1|0)==5?948:r;break}}while(0);return e|0}function I0(e){e=e|0;var n=0;return n=uh(1e3)|0,li(e,(n|0)!=0,2456),t[2276]=(t[2276]|0)+1,vn(n|0,8104,1e3)|0,c[e+2>>0]|0&&(t[n+4>>2]=2,t[n+12>>2]=4),t[n+976>>2]=e,n|0}function li(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;s=h,h=h+16|0,o=s,n||(t[o>>2]=r,zs(e,5,3197,o)),h=s}function qu(){return I0(956)|0}function Wi(e){e=e|0;var n=0;return n=Tt(1e3)|0,zu(n,e),li(t[e+976>>2]|0,1,2456),t[2276]=(t[2276]|0)+1,t[n+944>>2]=0,n|0}function zu(e,n){e=e|0,n=n|0;var r=0;vn(e|0,n|0,948)|0,af(e+948|0,n+948|0),r=e+960|0,e=n+960|0,n=r+40|0;do t[r>>2]=t[e>>2],r=r+4|0,e=e+4|0;while((r|0)<(n|0))}function Wu(e){e=e|0;var n=0,r=0,o=0,s=0;if(n=e+944|0,r=t[n>>2]|0,r|0&&(Ls(r+948|0,e)|0,t[n>>2]=0),r=fi(e)|0,r|0){n=0;do t[(e0(e,n)|0)+944>>2]=0,n=n+1|0;while((n|0)!=(r|0))}r=e+948|0,o=t[r>>2]|0,s=e+952|0,n=t[s>>2]|0,(n|0)!=(o|0)&&(t[s>>2]=n+(~((n+-4-o|0)>>>2)<<2)),io(r),sh(e),t[2276]=(t[2276]|0)+-1}function Ls(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0;o=t[e>>2]|0,_=e+4|0,r=t[_>>2]|0,l=r;e:do if((o|0)==(r|0))s=o,d=4;else for(e=o;;){if((t[e>>2]|0)==(n|0)){s=e,d=4;break e}if(e=e+4|0,(e|0)==(r|0)){e=0;break}}while(0);return(d|0)==4&&((s|0)!=(r|0)?(o=s+4|0,e=l-o|0,n=e>>2,n&&(Y1(s|0,o|0,e|0)|0,r=t[_>>2]|0),e=s+(n<<2)|0,(r|0)==(e|0)||(t[_>>2]=r+(~((r+-4-e|0)>>>2)<<2)),e=1):e=0),e|0}function fi(e){return e=e|0,(t[e+952>>2]|0)-(t[e+948>>2]|0)>>2|0}function e0(e,n){e=e|0,n=n|0;var r=0;return r=t[e+948>>2]|0,(t[e+952>>2]|0)-r>>2>>>0>n>>>0?e=t[r+(n<<2)>>2]|0:e=0,e|0}function io(e){e=e|0;var n=0,r=0,o=0,s=0;o=h,h=h+32|0,n=o,s=t[e>>2]|0,r=(t[e+4>>2]|0)-s|0,((t[e+8>>2]|0)-s|0)>>>0>r>>>0&&(s=r>>2,z(n,s,s,e+8|0),dr(e,n),Or(n)),h=o}function D0(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;k=fi(e)|0;do if(k|0){if((t[(e0(e,0)|0)+944>>2]|0)==(e|0)){if(!(Ls(e+948|0,n)|0))break;vn(n+400|0,8504,540)|0,t[n+944>>2]=0,ln(e);break}d=t[(t[e+976>>2]|0)+12>>2]|0,_=e+948|0,y=(d|0)==0,r=0,l=0;do o=t[(t[_>>2]|0)+(l<<2)>>2]|0,(o|0)==(n|0)?ln(e):(s=Wi(o)|0,t[(t[_>>2]|0)+(r<<2)>>2]=s,t[s+944>>2]=e,y||Q4[d&15](o,s,e,r),r=r+1|0),l=l+1|0;while((l|0)!=(k|0));if(r>>>0>>0){y=e+948|0,_=e+952|0,d=r,r=t[_>>2]|0;do l=(t[y>>2]|0)+(d<<2)|0,o=l+4|0,s=r-o|0,n=s>>2,n&&(Y1(l|0,o|0,s|0)|0,r=t[_>>2]|0),s=r,o=l+(n<<2)|0,(s|0)!=(o|0)&&(r=s+(~((s+-4-o|0)>>>2)<<2)|0,t[_>>2]=r),d=d+1|0;while((d|0)!=(k|0))}}while(0)}function Do(e){e=e|0;var n=0,r=0,o=0,s=0;i0(e,(fi(e)|0)==0,2491),i0(e,(t[e+944>>2]|0)==0,2545),n=e+948|0,r=t[n>>2]|0,o=e+952|0,s=t[o>>2]|0,(s|0)!=(r|0)&&(t[o>>2]=s+(~((s+-4-r|0)>>>2)<<2)),io(n),n=e+976|0,r=t[n>>2]|0,vn(e|0,8104,1e3)|0,c[r+2>>0]|0&&(t[e+4>>2]=2,t[e+12>>2]=4),t[n>>2]=r}function i0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;s=h,h=h+16|0,o=s,n||(t[o>>2]=r,wn(e,5,3197,o)),h=s}function Rs(){return t[2276]|0}function a0(){var e=0;return e=uh(20)|0,Hu((e|0)!=0,2592),t[2277]=(t[2277]|0)+1,t[e>>2]=t[239],t[e+4>>2]=t[240],t[e+8>>2]=t[241],t[e+12>>2]=t[242],t[e+16>>2]=t[243],e|0}function Hu(e,n){e=e|0,n=n|0;var r=0,o=0;o=h,h=h+16|0,r=o,e||(t[r>>2]=n,wn(0,5,3197,r)),h=o}function V0(e){e=e|0,sh(e),t[2277]=(t[2277]|0)+-1}function bu(e,n){e=e|0,n=n|0;var r=0;n?(i0(e,(fi(e)|0)==0,2629),r=1):(r=0,n=0),t[e+964>>2]=n,t[e+988>>2]=r}function Ns(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,l=o+8|0,s=o+4|0,d=o,t[s>>2]=n,i0(e,(t[n+944>>2]|0)==0,2709),i0(e,(t[e+964>>2]|0)==0,2763),bo(e),n=e+948|0,t[d>>2]=(t[n>>2]|0)+(r<<2),t[l>>2]=t[d>>2],P0(n,l,s)|0,t[(t[s>>2]|0)+944>>2]=e,ln(e),h=o}function bo(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;if(r=fi(e)|0,r|0?(t[(e0(e,0)|0)+944>>2]|0)!=(e|0):0){o=t[(t[e+976>>2]|0)+12>>2]|0,s=e+948|0,l=(o|0)==0,n=0;do d=t[(t[s>>2]|0)+(n<<2)>>2]|0,_=Wi(d)|0,t[(t[s>>2]|0)+(n<<2)>>2]=_,t[_+944>>2]=e,l||Q4[o&15](d,_,e,n),n=n+1|0;while((n|0)!=(r|0))}}function P0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0;Pe=h,h=h+64|0,P=Pe+52|0,_=Pe+48|0,q=Pe+28|0,we=Pe+24|0,le=Pe+20|0,ie=Pe,o=t[e>>2]|0,l=o,n=o+((t[n>>2]|0)-l>>2<<2)|0,o=e+4|0,s=t[o>>2]|0,d=e+8|0;do if(s>>>0<(t[d>>2]|0)>>>0){if((n|0)==(s|0)){t[n>>2]=t[r>>2],t[o>>2]=(t[o>>2]|0)+4;break}Qn(e,n,s,n+4|0),n>>>0<=r>>>0&&(r=(t[o>>2]|0)>>>0>r>>>0?r+4|0:r),t[n>>2]=t[r>>2]}else{o=(s-l>>2)+1|0,s=Q0(e)|0,s>>>0>>0&&$n(e),T=t[e>>2]|0,k=(t[d>>2]|0)-T|0,l=k>>1,z(ie,k>>2>>>0>>1>>>0?l>>>0>>0?o:l:s,n-T>>2,e+8|0),T=ie+8|0,o=t[T>>2]|0,l=ie+12|0,k=t[l>>2]|0,d=k,y=o;do if((o|0)==(k|0)){if(k=ie+4|0,o=t[k>>2]|0,ke=t[ie>>2]|0,s=ke,o>>>0<=ke>>>0){o=d-s>>1,o=(o|0)==0?1:o,z(q,o,o>>>2,t[ie+16>>2]|0),t[we>>2]=t[k>>2],t[le>>2]=t[T>>2],t[_>>2]=t[we>>2],t[P>>2]=t[le>>2],s0(q,_,P),o=t[ie>>2]|0,t[ie>>2]=t[q>>2],t[q>>2]=o,o=q+4|0,ke=t[k>>2]|0,t[k>>2]=t[o>>2],t[o>>2]=ke,o=q+8|0,ke=t[T>>2]|0,t[T>>2]=t[o>>2],t[o>>2]=ke,o=q+12|0,ke=t[l>>2]|0,t[l>>2]=t[o>>2],t[o>>2]=ke,Or(q),o=t[T>>2]|0;break}l=o,d=((l-s>>2)+1|0)/-2|0,_=o+(d<<2)|0,s=y-l|0,l=s>>2,l&&(Y1(_|0,o|0,s|0)|0,o=t[k>>2]|0),ke=_+(l<<2)|0,t[T>>2]=ke,t[k>>2]=o+(d<<2),o=ke}while(0);t[o>>2]=t[r>>2],t[T>>2]=(t[T>>2]|0)+4,n=nn(e,ie,n)|0,Or(ie)}while(0);return h=Pe,n|0}function ln(e){e=e|0;var n=0;do{if(n=e+984|0,c[n>>0]|0)break;c[n>>0]=1,D[e+504>>2]=w(J),e=t[e+944>>2]|0}while((e|0)!=0)}function lf(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-o|0)>>>2)<<2)),Ve(r))}function nr(e){return e=e|0,t[e+944>>2]|0}function rr(e){e=e|0,i0(e,(t[e+964>>2]|0)!=0,2832),ln(e)}function Go(e){return e=e|0,(c[e+984>>0]|0)!=0|0}function Gu(e,n){e=e|0,n=n|0,fL(e,n,400)|0&&(vn(e|0,n|0,400)|0,ln(e))}function yl(e){e=e|0;var n=tt;return n=w(D[e+44>>2]),e=gt(n)|0,w(e?w(0):n)}function cu(e){e=e|0;var n=tt;return n=w(D[e+48>>2]),gt(n)|0&&(n=c[(t[e+976>>2]|0)+2>>0]|0?w(1):w(0)),w(n)}function Bs(e,n){e=e|0,n=n|0,t[e+980>>2]=n}function Vu(e){return e=e|0,t[e+980>>2]|0}function M0(e,n){e=e|0,n=n|0;var r=0;r=e+4|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function au(e){return e=e|0,t[e+4>>2]|0}function Lr(e,n){e=e|0,n=n|0;var r=0;r=e+8|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function F(e){return e=e|0,t[e+8>>2]|0}function R(e,n){e=e|0,n=n|0;var r=0;r=e+12|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function U(e){return e=e|0,t[e+12>>2]|0}function H(e,n){e=e|0,n=n|0;var r=0;r=e+16|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function fe(e){return e=e|0,t[e+16>>2]|0}function ue(e,n){e=e|0,n=n|0;var r=0;r=e+20|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function de(e){return e=e|0,t[e+20>>2]|0}function W(e,n){e=e|0,n=n|0;var r=0;r=e+24|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function ve(e){return e=e|0,t[e+24>>2]|0}function Fe(e,n){e=e|0,n=n|0;var r=0;r=e+28|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function Ge(e){return e=e|0,t[e+28>>2]|0}function K(e,n){e=e|0,n=n|0;var r=0;r=e+32|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function xe(e){return e=e|0,t[e+32>>2]|0}function je(e,n){e=e|0,n=n|0;var r=0;r=e+36|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function Xe(e){return e=e|0,t[e+36>>2]|0}function rt(e,n){e=e|0,n=w(n);var r=0;r=e+40|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function st(e,n){e=e|0,n=w(n);var r=0;r=e+44|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function xt(e,n){e=e|0,n=w(n);var r=0;r=e+48|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function wt(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+52|0,s=e+56|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function lt(e,n){e=e|0,n=w(n);var r=0,o=0;o=e+52|0,r=e+56|0,(w(D[o>>2])==n?(t[r>>2]|0)==2:0)||(D[o>>2]=n,o=gt(n)|0,t[r>>2]=o?3:2,ln(e))}function Rt(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+52|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function yn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+132+(n<<3)|0,n=e+132+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function sn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=l?0:2,s=e+132+(n<<3)|0,n=e+132+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function ar(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=n+132+(r<<3)|0,n=t[o+4>>2]|0,r=e,t[r>>2]=t[o>>2],t[r+4>>2]=n}function rn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+60+(n<<3)|0,n=e+60+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function Hn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=l?0:2,s=e+60+(n<<3)|0,n=e+60+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function d0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=n+60+(r<<3)|0,n=t[o+4>>2]|0,r=e,t[r>>2]=t[o>>2],t[r+4>>2]=n}function Cr(e,n){e=e|0,n=n|0;var r=0;r=e+60+(n<<3)+4|0,(t[r>>2]|0)!=3&&(D[e+60+(n<<3)>>2]=w(J),t[r>>2]=3,ln(e))}function He(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+204+(n<<3)|0,n=e+204+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function Qe(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=l?0:2,s=e+204+(n<<3)|0,n=e+204+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function Ne(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=n+204+(r<<3)|0,n=t[o+4>>2]|0,r=e,t[r>>2]=t[o>>2],t[r+4>>2]=n}function ft(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+276+(n<<3)|0,n=e+276+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function St(e,n){return e=e|0,n=n|0,w(D[e+276+(n<<3)>>2])}function Qt(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+348|0,s=e+352|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Cn(e,n){e=e|0,n=w(n);var r=0,o=0;o=e+348|0,r=e+352|0,(w(D[o>>2])==n?(t[r>>2]|0)==2:0)||(D[o>>2]=n,o=gt(n)|0,t[r>>2]=o?3:2,ln(e))}function bn(e){e=e|0;var n=0;n=e+352|0,(t[n>>2]|0)!=3&&(D[e+348>>2]=w(J),t[n>>2]=3,ln(e))}function p0(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+348|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function h0(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+356|0,s=e+360|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function ci(e,n){e=e|0,n=w(n);var r=0,o=0;o=e+356|0,r=e+360|0,(w(D[o>>2])==n?(t[r>>2]|0)==2:0)||(D[o>>2]=n,o=gt(n)|0,t[r>>2]=o?3:2,ln(e))}function xi(e){e=e|0;var n=0;n=e+360|0,(t[n>>2]|0)!=3&&(D[e+356>>2]=w(J),t[n>>2]=3,ln(e))}function E0(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+356|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function qr(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+364|0,s=e+368|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Eo(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+364|0,s=e+368|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function So(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+364|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function wl(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+372|0,s=e+376|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function js(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+372|0,s=e+376|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Dl(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+372|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function du(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+380|0,s=e+384|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Yu(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+380|0,s=e+384|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Us(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+380|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function oo(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+388|0,s=e+392|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Hi(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+388|0,s=e+392|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function qs(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+388|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function F0(e,n){e=e|0,n=w(n);var r=0;r=e+396|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function Gr(e){return e=e|0,w(D[e+396>>2])}function ir(e){return e=e|0,w(D[e+400>>2])}function L0(e){return e=e|0,w(D[e+404>>2])}function Y0(e){return e=e|0,w(D[e+408>>2])}function Co(e){return e=e|0,w(D[e+412>>2])}function $u(e){return e=e|0,w(D[e+416>>2])}function Vo(e){return e=e|0,w(D[e+420>>2])}function Rr(e,n){switch(e=e|0,n=n|0,i0(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(D[e+424+(n<<2)>>2])}function Jn(e,n){switch(e=e|0,n=n|0,i0(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(D[e+448+(n<<2)>>2])}function ai(e,n){switch(e=e|0,n=n|0,i0(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(D[e+472+(n<<2)>>2])}function o0(e,n){e=e|0,n=n|0;var r=0,o=tt;return r=t[e+4>>2]|0,(r|0)==(t[n+4>>2]|0)?r?(o=w(D[e>>2]),e=w(Ot(w(o-w(D[n>>2]))))>2]=0,t[o+4>>2]=0,t[o+8>>2]=0,Ru(o|0,e|0,n|0,0),wn(e,3,(c[o+11>>0]|0)<0?t[o>>2]|0:o,r),ML(o),h=r}function $0(e,n,r,o){e=w(e),n=w(n),r=r|0,o=o|0;var s=tt;e=w(e*n),s=w(V4(e,w(1)));do if(Vr(s,w(0))|0)e=w(e-s);else{if(e=w(e-s),Vr(s,w(1))|0){e=w(e+w(1));break}if(r){e=w(e+w(1));break}o||(s>w(.5)?s=w(1):(o=Vr(s,w(.5))|0,s=w(o?1:0)),e=w(e+s))}while(0);return w(e/n)}function K0(e,n,r,o,s,l,d,_,y,k,T,P,q){e=e|0,n=w(n),r=r|0,o=w(o),s=s|0,l=w(l),d=d|0,_=w(_),y=w(y),k=w(k),T=w(T),P=w(P),q=q|0;var we=0,le=tt,ie=tt,Pe=tt,ke=tt,qe=tt,pe=tt;return y>2]),le!=w(0)):0)?(Pe=w($0(n,le,0,0)),ke=w($0(o,le,0,0)),ie=w($0(l,le,0,0)),le=w($0(_,le,0,0))):(ie=l,Pe=n,le=_,ke=o),(s|0)==(e|0)?we=Vr(ie,Pe)|0:we=0,(d|0)==(r|0)?q=Vr(le,ke)|0:q=0,((we?0:(qe=w(n-T),!(ae(e,qe,y)|0)))?!(Be(e,qe,s,y)|0):0)?we=Ie(e,qe,s,l,y)|0:we=1,((q?0:(pe=w(o-P),!(ae(r,pe,k)|0)))?!(Be(r,pe,d,k)|0):0)?q=Ie(r,pe,d,_,k)|0:q=1,q=we&q),q|0}function ae(e,n,r){return e=e|0,n=w(n),r=w(r),(e|0)==1?e=Vr(n,r)|0:e=0,e|0}function Be(e,n,r,o){return e=e|0,n=w(n),r=r|0,o=w(o),(e|0)==2&(r|0)==0?n>=o?e=1:e=Vr(n,o)|0:e=0,e|0}function Ie(e,n,r,o,s){return e=e|0,n=w(n),r=r|0,o=w(o),s=w(s),(e|0)==2&(r|0)==2&o>n?s<=n?e=1:e=Vr(n,s)|0:e=0,e|0}function ht(e,n,r,o,s,l,d,_,y,k,T){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=l|0,d=w(d),_=w(_),y=y|0,k=k|0,T=T|0;var P=0,q=0,we=0,le=0,ie=tt,Pe=tt,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=tt,Ki=tt,Xi=tt,Ji=0,Ro=0;zt=h,h=h+160|0,It=zt+152|0,Ht=zt+120|0,Ln=zt+104|0,pe=zt+72|0,le=zt+56|0,vt=zt+8|0,qe=zt,_e=(t[2279]|0)+1|0,t[2279]=_e,gn=e+984|0,((c[gn>>0]|0)!=0?(t[e+512>>2]|0)!=(t[2278]|0):0)?ke=4:(t[e+516>>2]|0)==(o|0)?Pn=0:ke=4,(ke|0)==4&&(t[e+520>>2]=0,t[e+924>>2]=-1,t[e+928>>2]=-1,D[e+932>>2]=w(-1),D[e+936>>2]=w(-1),Pn=1);e:do if(t[e+964>>2]|0)if(ie=w(mt(e,2,d)),Pe=w(mt(e,0,d)),P=e+916|0,Xi=w(D[P>>2]),Ki=w(D[e+920>>2]),Dr=w(D[e+932>>2]),K0(s,n,l,r,t[e+924>>2]|0,Xi,t[e+928>>2]|0,Ki,Dr,w(D[e+936>>2]),ie,Pe,T)|0)ke=22;else if(we=t[e+520>>2]|0,!we)ke=21;else for(q=0;;){if(P=e+524+(q*24|0)|0,Dr=w(D[P>>2]),Ki=w(D[e+524+(q*24|0)+4>>2]),Xi=w(D[e+524+(q*24|0)+16>>2]),K0(s,n,l,r,t[e+524+(q*24|0)+8>>2]|0,Dr,t[e+524+(q*24|0)+12>>2]|0,Ki,Xi,w(D[e+524+(q*24|0)+20>>2]),ie,Pe,T)|0){ke=22;break e}if(q=q+1|0,q>>>0>=we>>>0){ke=21;break}}else{if(y){if(P=e+916|0,!(Vr(w(D[P>>2]),n)|0)){ke=21;break}if(!(Vr(w(D[e+920>>2]),r)|0)){ke=21;break}if((t[e+924>>2]|0)!=(s|0)){ke=21;break}P=(t[e+928>>2]|0)==(l|0)?P:0,ke=22;break}if(we=t[e+520>>2]|0,!we)ke=21;else for(q=0;;){if(P=e+524+(q*24|0)|0,((Vr(w(D[P>>2]),n)|0?Vr(w(D[e+524+(q*24|0)+4>>2]),r)|0:0)?(t[e+524+(q*24|0)+8>>2]|0)==(s|0):0)?(t[e+524+(q*24|0)+12>>2]|0)==(l|0):0){ke=22;break e}if(q=q+1|0,q>>>0>=we>>>0){ke=21;break}}}while(0);do if((ke|0)==21)c[11697]|0?(P=0,ke=28):(P=0,ke=31);else if((ke|0)==22){if(q=(c[11697]|0)!=0,!((P|0)!=0&(Pn^1)))if(q){ke=28;break}else{ke=31;break}le=P+16|0,t[e+908>>2]=t[le>>2],we=P+20|0,t[e+912>>2]=t[we>>2],(c[11698]|0)==0|q^1||(t[qe>>2]=Gn(_e)|0,t[qe+4>>2]=_e,wn(e,4,2972,qe),q=t[e+972>>2]|0,q|0&&Nl[q&127](e),s=$t(s,y)|0,l=$t(l,y)|0,Ro=+w(D[le>>2]),Ji=+w(D[we>>2]),t[vt>>2]=s,t[vt+4>>2]=l,L[vt+8>>3]=+n,L[vt+16>>3]=+r,L[vt+24>>3]=Ro,L[vt+32>>3]=Ji,t[vt+40>>2]=k,wn(e,4,2989,vt))}while(0);return(ke|0)==28&&(q=Gn(_e)|0,t[le>>2]=q,t[le+4>>2]=_e,t[le+8>>2]=Pn?3047:11699,wn(e,4,3038,le),q=t[e+972>>2]|0,q|0&&Nl[q&127](e),vt=$t(s,y)|0,ke=$t(l,y)|0,t[pe>>2]=vt,t[pe+4>>2]=ke,L[pe+8>>3]=+n,L[pe+16>>3]=+r,t[pe+24>>2]=k,wn(e,4,3049,pe),ke=31),(ke|0)==31&&(X0(e,n,r,o,s,l,d,_,y,T),c[11697]|0&&(q=t[2279]|0,vt=Gn(q)|0,t[Ln>>2]=vt,t[Ln+4>>2]=q,t[Ln+8>>2]=Pn?3047:11699,wn(e,4,3083,Ln),q=t[e+972>>2]|0,q|0&&Nl[q&127](e),vt=$t(s,y)|0,Ln=$t(l,y)|0,Ji=+w(D[e+908>>2]),Ro=+w(D[e+912>>2]),t[Ht>>2]=vt,t[Ht+4>>2]=Ln,L[Ht+8>>3]=Ji,L[Ht+16>>3]=Ro,t[Ht+24>>2]=k,wn(e,4,3092,Ht)),t[e+516>>2]=o,P||(q=e+520|0,P=t[q>>2]|0,(P|0)==16&&(c[11697]|0&&wn(e,4,3124,It),t[q>>2]=0,P=0),y?P=e+916|0:(t[q>>2]=P+1,P=e+524+(P*24|0)|0),D[P>>2]=n,D[P+4>>2]=r,t[P+8>>2]=s,t[P+12>>2]=l,t[P+16>>2]=t[e+908>>2],t[P+20>>2]=t[e+912>>2],P=0)),y&&(t[e+416>>2]=t[e+908>>2],t[e+420>>2]=t[e+912>>2],c[e+985>>0]=1,c[gn>>0]=0),t[2279]=(t[2279]|0)+-1,t[e+512>>2]=t[2278],h=zt,Pn|(P|0)==0|0}function mt(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return o=w(Tr(e,n,r)),w(o+w(R0(e,n,r)))}function wn(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=h,h=h+16|0,s=l,t[s>>2]=o,e?o=t[e+976>>2]|0:o=0,Ku(o,e,n,r,s),h=l}function Gn(e){return e=e|0,(e>>>0>60?3201:3201+(60-e)|0)|0}function $t(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;return s=h,h=h+32|0,r=s+12|0,o=s,t[r>>2]=t[254],t[r+4>>2]=t[255],t[r+8>>2]=t[256],t[o>>2]=t[257],t[o+4>>2]=t[258],t[o+8>>2]=t[259],(e|0)>2?e=11699:e=t[(n?o:r)+(e<<2)>>2]|0,h=s,e|0}function X0(e,n,r,o,s,l,d,_,y,k){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=l|0,d=w(d),_=w(_),y=y|0,k=k|0;var T=0,P=0,q=0,we=0,le=tt,ie=tt,Pe=tt,ke=tt,qe=tt,pe=tt,_e=tt,vt=0,Ln=0,Ht=0,It=tt,gn=tt,Pn=0,zt=tt,Dr=0,Ki=0,Xi=0,Ji=0,Ro=0,kf=0,Af=0,Cu=0,Of=0,Js=0,Qs=0,If=0,Pf=0,Mf=0,Kn=0,Tu=0,Ff=0,us=0,Lf=tt,Rf=tt,Zs=tt,el=tt,ss=tt,Fi=0,nu=0,go=0,xu=0,jl=0,Ul=tt,tl=tt,ql=tt,zl=tt,Li=tt,Di=tt,ku=0,xr=tt,Wl=tt,Qi=tt,ls=tt,Zi=tt,fs=tt,Hl=0,bl=0,cs=tt,Ri=tt,Au=0,Gl=0,Vl=0,Yl=0,En=tt,br=0,Ei=0,eo=0,Ni=0,xn=0,Vt=0,Ou=0,kt=tt,$l=0,Qr=0;Ou=h,h=h+16|0,Fi=Ou+12|0,nu=Ou+8|0,go=Ou+4|0,xu=Ou,i0(e,(s|0)==0|(gt(n)|0)^1,3326),i0(e,(l|0)==0|(gt(r)|0)^1,3406),Ei=so(e,o)|0,t[e+496>>2]=Ei,xn=N0(2,Ei)|0,Vt=N0(0,Ei)|0,D[e+440>>2]=w(Tr(e,xn,d)),D[e+444>>2]=w(R0(e,xn,d)),D[e+428>>2]=w(Tr(e,Vt,d)),D[e+436>>2]=w(R0(e,Vt,d)),D[e+464>>2]=w(C0(e,xn)),D[e+468>>2]=w(di(e,xn)),D[e+452>>2]=w(C0(e,Vt)),D[e+460>>2]=w(di(e,Vt)),D[e+488>>2]=w(u0(e,xn,d)),D[e+492>>2]=w(v0(e,xn,d)),D[e+476>>2]=w(u0(e,Vt,d)),D[e+484>>2]=w(v0(e,Vt,d));do if(t[e+964>>2]|0)To(e,n,r,s,l,d,_);else{if(eo=e+948|0,Ni=(t[e+952>>2]|0)-(t[eo>>2]|0)>>2,!Ni){pu(e,n,r,s,l,d,_);break}if(y?0:Sl(e,n,r,s,l,d,_)|0)break;bo(e),Tu=e+508|0,c[Tu>>0]=0,xn=N0(t[e+4>>2]|0,Ei)|0,Vt=Cl(xn,Ei)|0,br=Nr(xn)|0,Ff=t[e+8>>2]|0,Gl=e+28|0,us=(t[Gl>>2]|0)!=0,Zi=br?d:_,cs=br?_:d,Lf=w(B0(e,xn,d)),Rf=w(hu(e,xn,d)),le=w(B0(e,Vt,d)),fs=w(Fn(e,xn,d)),Ri=w(Fn(e,Vt,d)),Ht=br?s:l,Au=br?l:s,En=br?fs:Ri,qe=br?Ri:fs,ls=w(mt(e,2,d)),ke=w(mt(e,0,d)),ie=w(w(Tn(e+364|0,d))-En),Pe=w(w(Tn(e+380|0,d))-En),pe=w(w(Tn(e+372|0,_))-qe),_e=w(w(Tn(e+388|0,_))-qe),Zs=br?ie:pe,el=br?Pe:_e,ls=w(n-ls),n=w(ls-En),gt(n)|0?En=n:En=w(Ur(w(cc(n,Pe)),ie)),Wl=w(r-ke),n=w(Wl-qe),gt(n)|0?Qi=n:Qi=w(Ur(w(cc(n,_e)),pe)),ie=br?En:Qi,xr=br?Qi:En;e:do if((Ht|0)==1)for(o=0,P=0;;){if(T=e0(e,P)|0,!o)(w(Br(T))>w(0)?w(zr(T))>w(0):0)?o=T:o=0;else if(pi(T)|0){we=0;break e}if(P=P+1|0,P>>>0>=Ni>>>0){we=o;break}}else we=0;while(0);vt=we+500|0,Ln=we+504|0,o=0,T=0,n=w(0),q=0;do{if(P=t[(t[eo>>2]|0)+(q<<2)>>2]|0,(t[P+36>>2]|0)==1)lo(P),c[P+985>>0]=1,c[P+984>>0]=0;else{$r(P),y&&Yo(P,so(P,Ei)|0,ie,xr,En);do if((t[P+24>>2]|0)!=1)if((P|0)==(we|0)){t[vt>>2]=t[2278],D[Ln>>2]=w(0);break}else{wr(e,P,En,s,Qi,En,Qi,l,Ei,k);break}else T|0&&(t[T+960>>2]=P),t[P+960>>2]=0,T=P,o=(o|0)==0?P:o;while(0);Di=w(D[P+504>>2]),n=w(n+w(Di+w(mt(P,xn,En))))}q=q+1|0}while((q|0)!=(Ni|0));for(Xi=n>ie,ku=us&((Ht|0)==2&Xi)?1:Ht,Dr=(Au|0)==1,Ro=Dr&(y^1),kf=(ku|0)==1,Af=(ku|0)==2,Cu=976+(xn<<2)|0,Of=(Au|2|0)==2,Mf=Dr&(us^1),Js=1040+(Vt<<2)|0,Qs=1040+(xn<<2)|0,If=976+(Vt<<2)|0,Pf=(Au|0)!=1,Xi=us&((Ht|0)!=0&Xi),Ki=e+976|0,Dr=Dr^1,n=ie,Pn=0,Ji=0,Di=w(0),ss=w(0);;){e:do if(Pn>>>0>>0)for(Ln=t[eo>>2]|0,q=0,_e=w(0),pe=w(0),Pe=w(0),ie=w(0),P=0,T=0,we=Pn;;){if(vt=t[Ln+(we<<2)>>2]|0,(t[vt+36>>2]|0)!=1?(t[vt+940>>2]=Ji,(t[vt+24>>2]|0)!=1):0){if(ke=w(mt(vt,xn,En)),Kn=t[Cu>>2]|0,r=w(Tn(vt+380+(Kn<<3)|0,Zi)),qe=w(D[vt+504>>2]),r=w(cc(r,qe)),r=w(Ur(w(Tn(vt+364+(Kn<<3)|0,Zi)),r)),us&(q|0)!=0&w(ke+w(pe+r))>n){l=q,ke=_e,Ht=we;break e}ke=w(ke+r),r=w(pe+ke),ke=w(_e+ke),pi(vt)|0&&(Pe=w(Pe+w(Br(vt))),ie=w(ie-w(qe*w(zr(vt))))),T|0&&(t[T+960>>2]=vt),t[vt+960>>2]=0,q=q+1|0,T=vt,P=(P|0)==0?vt:P}else ke=_e,r=pe;if(we=we+1|0,we>>>0>>0)_e=ke,pe=r;else{l=q,Ht=we;break}}else l=0,ke=w(0),Pe=w(0),ie=w(0),P=0,Ht=Pn;while(0);Kn=Pe>w(0)&Pew(0)&ieel&((gt(el)|0)^1))n=el,Kn=51;else if(c[(t[Ki>>2]|0)+3>>0]|0)Kn=51;else{if(It!=w(0)?w(Br(e))!=w(0):0){Kn=53;break}n=ke,Kn=53}while(0);if((Kn|0)==51&&(Kn=0,gt(n)|0?Kn=53:(gn=w(n-ke),zt=n)),(Kn|0)==53&&(Kn=0,ke>2]|0,we=gnw(0),pe=w(gn/It),Pe=w(0),ke=w(0),n=w(0),T=P;do r=w(Tn(T+380+(q<<3)|0,Zi)),ie=w(Tn(T+364+(q<<3)|0,Zi)),ie=w(cc(r,w(Ur(ie,w(D[T+504>>2]))))),we?(r=w(ie*w(zr(T))),(r!=w(-0)?(kt=w(ie-w(qe*r)),Ul=w(kn(T,xn,kt,zt,En)),kt!=Ul):0)&&(Pe=w(Pe-w(Ul-ie)),n=w(n+r))):((vt?(tl=w(Br(T)),tl!=w(0)):0)?(kt=w(ie+w(pe*tl)),ql=w(kn(T,xn,kt,zt,En)),kt!=ql):0)&&(Pe=w(Pe-w(ql-ie)),ke=w(ke-tl)),T=t[T+960>>2]|0;while((T|0)!=0);if(n=w(_e+n),ie=w(gn+Pe),jl)n=w(0);else{qe=w(It+ke),we=t[Cu>>2]|0,vt=iew(0),qe=w(ie/qe),n=w(0);do{kt=w(Tn(P+380+(we<<3)|0,Zi)),Pe=w(Tn(P+364+(we<<3)|0,Zi)),Pe=w(cc(kt,w(Ur(Pe,w(D[P+504>>2]))))),vt?(kt=w(Pe*w(zr(P))),ie=w(-kt),kt!=w(-0)?(kt=w(pe*ie),ie=w(kn(P,xn,w(Pe+(Ln?ie:kt)),zt,En))):ie=Pe):(q?(zl=w(Br(P)),zl!=w(0)):0)?ie=w(kn(P,xn,w(Pe+w(qe*zl)),zt,En)):ie=Pe,n=w(n-w(ie-Pe)),ke=w(mt(P,xn,En)),r=w(mt(P,Vt,En)),ie=w(ie+ke),D[nu>>2]=ie,t[xu>>2]=1,Pe=w(D[P+396>>2]);e:do if(gt(Pe)|0){T=gt(xr)|0;do if(!T){if(Xi|(m0(P,Vt,xr)|0|Dr)||(T0(e,P)|0)!=4||(t[(hi(P,Vt)|0)+4>>2]|0)==3||(t[(Ai(P,Vt)|0)+4>>2]|0)==3)break;D[Fi>>2]=xr,t[go>>2]=1;break e}while(0);if(m0(P,Vt,xr)|0){T=t[P+992+(t[If>>2]<<2)>>2]|0,kt=w(r+w(Tn(T,xr))),D[Fi>>2]=kt,T=Pf&(t[T+4>>2]|0)==2,t[go>>2]=((gt(kt)|0|T)^1)&1;break}else{D[Fi>>2]=xr,t[go>>2]=T?0:2;break}}else kt=w(ie-ke),It=w(kt/Pe),kt=w(Pe*kt),t[go>>2]=1,D[Fi>>2]=w(r+(br?It:kt));while(0);Kt(P,xn,zt,En,xu,nu),Kt(P,Vt,xr,En,go,Fi);do if(m0(P,Vt,xr)|0?0:(T0(e,P)|0)==4){if((t[(hi(P,Vt)|0)+4>>2]|0)==3){T=0;break}T=(t[(Ai(P,Vt)|0)+4>>2]|0)!=3}else T=0;while(0);kt=w(D[nu>>2]),It=w(D[Fi>>2]),$l=t[xu>>2]|0,Qr=t[go>>2]|0,ht(P,br?kt:It,br?It:kt,Ei,br?$l:Qr,br?Qr:$l,En,Qi,y&(T^1),3488,k)|0,c[Tu>>0]=c[Tu>>0]|c[P+508>>0],P=t[P+960>>2]|0}while((P|0)!=0)}}else n=w(0);if(n=w(gn+n),Qr=n>0]=Qr|C[Tu>>0],Af&n>w(0)?(T=t[Cu>>2]|0,((t[e+364+(T<<3)+4>>2]|0)!=0?(Li=w(Tn(e+364+(T<<3)|0,Zi)),Li>=w(0)):0)?ie=w(Ur(w(0),w(Li-w(zt-n)))):ie=w(0)):ie=n,vt=Pn>>>0>>0,vt){we=t[eo>>2]|0,q=Pn,T=0;do P=t[we+(q<<2)>>2]|0,t[P+24>>2]|0||(T=((t[(hi(P,xn)|0)+4>>2]|0)==3&1)+T|0,T=T+((t[(Ai(P,xn)|0)+4>>2]|0)==3&1)|0),q=q+1|0;while((q|0)!=(Ht|0));T?(ke=w(0),r=w(0)):Kn=101}else Kn=101;e:do if((Kn|0)==101)switch(Kn=0,Ff|0){case 1:{T=0,ke=w(ie*w(.5)),r=w(0);break e}case 2:{T=0,ke=ie,r=w(0);break e}case 3:{if(l>>>0<=1){T=0,ke=w(0),r=w(0);break e}r=w((l+-1|0)>>>0),T=0,ke=w(0),r=w(w(Ur(ie,w(0)))/r);break e}case 5:{r=w(ie/w((l+1|0)>>>0)),T=0,ke=r;break e}case 4:{r=w(ie/w(l>>>0)),T=0,ke=w(r*w(.5));break e}default:{T=0,ke=w(0),r=w(0);break e}}while(0);if(n=w(Lf+ke),vt){Pe=w(ie/w(T|0)),q=t[eo>>2]|0,P=Pn,ie=w(0);do{T=t[q+(P<<2)>>2]|0;e:do if((t[T+36>>2]|0)!=1){switch(t[T+24>>2]|0){case 1:{if(X(T,xn)|0){if(!y)break e;kt=w(Y(T,xn,zt)),kt=w(kt+w(C0(e,xn))),kt=w(kt+w(Tr(T,xn,En))),D[T+400+(t[Qs>>2]<<2)>>2]=kt;break e}break}case 0:if(Qr=(t[(hi(T,xn)|0)+4>>2]|0)==3,kt=w(Pe+n),n=Qr?kt:n,y&&(Qr=T+400+(t[Qs>>2]<<2)|0,D[Qr>>2]=w(n+w(D[Qr>>2]))),Qr=(t[(Ai(T,xn)|0)+4>>2]|0)==3,kt=w(Pe+n),n=Qr?kt:n,Ro){kt=w(r+w(mt(T,xn,En))),ie=xr,n=w(n+w(kt+w(D[T+504>>2])));break e}else{n=w(n+w(r+w(ye(T,xn,En)))),ie=w(Ur(ie,w(ye(T,Vt,En))));break e}default:}y&&(kt=w(ke+w(C0(e,xn))),Qr=T+400+(t[Qs>>2]<<2)|0,D[Qr>>2]=w(kt+w(D[Qr>>2])))}while(0);P=P+1|0}while((P|0)!=(Ht|0))}else ie=w(0);if(r=w(Rf+n),Of?ke=w(w(kn(e,Vt,w(Ri+ie),cs,d))-Ri):ke=xr,Pe=w(w(kn(e,Vt,w(Ri+(Mf?xr:ie)),cs,d))-Ri),vt&y){P=Pn;do{q=t[(t[eo>>2]|0)+(P<<2)>>2]|0;do if((t[q+36>>2]|0)!=1){if((t[q+24>>2]|0)==1){if(X(q,Vt)|0){if(kt=w(Y(q,Vt,xr)),kt=w(kt+w(C0(e,Vt))),kt=w(kt+w(Tr(q,Vt,En))),T=t[Js>>2]|0,D[q+400+(T<<2)>>2]=kt,!(gt(kt)|0))break}else T=t[Js>>2]|0;kt=w(C0(e,Vt)),D[q+400+(T<<2)>>2]=w(kt+w(Tr(q,Vt,En)));break}T=T0(e,q)|0;do if((T|0)==4){if((t[(hi(q,Vt)|0)+4>>2]|0)==3){Kn=139;break}if((t[(Ai(q,Vt)|0)+4>>2]|0)==3){Kn=139;break}if(m0(q,Vt,xr)|0){n=le;break}$l=t[q+908+(t[Cu>>2]<<2)>>2]|0,t[Fi>>2]=$l,n=w(D[q+396>>2]),Qr=gt(n)|0,ie=(t[j>>2]=$l,w(D[j>>2])),Qr?n=Pe:(gn=w(mt(q,Vt,En)),kt=w(ie/n),n=w(n*ie),n=w(gn+(br?kt:n))),D[nu>>2]=n,D[Fi>>2]=w(w(mt(q,xn,En))+ie),t[go>>2]=1,t[xu>>2]=1,Kt(q,xn,zt,En,go,Fi),Kt(q,Vt,xr,En,xu,nu),n=w(D[Fi>>2]),gn=w(D[nu>>2]),kt=br?n:gn,n=br?gn:n,Qr=((gt(kt)|0)^1)&1,ht(q,kt,n,Ei,Qr,((gt(n)|0)^1)&1,En,Qi,1,3493,k)|0,n=le}else Kn=139;while(0);e:do if((Kn|0)==139){Kn=0,n=w(ke-w(ye(q,Vt,En)));do if((t[(hi(q,Vt)|0)+4>>2]|0)==3){if((t[(Ai(q,Vt)|0)+4>>2]|0)!=3)break;n=w(le+w(Ur(w(0),w(n*w(.5)))));break e}while(0);if((t[(Ai(q,Vt)|0)+4>>2]|0)==3){n=le;break}if((t[(hi(q,Vt)|0)+4>>2]|0)==3){n=w(le+w(Ur(w(0),n)));break}switch(T|0){case 1:{n=le;break e}case 2:{n=w(le+w(n*w(.5)));break e}default:{n=w(le+n);break e}}}while(0);kt=w(Di+n),Qr=q+400+(t[Js>>2]<<2)|0,D[Qr>>2]=w(kt+w(D[Qr>>2]))}while(0);P=P+1|0}while((P|0)!=(Ht|0))}if(Di=w(Di+Pe),ss=w(Ur(ss,r)),l=Ji+1|0,Ht>>>0>=Ni>>>0)break;n=zt,Pn=Ht,Ji=l}do if(y){if(T=l>>>0>1,T?0:!(he(e)|0))break;if(!(gt(xr)|0)){n=w(xr-Di);e:do switch(t[e+12>>2]|0){case 3:{le=w(le+n),pe=w(0);break}case 2:{le=w(le+w(n*w(.5))),pe=w(0);break}case 4:{xr>Di?pe=w(n/w(l>>>0)):pe=w(0);break}case 7:if(xr>Di){le=w(le+w(n/w(l<<1>>>0))),pe=w(n/w(l>>>0)),pe=T?pe:w(0);break e}else{le=w(le+w(n*w(.5))),pe=w(0);break e}case 6:{pe=w(n/w(Ji>>>0)),pe=xr>Di&T?pe:w(0);break}default:pe=w(0)}while(0);if(l|0)for(vt=1040+(Vt<<2)|0,Ln=976+(Vt<<2)|0,we=0,P=0;;){e:do if(P>>>0>>0)for(ie=w(0),Pe=w(0),n=w(0),q=P;;){T=t[(t[eo>>2]|0)+(q<<2)>>2]|0;do if((t[T+36>>2]|0)!=1?(t[T+24>>2]|0)==0:0){if((t[T+940>>2]|0)!=(we|0))break e;if(We(T,Vt)|0&&(kt=w(D[T+908+(t[Ln>>2]<<2)>>2]),n=w(Ur(n,w(kt+w(mt(T,Vt,En)))))),(T0(e,T)|0)!=5)break;Li=w(et(T)),Li=w(Li+w(Tr(T,0,En))),kt=w(D[T+912>>2]),kt=w(w(kt+w(mt(T,0,En)))-Li),Li=w(Ur(Pe,Li)),kt=w(Ur(ie,kt)),ie=kt,Pe=Li,n=w(Ur(n,w(Li+kt)))}while(0);if(T=q+1|0,T>>>0>>0)q=T;else{q=T;break}}else Pe=w(0),n=w(0),q=P;while(0);if(qe=w(pe+n),r=le,le=w(le+qe),P>>>0>>0){ke=w(r+Pe),T=P;do{P=t[(t[eo>>2]|0)+(T<<2)>>2]|0;e:do if((t[P+36>>2]|0)!=1?(t[P+24>>2]|0)==0:0)switch(T0(e,P)|0){case 1:{kt=w(r+w(Tr(P,Vt,En))),D[P+400+(t[vt>>2]<<2)>>2]=kt;break e}case 3:{kt=w(w(le-w(R0(P,Vt,En)))-w(D[P+908+(t[Ln>>2]<<2)>>2])),D[P+400+(t[vt>>2]<<2)>>2]=kt;break e}case 2:{kt=w(r+w(w(qe-w(D[P+908+(t[Ln>>2]<<2)>>2]))*w(.5))),D[P+400+(t[vt>>2]<<2)>>2]=kt;break e}case 4:{if(kt=w(r+w(Tr(P,Vt,En))),D[P+400+(t[vt>>2]<<2)>>2]=kt,m0(P,Vt,xr)|0||(br?(ie=w(D[P+908>>2]),n=w(ie+w(mt(P,xn,En))),Pe=qe):(Pe=w(D[P+912>>2]),Pe=w(Pe+w(mt(P,Vt,En))),n=qe,ie=w(D[P+908>>2])),Vr(n,ie)|0?Vr(Pe,w(D[P+912>>2]))|0:0))break e;ht(P,n,Pe,Ei,1,1,En,Qi,1,3501,k)|0;break e}case 5:{D[P+404>>2]=w(w(ke-w(et(P)))+w(Y(P,0,xr)));break e}default:break e}while(0);T=T+1|0}while((T|0)!=(q|0))}if(we=we+1|0,(we|0)==(l|0))break;P=q}}}while(0);if(D[e+908>>2]=w(kn(e,2,ls,d,d)),D[e+912>>2]=w(kn(e,0,Wl,_,d)),((ku|0)!=0?(Hl=t[e+32>>2]|0,bl=(ku|0)==2,!(bl&(Hl|0)!=2)):0)?bl&(Hl|0)==2&&(n=w(fs+zt),n=w(Ur(w(cc(n,w(Dt(e,xn,ss,Zi)))),fs)),Kn=198):(n=w(kn(e,xn,ss,Zi,d)),Kn=198),(Kn|0)==198&&(D[e+908+(t[976+(xn<<2)>>2]<<2)>>2]=n),((Au|0)!=0?(Vl=t[e+32>>2]|0,Yl=(Au|0)==2,!(Yl&(Vl|0)!=2)):0)?Yl&(Vl|0)==2&&(n=w(Ri+xr),n=w(Ur(w(cc(n,w(Dt(e,Vt,w(Ri+Di),cs)))),Ri)),Kn=204):(n=w(kn(e,Vt,w(Ri+Di),cs,d)),Kn=204),(Kn|0)==204&&(D[e+908+(t[976+(Vt<<2)>>2]<<2)>>2]=n),y){if((t[Gl>>2]|0)==2){P=976+(Vt<<2)|0,q=1040+(Vt<<2)|0,T=0;do we=e0(e,T)|0,t[we+24>>2]|0||($l=t[P>>2]|0,kt=w(D[e+908+($l<<2)>>2]),Qr=we+400+(t[q>>2]<<2)|0,kt=w(kt-w(D[Qr>>2])),D[Qr>>2]=w(kt-w(D[we+908+($l<<2)>>2]))),T=T+1|0;while((T|0)!=(Ni|0))}if(o|0){T=br?ku:s;do bt(e,o,En,T,Qi,Ei,k),o=t[o+960>>2]|0;while((o|0)!=0)}if(T=(xn|2|0)==3,P=(Vt|2|0)==3,T|P){o=0;do q=t[(t[eo>>2]|0)+(o<<2)>>2]|0,(t[q+36>>2]|0)!=1&&(T&&Zt(e,q,xn),P&&Zt(e,q,Vt)),o=o+1|0;while((o|0)!=(Ni|0))}}}while(0);h=Ou}function ki(e,n){e=e|0,n=w(n);var r=0;li(e,n>=w(0),3147),r=n==w(0),D[e+4>>2]=r?w(0):n}function Yr(e,n,r,o){e=e|0,n=w(n),r=w(r),o=o|0;var s=tt,l=tt,d=0,_=0,y=0;t[2278]=(t[2278]|0)+1,$r(e),m0(e,2,n)|0?(s=w(Tn(t[e+992>>2]|0,n)),y=1,s=w(s+w(mt(e,2,n)))):(s=w(Tn(e+380|0,n)),s>=w(0)?y=2:(y=((gt(n)|0)^1)&1,s=n)),m0(e,0,r)|0?(l=w(Tn(t[e+996>>2]|0,r)),_=1,l=w(l+w(mt(e,0,n)))):(l=w(Tn(e+388|0,r)),l>=w(0)?_=2:(_=((gt(r)|0)^1)&1,l=r)),d=e+976|0,(ht(e,s,l,o,y,_,n,r,1,3189,t[d>>2]|0)|0?(Yo(e,t[e+496>>2]|0,n,r,n),bi(e,w(D[(t[d>>2]|0)+4>>2]),w(0),w(0)),c[11696]|0):0)&&ff(e,7)}function $r(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;_=h,h=h+32|0,d=_+24|0,l=_+16|0,o=_+8|0,s=_,r=0;do n=e+380+(r<<3)|0,((t[e+380+(r<<3)+4>>2]|0)!=0?(y=n,k=t[y+4>>2]|0,T=o,t[T>>2]=t[y>>2],t[T+4>>2]=k,T=e+364+(r<<3)|0,k=t[T+4>>2]|0,y=s,t[y>>2]=t[T>>2],t[y+4>>2]=k,t[l>>2]=t[o>>2],t[l+4>>2]=t[o+4>>2],t[d>>2]=t[s>>2],t[d+4>>2]=t[s+4>>2],o0(l,d)|0):0)||(n=e+348+(r<<3)|0),t[e+992+(r<<2)>>2]=n,r=r+1|0;while((r|0)!=2);h=_}function m0(e,n,r){e=e|0,n=n|0,r=w(r);var o=0;switch(e=t[e+992+(t[976+(n<<2)>>2]<<2)>>2]|0,t[e+4>>2]|0){case 0:case 3:{e=0;break}case 1:{w(D[e>>2])>2])>2]|0){case 2:{n=w(w(w(D[e>>2])*n)/w(100));break}case 1:{n=w(D[e>>2]);break}default:n=w(J)}return w(n)}function Yo(e,n,r,o,s){e=e|0,n=n|0,r=w(r),o=w(o),s=w(s);var l=0,d=tt;n=t[e+944>>2]|0?n:1,l=N0(t[e+4>>2]|0,n)|0,n=Cl(l,n)|0,r=w(Wr(e,l,r)),o=w(Wr(e,n,o)),d=w(r+w(Tr(e,l,s))),D[e+400+(t[1040+(l<<2)>>2]<<2)>>2]=d,r=w(r+w(R0(e,l,s))),D[e+400+(t[1e3+(l<<2)>>2]<<2)>>2]=r,r=w(o+w(Tr(e,n,s))),D[e+400+(t[1040+(n<<2)>>2]<<2)>>2]=r,s=w(o+w(R0(e,n,s))),D[e+400+(t[1e3+(n<<2)>>2]<<2)>>2]=s}function bi(e,n,r,o){e=e|0,n=w(n),r=w(r),o=w(o);var s=0,l=0,d=tt,_=tt,y=0,k=0,T=tt,P=0,q=tt,we=tt,le=tt,ie=tt;if(n!=w(0)&&(s=e+400|0,ie=w(D[s>>2]),l=e+404|0,le=w(D[l>>2]),P=e+416|0,we=w(D[P>>2]),k=e+420|0,d=w(D[k>>2]),q=w(ie+r),T=w(le+o),o=w(q+we),_=w(T+d),y=(t[e+988>>2]|0)==1,D[s>>2]=w($0(ie,n,0,y)),D[l>>2]=w($0(le,n,0,y)),r=w(V4(w(we*n),w(1))),Vr(r,w(0))|0?l=0:l=(Vr(r,w(1))|0)^1,r=w(V4(w(d*n),w(1))),Vr(r,w(0))|0?s=0:s=(Vr(r,w(1))|0)^1,ie=w($0(o,n,y&l,y&(l^1))),D[P>>2]=w(ie-w($0(q,n,0,y))),ie=w($0(_,n,y&s,y&(s^1))),D[k>>2]=w(ie-w($0(T,n,0,y))),l=(t[e+952>>2]|0)-(t[e+948>>2]|0)>>2,l|0)){s=0;do bi(e0(e,s)|0,n,q,T),s=s+1|0;while((s|0)!=(l|0))}}function or(e,n,r,o,s){switch(e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,r|0){case 5:case 0:{e=q8(t[489]|0,o,s)|0;break}default:e=AL(o,s)|0}return e|0}function zs(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;s=h,h=h+16|0,l=s,t[l>>2]=o,Ku(e,0,n,r,l),h=s}function Ku(e,n,r,o,s){if(e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,e=e|0?e:956,sD[t[e+8>>2]&1](e,n,r,o,s)|0,(r|0)==5)_n();else return}function J0(e,n,r){e=e|0,n=n|0,r=r|0,c[e+n>>0]=r&1}function af(e,n){e=e|0,n=n|0;var r=0,o=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,o=(t[r>>2]|0)-(t[n>>2]|0)>>2,o|0&&(S0(e,o),El(e,t[n>>2]|0,t[r>>2]|0,o))}function S0(e,n){e=e|0,n=n|0;var r=0;if((Q0(e)|0)>>>0>>0&&$n(e),n>>>0>1073741823)_n();else{r=Tt(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function El(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,o=e+4|0,e=r-n|0,(e|0)>0&&(vn(t[o>>2]|0,n|0,e|0)|0,t[o>>2]=(t[o>>2]|0)+(e>>>2<<2))}function Q0(e){return e=e|0,1073741823}function Tr(e,n,r){return e=e|0,n=n|0,r=w(r),(Nr(n)|0?(t[e+96>>2]|0)!=0:0)?e=e+92|0:e=en(e+60|0,t[1040+(n<<2)>>2]|0,992)|0,w(uo(e,r))}function R0(e,n,r){return e=e|0,n=n|0,r=w(r),(Nr(n)|0?(t[e+104>>2]|0)!=0:0)?e=e+100|0:e=en(e+60|0,t[1e3+(n<<2)>>2]|0,992)|0,w(uo(e,r))}function Nr(e){return e=e|0,(e|1|0)==3|0}function uo(e,n){return e=e|0,n=w(n),(t[e+4>>2]|0)==3?n=w(0):n=w(Tn(e,n)),w(n)}function so(e,n){return e=e|0,n=n|0,e=t[e>>2]|0,((e|0)==0?(n|0)>1?n:1:e)|0}function N0(e,n){e=e|0,n=n|0;var r=0;e:do if((n|0)==2){switch(e|0){case 2:{e=3;break e}case 3:break;default:{r=4;break e}}e=2}else r=4;while(0);return e|0}function C0(e,n){e=e|0,n=n|0;var r=tt;return((Nr(n)|0?(t[e+312>>2]|0)!=0:0)?(r=w(D[e+308>>2]),r>=w(0)):0)||(r=w(Ur(w(D[(en(e+276|0,t[1040+(n<<2)>>2]|0,992)|0)>>2]),w(0)))),w(r)}function di(e,n){e=e|0,n=n|0;var r=tt;return((Nr(n)|0?(t[e+320>>2]|0)!=0:0)?(r=w(D[e+316>>2]),r>=w(0)):0)||(r=w(Ur(w(D[(en(e+276|0,t[1e3+(n<<2)>>2]|0,992)|0)>>2]),w(0)))),w(r)}function u0(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return((Nr(n)|0?(t[e+240>>2]|0)!=0:0)?(o=w(Tn(e+236|0,r)),o>=w(0)):0)||(o=w(Ur(w(Tn(en(e+204|0,t[1040+(n<<2)>>2]|0,992)|0,r)),w(0)))),w(o)}function v0(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return((Nr(n)|0?(t[e+248>>2]|0)!=0:0)?(o=w(Tn(e+244|0,r)),o>=w(0)):0)||(o=w(Ur(w(Tn(en(e+204|0,t[1e3+(n<<2)>>2]|0,992)|0,r)),w(0)))),w(o)}function To(e,n,r,o,s,l,d){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=w(l),d=w(d);var _=tt,y=tt,k=tt,T=tt,P=tt,q=tt,we=0,le=0,ie=0;ie=h,h=h+16|0,we=ie,le=e+964|0,i0(e,(t[le>>2]|0)!=0,3519),_=w(Fn(e,2,n)),y=w(Fn(e,0,n)),k=w(mt(e,2,n)),T=w(mt(e,0,n)),gt(n)|0?P=n:P=w(Ur(w(0),w(w(n-k)-_))),gt(r)|0?q=r:q=w(Ur(w(0),w(w(r-T)-y))),(o|0)==1&(s|0)==1?(D[e+908>>2]=w(kn(e,2,w(n-k),l,l)),n=w(kn(e,0,w(r-T),d,l))):(lD[t[le>>2]&1](we,e,P,o,q,s),P=w(_+w(D[we>>2])),q=w(n-k),D[e+908>>2]=w(kn(e,2,(o|2|0)==2?P:q,l,l)),q=w(y+w(D[we+4>>2])),n=w(r-T),n=w(kn(e,0,(s|2|0)==2?q:n,d,l))),D[e+912>>2]=n,h=ie}function pu(e,n,r,o,s,l,d){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=w(l),d=w(d);var _=tt,y=tt,k=tt,T=tt;k=w(Fn(e,2,l)),_=w(Fn(e,0,l)),T=w(mt(e,2,l)),y=w(mt(e,0,l)),n=w(n-T),D[e+908>>2]=w(kn(e,2,(o|2|0)==2?k:n,l,l)),r=w(r-y),D[e+912>>2]=w(kn(e,0,(s|2|0)==2?_:r,d,l))}function Sl(e,n,r,o,s,l,d){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=w(l),d=w(d);var _=0,y=tt,k=tt;return _=(o|0)==2,((n<=w(0)&_?0:!(r<=w(0)&(s|0)==2))?!((o|0)==1&(s|0)==1):0)?e=0:(y=w(mt(e,0,l)),k=w(mt(e,2,l)),_=n>2]=w(kn(e,2,_?w(0):n,l,l)),n=w(r-y),_=r>2]=w(kn(e,0,_?w(0):n,d,l)),e=1),e|0}function Cl(e,n){return e=e|0,n=n|0,qt(e)|0?e=N0(2,n)|0:e=0,e|0}function B0(e,n,r){return e=e|0,n=n|0,r=w(r),r=w(u0(e,n,r)),w(r+w(C0(e,n)))}function hu(e,n,r){return e=e|0,n=n|0,r=w(r),r=w(v0(e,n,r)),w(r+w(di(e,n)))}function Fn(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return o=w(B0(e,n,r)),w(o+w(hu(e,n,r)))}function pi(e){return e=e|0,t[e+24>>2]|0?e=0:w(Br(e))!=w(0)?e=1:e=w(zr(e))!=w(0),e|0}function Br(e){e=e|0;var n=tt;if(t[e+944>>2]|0){if(n=w(D[e+44>>2]),gt(n)|0)return n=w(D[e+40>>2]),e=n>w(0)&((gt(n)|0)^1),w(e?n:w(0))}else n=w(0);return w(n)}function zr(e){e=e|0;var n=tt,r=0,o=tt;do if(t[e+944>>2]|0){if(n=w(D[e+48>>2]),gt(n)|0){if(r=c[(t[e+976>>2]|0)+2>>0]|0,r<<24>>24==0?(o=w(D[e+40>>2]),o>24?w(1):w(0)}}else n=w(0);while(0);return w(n)}function lo(e){e=e|0;var n=0,r=0;if(pa(e+400|0,0,540)|0,c[e+985>>0]=1,bo(e),r=fi(e)|0,r|0){n=e+948|0,e=0;do lo(t[(t[n>>2]|0)+(e<<2)>>2]|0),e=e+1|0;while((e|0)!=(r|0))}}function wr(e,n,r,o,s,l,d,_,y,k){e=e|0,n=n|0,r=w(r),o=o|0,s=w(s),l=w(l),d=w(d),_=_|0,y=y|0,k=k|0;var T=0,P=tt,q=0,we=0,le=tt,ie=tt,Pe=0,ke=tt,qe=0,pe=tt,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=0,Ki=0;Dr=h,h=h+16|0,Ln=Dr+12|0,Ht=Dr+8|0,It=Dr+4|0,gn=Dr,zt=N0(t[e+4>>2]|0,y)|0,_e=Nr(zt)|0,P=w(Tn(Ut(n)|0,_e?l:d)),vt=m0(n,2,l)|0,Pn=m0(n,0,d)|0;do if(gt(P)|0?0:!(gt(_e?r:s)|0)){if(T=n+504|0,!(gt(w(D[T>>2]))|0)&&(!(fn(t[n+976>>2]|0,0)|0)||(t[n+500>>2]|0)==(t[2278]|0)))break;D[T>>2]=w(Ur(P,w(Fn(n,zt,l))))}else q=7;while(0);do if((q|0)==7){if(qe=_e^1,!(qe|vt^1)){d=w(Tn(t[n+992>>2]|0,l)),D[n+504>>2]=w(Ur(d,w(Fn(n,2,l))));break}if(!(_e|Pn^1)){d=w(Tn(t[n+996>>2]|0,d)),D[n+504>>2]=w(Ur(d,w(Fn(n,0,l))));break}D[Ln>>2]=w(J),D[Ht>>2]=w(J),t[It>>2]=0,t[gn>>2]=0,ke=w(mt(n,2,l)),pe=w(mt(n,0,l)),vt?(le=w(ke+w(Tn(t[n+992>>2]|0,l))),D[Ln>>2]=le,t[It>>2]=1,we=1):(we=0,le=w(J)),Pn?(P=w(pe+w(Tn(t[n+996>>2]|0,d))),D[Ht>>2]=P,t[gn>>2]=1,T=1):(T=0,P=w(J)),q=t[e+32>>2]|0,_e&(q|0)==2?q=2:(gt(le)|0?!(gt(r)|0):0)&&(D[Ln>>2]=r,t[It>>2]=2,we=2,le=r),(((q|0)==2&qe?0:gt(P)|0)?!(gt(s)|0):0)&&(D[Ht>>2]=s,t[gn>>2]=2,T=2,P=s),ie=w(D[n+396>>2]),Pe=gt(ie)|0;do if(Pe)q=we;else{if((we|0)==1&qe){D[Ht>>2]=w(w(le-ke)/ie),t[gn>>2]=1,T=1,q=1;break}_e&(T|0)==1?(D[Ln>>2]=w(ie*w(P-pe)),t[It>>2]=1,T=1,q=1):q=we}while(0);Ki=gt(r)|0,we=(T0(e,n)|0)!=4,(_e|vt|((o|0)!=1|Ki)|(we|(q|0)==1)?0:(D[Ln>>2]=r,t[It>>2]=1,!Pe))&&(D[Ht>>2]=w(w(r-ke)/ie),t[gn>>2]=1,T=1),(Pn|qe|((_|0)!=1|(gt(s)|0))|(we|(T|0)==1)?0:(D[Ht>>2]=s,t[gn>>2]=1,!Pe))&&(D[Ln>>2]=w(ie*w(s-pe)),t[It>>2]=1),Kt(n,2,l,l,It,Ln),Kt(n,0,d,l,gn,Ht),r=w(D[Ln>>2]),s=w(D[Ht>>2]),ht(n,r,s,y,t[It>>2]|0,t[gn>>2]|0,l,d,0,3565,k)|0,d=w(D[n+908+(t[976+(zt<<2)>>2]<<2)>>2]),D[n+504>>2]=w(Ur(d,w(Fn(n,zt,l))))}while(0);t[n+500>>2]=t[2278],h=Dr}function kn(e,n,r,o,s){return e=e|0,n=n|0,r=w(r),o=w(o),s=w(s),o=w(Dt(e,n,r,o)),w(Ur(o,w(Fn(e,n,s))))}function T0(e,n){return e=e|0,n=n|0,n=n+20|0,n=t[((t[n>>2]|0)==0?e+16|0:n)>>2]|0,((n|0)==5?qt(t[e+4>>2]|0)|0:0)&&(n=1),n|0}function hi(e,n){return e=e|0,n=n|0,(Nr(n)|0?(t[e+96>>2]|0)!=0:0)?n=4:n=t[1040+(n<<2)>>2]|0,e+60+(n<<3)|0}function Ai(e,n){return e=e|0,n=n|0,(Nr(n)|0?(t[e+104>>2]|0)!=0:0)?n=5:n=t[1e3+(n<<2)>>2]|0,e+60+(n<<3)|0}function Kt(e,n,r,o,s,l){switch(e=e|0,n=n|0,r=w(r),o=w(o),s=s|0,l=l|0,r=w(Tn(e+380+(t[976+(n<<2)>>2]<<3)|0,r)),r=w(r+w(mt(e,n,o))),t[s>>2]|0){case 2:case 1:{s=gt(r)|0,o=w(D[l>>2]),D[l>>2]=s|o>2]=2,D[l>>2]=r);break}default:}}function X(e,n){return e=e|0,n=n|0,e=e+132|0,(Nr(n)|0?(t[(en(e,4,948)|0)+4>>2]|0)!=0:0)?e=1:e=(t[(en(e,t[1040+(n<<2)>>2]|0,948)|0)+4>>2]|0)!=0,e|0}function Y(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0;return e=e+132|0,(Nr(n)|0?(o=en(e,4,948)|0,(t[o+4>>2]|0)!=0):0)?s=4:(o=en(e,t[1040+(n<<2)>>2]|0,948)|0,t[o+4>>2]|0?s=4:r=w(0)),(s|0)==4&&(r=w(Tn(o,r))),w(r)}function ye(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return o=w(D[e+908+(t[976+(n<<2)>>2]<<2)>>2]),o=w(o+w(Tr(e,n,r))),w(o+w(R0(e,n,r)))}function he(e){e=e|0;var n=0,r=0,o=0;e:do if(qt(t[e+4>>2]|0)|0)n=0;else if((t[e+16>>2]|0)!=5)if(r=fi(e)|0,!r)n=0;else for(n=0;;){if(o=e0(e,n)|0,(t[o+24>>2]|0)==0?(t[o+20>>2]|0)==5:0){n=1;break e}if(n=n+1|0,n>>>0>=r>>>0){n=0;break}}else n=1;while(0);return n|0}function We(e,n){e=e|0,n=n|0;var r=tt;return r=w(D[e+908+(t[976+(n<<2)>>2]<<2)>>2]),r>=w(0)&((gt(r)|0)^1)|0}function et(e){e=e|0;var n=tt,r=0,o=0,s=0,l=0,d=0,_=0,y=tt;if(r=t[e+968>>2]|0,r)y=w(D[e+908>>2]),n=w(D[e+912>>2]),n=w(rD[r&0](e,y,n)),i0(e,(gt(n)|0)^1,3573);else{l=fi(e)|0;do if(l|0){for(r=0,s=0;;){if(o=e0(e,s)|0,t[o+940>>2]|0){d=8;break}if((t[o+24>>2]|0)!=1)if(_=(T0(e,o)|0)==5,_){r=o;break}else r=(r|0)==0?o:r;if(s=s+1|0,s>>>0>=l>>>0){d=8;break}}if((d|0)==8&&!r)break;return n=w(et(r)),w(n+w(D[r+404>>2]))}while(0);n=w(D[e+912>>2])}return w(n)}function Dt(e,n,r,o){e=e|0,n=n|0,r=w(r),o=w(o);var s=tt,l=0;return qt(n)|0?(n=1,l=3):Nr(n)|0?(n=0,l=3):(o=w(J),s=w(J)),(l|0)==3&&(s=w(Tn(e+364+(n<<3)|0,o)),o=w(Tn(e+380+(n<<3)|0,o))),l=o=w(0)&((gt(o)|0)^1)),r=l?o:r,l=s>=w(0)&((gt(s)|0)^1)&r>2]|0,l)|0,le=Cl(Pe,l)|0,ie=Nr(Pe)|0,P=w(mt(n,2,r)),q=w(mt(n,0,r)),m0(n,2,r)|0?_=w(P+w(Tn(t[n+992>>2]|0,r))):(X(n,2)|0?_t(n,2)|0:0)?(_=w(D[e+908>>2]),y=w(C0(e,2)),y=w(_-w(y+w(di(e,2)))),_=w(Y(n,2,r)),_=w(kn(n,2,w(y-w(_+w(_r(n,2,r)))),r,r))):_=w(J),m0(n,0,s)|0?y=w(q+w(Tn(t[n+996>>2]|0,s))):(X(n,0)|0?_t(n,0)|0:0)?(y=w(D[e+912>>2]),qe=w(C0(e,0)),qe=w(y-w(qe+w(di(e,0)))),y=w(Y(n,0,s)),y=w(kn(n,0,w(qe-w(y+w(_r(n,0,s)))),s,r))):y=w(J),k=gt(_)|0,T=gt(y)|0;do if(k^T?(we=w(D[n+396>>2]),!(gt(we)|0)):0)if(k){_=w(P+w(w(y-q)*we));break}else{qe=w(q+w(w(_-P)/we)),y=T?qe:y;break}while(0);T=gt(_)|0,k=gt(y)|0,T|k&&(pe=(T^1)&1,o=r>w(0)&((o|0)!=0&T),_=ie?_:o?r:_,ht(n,_,y,l,ie?pe:o?2:pe,T&(k^1)&1,_,y,0,3623,d)|0,_=w(D[n+908>>2]),_=w(_+w(mt(n,2,r))),y=w(D[n+912>>2]),y=w(y+w(mt(n,0,r)))),ht(n,_,y,l,1,1,_,y,1,3635,d)|0,(_t(n,Pe)|0?!(X(n,Pe)|0):0)?(pe=t[976+(Pe<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),qe=w(qe-w(di(e,Pe))),qe=w(qe-w(R0(n,Pe,r))),qe=w(qe-w(_r(n,Pe,ie?r:s))),D[n+400+(t[1040+(Pe<<2)>>2]<<2)>>2]=qe):ke=21;do if((ke|0)==21){if(X(n,Pe)|0?0:(t[e+8>>2]|0)==1){pe=t[976+(Pe<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(w(qe-w(D[n+908+(pe<<2)>>2]))*w(.5)),D[n+400+(t[1040+(Pe<<2)>>2]<<2)>>2]=qe;break}(X(n,Pe)|0?0:(t[e+8>>2]|0)==2)&&(pe=t[976+(Pe<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),D[n+400+(t[1040+(Pe<<2)>>2]<<2)>>2]=qe)}while(0);(_t(n,le)|0?!(X(n,le)|0):0)?(pe=t[976+(le<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),qe=w(qe-w(di(e,le))),qe=w(qe-w(R0(n,le,r))),qe=w(qe-w(_r(n,le,ie?s:r))),D[n+400+(t[1040+(le<<2)>>2]<<2)>>2]=qe):ke=30;do if((ke|0)==30?!(X(n,le)|0):0){if((T0(e,n)|0)==2){pe=t[976+(le<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(w(qe-w(D[n+908+(pe<<2)>>2]))*w(.5)),D[n+400+(t[1040+(le<<2)>>2]<<2)>>2]=qe;break}pe=(T0(e,n)|0)==3,pe^(t[e+28>>2]|0)==2&&(pe=t[976+(le<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),D[n+400+(t[1040+(le<<2)>>2]<<2)>>2]=qe)}while(0)}function Zt(e,n,r){e=e|0,n=n|0,r=r|0;var o=tt,s=0;s=t[976+(r<<2)>>2]|0,o=w(D[n+908+(s<<2)>>2]),o=w(w(D[e+908+(s<<2)>>2])-o),o=w(o-w(D[n+400+(t[1040+(r<<2)>>2]<<2)>>2])),D[n+400+(t[1e3+(r<<2)>>2]<<2)>>2]=o}function qt(e){return e=e|0,(e|1|0)==1|0}function Ut(e){e=e|0;var n=tt;switch(t[e+56>>2]|0){case 0:case 3:{n=w(D[e+40>>2]),n>w(0)&((gt(n)|0)^1)?e=c[(t[e+976>>2]|0)+2>>0]|0?1056:992:e=1056;break}default:e=e+52|0}return e|0}function fn(e,n){return e=e|0,n=n|0,(c[e+n>>0]|0)!=0|0}function _t(e,n){return e=e|0,n=n|0,e=e+132|0,(Nr(n)|0?(t[(en(e,5,948)|0)+4>>2]|0)!=0:0)?e=1:e=(t[(en(e,t[1e3+(n<<2)>>2]|0,948)|0)+4>>2]|0)!=0,e|0}function _r(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0;return e=e+132|0,(Nr(n)|0?(o=en(e,5,948)|0,(t[o+4>>2]|0)!=0):0)?s=4:(o=en(e,t[1e3+(n<<2)>>2]|0,948)|0,t[o+4>>2]|0?s=4:r=w(0)),(s|0)==4&&(r=w(Tn(o,r))),w(r)}function Wr(e,n,r){return e=e|0,n=n|0,r=w(r),X(e,n)|0?r=w(Y(e,n,r)):r=w(-w(_r(e,n,r))),w(r)}function Ar(e){return e=w(e),D[j>>2]=e,t[j>>2]|0|0}function z(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>1073741823)_n();else{s=Tt(n<<2)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<2)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<2)}function dr(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>2)<<2)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Or(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&Ve(e)}function Qn(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;if(d=e+4|0,_=t[d>>2]|0,s=_-o|0,l=s>>2,e=n+(l<<2)|0,e>>>0>>0){o=_;do t[o>>2]=t[e>>2],e=e+4|0,o=(t[d>>2]|0)+4|0,t[d>>2]=o;while(e>>>0>>0)}l|0&&Y1(_+(0-l<<2)|0,n|0,s|0)|0}function nn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0;return _=n+4|0,y=t[_>>2]|0,s=t[e>>2]|0,d=r,l=d-s|0,o=y+(0-(l>>2)<<2)|0,t[_>>2]=o,(l|0)>0&&vn(o|0,s|0,l|0)|0,s=e+4|0,l=n+8|0,o=(t[s>>2]|0)-d|0,(o|0)>0&&(vn(t[l>>2]|0,r|0,o|0)|0,t[l>>2]=(t[l>>2]|0)+(o>>>2<<2)),d=t[e>>2]|0,t[e>>2]=t[_>>2],t[_>>2]=d,d=t[s>>2]|0,t[s>>2]=t[l>>2],t[l>>2]=d,d=e+8|0,r=n+12|0,e=t[d>>2]|0,t[d>>2]=t[r>>2],t[r>>2]=e,t[n>>2]=t[_>>2],y|0}function s0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;if(d=t[n>>2]|0,l=t[r>>2]|0,(d|0)!=(l|0)){s=e+8|0,r=((l+-4-d|0)>>>2)+1|0,e=d,o=t[s>>2]|0;do t[o>>2]=t[e>>2],o=(t[s>>2]|0)+4|0,t[s>>2]=o,e=e+4|0;while((e|0)!=(l|0));t[n>>2]=d+(r<<2)}}function t0(){_l()}function g0(){var e=0;return e=Tt(4)|0,Kr(e),e|0}function Kr(e){e=e|0,t[e>>2]=a0()|0}function _0(e){e=e|0,e|0&&(Gi(e),Ve(e))}function Gi(e){e=e|0,V0(t[e>>2]|0)}function fo(e,n,r){e=e|0,n=n|0,r=r|0,J0(t[e>>2]|0,n,r)}function x0(e,n){e=e|0,n=w(n),ki(t[e>>2]|0,n)}function Xu(e,n){return e=e|0,n=n|0,fn(t[e>>2]|0,n)|0}function Z0(){var e=0;return e=Tt(8)|0,df(e,0),e|0}function df(e,n){e=e|0,n=n|0,n?n=I0(t[n>>2]|0)|0:n=qu()|0,t[e>>2]=n,t[e+4>>2]=0,Bs(n,e)}function Ba(e){e=e|0;var n=0;return n=Tt(8)|0,df(n,e),n|0}function Oc(e){e=e|0,e|0&&(mu(e),Ve(e))}function mu(e){e=e|0;var n=0;Wu(t[e>>2]|0),n=e+4|0,e=t[n>>2]|0,t[n>>2]=0,e|0&&(Ju(e),Ve(e))}function Ju(e){e=e|0,ei(e)}function ei(e){e=e|0,e=t[e>>2]|0,e|0&&ju(e|0)}function Yf(e){return e=e|0,Vu(e)|0}function pf(e){e=e|0;var n=0,r=0;r=e+4|0,n=t[r>>2]|0,t[r>>2]=0,n|0&&(Ju(n),Ve(n)),Do(t[e>>2]|0)}function ja(e,n){e=e|0,n=n|0,Gu(t[e>>2]|0,t[n>>2]|0)}function Ua(e,n){e=e|0,n=n|0,W(t[e>>2]|0,n)}function Ic(e,n,r){e=e|0,n=n|0,r=+r,yn(t[e>>2]|0,n,w(r))}function vu(e,n,r){e=e|0,n=n|0,r=+r,sn(t[e>>2]|0,n,w(r))}function $f(e,n){e=e|0,n=n|0,R(t[e>>2]|0,n)}function gu(e,n){e=e|0,n=n|0,H(t[e>>2]|0,n)}function co(e,n){e=e|0,n=n|0,ue(t[e>>2]|0,n)}function qa(e,n){e=e|0,n=n|0,M0(t[e>>2]|0,n)}function Ws(e,n){e=e|0,n=n|0,Fe(t[e>>2]|0,n)}function za(e,n){e=e|0,n=n|0,Lr(t[e>>2]|0,n)}function Pc(e,n,r){e=e|0,n=n|0,r=+r,rn(t[e>>2]|0,n,w(r))}function Qu(e,n,r){e=e|0,n=n|0,r=+r,Hn(t[e>>2]|0,n,w(r))}function Mc(e,n){e=e|0,n=n|0,Cr(t[e>>2]|0,n)}function Fc(e,n){e=e|0,n=n|0,K(t[e>>2]|0,n)}function Lc(e,n){e=e|0,n=n|0,je(t[e>>2]|0,n)}function Kf(e,n){e=e|0,n=+n,rt(t[e>>2]|0,w(n))}function Tl(e,n){e=e|0,n=+n,wt(t[e>>2]|0,w(n))}function xl(e,n){e=e|0,n=+n,lt(t[e>>2]|0,w(n))}function hf(e,n){e=e|0,n=+n,st(t[e>>2]|0,w(n))}function xo(e,n){e=e|0,n=+n,xt(t[e>>2]|0,w(n))}function mf(e,n){e=e|0,n=+n,Qt(t[e>>2]|0,w(n))}function Wa(e,n){e=e|0,n=+n,Cn(t[e>>2]|0,w(n))}function ti(e){e=e|0,bn(t[e>>2]|0)}function Hs(e,n){e=e|0,n=+n,h0(t[e>>2]|0,w(n))}function mi(e,n){e=e|0,n=+n,ci(t[e>>2]|0,w(n))}function vi(e){e=e|0,xi(t[e>>2]|0)}function Xf(e,n){e=e|0,n=+n,qr(t[e>>2]|0,w(n))}function Rc(e,n){e=e|0,n=+n,Eo(t[e>>2]|0,w(n))}function Jf(e,n){e=e|0,n=+n,wl(t[e>>2]|0,w(n))}function ao(e,n){e=e|0,n=+n,js(t[e>>2]|0,w(n))}function $o(e,n){e=e|0,n=+n,du(t[e>>2]|0,w(n))}function kl(e,n){e=e|0,n=+n,Yu(t[e>>2]|0,w(n))}function Nc(e,n){e=e|0,n=+n,oo(t[e>>2]|0,w(n))}function Al(e,n){e=e|0,n=+n,Hi(t[e>>2]|0,w(n))}function vf(e,n){e=e|0,n=+n,F0(t[e>>2]|0,w(n))}function Qf(e,n,r){e=e|0,n=n|0,r=+r,ft(t[e>>2]|0,n,w(r))}function k0(e,n,r){e=e|0,n=n|0,r=+r,He(t[e>>2]|0,n,w(r))}function v(e,n,r){e=e|0,n=n|0,r=+r,Qe(t[e>>2]|0,n,w(r))}function m(e){return e=e|0,ve(t[e>>2]|0)|0}function S(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,ar(s,t[n>>2]|0,r),O(e,s),h=o}function O(e,n){e=e|0,n=n|0,M(e,t[n+4>>2]|0,+w(D[n>>2]))}function M(e,n,r){e=e|0,n=n|0,r=+r,t[e>>2]=n,L[e+8>>3]=r}function b(e){return e=e|0,U(t[e>>2]|0)|0}function ee(e){return e=e|0,fe(t[e>>2]|0)|0}function Ye(e){return e=e|0,de(t[e>>2]|0)|0}function Ze(e){return e=e|0,au(t[e>>2]|0)|0}function ut(e){return e=e|0,Ge(t[e>>2]|0)|0}function In(e){return e=e|0,F(t[e>>2]|0)|0}function A0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,d0(s,t[n>>2]|0,r),O(e,s),h=o}function jr(e){return e=e|0,xe(t[e>>2]|0)|0}function gi(e){return e=e|0,Xe(t[e>>2]|0)|0}function po(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Rt(o,t[n>>2]|0),O(e,o),h=r}function _i(e){return e=e|0,+ +w(yl(t[e>>2]|0))}function Re(e){return e=e|0,+ +w(cu(t[e>>2]|0))}function Ce(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,p0(o,t[n>>2]|0),O(e,o),h=r}function ze(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,E0(o,t[n>>2]|0),O(e,o),h=r}function Et(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,So(o,t[n>>2]|0),O(e,o),h=r}function on(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Dl(o,t[n>>2]|0),O(e,o),h=r}function sr(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Us(o,t[n>>2]|0),O(e,o),h=r}function mn(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,qs(o,t[n>>2]|0),O(e,o),h=r}function pr(e){return e=e|0,+ +w(Gr(t[e>>2]|0))}function Hr(e,n){return e=e|0,n=n|0,+ +w(St(t[e>>2]|0,n))}function Vn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,Ne(s,t[n>>2]|0,r),O(e,s),h=o}function ni(e,n,r){e=e|0,n=n|0,r=r|0,Ns(t[e>>2]|0,t[n>>2]|0,r)}function Zf(e,n){e=e|0,n=n|0,D0(t[e>>2]|0,t[n>>2]|0)}function Pm(e){return e=e|0,fi(t[e>>2]|0)|0}function Ha(e){return e=e|0,e=nr(t[e>>2]|0)|0,e?e=Yf(e)|0:e=0,e|0}function vd(e,n){return e=e|0,n=n|0,e=e0(t[e>>2]|0,n)|0,e?e=Yf(e)|0:e=0,e|0}function gd(e,n){e=e|0,n=n|0;var r=0,o=0;o=Tt(4)|0,ba(o,n),r=e+4|0,n=t[r>>2]|0,t[r>>2]=o,n|0&&(Ju(n),Ve(n)),bu(t[e>>2]|0,1)}function ba(e,n){e=e|0,n=n|0,Oo(e,n)}function Bc(e,n,r,o,s,l){e=e|0,n=n|0,r=w(r),o=o|0,s=w(s),l=l|0;var d=0,_=0;d=h,h=h+16|0,_=d,Mm(_,Vu(n)|0,+r,o,+s,l),D[e>>2]=w(+L[_>>3]),D[e+4>>2]=w(+L[_+8>>3]),h=d}function Mm(e,n,r,o,s,l){e=e|0,n=n|0,r=+r,o=o|0,s=+s,l=l|0;var d=0,_=0,y=0,k=0,T=0;d=h,h=h+32|0,T=d+8|0,k=d+20|0,y=d,_=d+16|0,L[T>>3]=r,t[k>>2]=o,L[y>>3]=s,t[_>>2]=l,_d(e,t[n+4>>2]|0,T,k,y,_),h=d}function _d(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0;d=h,h=h+16|0,_=d,Zo(_),n=Oi(n)|0,Fm(e,n,+L[r>>3],t[o>>2]|0,+L[s>>3],t[l>>2]|0),eu(_),h=d}function Oi(e){return e=e|0,t[e>>2]|0}function Fm(e,n,r,o,s,l){e=e|0,n=n|0,r=+r,o=o|0,s=+s,l=l|0;var d=0;d=ko(yd()|0)|0,r=+Ko(r),o=jc(o)|0,s=+Ko(s),Ga(e,ro(0,d|0,n|0,+r,o|0,+s,jc(l)|0)|0)}function yd(){var e=0;return c[7608]|0||(Ed(9120),e=7608,t[e>>2]=1,t[e+4>>2]=0),9120}function ko(e){return e=e|0,t[e+8>>2]|0}function Ko(e){return e=+e,+ +Ol(e)}function jc(e){return e=e|0,Dd(e)|0}function Ga(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;s=h,h=h+32|0,r=s,o=n,o&1?(Lm(r,0),c0(o|0,r|0)|0,Va(e,r),Wn(r)):(t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2]),h=s}function Lm(e,n){e=e|0,n=n|0,wd(e,n),t[e+8>>2]=0,c[e+24>>0]=0}function Va(e,n){e=e|0,n=n|0,n=n+8|0,t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2]}function Wn(e){e=e|0,c[e+24>>0]=0}function wd(e,n){e=e|0,n=n|0,t[e>>2]=n}function Dd(e){return e=e|0,e|0}function Ol(e){return e=+e,+e}function Ed(e){e=e|0,Ao(e,Rm()|0,4)}function Rm(){return 1064}function Ao(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=hl(n|0,r+1|0)|0}function Oo(e,n){e=e|0,n=n|0,n=t[n>>2]|0,t[e>>2]=n,qi(n|0)}function Nm(e){e=e|0;var n=0,r=0;r=e+4|0,n=t[r>>2]|0,t[r>>2]=0,n|0&&(Ju(n),Ve(n)),bu(t[e>>2]|0,0)}function Uc(e){e=e|0,rr(t[e>>2]|0)}function Ya(e){return e=e|0,Go(t[e>>2]|0)|0}function Sd(e,n,r,o){e=e|0,n=+n,r=+r,o=o|0,Yr(t[e>>2]|0,w(n),w(r),o)}function Cd(e){return e=e|0,+ +w(ir(t[e>>2]|0))}function ho(e){return e=e|0,+ +w(Y0(t[e>>2]|0))}function bs(e){return e=e|0,+ +w(L0(t[e>>2]|0))}function $a(e){return e=e|0,+ +w(Co(t[e>>2]|0))}function Td(e){return e=e|0,+ +w($u(t[e>>2]|0))}function qc(e){return e=e|0,+ +w(Vo(t[e>>2]|0))}function xd(e,n){e=e|0,n=n|0,L[e>>3]=+w(ir(t[n>>2]|0)),L[e+8>>3]=+w(Y0(t[n>>2]|0)),L[e+16>>3]=+w(L0(t[n>>2]|0)),L[e+24>>3]=+w(Co(t[n>>2]|0)),L[e+32>>3]=+w($u(t[n>>2]|0)),L[e+40>>3]=+w(Vo(t[n>>2]|0))}function Ka(e,n){return e=e|0,n=n|0,+ +w(Rr(t[e>>2]|0,n))}function kd(e,n){return e=e|0,n=n|0,+ +w(Jn(t[e>>2]|0,n))}function Xa(e,n){return e=e|0,n=n|0,+ +w(ai(t[e>>2]|0,n))}function Ja(){return Rs()|0}function Gs(){Bm(),Vs(),Ad(),Od(),Qa(),jm()}function Bm(){hO(11713,4938,1)}function Vs(){FA(10448)}function Ad(){hA(10408)}function Od(){Bk(10324)}function Qa(){Gx(10096)}function jm(){Um(9132)}function Um(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=0,Ki=0,Xi=0,Ji=0,Ro=0,kf=0,Af=0,Cu=0,Of=0,Js=0,Qs=0,If=0,Pf=0,Mf=0,Kn=0,Tu=0,Ff=0,us=0,Lf=0,Rf=0,Zs=0,el=0,ss=0,Fi=0,nu=0,go=0,xu=0,jl=0,Ul=0,tl=0,ql=0,zl=0,Li=0,Di=0,ku=0,xr=0,Wl=0,Qi=0,ls=0,Zi=0,fs=0,Hl=0,bl=0,cs=0,Ri=0,Au=0,Gl=0,Vl=0,Yl=0,En=0,br=0,Ei=0,eo=0,Ni=0,xn=0,Vt=0,Ou=0;n=h,h=h+672|0,r=n+656|0,Ou=n+648|0,Vt=n+640|0,xn=n+632|0,Ni=n+624|0,eo=n+616|0,Ei=n+608|0,br=n+600|0,En=n+592|0,Yl=n+584|0,Vl=n+576|0,Gl=n+568|0,Au=n+560|0,Ri=n+552|0,cs=n+544|0,bl=n+536|0,Hl=n+528|0,fs=n+520|0,Zi=n+512|0,ls=n+504|0,Qi=n+496|0,Wl=n+488|0,xr=n+480|0,ku=n+472|0,Di=n+464|0,Li=n+456|0,zl=n+448|0,ql=n+440|0,tl=n+432|0,Ul=n+424|0,jl=n+416|0,xu=n+408|0,go=n+400|0,nu=n+392|0,Fi=n+384|0,ss=n+376|0,el=n+368|0,Zs=n+360|0,Rf=n+352|0,Lf=n+344|0,us=n+336|0,Ff=n+328|0,Tu=n+320|0,Kn=n+312|0,Mf=n+304|0,Pf=n+296|0,If=n+288|0,Qs=n+280|0,Js=n+272|0,Of=n+264|0,Cu=n+256|0,Af=n+248|0,kf=n+240|0,Ro=n+232|0,Ji=n+224|0,Xi=n+216|0,Ki=n+208|0,Dr=n+200|0,zt=n+192|0,Pn=n+184|0,gn=n+176|0,It=n+168|0,Ht=n+160|0,Ln=n+152|0,vt=n+144|0,_e=n+136|0,pe=n+128|0,qe=n+120|0,ke=n+112|0,Pe=n+104|0,ie=n+96|0,le=n+88|0,we=n+80|0,q=n+72|0,P=n+64|0,T=n+56|0,k=n+48|0,y=n+40|0,_=n+32|0,d=n+24|0,l=n+16|0,s=n+8|0,o=n,qm(e,3646),Id(e,3651,2)|0,Pd(e,3665,2)|0,zm(e,3682,18)|0,t[Ou>>2]=19,t[Ou+4>>2]=0,t[r>>2]=t[Ou>>2],t[r+4>>2]=t[Ou+4>>2],gf(e,3690,r)|0,t[Vt>>2]=1,t[Vt+4>>2]=0,t[r>>2]=t[Vt>>2],t[r+4>>2]=t[Vt+4>>2],Md(e,3696,r)|0,t[xn>>2]=2,t[xn+4>>2]=0,t[r>>2]=t[xn>>2],t[r+4>>2]=t[xn+4>>2],Xr(e,3706,r)|0,t[Ni>>2]=1,t[Ni+4>>2]=0,t[r>>2]=t[Ni>>2],t[r+4>>2]=t[Ni+4>>2],yi(e,3722,r)|0,t[eo>>2]=2,t[eo+4>>2]=0,t[r>>2]=t[eo>>2],t[r+4>>2]=t[eo+4>>2],yi(e,3734,r)|0,t[Ei>>2]=3,t[Ei+4>>2]=0,t[r>>2]=t[Ei>>2],t[r+4>>2]=t[Ei+4>>2],Xr(e,3753,r)|0,t[br>>2]=4,t[br+4>>2]=0,t[r>>2]=t[br>>2],t[r+4>>2]=t[br+4>>2],Xr(e,3769,r)|0,t[En>>2]=5,t[En+4>>2]=0,t[r>>2]=t[En>>2],t[r+4>>2]=t[En+4>>2],Xr(e,3783,r)|0,t[Yl>>2]=6,t[Yl+4>>2]=0,t[r>>2]=t[Yl>>2],t[r+4>>2]=t[Yl+4>>2],Xr(e,3796,r)|0,t[Vl>>2]=7,t[Vl+4>>2]=0,t[r>>2]=t[Vl>>2],t[r+4>>2]=t[Vl+4>>2],Xr(e,3813,r)|0,t[Gl>>2]=8,t[Gl+4>>2]=0,t[r>>2]=t[Gl>>2],t[r+4>>2]=t[Gl+4>>2],Xr(e,3825,r)|0,t[Au>>2]=3,t[Au+4>>2]=0,t[r>>2]=t[Au>>2],t[r+4>>2]=t[Au+4>>2],yi(e,3843,r)|0,t[Ri>>2]=4,t[Ri+4>>2]=0,t[r>>2]=t[Ri>>2],t[r+4>>2]=t[Ri+4>>2],yi(e,3853,r)|0,t[cs>>2]=9,t[cs+4>>2]=0,t[r>>2]=t[cs>>2],t[r+4>>2]=t[cs+4>>2],Xr(e,3870,r)|0,t[bl>>2]=10,t[bl+4>>2]=0,t[r>>2]=t[bl>>2],t[r+4>>2]=t[bl+4>>2],Xr(e,3884,r)|0,t[Hl>>2]=11,t[Hl+4>>2]=0,t[r>>2]=t[Hl>>2],t[r+4>>2]=t[Hl+4>>2],Xr(e,3896,r)|0,t[fs>>2]=1,t[fs+4>>2]=0,t[r>>2]=t[fs>>2],t[r+4>>2]=t[fs+4>>2],j0(e,3907,r)|0,t[Zi>>2]=2,t[Zi+4>>2]=0,t[r>>2]=t[Zi>>2],t[r+4>>2]=t[Zi+4>>2],j0(e,3915,r)|0,t[ls>>2]=3,t[ls+4>>2]=0,t[r>>2]=t[ls>>2],t[r+4>>2]=t[ls+4>>2],j0(e,3928,r)|0,t[Qi>>2]=4,t[Qi+4>>2]=0,t[r>>2]=t[Qi>>2],t[r+4>>2]=t[Qi+4>>2],j0(e,3948,r)|0,t[Wl>>2]=5,t[Wl+4>>2]=0,t[r>>2]=t[Wl>>2],t[r+4>>2]=t[Wl+4>>2],j0(e,3960,r)|0,t[xr>>2]=6,t[xr+4>>2]=0,t[r>>2]=t[xr>>2],t[r+4>>2]=t[xr+4>>2],j0(e,3974,r)|0,t[ku>>2]=7,t[ku+4>>2]=0,t[r>>2]=t[ku>>2],t[r+4>>2]=t[ku+4>>2],j0(e,3983,r)|0,t[Di>>2]=20,t[Di+4>>2]=0,t[r>>2]=t[Di>>2],t[r+4>>2]=t[Di+4>>2],gf(e,3999,r)|0,t[Li>>2]=8,t[Li+4>>2]=0,t[r>>2]=t[Li>>2],t[r+4>>2]=t[Li+4>>2],j0(e,4012,r)|0,t[zl>>2]=9,t[zl+4>>2]=0,t[r>>2]=t[zl>>2],t[r+4>>2]=t[zl+4>>2],j0(e,4022,r)|0,t[ql>>2]=21,t[ql+4>>2]=0,t[r>>2]=t[ql>>2],t[r+4>>2]=t[ql+4>>2],gf(e,4039,r)|0,t[tl>>2]=10,t[tl+4>>2]=0,t[r>>2]=t[tl>>2],t[r+4>>2]=t[tl+4>>2],j0(e,4053,r)|0,t[Ul>>2]=11,t[Ul+4>>2]=0,t[r>>2]=t[Ul>>2],t[r+4>>2]=t[Ul+4>>2],j0(e,4065,r)|0,t[jl>>2]=12,t[jl+4>>2]=0,t[r>>2]=t[jl>>2],t[r+4>>2]=t[jl+4>>2],j0(e,4084,r)|0,t[xu>>2]=13,t[xu+4>>2]=0,t[r>>2]=t[xu>>2],t[r+4>>2]=t[xu+4>>2],j0(e,4097,r)|0,t[go>>2]=14,t[go+4>>2]=0,t[r>>2]=t[go>>2],t[r+4>>2]=t[go+4>>2],j0(e,4117,r)|0,t[nu>>2]=15,t[nu+4>>2]=0,t[r>>2]=t[nu>>2],t[r+4>>2]=t[nu+4>>2],j0(e,4129,r)|0,t[Fi>>2]=16,t[Fi+4>>2]=0,t[r>>2]=t[Fi>>2],t[r+4>>2]=t[Fi+4>>2],j0(e,4148,r)|0,t[ss>>2]=17,t[ss+4>>2]=0,t[r>>2]=t[ss>>2],t[r+4>>2]=t[ss+4>>2],j0(e,4161,r)|0,t[el>>2]=18,t[el+4>>2]=0,t[r>>2]=t[el>>2],t[r+4>>2]=t[el+4>>2],j0(e,4181,r)|0,t[Zs>>2]=5,t[Zs+4>>2]=0,t[r>>2]=t[Zs>>2],t[r+4>>2]=t[Zs+4>>2],yi(e,4196,r)|0,t[Rf>>2]=6,t[Rf+4>>2]=0,t[r>>2]=t[Rf>>2],t[r+4>>2]=t[Rf+4>>2],yi(e,4206,r)|0,t[Lf>>2]=7,t[Lf+4>>2]=0,t[r>>2]=t[Lf>>2],t[r+4>>2]=t[Lf+4>>2],yi(e,4217,r)|0,t[us>>2]=3,t[us+4>>2]=0,t[r>>2]=t[us>>2],t[r+4>>2]=t[us+4>>2],Zu(e,4235,r)|0,t[Ff>>2]=1,t[Ff+4>>2]=0,t[r>>2]=t[Ff>>2],t[r+4>>2]=t[Ff+4>>2],_f(e,4251,r)|0,t[Tu>>2]=4,t[Tu+4>>2]=0,t[r>>2]=t[Tu>>2],t[r+4>>2]=t[Tu+4>>2],Zu(e,4263,r)|0,t[Kn>>2]=5,t[Kn+4>>2]=0,t[r>>2]=t[Kn>>2],t[r+4>>2]=t[Kn+4>>2],Zu(e,4279,r)|0,t[Mf>>2]=6,t[Mf+4>>2]=0,t[r>>2]=t[Mf>>2],t[r+4>>2]=t[Mf+4>>2],Zu(e,4293,r)|0,t[Pf>>2]=7,t[Pf+4>>2]=0,t[r>>2]=t[Pf>>2],t[r+4>>2]=t[Pf+4>>2],Zu(e,4306,r)|0,t[If>>2]=8,t[If+4>>2]=0,t[r>>2]=t[If>>2],t[r+4>>2]=t[If+4>>2],Zu(e,4323,r)|0,t[Qs>>2]=9,t[Qs+4>>2]=0,t[r>>2]=t[Qs>>2],t[r+4>>2]=t[Qs+4>>2],Zu(e,4335,r)|0,t[Js>>2]=2,t[Js+4>>2]=0,t[r>>2]=t[Js>>2],t[r+4>>2]=t[Js+4>>2],_f(e,4353,r)|0,t[Of>>2]=12,t[Of+4>>2]=0,t[r>>2]=t[Of>>2],t[r+4>>2]=t[Of+4>>2],Io(e,4363,r)|0,t[Cu>>2]=1,t[Cu+4>>2]=0,t[r>>2]=t[Cu>>2],t[r+4>>2]=t[Cu+4>>2],_u(e,4376,r)|0,t[Af>>2]=2,t[Af+4>>2]=0,t[r>>2]=t[Af>>2],t[r+4>>2]=t[Af+4>>2],_u(e,4388,r)|0,t[kf>>2]=13,t[kf+4>>2]=0,t[r>>2]=t[kf>>2],t[r+4>>2]=t[kf+4>>2],Io(e,4402,r)|0,t[Ro>>2]=14,t[Ro+4>>2]=0,t[r>>2]=t[Ro>>2],t[r+4>>2]=t[Ro+4>>2],Io(e,4411,r)|0,t[Ji>>2]=15,t[Ji+4>>2]=0,t[r>>2]=t[Ji>>2],t[r+4>>2]=t[Ji+4>>2],Io(e,4421,r)|0,t[Xi>>2]=16,t[Xi+4>>2]=0,t[r>>2]=t[Xi>>2],t[r+4>>2]=t[Xi+4>>2],Io(e,4433,r)|0,t[Ki>>2]=17,t[Ki+4>>2]=0,t[r>>2]=t[Ki>>2],t[r+4>>2]=t[Ki+4>>2],Io(e,4446,r)|0,t[Dr>>2]=18,t[Dr+4>>2]=0,t[r>>2]=t[Dr>>2],t[r+4>>2]=t[Dr+4>>2],Io(e,4458,r)|0,t[zt>>2]=3,t[zt+4>>2]=0,t[r>>2]=t[zt>>2],t[r+4>>2]=t[zt+4>>2],_u(e,4471,r)|0,t[Pn>>2]=1,t[Pn+4>>2]=0,t[r>>2]=t[Pn>>2],t[r+4>>2]=t[Pn+4>>2],ec(e,4486,r)|0,t[gn>>2]=10,t[gn+4>>2]=0,t[r>>2]=t[gn>>2],t[r+4>>2]=t[gn+4>>2],Zu(e,4496,r)|0,t[It>>2]=11,t[It+4>>2]=0,t[r>>2]=t[It>>2],t[r+4>>2]=t[It+4>>2],Zu(e,4508,r)|0,t[Ht>>2]=3,t[Ht+4>>2]=0,t[r>>2]=t[Ht>>2],t[r+4>>2]=t[Ht+4>>2],_f(e,4519,r)|0,t[Ln>>2]=4,t[Ln+4>>2]=0,t[r>>2]=t[Ln>>2],t[r+4>>2]=t[Ln+4>>2],Wm(e,4530,r)|0,t[vt>>2]=19,t[vt+4>>2]=0,t[r>>2]=t[vt>>2],t[r+4>>2]=t[vt+4>>2],Fd(e,4542,r)|0,t[_e>>2]=12,t[_e+4>>2]=0,t[r>>2]=t[_e>>2],t[r+4>>2]=t[_e+4>>2],yf(e,4554,r)|0,t[pe>>2]=13,t[pe+4>>2]=0,t[r>>2]=t[pe>>2],t[r+4>>2]=t[pe+4>>2],tc(e,4568,r)|0,t[qe>>2]=2,t[qe+4>>2]=0,t[r>>2]=t[qe>>2],t[r+4>>2]=t[qe+4>>2],Hm(e,4578,r)|0,t[ke>>2]=20,t[ke+4>>2]=0,t[r>>2]=t[ke>>2],t[r+4>>2]=t[ke+4>>2],Ld(e,4587,r)|0,t[Pe>>2]=22,t[Pe+4>>2]=0,t[r>>2]=t[Pe>>2],t[r+4>>2]=t[Pe+4>>2],gf(e,4602,r)|0,t[ie>>2]=23,t[ie+4>>2]=0,t[r>>2]=t[ie>>2],t[r+4>>2]=t[ie+4>>2],gf(e,4619,r)|0,t[le>>2]=14,t[le+4>>2]=0,t[r>>2]=t[le>>2],t[r+4>>2]=t[le+4>>2],Rd(e,4629,r)|0,t[we>>2]=1,t[we+4>>2]=0,t[r>>2]=t[we>>2],t[r+4>>2]=t[we+4>>2],zc(e,4637,r)|0,t[q>>2]=4,t[q+4>>2]=0,t[r>>2]=t[q>>2],t[r+4>>2]=t[q+4>>2],_u(e,4653,r)|0,t[P>>2]=5,t[P+4>>2]=0,t[r>>2]=t[P>>2],t[r+4>>2]=t[P+4>>2],_u(e,4669,r)|0,t[T>>2]=6,t[T+4>>2]=0,t[r>>2]=t[T>>2],t[r+4>>2]=t[T+4>>2],_u(e,4686,r)|0,t[k>>2]=7,t[k+4>>2]=0,t[r>>2]=t[k>>2],t[r+4>>2]=t[k+4>>2],_u(e,4701,r)|0,t[y>>2]=8,t[y+4>>2]=0,t[r>>2]=t[y>>2],t[r+4>>2]=t[y+4>>2],_u(e,4719,r)|0,t[_>>2]=9,t[_+4>>2]=0,t[r>>2]=t[_>>2],t[r+4>>2]=t[_+4>>2],_u(e,4736,r)|0,t[d>>2]=21,t[d+4>>2]=0,t[r>>2]=t[d>>2],t[r+4>>2]=t[d+4>>2],Nd(e,4754,r)|0,t[l>>2]=2,t[l+4>>2]=0,t[r>>2]=t[l>>2],t[r+4>>2]=t[l+4>>2],ec(e,4772,r)|0,t[s>>2]=3,t[s+4>>2]=0,t[r>>2]=t[s>>2],t[r+4>>2]=t[s+4>>2],ec(e,4790,r)|0,t[o>>2]=4,t[o+4>>2]=0,t[r>>2]=t[o>>2],t[r+4>>2]=t[o+4>>2],ec(e,4808,r)|0,h=n}function qm(e,n){e=e|0,n=n|0;var r=0;r=Nx()|0,t[e>>2]=r,Bx(r,n),Cf(t[e>>2]|0)}function Id(e,n,r){return e=e|0,n=n|0,r=r|0,Ex(e,Zn(n)|0,r,0),e|0}function Pd(e,n,r){return e=e|0,n=n|0,r=r|0,ux(e,Zn(n)|0,r,0),e|0}function zm(e,n,r){return e=e|0,n=n|0,r=r|0,V9(e,Zn(n)|0,r,0),e|0}function gf(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],I9(e,n,s),h=o,e|0}function Md(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],vo(e,n,s),h=o,e|0}function Xr(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],a(e,n,s),h=o,e|0}function yi(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],n4(e,n,s),h=o,e|0}function j0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],b_(e,n,s),h=o,e|0}function Zu(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],L_(e,n,s),h=o,e|0}function _f(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Hp(e,n,s),h=o,e|0}function Io(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],e_(e,n,s),h=o,e|0}function _u(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Ip(e,n,s),h=o,e|0}function ec(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Ng(e,n,s),h=o,e|0}function Wm(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],l0(e,n,s),h=o,e|0}function Fd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],hg(e,n,s),h=o,e|0}function yf(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],sg(e,n,s),h=o,e|0}function tc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Kv(e,n,s),h=o,e|0}function Hm(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],y1(e,n,s),h=o,e|0}function Ld(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],wv(e,n,s),h=o,e|0}function Rd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],fv(e,n,s),h=o,e|0}function zc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Gd(e,n,s),h=o,e|0}function Nd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Wc(e,n,s),h=o,e|0}function Wc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Hc(e,r,s,1),h=o}function Zn(e){return e=e|0,e|0}function Hc(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=Za()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Bd(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,bc(l,o)|0,o),h=s}function Za(){var e=0,n=0;if(c[7616]|0||(yu(9136),Bt(24,9136,Q|0)|0,n=7616,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9136)|0)){e=9136,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));yu(9136)}return 9136}function Bd(e){return e=e|0,0}function bc(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=Za()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],n1(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(jd(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ur(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0;d=h,h=h+32|0,q=d+24|0,P=d+20|0,y=d+16|0,T=d+12|0,k=d+8|0,_=d+4|0,we=d,t[P>>2]=n,t[y>>2]=r,t[T>>2]=o,t[k>>2]=s,t[_>>2]=l,l=e+28|0,t[we>>2]=t[l>>2],t[q>>2]=t[we>>2],e1(e+24|0,q,P,T,k,y,_)|0,t[l>>2]=t[t[l>>2]>>2],h=d}function e1(e,n,r,o,s,l,d){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0,e=bm(n)|0,n=Tt(24)|0,t1(n+4|0,t[r>>2]|0,t[o>>2]|0,t[s>>2]|0,t[l>>2]|0,t[d>>2]|0),t[n>>2]=t[e>>2],t[e>>2]=n,n|0}function bm(e){return e=e|0,t[e>>2]|0}function t1(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=o,t[e+12>>2]=s,t[e+16>>2]=l}function Lt(e,n){return e=e|0,n=n|0,n|e|0}function n1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function jd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Gm(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Ud(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],n1(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Vm(e,_),Ym(_),h=k;return}}function Gm(e){return e=e|0,357913941}function Ud(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Vm(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Ym(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function yu(e){e=e|0,Gc(e)}function r1(e){e=e|0,i1(e+24|0)}function Dn(e){return e=e|0,t[e>>2]|0}function i1(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Gc(e){e=e|0;var n=0;n=An()|0,Nn(e,2,3,n,cn()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function An(){return 9228}function cn(){return 1140}function Vc(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=Il(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=$m(n,o)|0,h=r,n|0}function Nn(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=o,t[e+12>>2]=s,t[e+16>>2]=l}function Il(e){return e=e|0,(t[(Za()|0)+24>>2]|0)+(e*12|0)|0}function $m(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;return s=h,h=h+48|0,o=s,r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Bl[r&31](o,e),o=o1(o)|0,h=s,o|0}function o1(e){e=e|0;var n=0,r=0,o=0,s=0;return s=h,h=h+32|0,n=s+12|0,r=s,o=U0(u1()|0)|0,o?(s1(n,o),l1(r,n),qd(e,r),e=f1(n)|0):e=zd(e)|0,h=s,e|0}function u1(){var e=0;return c[7632]|0||(nc(9184),Bt(25,9184,Q|0)|0,e=7632,t[e>>2]=1,t[e+4>>2]=0),9184}function U0(e){return e=e|0,t[e+36>>2]|0}function s1(e,n){e=e|0,n=n|0,t[e>>2]=n,t[e+4>>2]=e,t[e+8>>2]=0}function l1(e,n){e=e|0,n=n|0,t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=0}function qd(e,n){e=e|0,n=n|0,Ii(n,e,e+8|0,e+16|0,e+24|0,e+32|0,e+40|0)|0}function f1(e){return e=e|0,t[(t[e+4>>2]|0)+8>>2]|0}function zd(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0;y=h,h=h+16|0,r=y+4|0,o=y,s=Qo(8)|0,l=s,d=Tt(48)|0,_=d,n=_+48|0;do t[_>>2]=t[e>>2],_=_+4|0,e=e+4|0;while((_|0)<(n|0));return n=l+4|0,t[n>>2]=d,_=Tt(8)|0,d=t[n>>2]|0,t[o>>2]=0,t[r>>2]=t[o>>2],Wd(_,d,r),t[s>>2]=_,h=y,l|0}function Wd(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1092,t[r+12>>2]=n,t[e+4>>2]=r}function Km(e){e=e|0,da(e),Ve(e)}function Xm(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function es(e){e=e|0,Ve(e)}function Ii(e,n,r,o,s,l,d){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0,l=c1(t[e>>2]|0,n,r,o,s,l,d)|0,d=e+4|0,t[(t[d>>2]|0)+8>>2]=l,t[(t[d>>2]|0)+8>>2]|0}function c1(e,n,r,o,s,l,d){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0;var _=0,y=0;return _=h,h=h+16|0,y=_,Zo(y),e=Oi(e)|0,d=Jm(e,+L[n>>3],+L[r>>3],+L[o>>3],+L[s>>3],+L[l>>3],+L[d>>3])|0,eu(y),h=_,d|0}function Jm(e,n,r,o,s,l,d){e=e|0,n=+n,r=+r,o=+o,s=+s,l=+l,d=+d;var _=0;return _=ko(a1()|0)|0,n=+Ko(n),r=+Ko(r),o=+Ko(o),s=+Ko(s),l=+Ko(l),xs(0,_|0,e|0,+n,+r,+o,+s,+l,+ +Ko(d))|0}function a1(){var e=0;return c[7624]|0||(Qm(9172),e=7624,t[e>>2]=1,t[e+4>>2]=0),9172}function Qm(e){e=e|0,Ao(e,Zm()|0,6)}function Zm(){return 1112}function nc(e){e=e|0,Ys(e)}function Hd(e){e=e|0,d1(e+24|0),bd(e+16|0)}function d1(e){e=e|0,tv(e)}function bd(e){e=e|0,ev(e)}function ev(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,Ve(r);while((n|0)!=0);t[e>>2]=0}function tv(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,Ve(r);while((n|0)!=0);t[e>>2]=0}function Ys(e){e=e|0;var n=0;t[e+16>>2]=0,t[e+20>>2]=0,n=e+24|0,t[n>>2]=0,t[e+28>>2]=n,t[e+36>>2]=0,c[e+40>>0]=0,c[e+41>>0]=0}function Gd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Vd(e,r,s,0),h=o}function Vd(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=p1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=h1(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Yd(l,o)|0,o),h=s}function p1(){var e=0,n=0;if(c[7640]|0||(Xo(9232),Bt(26,9232,Q|0)|0,n=7640,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9232)|0)){e=9232,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Xo(9232)}return 9232}function h1(e){return e=e|0,0}function Yd(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=p1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],wf(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(m1(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function wf(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function m1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=$d(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Kd(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],wf(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Yc(e,_),Xd(_),h=k;return}}function $d(e){return e=e|0,357913941}function Kd(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Yc(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Xd(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Xo(e){e=e|0,Jd(e)}function Pl(e){e=e|0,nv(e+24|0)}function nv(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Jd(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,rv()|0,3),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function rv(){return 1144}function iv(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0;var l=0,d=0,_=0,y=0;l=h,h=h+16|0,d=l+8|0,_=l,y=ov(e)|0,e=t[y+4>>2]|0,t[_>>2]=t[y>>2],t[_+4>>2]=e,t[d>>2]=t[_>>2],t[d+4>>2]=t[_+4>>2],uv(n,d,r,o,s),h=l}function ov(e){return e=e|0,(t[(p1()|0)+24>>2]|0)+(e*12|0)|0}function uv(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0;var l=0,d=0,_=0,y=0,k=0;k=h,h=h+16|0,d=k+2|0,_=k+1|0,y=k,l=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(l=t[(t[e>>2]|0)+l>>2]|0),wu(d,r),r=+Du(d,r),wu(_,o),o=+Du(_,o),ts(y,s),y=ns(y,s)|0,iD[l&1](e,r,o,y),h=k}function wu(e,n){e=e|0,n=+n}function Du(e,n){return e=e|0,n=+n,+ +lv(n)}function ts(e,n){e=e|0,n=n|0}function ns(e,n){return e=e|0,n=n|0,sv(n)|0}function sv(e){return e=e|0,e|0}function lv(e){return e=+e,+e}function fv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Qd(e,r,s,1),h=o}function Qd(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=$c()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Zd(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,cv(l,o)|0,o),h=s}function $c(){var e=0,n=0;if(c[7648]|0||(np(9268),Bt(27,9268,Q|0)|0,n=7648,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9268)|0)){e=9268,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));np(9268)}return 9268}function Zd(e){return e=e|0,0}function cv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=$c()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],ep(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(av(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ep(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function av(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=tp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,dv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],ep(l,o,r),t[y>>2]=(t[y>>2]|0)+12,pv(e,_),hv(_),h=k;return}}function tp(e){return e=e|0,357913941}function dv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function pv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function hv(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function np(e){e=e|0,Po(e)}function mv(e){e=e|0,vv(e+24|0)}function vv(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Po(e){e=e|0;var n=0;n=An()|0,Nn(e,2,4,n,gv()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function gv(){return 1160}function _v(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=yv(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=rp(n,o)|0,h=r,n|0}function yv(e){return e=e|0,(t[($c()|0)+24>>2]|0)+(e*12|0)|0}function rp(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),ip(dc[r&31](e)|0)|0}function ip(e){return e=e|0,e&1|0}function wv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Dv(e,r,s,0),h=o}function Dv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=v1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=g1(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Ev(l,o)|0,o),h=s}function v1(){var e=0,n=0;if(c[7656]|0||(up(9304),Bt(28,9304,Q|0)|0,n=7656,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9304)|0)){e=9304,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));up(9304)}return 9304}function g1(e){return e=e|0,0}function Ev(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=v1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],op(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Sv(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function op(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Sv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Cv(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Tv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],op(l,o,r),t[y>>2]=(t[y>>2]|0)+12,xv(e,_),kv(_),h=k;return}}function Cv(e){return e=e|0,357913941}function Tv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function xv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function kv(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function up(e){e=e|0,Iv(e)}function Av(e){e=e|0,Ov(e+24|0)}function Ov(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Iv(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,Pv()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Pv(){return 1164}function Mv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=Fv(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Lv(n,s,r),h=o}function Fv(e){return e=e|0,(t[(v1()|0)+24>>2]|0)+(e*12|0)|0}function Lv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),$s(s,r),r=Ks(s,r)|0,Bl[o&31](e,r),Xs(s),h=l}function $s(e,n){e=e|0,n=n|0,Rv(e,n)}function Ks(e,n){return e=e|0,n=n|0,e|0}function Xs(e){e=e|0,Ju(e)}function Rv(e,n){e=e|0,n=n|0,_1(e,n)}function _1(e,n){e=e|0,n=n|0,t[e>>2]=n}function y1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],sp(e,r,s,0),h=o}function sp(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=w1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Nv(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Bv(l,o)|0,o),h=s}function w1(){var e=0,n=0;if(c[7664]|0||(cp(9340),Bt(29,9340,Q|0)|0,n=7664,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9340)|0)){e=9340,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));cp(9340)}return 9340}function Nv(e){return e=e|0,0}function Bv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=w1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],lp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(jv(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function lp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function jv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Uv(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,qv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],lp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,zv(e,_),fp(_),h=k;return}}function Uv(e){return e=e|0,357913941}function qv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function zv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function fp(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function cp(e){e=e|0,Hv(e)}function Kc(e){e=e|0,Wv(e+24|0)}function Wv(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Hv(e){e=e|0;var n=0;n=An()|0,Nn(e,2,4,n,bv()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function bv(){return 1180}function Gv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=Vv(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=Yv(n,s,r)|0,h=o,r|0}function Vv(e){return e=e|0,(t[(w1()|0)+24>>2]|0)+(e*12|0)|0}function Yv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;return l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),Ml(s,r),s=Fl(s,r)|0,s=Xc(J4[o&15](e,s)|0)|0,h=l,s|0}function Ml(e,n){e=e|0,n=n|0}function Fl(e,n){return e=e|0,n=n|0,$v(n)|0}function Xc(e){return e=e|0,e|0}function $v(e){return e=e|0,e|0}function Kv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Xv(e,r,s,0),h=o}function Xv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=D1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Jv(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Qv(l,o)|0,o),h=s}function D1(){var e=0,n=0;if(c[7672]|0||(hp(9376),Bt(30,9376,Q|0)|0,n=7672,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9376)|0)){e=9376,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));hp(9376)}return 9376}function Jv(e){return e=e|0,0}function Qv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=D1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],ap(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(dp(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ap(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function dp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=pp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Zv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],ap(l,o,r),t[y>>2]=(t[y>>2]|0)+12,eg(e,_),tg(_),h=k;return}}function pp(e){return e=e|0,357913941}function Zv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function eg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function tg(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function hp(e){e=e|0,rg(e)}function Jc(e){e=e|0,ng(e+24|0)}function ng(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function rg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,mp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function mp(){return 1196}function ig(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=og(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=ug(n,o)|0,h=r,n|0}function og(e){return e=e|0,(t[(D1()|0)+24>>2]|0)+(e*12|0)|0}function ug(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Xc(dc[r&31](e)|0)|0}function sg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],lg(e,r,s,1),h=o}function lg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=E1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=fg(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,cg(l,o)|0,o),h=s}function E1(){var e=0,n=0;if(c[7680]|0||(C1(9412),Bt(31,9412,Q|0)|0,n=7680,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9412)|0)){e=9412,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));C1(9412)}return 9412}function fg(e){return e=e|0,0}function cg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=E1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],rc(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(ag(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function rc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function ag(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=vp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,gp(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],rc(l,o,r),t[y>>2]=(t[y>>2]|0)+12,S1(e,_),_p(_),h=k;return}}function vp(e){return e=e|0,357913941}function gp(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function S1(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function _p(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function C1(e){e=e|0,dg(e)}function yp(e){e=e|0,wp(e+24|0)}function wp(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function dg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,6,n,Dp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Dp(){return 1200}function pg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=Qc(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=Zc(n,o)|0,h=r,n|0}function Qc(e){return e=e|0,(t[(E1()|0)+24>>2]|0)+(e*12|0)|0}function Zc(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),ea(dc[r&31](e)|0)|0}function ea(e){return e=e|0,e|0}function hg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],T1(e,r,s,0),h=o}function T1(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=ta()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=mg(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,vg(l,o)|0,o),h=s}function ta(){var e=0,n=0;if(c[7688]|0||(Sp(9448),Bt(32,9448,Q|0)|0,n=7688,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9448)|0)){e=9448,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Sp(9448)}return 9448}function mg(e){return e=e|0,0}function vg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=ta()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Ep(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(gg(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Ep(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function gg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=_g(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,yg(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Ep(l,o,r),t[y>>2]=(t[y>>2]|0)+12,wg(e,_),Dg(_),h=k;return}}function _g(e){return e=e|0,357913941}function yg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function wg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Dg(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Sp(e){e=e|0,Cg(e)}function Eg(e){e=e|0,Sg(e+24|0)}function Sg(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Cg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,6,n,Mo()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Mo(){return 1204}function Tg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=xg(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Ll(n,s,r),h=o}function xg(e){return e=e|0,(t[(ta()|0)+24>>2]|0)+(e*12|0)|0}function Ll(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),On(s,r),s=x1(s,r)|0,Bl[o&31](e,s),h=l}function On(e,n){e=e|0,n=n|0}function x1(e,n){return e=e|0,n=n|0,Vi(n)|0}function Vi(e){return e=e|0,e|0}function l0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],kg(e,r,s,0),h=o}function kg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=Eu()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Ag(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Og(l,o)|0,o),h=s}function Eu(){var e=0,n=0;if(c[7696]|0||(A1(9484),Bt(33,9484,Q|0)|0,n=7696,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9484)|0)){e=9484,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));A1(9484)}return 9484}function Ag(e){return e=e|0,0}function Og(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=Eu()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Cp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Ig(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Cp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Ig(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Pg(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,k1(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Cp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Mg(e,_),rs(_),h=k;return}}function Pg(e){return e=e|0,357913941}function k1(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Mg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function rs(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function A1(e){e=e|0,n0(e)}function na(e){e=e|0,Jr(e+24|0)}function Jr(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function n0(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,Tp()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Tp(){return 1212}function Fg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+8|0,d=s,_=Lg(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],Rg(n,l,r,o),h=s}function Lg(e){return e=e|0,(t[(Eu()|0)+24>>2]|0)+(e*12|0)|0}function Rg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;_=h,h=h+16|0,l=_+1|0,d=_,s=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(s=t[(t[e>>2]|0)+s>>2]|0),On(l,r),l=x1(l,r)|0,Ml(d,o),d=Fl(d,o)|0,X1[s&15](e,l,d),h=_}function Ng(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Bg(e,r,s,1),h=o}function Bg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=O1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=xp(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,ic(l,o)|0,o),h=s}function O1(){var e=0,n=0;if(c[7704]|0||(Ap(9520),Bt(34,9520,Q|0)|0,n=7704,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9520)|0)){e=9520,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Ap(9520)}return 9520}function xp(e){return e=e|0,0}function ic(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=O1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],ra(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(jg(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ra(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function jg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=kp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,ia(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],ra(l,o,r),t[y>>2]=(t[y>>2]|0)+12,mo(e,_),Df(_),h=k;return}}function kp(e){return e=e|0,357913941}function ia(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function mo(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Df(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Ap(e){e=e|0,zg(e)}function Ug(e){e=e|0,qg(e+24|0)}function qg(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function zg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,Wg()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Wg(){return 1224}function Op(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;return s=h,h=h+16|0,l=s+8|0,d=s,_=is(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],o=+jn(n,l,r),h=s,+o}function is(e){return e=e|0,(t[(O1()|0)+24>>2]|0)+(e*12|0)|0}function jn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(s,r),s=ns(s,r)|0,d=+Ol(+uD[o&7](e,s)),h=l,+d}function Ip(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Fo(e,r,s,1),h=o}function Fo(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=oa()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Hg(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,yr(l,o)|0,o),h=s}function oa(){var e=0,n=0;if(c[7712]|0||(Fp(9556),Bt(35,9556,Q|0)|0,n=7712,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9556)|0)){e=9556,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Fp(9556)}return 9556}function Hg(e){return e=e|0,0}function yr(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=oa()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Pp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Mp(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Pp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Mp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=ua(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,bg(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Pp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Gg(e,_),Vg(_),h=k;return}}function ua(e){return e=e|0,357913941}function bg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Gg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Vg(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Fp(e){e=e|0,Kg(e)}function Yg(e){e=e|0,$g(e+24|0)}function $g(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Kg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,Xg()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Xg(){return 1232}function Jg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=Qg(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=+Zg(n,s),h=o,+r}function Qg(e){return e=e|0,(t[(oa()|0)+24>>2]|0)+(e*12|0)|0}function Zg(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),+ +Ol(+oD[r&15](e))}function e_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],t_(e,r,s,1),h=o}function t_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=oc()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=n_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,I1(l,o)|0,o),h=s}function oc(){var e=0,n=0;if(c[7720]|0||(Rp(9592),Bt(36,9592,Q|0)|0,n=7720,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9592)|0)){e=9592,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Rp(9592)}return 9592}function n_(e){return e=e|0,0}function I1(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=oc()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Lp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(r_(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Lp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function r_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=i_(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,q0(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Lp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Yi(e,_),o_(_),h=k;return}}function i_(e){return e=e|0,357913941}function q0(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Yi(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function o_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Rp(e){e=e|0,s_(e)}function u_(e){e=e|0,Np(e+24|0)}function Np(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function s_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,7,n,l_()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function l_(){return 1276}function f_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=Bp(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=c_(n,o)|0,h=r,n|0}function Bp(e){return e=e|0,(t[(oc()|0)+24>>2]|0)+(e*12|0)|0}function c_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;return s=h,h=h+16|0,o=s,r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Bl[r&31](o,e),o=jp(o)|0,h=s,o|0}function jp(e){e=e|0;var n=0,r=0,o=0,s=0;return s=h,h=h+32|0,n=s+12|0,r=s,o=U0(Up()|0)|0,o?(s1(n,o),l1(r,n),qp(e,r),e=f1(n)|0):e=zp(e)|0,h=s,e|0}function Up(){var e=0;return c[7736]|0||(Wp(9640),Bt(25,9640,Q|0)|0,e=7736,t[e>>2]=1,t[e+4>>2]=0),9640}function qp(e,n){e=e|0,n=n|0,Ef(n,e,e+8|0)|0}function zp(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;return r=h,h=h+16|0,s=r+4|0,d=r,o=Qo(8)|0,n=o,_=Tt(16)|0,t[_>>2]=t[e>>2],t[_+4>>2]=t[e+4>>2],t[_+8>>2]=t[e+8>>2],t[_+12>>2]=t[e+12>>2],l=n+4|0,t[l>>2]=_,e=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],P1(e,l,s),t[o>>2]=e,h=r,n|0}function P1(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1244,t[r+12>>2]=n,t[e+4>>2]=r}function a_(e){e=e|0,da(e),Ve(e)}function d_(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function p_(e){e=e|0,Ve(e)}function Ef(e,n,r){return e=e|0,n=n|0,r=r|0,n=h_(t[e>>2]|0,n,r)|0,r=e+4|0,t[(t[r>>2]|0)+8>>2]=n,t[(t[r>>2]|0)+8>>2]|0}function h_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;return o=h,h=h+16|0,s=o,Zo(s),e=Oi(e)|0,r=m_(e,t[n>>2]|0,+L[r>>3])|0,eu(s),h=o,r|0}function m_(e,n,r){e=e|0,n=n|0,r=+r;var o=0;return o=ko(v_()|0)|0,n=jc(n)|0,dl(0,o|0,e|0,n|0,+ +Ko(r))|0}function v_(){var e=0;return c[7728]|0||(g_(9628),e=7728,t[e>>2]=1,t[e+4>>2]=0),9628}function g_(e){e=e|0,Ao(e,__()|0,2)}function __(){return 1264}function Wp(e){e=e|0,Ys(e)}function Hp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],y_(e,r,s,1),h=o}function y_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=M1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=w_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,D_(l,o)|0,o),h=s}function M1(){var e=0,n=0;if(c[7744]|0||(Gp(9684),Bt(37,9684,Q|0)|0,n=7744,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9684)|0)){e=9684,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Gp(9684)}return 9684}function w_(e){return e=e|0,0}function D_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=M1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],bp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(E_(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function bp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function E_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=S_(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,C_(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],bp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,T_(e,_),x_(_),h=k;return}}function S_(e){return e=e|0,357913941}function C_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function T_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function x_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Gp(e){e=e|0,O_(e)}function k_(e){e=e|0,A_(e+24|0)}function A_(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function O_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,I_()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function I_(){return 1280}function P_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=M_(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=F_(n,s,r)|0,h=o,r|0}function M_(e){return e=e|0,(t[(M1()|0)+24>>2]|0)+(e*12|0)|0}function F_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return d=h,h=h+32|0,s=d,l=d+16|0,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(l,r),l=ns(l,r)|0,X1[o&15](s,e,l),l=jp(s)|0,h=d,l|0}function L_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],R_(e,r,s,1),h=o}function R_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=F1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=N_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,B_(l,o)|0,o),h=s}function F1(){var e=0,n=0;if(c[7752]|0||(Kp(9720),Bt(38,9720,Q|0)|0,n=7752,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9720)|0)){e=9720,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Kp(9720)}return 9720}function N_(e){return e=e|0,0}function B_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=F1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Vp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(j_(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Vp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function j_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=L1(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Yp(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Vp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,$p(e,_),U_(_),h=k;return}}function L1(e){return e=e|0,357913941}function Yp(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function $p(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function U_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Kp(e){e=e|0,z_(e)}function q_(e){e=e|0,R1(e+24|0)}function R1(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function z_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,8,n,W_()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function W_(){return 1288}function H_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=$i(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=N1(n,o)|0,h=r,n|0}function $i(e){return e=e|0,(t[(F1()|0)+24>>2]|0)+(e*12|0)|0}function N1(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Dd(dc[r&31](e)|0)|0}function b_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],G_(e,r,s,0),h=o}function G_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=B1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=V_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,j1(l,o)|0,o),h=s}function B1(){var e=0,n=0;if(c[7760]|0||(q1(9756),Bt(39,9756,Q|0)|0,n=7760,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9756)|0)){e=9756,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));q1(9756)}return 9756}function V_(e){return e=e|0,0}function j1(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=B1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Xp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(U1(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Xp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function U1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Y_(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,$_(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Xp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,K_(e,_),X_(_),h=k;return}}function Y_(e){return e=e|0,357913941}function $_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function K_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function X_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function q1(e){e=e|0,Z_(e)}function J_(e){e=e|0,Q_(e+24|0)}function Q_(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Z_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,8,n,z1()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function z1(){return 1292}function W1(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=e4(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],t4(n,s,r),h=o}function e4(e){return e=e|0,(t[(B1()|0)+24>>2]|0)+(e*12|0)|0}function t4(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),wu(s,r),r=+Du(s,r),nD[o&31](e,r),h=l}function n4(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r4(e,r,s,0),h=o}function r4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=H1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=i4(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,o4(l,o)|0,o),h=s}function H1(){var e=0,n=0;if(c[7768]|0||(Qp(9792),Bt(40,9792,Q|0)|0,n=7768,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9792)|0)){e=9792,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Qp(9792)}return 9792}function i4(e){return e=e|0,0}function o4(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=H1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Jp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(u4(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Jp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function u4(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=s4(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,l4(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Jp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,f4(e,_),c4(_),h=k;return}}function s4(e){return e=e|0,357913941}function l4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function f4(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function c4(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Qp(e){e=e|0,p4(e)}function a4(e){e=e|0,d4(e+24|0)}function d4(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function p4(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,h4()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function h4(){return 1300}function m4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+8|0,d=s,_=v4(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],g4(n,l,r,o),h=s}function v4(e){return e=e|0,(t[(H1()|0)+24>>2]|0)+(e*12|0)|0}function g4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o;var s=0,l=0,d=0,_=0;_=h,h=h+16|0,l=_+1|0,d=_,s=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(s=t[(t[e>>2]|0)+s>>2]|0),ts(l,r),l=ns(l,r)|0,wu(d,o),o=+Du(d,o),cD[s&15](e,l,o),h=_}function a(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],p(e,r,s,0),h=o}function p(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=E()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=I(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,B(l,o)|0,o),h=s}function E(){var e=0,n=0;if(c[7776]|0||(nt(9828),Bt(41,9828,Q|0)|0,n=7776,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9828)|0)){e=9828,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));nt(9828)}return 9828}function I(e){return e=e|0,0}function B(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=E()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],G(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(te(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function G(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function te(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=se(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Ee(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],G(l,o,r),t[y>>2]=(t[y>>2]|0)+12,$e(e,_),Ke(_),h=k;return}}function se(e){return e=e|0,357913941}function Ee(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function $e(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Ke(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function nt(e){e=e|0,an(e)}function Ct(e){e=e|0,Gt(e+24|0)}function Gt(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function an(e){e=e|0;var n=0;n=An()|0,Nn(e,2,7,n,qn()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function qn(){return 1312}function dn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=Yn(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],er(n,s,r),h=o}function Yn(e){return e=e|0,(t[(E()|0)+24>>2]|0)+(e*12|0)|0}function er(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(s,r),s=ns(s,r)|0,Bl[o&31](e,s),h=l}function vo(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Pi(e,r,s,0),h=o}function Pi(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=Mi()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=f0(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Jo(l,o)|0,o),h=s}function Mi(){var e=0,n=0;if(c[7784]|0||(kw(9864),Bt(42,9864,Q|0)|0,n=7784,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9864)|0)){e=9864,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));kw(9864)}return 9864}function f0(e){return e=e|0,0}function Jo(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=Mi()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Su(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Zp(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Su(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Zp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=v9(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,g9(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Su(l,o,r),t[y>>2]=(t[y>>2]|0)+12,_9(e,_),y9(_),h=k;return}}function v9(e){return e=e|0,357913941}function g9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function _9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function y9(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function kw(e){e=e|0,E9(e)}function w9(e){e=e|0,D9(e+24|0)}function D9(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function E9(e){e=e|0;var n=0;n=An()|0,Nn(e,2,8,n,S9()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function S9(){return 1320}function C9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=T9(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],x9(n,s,r),h=o}function T9(e){return e=e|0,(t[(Mi()|0)+24>>2]|0)+(e*12|0)|0}function x9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),k9(s,r),s=A9(s,r)|0,Bl[o&31](e,s),h=l}function k9(e,n){e=e|0,n=n|0}function A9(e,n){return e=e|0,n=n|0,O9(n)|0}function O9(e){return e=e|0,e|0}function I9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],P9(e,r,s,0),h=o}function P9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=_4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=M9(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,F9(l,o)|0,o),h=s}function _4(){var e=0,n=0;if(c[7792]|0||(Ow(9900),Bt(43,9900,Q|0)|0,n=7792,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9900)|0)){e=9900,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Ow(9900)}return 9900}function M9(e){return e=e|0,0}function F9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=_4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Aw(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(L9(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Aw(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function L9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=R9(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,N9(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Aw(l,o,r),t[y>>2]=(t[y>>2]|0)+12,B9(e,_),j9(_),h=k;return}}function R9(e){return e=e|0,357913941}function N9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function B9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function j9(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Ow(e){e=e|0,z9(e)}function U9(e){e=e|0,q9(e+24|0)}function q9(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function z9(e){e=e|0;var n=0;n=An()|0,Nn(e,2,22,n,W9()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function W9(){return 1344}function H9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;r=h,h=h+16|0,o=r+8|0,s=r,l=b9(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],G9(n,o),h=r}function b9(e){return e=e|0,(t[(_4()|0)+24>>2]|0)+(e*12|0)|0}function G9(e,n){e=e|0,n=n|0;var r=0;r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Nl[r&127](e)}function V9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=y4()|0,e=Y9(r)|0,ur(l,n,s,e,$9(r,o)|0,o)}function y4(){var e=0,n=0;if(c[7800]|0||(Pw(9936),Bt(44,9936,Q|0)|0,n=7800,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9936)|0)){e=9936,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Pw(9936)}return 9936}function Y9(e){return e=e|0,e|0}function $9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=y4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Iw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(K9(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Iw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function K9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=X9(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,J9(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Iw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,Q9(e,s),Z9(s),h=_;return}}function X9(e){return e=e|0,536870911}function J9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function Q9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Z9(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Pw(e){e=e|0,nx(e)}function ex(e){e=e|0,tx(e+24|0)}function tx(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function nx(e){e=e|0;var n=0;n=An()|0,Nn(e,1,23,n,Mo()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function rx(e,n){e=e|0,n=n|0,ox(t[(ix(e)|0)>>2]|0,n)}function ix(e){return e=e|0,(t[(y4()|0)+24>>2]|0)+(e<<3)|0}function ox(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,On(o,n),n=x1(o,n)|0,Nl[e&127](n),h=r}function ux(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=w4()|0,e=sx(r)|0,ur(l,n,s,e,lx(r,o)|0,o)}function w4(){var e=0,n=0;if(c[7808]|0||(Fw(9972),Bt(45,9972,Q|0)|0,n=7808,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9972)|0)){e=9972,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Fw(9972)}return 9972}function sx(e){return e=e|0,e|0}function lx(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=w4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Mw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(fx(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Mw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function fx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=cx(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,ax(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Mw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,dx(e,s),px(s),h=_;return}}function cx(e){return e=e|0,536870911}function ax(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function dx(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function px(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Fw(e){e=e|0,vx(e)}function hx(e){e=e|0,mx(e+24|0)}function mx(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function vx(e){e=e|0;var n=0;n=An()|0,Nn(e,1,9,n,gx()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function gx(){return 1348}function _x(e,n){return e=e|0,n=n|0,wx(t[(yx(e)|0)>>2]|0,n)|0}function yx(e){return e=e|0,(t[(w4()|0)+24>>2]|0)+(e<<3)|0}function wx(e,n){e=e|0,n=n|0;var r=0,o=0;return r=h,h=h+16|0,o=r,Lw(o,n),n=Rw(o,n)|0,n=Xc(dc[e&31](n)|0)|0,h=r,n|0}function Lw(e,n){e=e|0,n=n|0}function Rw(e,n){return e=e|0,n=n|0,Dx(n)|0}function Dx(e){return e=e|0,e|0}function Ex(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=D4()|0,e=Sx(r)|0,ur(l,n,s,e,Cx(r,o)|0,o)}function D4(){var e=0,n=0;if(c[7816]|0||(Bw(10008),Bt(46,10008,Q|0)|0,n=7816,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10008)|0)){e=10008,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Bw(10008)}return 10008}function Sx(e){return e=e|0,e|0}function Cx(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=D4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Nw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(Tx(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Nw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function Tx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=xx(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,kx(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Nw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,Ax(e,s),Ox(s),h=_;return}}function xx(e){return e=e|0,536870911}function kx(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function Ax(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Ox(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Bw(e){e=e|0,Mx(e)}function Ix(e){e=e|0,Px(e+24|0)}function Px(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function Mx(e){e=e|0;var n=0;n=An()|0,Nn(e,1,15,n,mp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Fx(e){return e=e|0,Rx(t[(Lx(e)|0)>>2]|0)|0}function Lx(e){return e=e|0,(t[(D4()|0)+24>>2]|0)+(e<<3)|0}function Rx(e){return e=e|0,Xc(ph[e&7]()|0)|0}function Nx(){var e=0;return c[7832]|0||(bx(10052),Bt(25,10052,Q|0)|0,e=7832,t[e>>2]=1,t[e+4>>2]=0),10052}function Bx(e,n){e=e|0,n=n|0,t[e>>2]=jx()|0,t[e+4>>2]=Ux()|0,t[e+12>>2]=n,t[e+8>>2]=qx()|0,t[e+32>>2]=2}function jx(){return 11709}function Ux(){return 1188}function qx(){return eh()|0}function zx(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(Wx(r),Ve(r)):n|0&&(mu(n),Ve(n))}function Sf(e,n){return e=e|0,n=n|0,n&e|0}function Wx(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function eh(){var e=0;return c[7824]|0||(t[2511]=Hx()|0,t[2512]=0,e=7824,t[e>>2]=1,t[e+4>>2]=0),10044}function Hx(){return 0}function bx(e){e=e|0,Ys(e)}function Gx(e){e=e|0;var n=0,r=0,o=0,s=0,l=0;n=h,h=h+32|0,r=n+24|0,l=n+16|0,s=n+8|0,o=n,Vx(e,4827),Yx(e,4834,3)|0,$x(e,3682,47)|0,t[l>>2]=9,t[l+4>>2]=0,t[r>>2]=t[l>>2],t[r+4>>2]=t[l+4>>2],Kx(e,4841,r)|0,t[s>>2]=1,t[s+4>>2]=0,t[r>>2]=t[s>>2],t[r+4>>2]=t[s+4>>2],Xx(e,4871,r)|0,t[o>>2]=10,t[o+4>>2]=0,t[r>>2]=t[o>>2],t[r+4>>2]=t[o+4>>2],Jx(e,4891,r)|0,h=n}function Vx(e,n){e=e|0,n=n|0;var r=0;r=Ok()|0,t[e>>2]=r,Ik(r,n),Cf(t[e>>2]|0)}function Yx(e,n,r){return e=e|0,n=n|0,r=r|0,pk(e,Zn(n)|0,r,0),e|0}function $x(e,n,r){return e=e|0,n=n|0,r=r|0,Q7(e,Zn(n)|0,r,0),e|0}function Kx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],F7(e,n,s),h=o,e|0}function Xx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],h7(e,n,s),h=o,e|0}function Jx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Qx(e,n,s),h=o,e|0}function Qx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Zx(e,r,s,1),h=o}function Zx(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=E4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=e7(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,t7(l,o)|0,o),h=s}function E4(){var e=0,n=0;if(c[7840]|0||(Uw(10100),Bt(48,10100,Q|0)|0,n=7840,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10100)|0)){e=10100,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Uw(10100)}return 10100}function e7(e){return e=e|0,0}function t7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=E4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],jw(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(n7(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function jw(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function n7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=r7(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,i7(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],jw(l,o,r),t[y>>2]=(t[y>>2]|0)+12,o7(e,_),u7(_),h=k;return}}function r7(e){return e=e|0,357913941}function i7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function o7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function u7(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Uw(e){e=e|0,f7(e)}function s7(e){e=e|0,l7(e+24|0)}function l7(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function f7(e){e=e|0;var n=0;n=An()|0,Nn(e,2,6,n,c7()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function c7(){return 1364}function a7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=d7(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=p7(n,s,r)|0,h=o,r|0}function d7(e){return e=e|0,(t[(E4()|0)+24>>2]|0)+(e*12|0)|0}function p7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;return l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(s,r),s=ns(s,r)|0,s=ip(J4[o&15](e,s)|0)|0,h=l,s|0}function h7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],m7(e,r,s,0),h=o}function m7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=S4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=v7(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,g7(l,o)|0,o),h=s}function S4(){var e=0,n=0;if(c[7848]|0||(zw(10136),Bt(49,10136,Q|0)|0,n=7848,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10136)|0)){e=10136,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));zw(10136)}return 10136}function v7(e){return e=e|0,0}function g7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=S4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],qw(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(_7(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function qw(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function _7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=y7(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,w7(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],qw(l,o,r),t[y>>2]=(t[y>>2]|0)+12,D7(e,_),E7(_),h=k;return}}function y7(e){return e=e|0,357913941}function w7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function D7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function E7(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function zw(e){e=e|0,T7(e)}function S7(e){e=e|0,C7(e+24|0)}function C7(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function T7(e){e=e|0;var n=0;n=An()|0,Nn(e,2,9,n,x7()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function x7(){return 1372}function k7(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=A7(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],O7(n,s,r),h=o}function A7(e){return e=e|0,(t[(S4()|0)+24>>2]|0)+(e*12|0)|0}function O7(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=tt;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),I7(s,r),d=w(P7(s,r)),tD[o&1](e,d),h=l}function I7(e,n){e=e|0,n=+n}function P7(e,n){return e=e|0,n=+n,w(M7(n))}function M7(e){return e=+e,w(e)}function F7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],L7(e,r,s,0),h=o}function L7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=C4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=R7(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,N7(l,o)|0,o),h=s}function C4(){var e=0,n=0;if(c[7856]|0||(Hw(10172),Bt(50,10172,Q|0)|0,n=7856,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10172)|0)){e=10172,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Hw(10172)}return 10172}function R7(e){return e=e|0,0}function N7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=C4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Ww(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(B7(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Ww(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function B7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=j7(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,U7(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Ww(l,o,r),t[y>>2]=(t[y>>2]|0)+12,q7(e,_),z7(_),h=k;return}}function j7(e){return e=e|0,357913941}function U7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function q7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function z7(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Hw(e){e=e|0,b7(e)}function W7(e){e=e|0,H7(e+24|0)}function H7(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function b7(e){e=e|0;var n=0;n=An()|0,Nn(e,2,3,n,G7()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function G7(){return 1380}function V7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+8|0,d=s,_=Y7(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],$7(n,l,r,o),h=s}function Y7(e){return e=e|0,(t[(C4()|0)+24>>2]|0)+(e*12|0)|0}function $7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;_=h,h=h+16|0,l=_+1|0,d=_,s=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(s=t[(t[e>>2]|0)+s>>2]|0),ts(l,r),l=ns(l,r)|0,K7(d,o),d=X7(d,o)|0,X1[s&15](e,l,d),h=_}function K7(e,n){e=e|0,n=n|0}function X7(e,n){return e=e|0,n=n|0,J7(n)|0}function J7(e){return e=e|0,(e|0)!=0|0}function Q7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=T4()|0,e=Z7(r)|0,ur(l,n,s,e,ek(r,o)|0,o)}function T4(){var e=0,n=0;if(c[7864]|0||(Gw(10208),Bt(51,10208,Q|0)|0,n=7864,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10208)|0)){e=10208,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Gw(10208)}return 10208}function Z7(e){return e=e|0,e|0}function ek(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=T4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(bw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(tk(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function bw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function tk(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=nk(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,rk(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,bw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,ik(e,s),ok(s),h=_;return}}function nk(e){return e=e|0,536870911}function rk(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function ik(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function ok(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Gw(e){e=e|0,lk(e)}function uk(e){e=e|0,sk(e+24|0)}function sk(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function lk(e){e=e|0;var n=0;n=An()|0,Nn(e,1,24,n,fk()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function fk(){return 1392}function ck(e,n){e=e|0,n=n|0,dk(t[(ak(e)|0)>>2]|0,n)}function ak(e){return e=e|0,(t[(T4()|0)+24>>2]|0)+(e<<3)|0}function dk(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Lw(o,n),n=Rw(o,n)|0,Nl[e&127](n),h=r}function pk(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=x4()|0,e=hk(r)|0,ur(l,n,s,e,mk(r,o)|0,o)}function x4(){var e=0,n=0;if(c[7872]|0||(Yw(10244),Bt(52,10244,Q|0)|0,n=7872,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10244)|0)){e=10244,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Yw(10244)}return 10244}function hk(e){return e=e|0,e|0}function mk(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=x4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Vw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(vk(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Vw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function vk(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=gk(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,_k(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Vw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,yk(e,s),wk(s),h=_;return}}function gk(e){return e=e|0,536870911}function _k(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function yk(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function wk(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Yw(e){e=e|0,Sk(e)}function Dk(e){e=e|0,Ek(e+24|0)}function Ek(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function Sk(e){e=e|0;var n=0;n=An()|0,Nn(e,1,16,n,Ck()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Ck(){return 1400}function Tk(e){return e=e|0,kk(t[(xk(e)|0)>>2]|0)|0}function xk(e){return e=e|0,(t[(x4()|0)+24>>2]|0)+(e<<3)|0}function kk(e){return e=e|0,Ak(ph[e&7]()|0)|0}function Ak(e){return e=e|0,e|0}function Ok(){var e=0;return c[7880]|0||(Nk(10280),Bt(25,10280,Q|0)|0,e=7880,t[e>>2]=1,t[e+4>>2]=0),10280}function Ik(e,n){e=e|0,n=n|0,t[e>>2]=Pk()|0,t[e+4>>2]=Mk()|0,t[e+12>>2]=n,t[e+8>>2]=Fk()|0,t[e+32>>2]=4}function Pk(){return 11711}function Mk(){return 1356}function Fk(){return eh()|0}function Lk(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(Rk(r),Ve(r)):n|0&&(Gi(n),Ve(n))}function Rk(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function Nk(e){e=e|0,Ys(e)}function Bk(e){e=e|0,jk(e,4920),Uk(e)|0,qk(e)|0}function jk(e,n){e=e|0,n=n|0;var r=0;r=Up()|0,t[e>>2]=r,sA(r,n),Cf(t[e>>2]|0)}function Uk(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,Jk()|0),e|0}function qk(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,zk()|0),e|0}function zk(){var e=0;return c[7888]|0||($w(10328),Bt(53,10328,Q|0)|0,e=7888,t[e>>2]=1,t[e+4>>2]=0),Dn(10328)|0||$w(10328),10328}function uc(e,n){e=e|0,n=n|0,ur(e,0,n,0,0,0)}function $w(e){e=e|0,bk(e),sc(e,10)}function Wk(e){e=e|0,Hk(e+24|0)}function Hk(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function bk(e){e=e|0;var n=0;n=An()|0,Nn(e,5,1,n,$k()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Gk(e,n,r){e=e|0,n=n|0,r=+r,Vk(e,n,r)}function sc(e,n){e=e|0,n=n|0,t[e+20>>2]=n}function Vk(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,l=o+8|0,_=o+13|0,s=o,d=o+12|0,ts(_,n),t[l>>2]=ns(_,n)|0,wu(d,r),L[s>>3]=+Du(d,r),Yk(e,l,s),h=o}function Yk(e,n,r){e=e|0,n=n|0,r=r|0,M(e+8|0,t[n>>2]|0,+L[r>>3]),c[e+24>>0]=1}function $k(){return 1404}function Kk(e,n){return e=e|0,n=+n,Xk(e,n)|0}function Xk(e,n){e=e|0,n=+n;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return o=h,h=h+16|0,l=o+4|0,d=o+8|0,_=o,s=Qo(8)|0,r=s,y=Tt(16)|0,ts(l,e),e=ns(l,e)|0,wu(d,n),M(y,e,+Du(d,n)),d=r+4|0,t[d>>2]=y,e=Tt(8)|0,d=t[d>>2]|0,t[_>>2]=0,t[l>>2]=t[_>>2],P1(e,d,l),t[s>>2]=e,h=o,r|0}function Jk(){var e=0;return c[7896]|0||(Kw(10364),Bt(54,10364,Q|0)|0,e=7896,t[e>>2]=1,t[e+4>>2]=0),Dn(10364)|0||Kw(10364),10364}function Kw(e){e=e|0,eA(e),sc(e,55)}function Qk(e){e=e|0,Zk(e+24|0)}function Zk(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function eA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,4,n,iA()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function tA(e){e=e|0,nA(e)}function nA(e){e=e|0,rA(e)}function rA(e){e=e|0,Xw(e+8|0),c[e+24>>0]=1}function Xw(e){e=e|0,t[e>>2]=0,L[e+8>>3]=0}function iA(){return 1424}function oA(){return uA()|0}function uA(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0;return n=h,h=h+16|0,s=n+4|0,d=n,r=Qo(8)|0,e=r,o=Tt(16)|0,Xw(o),l=e+4|0,t[l>>2]=o,o=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],P1(o,l,s),t[r>>2]=o,h=n,e|0}function sA(e,n){e=e|0,n=n|0,t[e>>2]=lA()|0,t[e+4>>2]=fA()|0,t[e+12>>2]=n,t[e+8>>2]=cA()|0,t[e+32>>2]=5}function lA(){return 11710}function fA(){return 1416}function cA(){return th()|0}function aA(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(dA(r),Ve(r)):n|0&&Ve(n)}function dA(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function th(){var e=0;return c[7904]|0||(t[2600]=pA()|0,t[2601]=0,e=7904,t[e>>2]=1,t[e+4>>2]=0),10400}function pA(){return t[357]|0}function hA(e){e=e|0,mA(e,4926),vA(e)|0}function mA(e,n){e=e|0,n=n|0;var r=0;r=u1()|0,t[e>>2]=r,kA(r,n),Cf(t[e>>2]|0)}function vA(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,gA()|0),e|0}function gA(){var e=0;return c[7912]|0||(Jw(10412),Bt(56,10412,Q|0)|0,e=7912,t[e>>2]=1,t[e+4>>2]=0),Dn(10412)|0||Jw(10412),10412}function Jw(e){e=e|0,wA(e),sc(e,57)}function _A(e){e=e|0,yA(e+24|0)}function yA(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function wA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,5,n,CA()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function DA(e){e=e|0,EA(e)}function EA(e){e=e|0,SA(e)}function SA(e){e=e|0;var n=0,r=0;n=e+8|0,r=n+48|0;do t[n>>2]=0,n=n+4|0;while((n|0)<(r|0));c[e+56>>0]=1}function CA(){return 1432}function TA(){return xA()|0}function xA(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0,_=0;d=h,h=h+16|0,e=d+4|0,n=d,r=Qo(8)|0,o=r,s=Tt(48)|0,l=s,_=l+48|0;do t[l>>2]=0,l=l+4|0;while((l|0)<(_|0));return l=o+4|0,t[l>>2]=s,_=Tt(8)|0,l=t[l>>2]|0,t[n>>2]=0,t[e>>2]=t[n>>2],Wd(_,l,e),t[r>>2]=_,h=d,o|0}function kA(e,n){e=e|0,n=n|0,t[e>>2]=AA()|0,t[e+4>>2]=OA()|0,t[e+12>>2]=n,t[e+8>>2]=IA()|0,t[e+32>>2]=6}function AA(){return 11704}function OA(){return 1436}function IA(){return th()|0}function PA(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(MA(r),Ve(r)):n|0&&Ve(n)}function MA(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function FA(e){e=e|0,LA(e,4933),RA(e)|0,NA(e)|0}function LA(e,n){e=e|0,n=n|0;var r=0;r=uO()|0,t[e>>2]=r,sO(r,n),Cf(t[e>>2]|0)}function RA(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,XA()|0),e|0}function NA(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,BA()|0),e|0}function BA(){var e=0;return c[7920]|0||(Qw(10452),Bt(58,10452,Q|0)|0,e=7920,t[e>>2]=1,t[e+4>>2]=0),Dn(10452)|0||Qw(10452),10452}function Qw(e){e=e|0,qA(e),sc(e,1)}function jA(e){e=e|0,UA(e+24|0)}function UA(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function qA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,1,n,bA()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function zA(e,n,r){e=e|0,n=+n,r=+r,WA(e,n,r)}function WA(e,n,r){e=e|0,n=+n,r=+r;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+32|0,l=o+8|0,_=o+17|0,s=o,d=o+16|0,wu(_,n),L[l>>3]=+Du(_,n),wu(d,r),L[s>>3]=+Du(d,r),HA(e,l,s),h=o}function HA(e,n,r){e=e|0,n=n|0,r=r|0,Zw(e+8|0,+L[n>>3],+L[r>>3]),c[e+24>>0]=1}function Zw(e,n,r){e=e|0,n=+n,r=+r,L[e>>3]=n,L[e+8>>3]=r}function bA(){return 1472}function GA(e,n){return e=+e,n=+n,VA(e,n)|0}function VA(e,n){e=+e,n=+n;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return o=h,h=h+16|0,d=o+4|0,_=o+8|0,y=o,s=Qo(8)|0,r=s,l=Tt(16)|0,wu(d,e),e=+Du(d,e),wu(_,n),Zw(l,e,+Du(_,n)),_=r+4|0,t[_>>2]=l,l=Tt(8)|0,_=t[_>>2]|0,t[y>>2]=0,t[d>>2]=t[y>>2],e8(l,_,d),t[s>>2]=l,h=o,r|0}function e8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1452,t[r+12>>2]=n,t[e+4>>2]=r}function YA(e){e=e|0,da(e),Ve(e)}function $A(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function KA(e){e=e|0,Ve(e)}function XA(){var e=0;return c[7928]|0||(t8(10488),Bt(59,10488,Q|0)|0,e=7928,t[e>>2]=1,t[e+4>>2]=0),Dn(10488)|0||t8(10488),10488}function t8(e){e=e|0,ZA(e),sc(e,60)}function JA(e){e=e|0,QA(e+24|0)}function QA(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function ZA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,6,n,rO()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function eO(e){e=e|0,tO(e)}function tO(e){e=e|0,nO(e)}function nO(e){e=e|0,n8(e+8|0),c[e+24>>0]=1}function n8(e){e=e|0,t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,t[e+12>>2]=0}function rO(){return 1492}function iO(){return oO()|0}function oO(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0;return n=h,h=h+16|0,s=n+4|0,d=n,r=Qo(8)|0,e=r,o=Tt(16)|0,n8(o),l=e+4|0,t[l>>2]=o,o=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],e8(o,l,s),t[r>>2]=o,h=n,e|0}function uO(){var e=0;return c[7936]|0||(pO(10524),Bt(25,10524,Q|0)|0,e=7936,t[e>>2]=1,t[e+4>>2]=0),10524}function sO(e,n){e=e|0,n=n|0,t[e>>2]=lO()|0,t[e+4>>2]=fO()|0,t[e+12>>2]=n,t[e+8>>2]=cO()|0,t[e+32>>2]=7}function lO(){return 11700}function fO(){return 1484}function cO(){return th()|0}function aO(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(dO(r),Ve(r)):n|0&&Ve(n)}function dO(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function pO(e){e=e|0,Ys(e)}function hO(e,n,r){e=e|0,n=n|0,r=r|0,e=Zn(n)|0,n=mO(r)|0,r=vO(r,0)|0,VO(e,n,r,k4()|0,0)}function mO(e){return e=e|0,e|0}function vO(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=k4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(i8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(SO(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function k4(){var e=0,n=0;if(c[7944]|0||(r8(10568),Bt(61,10568,Q|0)|0,n=7944,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10568)|0)){e=10568,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));r8(10568)}return 10568}function r8(e){e=e|0,yO(e)}function gO(e){e=e|0,_O(e+24|0)}function _O(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function yO(e){e=e|0;var n=0;n=An()|0,Nn(e,1,17,n,Dp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function wO(e){return e=e|0,EO(t[(DO(e)|0)>>2]|0)|0}function DO(e){return e=e|0,(t[(k4()|0)+24>>2]|0)+(e<<3)|0}function EO(e){return e=e|0,ea(ph[e&7]()|0)|0}function i8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function SO(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=CO(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,TO(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,i8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,xO(e,s),kO(s),h=_;return}}function CO(e){return e=e|0,536870911}function TO(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function xO(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function kO(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function AO(){OO()}function OO(){IO(10604)}function IO(e){e=e|0,PO(e,4955)}function PO(e,n){e=e|0,n=n|0;var r=0;r=MO()|0,t[e>>2]=r,FO(r,n),Cf(t[e>>2]|0)}function MO(){var e=0;return c[7952]|0||(WO(10612),Bt(25,10612,Q|0)|0,e=7952,t[e>>2]=1,t[e+4>>2]=0),10612}function FO(e,n){e=e|0,n=n|0,t[e>>2]=BO()|0,t[e+4>>2]=jO()|0,t[e+12>>2]=n,t[e+8>>2]=UO()|0,t[e+32>>2]=8}function Cf(e){e=e|0;var n=0,r=0;n=h,h=h+16|0,r=n,sa()|0,t[r>>2]=e,LO(10608,r),h=n}function sa(){return c[11714]|0||(t[2652]=0,Bt(62,10608,Q|0)|0,c[11714]=1),10608}function LO(e,n){e=e|0,n=n|0;var r=0;r=Tt(8)|0,t[r+4>>2]=t[n>>2],t[r>>2]=t[e>>2],t[e>>2]=r}function RO(e){e=e|0,NO(e)}function NO(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,Ve(r);while((n|0)!=0);t[e>>2]=0}function BO(){return 11715}function jO(){return 1496}function UO(){return eh()|0}function qO(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(zO(r),Ve(r)):n|0&&Ve(n)}function zO(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function WO(e){e=e|0,Ys(e)}function HO(e,n){e=e|0,n=n|0;var r=0,o=0;sa()|0,r=t[2652]|0;e:do if(r|0){for(;o=t[r+4>>2]|0,!(o|0?(U8(A4(o)|0,e)|0)==0:0);)if(r=t[r>>2]|0,!r)break e;bO(o,n)}while(0)}function A4(e){return e=e|0,t[e+12>>2]|0}function bO(e,n){e=e|0,n=n|0;var r=0;e=e+36|0,r=t[e>>2]|0,r|0&&(Ju(r),Ve(r)),r=Tt(4)|0,ba(r,n),t[e>>2]=r}function O4(){return c[11716]|0||(t[2664]=0,Bt(63,10656,Q|0)|0,c[11716]=1),10656}function o8(){var e=0;return c[11717]|0?e=t[2665]|0:(GO(),t[2665]=1504,c[11717]=1,e=1504),e|0}function GO(){c[11740]|0||(c[11718]=Lt(Lt(8,0)|0,0)|0,c[11719]=Lt(Lt(0,0)|0,0)|0,c[11720]=Lt(Lt(0,16)|0,0)|0,c[11721]=Lt(Lt(8,0)|0,0)|0,c[11722]=Lt(Lt(0,0)|0,0)|0,c[11723]=Lt(Lt(8,0)|0,0)|0,c[11724]=Lt(Lt(0,0)|0,0)|0,c[11725]=Lt(Lt(8,0)|0,0)|0,c[11726]=Lt(Lt(0,0)|0,0)|0,c[11727]=Lt(Lt(8,0)|0,0)|0,c[11728]=Lt(Lt(0,0)|0,0)|0,c[11729]=Lt(Lt(0,0)|0,32)|0,c[11730]=Lt(Lt(0,0)|0,32)|0,c[11740]=1)}function u8(){return 1572}function VO(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0;l=h,h=h+32|0,T=l+16|0,k=l+12|0,y=l+8|0,_=l+4|0,d=l,t[T>>2]=e,t[k>>2]=n,t[y>>2]=r,t[_>>2]=o,t[d>>2]=s,O4()|0,YO(10656,T,k,y,_,d),h=l}function YO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0;d=Tt(24)|0,t1(d+4|0,t[n>>2]|0,t[r>>2]|0,t[o>>2]|0,t[s>>2]|0,t[l>>2]|0),t[d>>2]=t[e>>2],t[e>>2]=d}function s8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0;if(qe=h,h=h+32|0,le=qe+20|0,ie=qe+8|0,Pe=qe+4|0,ke=qe,n=t[n>>2]|0,n|0){we=le+4|0,y=le+8|0,k=ie+4|0,T=ie+8|0,P=ie+8|0,q=le+8|0;do{if(d=n+4|0,_=I4(d)|0,_|0){if(s=b1(_)|0,t[le>>2]=0,t[we>>2]=0,t[y>>2]=0,o=(G1(_)|0)+1|0,$O(le,o),o|0)for(;o=o+-1|0,os(ie,t[s>>2]|0),l=t[we>>2]|0,l>>>0<(t[q>>2]|0)>>>0?(t[l>>2]=t[ie>>2],t[we>>2]=(t[we>>2]|0)+4):P4(le,ie),o;)s=s+4|0;o=V1(_)|0,t[ie>>2]=0,t[k>>2]=0,t[T>>2]=0;e:do if(t[o>>2]|0)for(s=0,l=0;;){if((s|0)==(l|0)?KO(ie,o):(t[s>>2]=t[o>>2],t[k>>2]=(t[k>>2]|0)+4),o=o+4|0,!(t[o>>2]|0))break e;s=t[k>>2]|0,l=t[P>>2]|0}while(0);t[Pe>>2]=nh(d)|0,t[ke>>2]=Dn(_)|0,XO(r,e,Pe,ke,le,ie),M4(ie),Rl(le)}n=t[n>>2]|0}while((n|0)!=0)}h=qe}function I4(e){return e=e|0,t[e+12>>2]|0}function b1(e){return e=e|0,t[e+12>>2]|0}function G1(e){return e=e|0,t[e+16>>2]|0}function $O(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;s=h,h=h+32|0,r=s,o=t[e>>2]|0,(t[e+8>>2]|0)-o>>2>>>0>>0&&(m8(r,n,(t[e+4>>2]|0)-o>>2,e+8|0),v8(e,r),g8(r)),h=s}function P4(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;if(d=h,h=h+32|0,r=d,o=e+4|0,s=((t[o>>2]|0)-(t[e>>2]|0)>>2)+1|0,l=h8(e)|0,l>>>0>>0)$n(e);else{_=t[e>>2]|0,k=(t[e+8>>2]|0)-_|0,y=k>>1,m8(r,k>>2>>>0>>1>>>0?y>>>0>>0?s:y:l,(t[o>>2]|0)-_>>2,e+8|0),l=r+8|0,t[t[l>>2]>>2]=t[n>>2],t[l>>2]=(t[l>>2]|0)+4,v8(e,r),g8(r),h=d;return}}function V1(e){return e=e|0,t[e+8>>2]|0}function KO(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;if(d=h,h=h+32|0,r=d,o=e+4|0,s=((t[o>>2]|0)-(t[e>>2]|0)>>2)+1|0,l=p8(e)|0,l>>>0>>0)$n(e);else{_=t[e>>2]|0,k=(t[e+8>>2]|0)-_|0,y=k>>1,mI(r,k>>2>>>0>>1>>>0?y>>>0>>0?s:y:l,(t[o>>2]|0)-_>>2,e+8|0),l=r+8|0,t[t[l>>2]>>2]=t[n>>2],t[l>>2]=(t[l>>2]|0)+4,vI(e,r),gI(r),h=d;return}}function nh(e){return e=e|0,t[e>>2]|0}function XO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,JO(e,n,r,o,s,l)}function M4(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-o|0)>>>2)<<2)),Ve(r))}function Rl(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-o|0)>>>2)<<2)),Ve(r))}function JO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0;d=h,h=h+48|0,T=d+40|0,_=d+32|0,P=d+24|0,y=d+12|0,k=d,Zo(_),e=Oi(e)|0,t[P>>2]=t[n>>2],r=t[r>>2]|0,o=t[o>>2]|0,F4(y,s),QO(k,l),t[T>>2]=t[P>>2],ZO(e,T,r,o,y,k),M4(k),Rl(y),eu(_),h=d}function F4(e,n){e=e|0,n=n|0;var r=0,o=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,o=(t[r>>2]|0)-(t[n>>2]|0)>>2,o|0&&(pI(e,o),hI(e,t[n>>2]|0,t[r>>2]|0,o))}function QO(e,n){e=e|0,n=n|0;var r=0,o=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,o=(t[r>>2]|0)-(t[n>>2]|0)>>2,o|0&&(aI(e,o),dI(e,t[n>>2]|0,t[r>>2]|0,o))}function ZO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0;d=h,h=h+32|0,T=d+28|0,P=d+24|0,_=d+12|0,y=d,k=ko(eI()|0)|0,t[P>>2]=t[n>>2],t[T>>2]=t[P>>2],n=lc(T)|0,r=l8(r)|0,o=L4(o)|0,t[_>>2]=t[s>>2],T=s+4|0,t[_+4>>2]=t[T>>2],P=s+8|0,t[_+8>>2]=t[P>>2],t[P>>2]=0,t[T>>2]=0,t[s>>2]=0,s=R4(_)|0,t[y>>2]=t[l>>2],T=l+4|0,t[y+4>>2]=t[T>>2],P=l+8|0,t[y+8>>2]=t[P>>2],t[P>>2]=0,t[T>>2]=0,t[l>>2]=0,qo(0,k|0,e|0,n|0,r|0,o|0,s|0,tI(y)|0)|0,M4(y),Rl(_),h=d}function eI(){var e=0;return c[7968]|0||(fI(10708),e=7968,t[e>>2]=1,t[e+4>>2]=0),10708}function lc(e){return e=e|0,c8(e)|0}function l8(e){return e=e|0,f8(e)|0}function L4(e){return e=e|0,ea(e)|0}function R4(e){return e=e|0,rI(e)|0}function tI(e){return e=e|0,nI(e)|0}function nI(e){e=e|0;var n=0,r=0,o=0;if(o=(t[e+4>>2]|0)-(t[e>>2]|0)|0,r=o>>2,o=Qo(o+4|0)|0,t[o>>2]=r,r|0){n=0;do t[o+4+(n<<2)>>2]=f8(t[(t[e>>2]|0)+(n<<2)>>2]|0)|0,n=n+1|0;while((n|0)!=(r|0))}return o|0}function f8(e){return e=e|0,e|0}function rI(e){e=e|0;var n=0,r=0,o=0;if(o=(t[e+4>>2]|0)-(t[e>>2]|0)|0,r=o>>2,o=Qo(o+4|0)|0,t[o>>2]=r,r|0){n=0;do t[o+4+(n<<2)>>2]=c8((t[e>>2]|0)+(n<<2)|0)|0,n=n+1|0;while((n|0)!=(r|0))}return o|0}function c8(e){e=e|0;var n=0,r=0,o=0,s=0;return s=h,h=h+32|0,n=s+12|0,r=s,o=U0(a8()|0)|0,o?(s1(n,o),l1(r,n),UF(e,r),e=f1(n)|0):e=iI(e)|0,h=s,e|0}function a8(){var e=0;return c[7960]|0||(lI(10664),Bt(25,10664,Q|0)|0,e=7960,t[e>>2]=1,t[e+4>>2]=0),10664}function iI(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;return r=h,h=h+16|0,s=r+4|0,d=r,o=Qo(8)|0,n=o,_=Tt(4)|0,t[_>>2]=t[e>>2],l=n+4|0,t[l>>2]=_,e=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],d8(e,l,s),t[o>>2]=e,h=r,n|0}function d8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1656,t[r+12>>2]=n,t[e+4>>2]=r}function oI(e){e=e|0,da(e),Ve(e)}function uI(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function sI(e){e=e|0,Ve(e)}function lI(e){e=e|0,Ys(e)}function fI(e){e=e|0,Ao(e,cI()|0,5)}function cI(){return 1676}function aI(e,n){e=e|0,n=n|0;var r=0;if((p8(e)|0)>>>0>>0&&$n(e),n>>>0>1073741823)_n();else{r=Tt(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function dI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,o=e+4|0,e=r-n|0,(e|0)>0&&(vn(t[o>>2]|0,n|0,e|0)|0,t[o>>2]=(t[o>>2]|0)+(e>>>2<<2))}function p8(e){return e=e|0,1073741823}function pI(e,n){e=e|0,n=n|0;var r=0;if((h8(e)|0)>>>0>>0&&$n(e),n>>>0>1073741823)_n();else{r=Tt(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function hI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,o=e+4|0,e=r-n|0,(e|0)>0&&(vn(t[o>>2]|0,n|0,e|0)|0,t[o>>2]=(t[o>>2]|0)+(e>>>2<<2))}function h8(e){return e=e|0,1073741823}function mI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>1073741823)_n();else{s=Tt(n<<2)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<2)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<2)}function vI(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>2)<<2)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function gI(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&Ve(e)}function m8(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>1073741823)_n();else{s=Tt(n<<2)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<2)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<2)}function v8(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>2)<<2)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function g8(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&Ve(e)}function _I(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0;if(ie=h,h=h+32|0,T=ie+20|0,P=ie+12|0,k=ie+16|0,q=ie+4|0,we=ie,le=ie+8|0,_=o8()|0,l=t[_>>2]|0,d=t[l>>2]|0,d|0)for(y=t[_+8>>2]|0,_=t[_+4>>2]|0;os(T,d),yI(e,T,_,y),l=l+4|0,d=t[l>>2]|0,d;)y=y+1|0,_=_+1|0;if(l=u8()|0,d=t[l>>2]|0,d|0)do os(T,d),t[P>>2]=t[l+4>>2],wI(n,T,P),l=l+8|0,d=t[l>>2]|0;while((d|0)!=0);if(l=t[(sa()|0)>>2]|0,l|0)do n=t[l+4>>2]|0,os(T,t[(la(n)|0)>>2]|0),t[P>>2]=A4(n)|0,DI(r,T,P),l=t[l>>2]|0;while((l|0)!=0);if(os(k,0),l=O4()|0,t[T>>2]=t[k>>2],s8(T,l,s),l=t[(sa()|0)>>2]|0,l|0){e=T+4|0,n=T+8|0,r=T+8|0;do{if(y=t[l+4>>2]|0,os(P,t[(la(y)|0)>>2]|0),EI(q,_8(y)|0),d=t[q>>2]|0,d|0){t[T>>2]=0,t[e>>2]=0,t[n>>2]=0;do os(we,t[(la(t[d+4>>2]|0)|0)>>2]|0),_=t[e>>2]|0,_>>>0<(t[r>>2]|0)>>>0?(t[_>>2]=t[we>>2],t[e>>2]=(t[e>>2]|0)+4):P4(T,we),d=t[d>>2]|0;while((d|0)!=0);SI(o,P,T),Rl(T)}t[le>>2]=t[P>>2],k=y8(y)|0,t[T>>2]=t[le>>2],s8(T,k,s),bd(q),l=t[l>>2]|0}while((l|0)!=0)}h=ie}function yI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,RI(e,n,r,o)}function wI(e,n,r){e=e|0,n=n|0,r=r|0,LI(e,n,r)}function la(e){return e=e|0,e|0}function DI(e,n,r){e=e|0,n=n|0,r=r|0,II(e,n,r)}function _8(e){return e=e|0,e+16|0}function EI(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;if(l=h,h=h+16|0,s=l+8|0,r=l,t[e>>2]=0,o=t[n>>2]|0,t[s>>2]=o,t[r>>2]=e,r=OI(r)|0,o|0){if(o=Tt(12)|0,d=(w8(s)|0)+4|0,e=t[d+4>>2]|0,n=o+4|0,t[n>>2]=t[d>>2],t[n+4>>2]=e,n=t[t[s>>2]>>2]|0,t[s>>2]=n,!n)e=o;else for(n=o;e=Tt(12)|0,y=(w8(s)|0)+4|0,_=t[y+4>>2]|0,d=e+4|0,t[d>>2]=t[y>>2],t[d+4>>2]=_,t[n>>2]=e,d=t[t[s>>2]>>2]|0,t[s>>2]=d,d;)n=e;t[e>>2]=t[r>>2],t[r>>2]=o}h=l}function SI(e,n,r){e=e|0,n=n|0,r=r|0,CI(e,n,r)}function y8(e){return e=e|0,e+24|0}function CI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+32|0,d=o+24|0,s=o+16|0,_=o+12|0,l=o,Zo(s),e=Oi(e)|0,t[_>>2]=t[n>>2],F4(l,r),t[d>>2]=t[_>>2],TI(e,d,l),Rl(l),eu(s),h=o}function TI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+32|0,d=o+16|0,_=o+12|0,s=o,l=ko(xI()|0)|0,t[_>>2]=t[n>>2],t[d>>2]=t[_>>2],n=lc(d)|0,t[s>>2]=t[r>>2],d=r+4|0,t[s+4>>2]=t[d>>2],_=r+8|0,t[s+8>>2]=t[_>>2],t[_>>2]=0,t[d>>2]=0,t[r>>2]=0,Ts(0,l|0,e|0,n|0,R4(s)|0)|0,Rl(s),h=o}function xI(){var e=0;return c[7976]|0||(kI(10720),e=7976,t[e>>2]=1,t[e+4>>2]=0),10720}function kI(e){e=e|0,Ao(e,AI()|0,2)}function AI(){return 1732}function OI(e){return e=e|0,t[e>>2]|0}function w8(e){return e=e|0,t[e>>2]|0}function II(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+32|0,l=o+16|0,s=o+8|0,d=o,Zo(s),e=Oi(e)|0,t[d>>2]=t[n>>2],r=t[r>>2]|0,t[l>>2]=t[d>>2],D8(e,l,r),eu(s),h=o}function D8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,l=o+4|0,d=o,s=ko(PI()|0)|0,t[d>>2]=t[n>>2],t[l>>2]=t[d>>2],n=lc(l)|0,Ts(0,s|0,e|0,n|0,l8(r)|0)|0,h=o}function PI(){var e=0;return c[7984]|0||(MI(10732),e=7984,t[e>>2]=1,t[e+4>>2]=0),10732}function MI(e){e=e|0,Ao(e,FI()|0,2)}function FI(){return 1744}function LI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+32|0,l=o+16|0,s=o+8|0,d=o,Zo(s),e=Oi(e)|0,t[d>>2]=t[n>>2],r=t[r>>2]|0,t[l>>2]=t[d>>2],D8(e,l,r),eu(s),h=o}function RI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+32|0,d=s+16|0,l=s+8|0,_=s,Zo(l),e=Oi(e)|0,t[_>>2]=t[n>>2],r=c[r>>0]|0,o=c[o>>0]|0,t[d>>2]=t[_>>2],NI(e,d,r,o),eu(l),h=s}function NI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,d=s+4|0,_=s,l=ko(BI()|0)|0,t[_>>2]=t[n>>2],t[d>>2]=t[_>>2],n=lc(d)|0,r=fa(r)|0,Bu(0,l|0,e|0,n|0,r|0,fa(o)|0)|0,h=s}function BI(){var e=0;return c[7992]|0||(UI(10744),e=7992,t[e>>2]=1,t[e+4>>2]=0),10744}function fa(e){return e=e|0,jI(e)|0}function jI(e){return e=e|0,e&255|0}function UI(e){e=e|0,Ao(e,qI()|0,3)}function qI(){return 1756}function zI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;switch(q=h,h=h+32|0,_=q+8|0,y=q+4|0,k=q+20|0,T=q,_1(e,0),o=jF(n)|0,t[_>>2]=0,P=_+4|0,t[P>>2]=0,t[_+8>>2]=0,o<<24>>24){case 0:{c[k>>0]=0,WI(y,r,k),rh(e,y)|0,ei(y);break}case 8:{P=z4(n)|0,c[k>>0]=8,os(T,t[P+4>>2]|0),HI(y,r,k,T,P+8|0),rh(e,y)|0,ei(y);break}case 9:{if(l=z4(n)|0,n=t[l+4>>2]|0,n|0)for(d=_+8|0,s=l+12|0;n=n+-1|0,os(y,t[s>>2]|0),o=t[P>>2]|0,o>>>0<(t[d>>2]|0)>>>0?(t[o>>2]=t[y>>2],t[P>>2]=(t[P>>2]|0)+4):P4(_,y),n;)s=s+4|0;c[k>>0]=9,os(T,t[l+8>>2]|0),bI(y,r,k,T,_),rh(e,y)|0,ei(y);break}default:P=z4(n)|0,c[k>>0]=o,os(T,t[P+4>>2]|0),GI(y,r,k,T),rh(e,y)|0,ei(y)}Rl(_),h=q}function WI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,Zo(s),n=Oi(n)|0,iP(e,n,c[r>>0]|0),eu(s),h=o}function rh(e,n){e=e|0,n=n|0;var r=0;return r=t[e>>2]|0,r|0&&ju(r|0),t[e>>2]=t[n>>2],t[n>>2]=0,e|0}function HI(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0;l=h,h=h+32|0,_=l+16|0,d=l+8|0,y=l,Zo(d),n=Oi(n)|0,r=c[r>>0]|0,t[y>>2]=t[o>>2],s=t[s>>2]|0,t[_>>2]=t[y>>2],eP(e,n,r,_,s),eu(d),h=l}function bI(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0;l=h,h=h+32|0,y=l+24|0,d=l+16|0,k=l+12|0,_=l,Zo(d),n=Oi(n)|0,r=c[r>>0]|0,t[k>>2]=t[o>>2],F4(_,s),t[y>>2]=t[k>>2],XI(e,n,r,y,_),Rl(_),eu(d),h=l}function GI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+32|0,d=s+16|0,l=s+8|0,_=s,Zo(l),n=Oi(n)|0,r=c[r>>0]|0,t[_>>2]=t[o>>2],t[d>>2]=t[_>>2],VI(e,n,r,d),eu(l),h=s}function VI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+4|0,_=s,d=ko(YI()|0)|0,r=fa(r)|0,t[_>>2]=t[o>>2],t[l>>2]=t[_>>2],ih(e,Ts(0,d|0,n|0,r|0,lc(l)|0)|0),h=s}function YI(){var e=0;return c[8e3]|0||($I(10756),e=8e3,t[e>>2]=1,t[e+4>>2]=0),10756}function ih(e,n){e=e|0,n=n|0,_1(e,n)}function $I(e){e=e|0,Ao(e,KI()|0,2)}function KI(){return 1772}function XI(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0;l=h,h=h+32|0,y=l+16|0,k=l+12|0,d=l,_=ko(JI()|0)|0,r=fa(r)|0,t[k>>2]=t[o>>2],t[y>>2]=t[k>>2],o=lc(y)|0,t[d>>2]=t[s>>2],y=s+4|0,t[d+4>>2]=t[y>>2],k=s+8|0,t[d+8>>2]=t[k>>2],t[k>>2]=0,t[y>>2]=0,t[s>>2]=0,ih(e,Bu(0,_|0,n|0,r|0,o|0,R4(d)|0)|0),Rl(d),h=l}function JI(){var e=0;return c[8008]|0||(QI(10768),e=8008,t[e>>2]=1,t[e+4>>2]=0),10768}function QI(e){e=e|0,Ao(e,ZI()|0,3)}function ZI(){return 1784}function eP(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0;l=h,h=h+16|0,_=l+4|0,y=l,d=ko(tP()|0)|0,r=fa(r)|0,t[y>>2]=t[o>>2],t[_>>2]=t[y>>2],o=lc(_)|0,ih(e,Bu(0,d|0,n|0,r|0,o|0,L4(s)|0)|0),h=l}function tP(){var e=0;return c[8016]|0||(nP(10780),e=8016,t[e>>2]=1,t[e+4>>2]=0),10780}function nP(e){e=e|0,Ao(e,rP()|0,3)}function rP(){return 1800}function iP(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=ko(oP()|0)|0,ih(e,sf(0,o|0,n|0,fa(r)|0)|0)}function oP(){var e=0;return c[8024]|0||(uP(10792),e=8024,t[e>>2]=1,t[e+4>>2]=0),10792}function uP(e){e=e|0,Ao(e,sP()|0,1)}function sP(){return 1816}function lP(){fP(),cP(),aP()}function fP(){t[2702]=K8(65536)|0}function cP(){PP(10856)}function aP(){dP(10816)}function dP(e){e=e|0,pP(e,5044),hP(e)|0}function pP(e,n){e=e|0,n=n|0;var r=0;r=a8()|0,t[e>>2]=r,TP(r,n),Cf(t[e>>2]|0)}function hP(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,mP()|0),e|0}function mP(){var e=0;return c[8032]|0||(E8(10820),Bt(64,10820,Q|0)|0,e=8032,t[e>>2]=1,t[e+4>>2]=0),Dn(10820)|0||E8(10820),10820}function E8(e){e=e|0,_P(e),sc(e,25)}function vP(e){e=e|0,gP(e+24|0)}function gP(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function _P(e){e=e|0;var n=0;n=An()|0,Nn(e,5,18,n,EP()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function yP(e,n){e=e|0,n=n|0,wP(e,n)}function wP(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;r=h,h=h+16|0,o=r,s=r+4|0,Ml(s,n),t[o>>2]=Fl(s,n)|0,DP(e,o),h=r}function DP(e,n){e=e|0,n=n|0,S8(e+4|0,t[n>>2]|0),c[e+8>>0]=1}function S8(e,n){e=e|0,n=n|0,t[e>>2]=n}function EP(){return 1824}function SP(e){return e=e|0,CP(e)|0}function CP(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;return r=h,h=h+16|0,s=r+4|0,d=r,o=Qo(8)|0,n=o,_=Tt(4)|0,Ml(s,e),S8(_,Fl(s,e)|0),l=n+4|0,t[l>>2]=_,e=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],d8(e,l,s),t[o>>2]=e,h=r,n|0}function Qo(e){e=e|0;var n=0,r=0;return e=e+7&-8,(e>>>0<=32768?(n=t[2701]|0,e>>>0<=(65536-n|0)>>>0):0)?(r=(t[2702]|0)+n|0,t[2701]=n+e,e=r):(e=K8(e+8|0)|0,t[e>>2]=t[2703],t[2703]=e,e=e+8|0),e|0}function TP(e,n){e=e|0,n=n|0,t[e>>2]=xP()|0,t[e+4>>2]=kP()|0,t[e+12>>2]=n,t[e+8>>2]=AP()|0,t[e+32>>2]=9}function xP(){return 11744}function kP(){return 1832}function AP(){return th()|0}function OP(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(IP(r),Ve(r)):n|0&&Ve(n)}function IP(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function PP(e){e=e|0,MP(e,5052),FP(e)|0,LP(e,5058,26)|0,RP(e,5069,1)|0,NP(e,5077,10)|0,BP(e,5087,19)|0,jP(e,5094,27)|0}function MP(e,n){e=e|0,n=n|0;var r=0;r=IF()|0,t[e>>2]=r,PF(r,n),Cf(t[e>>2]|0)}function FP(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,vF()|0),e|0}function LP(e,n,r){return e=e|0,n=n|0,r=r|0,QM(e,Zn(n)|0,r,0),e|0}function RP(e,n,r){return e=e|0,n=n|0,r=r|0,BM(e,Zn(n)|0,r,0),e|0}function NP(e,n,r){return e=e|0,n=n|0,r=r|0,mM(e,Zn(n)|0,r,0),e|0}function BP(e,n,r){return e=e|0,n=n|0,r=r|0,eM(e,Zn(n)|0,r,0),e|0}function C8(e,n){e=e|0,n=n|0;var r=0,o=0;e:for(;;){for(r=t[2703]|0;;){if((r|0)==(n|0))break e;if(o=t[r>>2]|0,t[2703]=o,!r)r=o;else break}Ve(r)}t[2701]=e}function jP(e,n,r){return e=e|0,n=n|0,r=r|0,UP(e,Zn(n)|0,r,0),e|0}function UP(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=N4()|0,e=qP(r)|0,ur(l,n,s,e,zP(r,o)|0,o)}function N4(){var e=0,n=0;if(c[8040]|0||(x8(10860),Bt(65,10860,Q|0)|0,n=8040,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10860)|0)){e=10860,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));x8(10860)}return 10860}function qP(e){return e=e|0,e|0}function zP(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=N4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(T8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(WP(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function T8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function WP(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=HP(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,bP(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,T8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,GP(e,s),VP(s),h=_;return}}function HP(e){return e=e|0,536870911}function bP(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function GP(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function VP(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function x8(e){e=e|0,KP(e)}function YP(e){e=e|0,$P(e+24|0)}function $P(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function KP(e){e=e|0;var n=0;n=An()|0,Nn(e,1,11,n,XP()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function XP(){return 1840}function JP(e,n,r){e=e|0,n=n|0,r=r|0,ZP(t[(QP(e)|0)>>2]|0,n,r)}function QP(e){return e=e|0,(t[(N4()|0)+24>>2]|0)+(e<<3)|0}function ZP(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;o=h,h=h+16|0,l=o+1|0,s=o,Ml(l,n),n=Fl(l,n)|0,Ml(s,r),r=Fl(s,r)|0,Bl[e&31](n,r),h=o}function eM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=B4()|0,e=tM(r)|0,ur(l,n,s,e,nM(r,o)|0,o)}function B4(){var e=0,n=0;if(c[8048]|0||(A8(10896),Bt(66,10896,Q|0)|0,n=8048,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10896)|0)){e=10896,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));A8(10896)}return 10896}function tM(e){return e=e|0,e|0}function nM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=B4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(k8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(rM(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function k8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function rM(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=iM(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,oM(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,k8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,uM(e,s),sM(s),h=_;return}}function iM(e){return e=e|0,536870911}function oM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function uM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function sM(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function A8(e){e=e|0,cM(e)}function lM(e){e=e|0,fM(e+24|0)}function fM(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function cM(e){e=e|0;var n=0;n=An()|0,Nn(e,1,11,n,aM()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function aM(){return 1852}function dM(e,n){return e=e|0,n=n|0,hM(t[(pM(e)|0)>>2]|0,n)|0}function pM(e){return e=e|0,(t[(B4()|0)+24>>2]|0)+(e<<3)|0}function hM(e,n){e=e|0,n=n|0;var r=0,o=0;return r=h,h=h+16|0,o=r,Ml(o,n),n=Fl(o,n)|0,n=ea(dc[e&31](n)|0)|0,h=r,n|0}function mM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=j4()|0,e=vM(r)|0,ur(l,n,s,e,gM(r,o)|0,o)}function j4(){var e=0,n=0;if(c[8056]|0||(I8(10932),Bt(67,10932,Q|0)|0,n=8056,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10932)|0)){e=10932,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));I8(10932)}return 10932}function vM(e){return e=e|0,e|0}function gM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=j4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(O8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(_M(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function O8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function _M(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=yM(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,wM(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,O8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,DM(e,s),EM(s),h=_;return}}function yM(e){return e=e|0,536870911}function wM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function DM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function EM(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function I8(e){e=e|0,TM(e)}function SM(e){e=e|0,CM(e+24|0)}function CM(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function TM(e){e=e|0;var n=0;n=An()|0,Nn(e,1,7,n,xM()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function xM(){return 1860}function kM(e,n,r){return e=e|0,n=n|0,r=r|0,OM(t[(AM(e)|0)>>2]|0,n,r)|0}function AM(e){return e=e|0,(t[(j4()|0)+24>>2]|0)+(e<<3)|0}function OM(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0;return o=h,h=h+32|0,d=o+12|0,l=o+8|0,_=o,y=o+16|0,s=o+4|0,IM(y,n),PM(_,y,n),$s(s,r),r=Ks(s,r)|0,t[d>>2]=t[_>>2],X1[e&15](l,d,r),r=MM(l)|0,ei(l),Xs(s),h=o,r|0}function IM(e,n){e=e|0,n=n|0}function PM(e,n,r){e=e|0,n=n|0,r=r|0,FM(e,r)}function MM(e){return e=e|0,Oi(e)|0}function FM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;s=h,h=h+16|0,r=s,o=n,o&1?(LM(r,0),c0(o|0,r|0)|0,RM(e,r),NM(r)):t[e>>2]=t[n>>2],h=s}function LM(e,n){e=e|0,n=n|0,wd(e,n),t[e+4>>2]=0,c[e+8>>0]=0}function RM(e,n){e=e|0,n=n|0,t[e>>2]=t[n+4>>2]}function NM(e){e=e|0,c[e+8>>0]=0}function BM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=U4()|0,e=jM(r)|0,ur(l,n,s,e,UM(r,o)|0,o)}function U4(){var e=0,n=0;if(c[8064]|0||(M8(10968),Bt(68,10968,Q|0)|0,n=8064,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10968)|0)){e=10968,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));M8(10968)}return 10968}function jM(e){return e=e|0,e|0}function UM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=U4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(P8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(qM(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function P8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function qM(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=zM(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,WM(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,P8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,HM(e,s),bM(s),h=_;return}}function zM(e){return e=e|0,536870911}function WM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function HM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function bM(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function M8(e){e=e|0,YM(e)}function GM(e){e=e|0,VM(e+24|0)}function VM(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function YM(e){e=e|0;var n=0;n=An()|0,Nn(e,1,1,n,$M()|0,5),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function $M(){return 1872}function KM(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,JM(t[(XM(e)|0)>>2]|0,n,r,o,s,l)}function XM(e){return e=e|0,(t[(U4()|0)+24>>2]|0)+(e<<3)|0}function JM(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0;d=h,h=h+32|0,_=d+16|0,y=d+12|0,k=d+8|0,T=d+4|0,P=d,$s(_,n),n=Ks(_,n)|0,$s(y,r),r=Ks(y,r)|0,$s(k,o),o=Ks(k,o)|0,$s(T,s),s=Ks(T,s)|0,$s(P,l),l=Ks(P,l)|0,eD[e&1](n,r,o,s,l),Xs(P),Xs(T),Xs(k),Xs(y),Xs(_),h=d}function QM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=q4()|0,e=ZM(r)|0,ur(l,n,s,e,eF(r,o)|0,o)}function q4(){var e=0,n=0;if(c[8072]|0||(L8(11004),Bt(69,11004,Q|0)|0,n=8072,t[n>>2]=1,t[n+4>>2]=0),!(Dn(11004)|0)){e=11004,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));L8(11004)}return 11004}function ZM(e){return e=e|0,e|0}function eF(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=q4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(F8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(tF(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function F8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function tF(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=nF(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,rF(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,F8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,iF(e,s),oF(s),h=_;return}}function nF(e){return e=e|0,536870911}function rF(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function iF(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function oF(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function L8(e){e=e|0,lF(e)}function uF(e){e=e|0,sF(e+24|0)}function sF(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function lF(e){e=e|0;var n=0;n=An()|0,Nn(e,1,12,n,fF()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function fF(){return 1896}function cF(e,n,r){e=e|0,n=n|0,r=r|0,dF(t[(aF(e)|0)>>2]|0,n,r)}function aF(e){return e=e|0,(t[(q4()|0)+24>>2]|0)+(e<<3)|0}function dF(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;o=h,h=h+16|0,l=o+4|0,s=o,pF(l,n),n=hF(l,n)|0,$s(s,r),r=Ks(s,r)|0,Bl[e&31](n,r),Xs(s),h=o}function pF(e,n){e=e|0,n=n|0}function hF(e,n){return e=e|0,n=n|0,mF(n)|0}function mF(e){return e=e|0,e|0}function vF(){var e=0;return c[8080]|0||(R8(11040),Bt(70,11040,Q|0)|0,e=8080,t[e>>2]=1,t[e+4>>2]=0),Dn(11040)|0||R8(11040),11040}function R8(e){e=e|0,yF(e),sc(e,71)}function gF(e){e=e|0,_F(e+24|0)}function _F(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function yF(e){e=e|0;var n=0;n=An()|0,Nn(e,5,7,n,SF()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function wF(e){e=e|0,DF(e)}function DF(e){e=e|0,EF(e)}function EF(e){e=e|0,c[e+8>>0]=1}function SF(){return 1936}function CF(){return TF()|0}function TF(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0;return n=h,h=h+16|0,s=n+4|0,d=n,r=Qo(8)|0,e=r,l=e+4|0,t[l>>2]=Tt(1)|0,o=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],xF(o,l,s),t[r>>2]=o,h=n,e|0}function xF(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1916,t[r+12>>2]=n,t[e+4>>2]=r}function kF(e){e=e|0,da(e),Ve(e)}function AF(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function OF(e){e=e|0,Ve(e)}function IF(){var e=0;return c[8088]|0||(BF(11076),Bt(25,11076,Q|0)|0,e=8088,t[e>>2]=1,t[e+4>>2]=0),11076}function PF(e,n){e=e|0,n=n|0,t[e>>2]=MF()|0,t[e+4>>2]=FF()|0,t[e+12>>2]=n,t[e+8>>2]=LF()|0,t[e+32>>2]=10}function MF(){return 11745}function FF(){return 1940}function LF(){return eh()|0}function RF(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(NF(r),Ve(r)):n|0&&Ve(n)}function NF(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function BF(e){e=e|0,Ys(e)}function os(e,n){e=e|0,n=n|0,t[e>>2]=n}function z4(e){return e=e|0,t[e>>2]|0}function jF(e){return e=e|0,c[t[e>>2]>>0]|0}function UF(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,t[o>>2]=t[e>>2],qF(n,o)|0,h=r}function qF(e,n){e=e|0,n=n|0;var r=0;return r=zF(t[e>>2]|0,n)|0,n=e+4|0,t[(t[n>>2]|0)+8>>2]=r,t[(t[n>>2]|0)+8>>2]|0}function zF(e,n){e=e|0,n=n|0;var r=0,o=0;return r=h,h=h+16|0,o=r,Zo(o),e=Oi(e)|0,n=WF(e,t[n>>2]|0)|0,eu(o),h=r,n|0}function Zo(e){e=e|0,t[e>>2]=t[2701],t[e+4>>2]=t[2703]}function WF(e,n){e=e|0,n=n|0;var r=0;return r=ko(HF()|0)|0,sf(0,r|0,e|0,L4(n)|0)|0}function eu(e){e=e|0,C8(t[e>>2]|0,t[e+4>>2]|0)}function HF(){var e=0;return c[8096]|0||(bF(11120),e=8096,t[e>>2]=1,t[e+4>>2]=0),11120}function bF(e){e=e|0,Ao(e,GF()|0,1)}function GF(){return 1948}function VF(){YF()}function YF(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0;if(le=h,h=h+16|0,T=le+4|0,P=le,si(65536,10804,t[2702]|0,10812),r=o8()|0,n=t[r>>2]|0,e=t[n>>2]|0,e|0)for(o=t[r+8>>2]|0,r=t[r+4>>2]|0;As(e|0,C[r>>0]|0|0,c[o>>0]|0),n=n+4|0,e=t[n>>2]|0,e;)o=o+1|0,r=r+1|0;if(e=u8()|0,n=t[e>>2]|0,n|0)do uu(n|0,t[e+4>>2]|0),e=e+8|0,n=t[e>>2]|0;while((n|0)!=0);uu($F()|0,5167),k=sa()|0,e=t[k>>2]|0;e:do if(e|0){do KF(t[e+4>>2]|0),e=t[e>>2]|0;while((e|0)!=0);if(e=t[k>>2]|0,e|0){y=k;do{for(;s=e,e=t[e>>2]|0,s=t[s+4>>2]|0,!!(XF(s)|0);)if(t[P>>2]=y,t[T>>2]=t[P>>2],JF(k,T)|0,!e)break e;if(QF(s),y=t[y>>2]|0,n=N8(s)|0,l=Wo()|0,d=h,h=h+((1*(n<<2)|0)+15&-16)|0,_=h,h=h+((1*(n<<2)|0)+15&-16)|0,n=t[(_8(s)|0)>>2]|0,n|0)for(r=d,o=_;t[r>>2]=t[(la(t[n+4>>2]|0)|0)>>2],t[o>>2]=t[n+8>>2],n=t[n>>2]|0,n;)r=r+4|0,o=o+4|0;ie=la(s)|0,n=ZF(s)|0,r=N8(s)|0,o=eL(s)|0,Is(ie|0,n|0,d|0,_|0,r|0,o|0,A4(s)|0),b0(l|0)}while((e|0)!=0)}}while(0);if(e=t[(O4()|0)>>2]|0,e|0)do ie=e+4|0,k=I4(ie)|0,s=V1(k)|0,l=b1(k)|0,d=(G1(k)|0)+1|0,_=oh(k)|0,y=B8(ie)|0,k=Dn(k)|0,T=nh(ie)|0,P=W4(ie)|0,zo(0,s|0,l|0,d|0,_|0,y|0,k|0,T|0,P|0,H4(ie)|0),e=t[e>>2]|0;while((e|0)!=0);e=t[(sa()|0)>>2]|0;e:do if(e|0){t:for(;;){if(n=t[e+4>>2]|0,n|0?(q=t[(la(n)|0)>>2]|0,we=t[(y8(n)|0)>>2]|0,we|0):0){r=we;do{n=r+4|0,o=I4(n)|0;n:do if(o|0)switch(Dn(o)|0){case 0:break t;case 4:case 3:case 2:{_=V1(o)|0,y=b1(o)|0,k=(G1(o)|0)+1|0,T=oh(o)|0,P=Dn(o)|0,ie=nh(n)|0,zo(q|0,_|0,y|0,k|0,T|0,0,P|0,ie|0,W4(n)|0,H4(n)|0);break n}case 1:{d=V1(o)|0,_=b1(o)|0,y=(G1(o)|0)+1|0,k=oh(o)|0,T=B8(n)|0,P=Dn(o)|0,ie=nh(n)|0,zo(q|0,d|0,_|0,y|0,k|0,T|0,P|0,ie|0,W4(n)|0,H4(n)|0);break n}case 5:{k=V1(o)|0,T=b1(o)|0,P=(G1(o)|0)+1|0,ie=oh(o)|0,zo(q|0,k|0,T|0,P|0,ie|0,tL(o)|0,Dn(o)|0,0,0,0);break n}default:break n}while(0);r=t[r>>2]|0}while((r|0)!=0)}if(e=t[e>>2]|0,!e)break e}_n()}while(0);uf(),h=le}function $F(){return 11703}function KF(e){e=e|0,c[e+40>>0]=0}function XF(e){return e=e|0,(c[e+40>>0]|0)!=0|0}function JF(e,n){return e=e|0,n=n|0,n=nL(n)|0,e=t[n>>2]|0,t[n>>2]=t[e>>2],Ve(e),t[n>>2]|0}function QF(e){e=e|0,c[e+40>>0]=1}function N8(e){return e=e|0,t[e+20>>2]|0}function ZF(e){return e=e|0,t[e+8>>2]|0}function eL(e){return e=e|0,t[e+32>>2]|0}function oh(e){return e=e|0,t[e+4>>2]|0}function B8(e){return e=e|0,t[e+4>>2]|0}function W4(e){return e=e|0,t[e+8>>2]|0}function H4(e){return e=e|0,t[e+16>>2]|0}function tL(e){return e=e|0,t[e+20>>2]|0}function nL(e){return e=e|0,t[e>>2]|0}function uh(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0;vt=h,h=h+16|0,q=vt;do if(e>>>0<245){if(k=e>>>0<11?16:e+11&-8,e=k>>>3,P=t[2783]|0,r=P>>>e,r&3|0)return n=(r&1^1)+e|0,e=11172+(n<<1<<2)|0,r=e+8|0,o=t[r>>2]|0,s=o+8|0,l=t[s>>2]|0,(e|0)==(l|0)?t[2783]=P&~(1<>2]=e,t[r>>2]=l),_e=n<<3,t[o+4>>2]=_e|3,_e=o+_e+4|0,t[_e>>2]=t[_e>>2]|1,_e=s,h=vt,_e|0;if(T=t[2785]|0,k>>>0>T>>>0){if(r|0)return n=2<>>12&16,n=n>>>d,r=n>>>5&8,n=n>>>r,s=n>>>2&4,n=n>>>s,e=n>>>1&2,n=n>>>e,o=n>>>1&1,o=(r|d|s|e|o)+(n>>>o)|0,n=11172+(o<<1<<2)|0,e=n+8|0,s=t[e>>2]|0,d=s+8|0,r=t[d>>2]|0,(n|0)==(r|0)?(e=P&~(1<>2]=n,t[e>>2]=r,e=P),l=(o<<3)-k|0,t[s+4>>2]=k|3,o=s+k|0,t[o+4>>2]=l|1,t[o+l>>2]=l,T|0&&(s=t[2788]|0,n=T>>>3,r=11172+(n<<1<<2)|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=s,t[n+12>>2]=s,t[s+8>>2]=n,t[s+12>>2]=r),t[2785]=l,t[2788]=o,_e=d,h=vt,_e|0;if(_=t[2784]|0,_){if(r=(_&0-_)+-1|0,d=r>>>12&16,r=r>>>d,l=r>>>5&8,r=r>>>l,y=r>>>2&4,r=r>>>y,o=r>>>1&2,r=r>>>o,e=r>>>1&1,e=t[11436+((l|d|y|o|e)+(r>>>e)<<2)>>2]|0,r=(t[e+4>>2]&-8)-k|0,o=t[e+16+(((t[e+16>>2]|0)==0&1)<<2)>>2]|0,!o)y=e,l=r;else{do d=(t[o+4>>2]&-8)-k|0,y=d>>>0>>0,r=y?d:r,e=y?o:e,o=t[o+16+(((t[o+16>>2]|0)==0&1)<<2)>>2]|0;while((o|0)!=0);y=e,l=r}if(d=y+k|0,y>>>0>>0){s=t[y+24>>2]|0,n=t[y+12>>2]|0;do if((n|0)==(y|0)){if(e=y+20|0,n=t[e>>2]|0,!n&&(e=y+16|0,n=t[e>>2]|0,!n)){r=0;break}for(;;){if(r=n+20|0,o=t[r>>2]|0,o|0){n=o,e=r;continue}if(r=n+16|0,o=t[r>>2]|0,o)n=o,e=r;else break}t[e>>2]=0,r=n}else r=t[y+8>>2]|0,t[r+12>>2]=n,t[n+8>>2]=r,r=n;while(0);do if(s|0){if(n=t[y+28>>2]|0,e=11436+(n<<2)|0,(y|0)==(t[e>>2]|0)){if(t[e>>2]=r,!r){t[2784]=_&~(1<>2]|0)!=(y|0)&1)<<2)>>2]=r,!r)break;t[r+24>>2]=s,n=t[y+16>>2]|0,n|0&&(t[r+16>>2]=n,t[n+24>>2]=r),n=t[y+20>>2]|0,n|0&&(t[r+20>>2]=n,t[n+24>>2]=r)}while(0);return l>>>0<16?(_e=l+k|0,t[y+4>>2]=_e|3,_e=y+_e+4|0,t[_e>>2]=t[_e>>2]|1):(t[y+4>>2]=k|3,t[d+4>>2]=l|1,t[d+l>>2]=l,T|0&&(o=t[2788]|0,n=T>>>3,r=11172+(n<<1<<2)|0,n=1<>2]|0):(t[2783]=P|n,n=r,e=r+8|0),t[e>>2]=o,t[n+12>>2]=o,t[o+8>>2]=n,t[o+12>>2]=r),t[2785]=l,t[2788]=d),_e=y+8|0,h=vt,_e|0}else P=k}else P=k}else P=k}else if(e>>>0<=4294967231)if(e=e+11|0,k=e&-8,y=t[2784]|0,y){o=0-k|0,e=e>>>8,e?k>>>0>16777215?_=31:(P=(e+1048320|0)>>>16&8,pe=e<>>16&4,pe=pe<>>16&2,_=14-(T|P|_)+(pe<<_>>>15)|0,_=k>>>(_+7|0)&1|_<<1):_=0,r=t[11436+(_<<2)>>2]|0;e:do if(!r)r=0,e=0,pe=57;else for(e=0,d=k<<((_|0)==31?0:25-(_>>>1)|0),l=0;;){if(s=(t[r+4>>2]&-8)-k|0,s>>>0>>0)if(s)e=r,o=s;else{e=r,o=0,s=r,pe=61;break e}if(s=t[r+20>>2]|0,r=t[r+16+(d>>>31<<2)>>2]|0,l=(s|0)==0|(s|0)==(r|0)?l:s,s=(r|0)==0,s){r=l,pe=57;break}else d=d<<((s^1)&1)}while(0);if((pe|0)==57){if((r|0)==0&(e|0)==0){if(e=2<<_,e=y&(e|0-e),!e){P=k;break}P=(e&0-e)+-1|0,d=P>>>12&16,P=P>>>d,l=P>>>5&8,P=P>>>l,_=P>>>2&4,P=P>>>_,T=P>>>1&2,P=P>>>T,r=P>>>1&1,e=0,r=t[11436+((l|d|_|T|r)+(P>>>r)<<2)>>2]|0}r?(s=r,pe=61):(_=e,d=o)}if((pe|0)==61)for(;;)if(pe=0,r=(t[s+4>>2]&-8)-k|0,P=r>>>0>>0,r=P?r:o,e=P?s:e,s=t[s+16+(((t[s+16>>2]|0)==0&1)<<2)>>2]|0,s)o=r,pe=61;else{_=e,d=r;break}if((_|0)!=0?d>>>0<((t[2785]|0)-k|0)>>>0:0){if(l=_+k|0,_>>>0>=l>>>0)return _e=0,h=vt,_e|0;s=t[_+24>>2]|0,n=t[_+12>>2]|0;do if((n|0)==(_|0)){if(e=_+20|0,n=t[e>>2]|0,!n&&(e=_+16|0,n=t[e>>2]|0,!n)){n=0;break}for(;;){if(r=n+20|0,o=t[r>>2]|0,o|0){n=o,e=r;continue}if(r=n+16|0,o=t[r>>2]|0,o)n=o,e=r;else break}t[e>>2]=0}else _e=t[_+8>>2]|0,t[_e+12>>2]=n,t[n+8>>2]=_e;while(0);do if(s){if(e=t[_+28>>2]|0,r=11436+(e<<2)|0,(_|0)==(t[r>>2]|0)){if(t[r>>2]=n,!n){o=y&~(1<>2]|0)!=(_|0)&1)<<2)>>2]=n,!n){o=y;break}t[n+24>>2]=s,e=t[_+16>>2]|0,e|0&&(t[n+16>>2]=e,t[e+24>>2]=n),e=t[_+20>>2]|0,e&&(t[n+20>>2]=e,t[e+24>>2]=n),o=y}else o=y;while(0);do if(d>>>0>=16){if(t[_+4>>2]=k|3,t[l+4>>2]=d|1,t[l+d>>2]=d,n=d>>>3,d>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=l,t[n+12>>2]=l,t[l+8>>2]=n,t[l+12>>2]=r;break}if(n=d>>>8,n?d>>>0>16777215?n=31:(pe=(n+1048320|0)>>>16&8,_e=n<>>16&4,_e=_e<>>16&2,n=14-(qe|pe|n)+(_e<>>15)|0,n=d>>>(n+7|0)&1|n<<1):n=0,r=11436+(n<<2)|0,t[l+28>>2]=n,e=l+16|0,t[e+4>>2]=0,t[e>>2]=0,e=1<>2]=l,t[l+24>>2]=r,t[l+12>>2]=l,t[l+8>>2]=l;break}for(e=d<<((n|0)==31?0:25-(n>>>1)|0),r=t[r>>2]|0;;){if((t[r+4>>2]&-8|0)==(d|0)){pe=97;break}if(o=r+16+(e>>>31<<2)|0,n=t[o>>2]|0,n)e=e<<1,r=n;else{pe=96;break}}if((pe|0)==96){t[o>>2]=l,t[l+24>>2]=r,t[l+12>>2]=l,t[l+8>>2]=l;break}else if((pe|0)==97){pe=r+8|0,_e=t[pe>>2]|0,t[_e+12>>2]=l,t[pe>>2]=l,t[l+8>>2]=_e,t[l+12>>2]=r,t[l+24>>2]=0;break}}else _e=d+k|0,t[_+4>>2]=_e|3,_e=_+_e+4|0,t[_e>>2]=t[_e>>2]|1;while(0);return _e=_+8|0,h=vt,_e|0}else P=k}else P=k;else P=-1;while(0);if(r=t[2785]|0,r>>>0>=P>>>0)return n=r-P|0,e=t[2788]|0,n>>>0>15?(_e=e+P|0,t[2788]=_e,t[2785]=n,t[_e+4>>2]=n|1,t[_e+n>>2]=n,t[e+4>>2]=P|3):(t[2785]=0,t[2788]=0,t[e+4>>2]=r|3,_e=e+r+4|0,t[_e>>2]=t[_e>>2]|1),_e=e+8|0,h=vt,_e|0;if(d=t[2786]|0,d>>>0>P>>>0)return qe=d-P|0,t[2786]=qe,_e=t[2789]|0,pe=_e+P|0,t[2789]=pe,t[pe+4>>2]=qe|1,t[_e+4>>2]=P|3,_e=_e+8|0,h=vt,_e|0;if(t[2901]|0?e=t[2903]|0:(t[2903]=4096,t[2902]=4096,t[2904]=-1,t[2905]=-1,t[2906]=0,t[2894]=0,e=q&-16^1431655768,t[q>>2]=e,t[2901]=e,e=4096),_=P+48|0,y=P+47|0,l=e+y|0,s=0-e|0,k=l&s,k>>>0<=P>>>0||(e=t[2893]|0,e|0?(T=t[2891]|0,q=T+k|0,q>>>0<=T>>>0|q>>>0>e>>>0):0))return _e=0,h=vt,_e|0;e:do if(t[2894]&4)n=0,pe=133;else{r=t[2789]|0;t:do if(r){for(o=11580;e=t[o>>2]|0,!(e>>>0<=r>>>0?(ie=o+4|0,(e+(t[ie>>2]|0)|0)>>>0>r>>>0):0);)if(e=t[o+8>>2]|0,e)o=e;else{pe=118;break t}if(n=l-d&s,n>>>0<2147483647)if(e=xf(n|0)|0,(e|0)==((t[o>>2]|0)+(t[ie>>2]|0)|0)){if((e|0)!=(-1|0)){d=n,l=e,pe=135;break e}}else o=e,pe=126;else n=0}else pe=118;while(0);do if((pe|0)==118)if(r=xf(0)|0,(r|0)!=(-1|0)?(n=r,we=t[2902]|0,le=we+-1|0,n=((le&n|0)==0?0:(le+n&0-we)-n|0)+k|0,we=t[2891]|0,le=n+we|0,n>>>0>P>>>0&n>>>0<2147483647):0){if(ie=t[2893]|0,ie|0?le>>>0<=we>>>0|le>>>0>ie>>>0:0){n=0;break}if(e=xf(n|0)|0,(e|0)==(r|0)){d=n,l=r,pe=135;break e}else o=e,pe=126}else n=0;while(0);do if((pe|0)==126){if(r=0-n|0,!(_>>>0>n>>>0&(n>>>0<2147483647&(o|0)!=(-1|0))))if((o|0)==(-1|0)){n=0;break}else{d=n,l=o,pe=135;break e}if(e=t[2903]|0,e=y-n+e&0-e,e>>>0>=2147483647){d=n,l=o,pe=135;break e}if((xf(e|0)|0)==(-1|0)){xf(r|0)|0,n=0;break}else{d=e+n|0,l=o,pe=135;break e}}while(0);t[2894]=t[2894]|4,pe=133}while(0);if((((pe|0)==133?k>>>0<2147483647:0)?(qe=xf(k|0)|0,ie=xf(0)|0,Pe=ie-qe|0,ke=Pe>>>0>(P+40|0)>>>0,!((qe|0)==(-1|0)|ke^1|qe>>>0>>0&((qe|0)!=(-1|0)&(ie|0)!=(-1|0))^1)):0)&&(d=ke?Pe:n,l=qe,pe=135),(pe|0)==135){n=(t[2891]|0)+d|0,t[2891]=n,n>>>0>(t[2892]|0)>>>0&&(t[2892]=n),y=t[2789]|0;do if(y){for(n=11580;;){if(e=t[n>>2]|0,r=n+4|0,o=t[r>>2]|0,(l|0)==(e+o|0)){pe=145;break}if(s=t[n+8>>2]|0,s)n=s;else break}if(((pe|0)==145?(t[n+12>>2]&8|0)==0:0)?y>>>0>>0&y>>>0>=e>>>0:0){t[r>>2]=o+d,_e=y+8|0,_e=(_e&7|0)==0?0:0-_e&7,pe=y+_e|0,_e=(t[2786]|0)+(d-_e)|0,t[2789]=pe,t[2786]=_e,t[pe+4>>2]=_e|1,t[pe+_e+4>>2]=40,t[2790]=t[2905];break}for(l>>>0<(t[2787]|0)>>>0&&(t[2787]=l),r=l+d|0,n=11580;;){if((t[n>>2]|0)==(r|0)){pe=153;break}if(e=t[n+8>>2]|0,e)n=e;else break}if((pe|0)==153?(t[n+12>>2]&8|0)==0:0){t[n>>2]=l,T=n+4|0,t[T>>2]=(t[T>>2]|0)+d,T=l+8|0,T=l+((T&7|0)==0?0:0-T&7)|0,n=r+8|0,n=r+((n&7|0)==0?0:0-n&7)|0,k=T+P|0,_=n-T-P|0,t[T+4>>2]=P|3;do if((n|0)!=(y|0)){if((n|0)==(t[2788]|0)){_e=(t[2785]|0)+_|0,t[2785]=_e,t[2788]=k,t[k+4>>2]=_e|1,t[k+_e>>2]=_e;break}if(e=t[n+4>>2]|0,(e&3|0)==1){d=e&-8,o=e>>>3;e:do if(e>>>0<256)if(e=t[n+8>>2]|0,r=t[n+12>>2]|0,(r|0)==(e|0)){t[2783]=t[2783]&~(1<>2]=r,t[r+8>>2]=e;break}else{l=t[n+24>>2]|0,e=t[n+12>>2]|0;do if((e|0)==(n|0)){if(o=n+16|0,r=o+4|0,e=t[r>>2]|0,!e)if(e=t[o>>2]|0,e)r=o;else{e=0;break}for(;;){if(o=e+20|0,s=t[o>>2]|0,s|0){e=s,r=o;continue}if(o=e+16|0,s=t[o>>2]|0,s)e=s,r=o;else break}t[r>>2]=0}else _e=t[n+8>>2]|0,t[_e+12>>2]=e,t[e+8>>2]=_e;while(0);if(!l)break;r=t[n+28>>2]|0,o=11436+(r<<2)|0;do if((n|0)!=(t[o>>2]|0)){if(t[l+16+(((t[l+16>>2]|0)!=(n|0)&1)<<2)>>2]=e,!e)break e}else{if(t[o>>2]=e,e|0)break;t[2784]=t[2784]&~(1<>2]=l,r=n+16|0,o=t[r>>2]|0,o|0&&(t[e+16>>2]=o,t[o+24>>2]=e),r=t[r+4>>2]|0,!r)break;t[e+20>>2]=r,t[r+24>>2]=e}while(0);n=n+d|0,s=d+_|0}else s=_;if(n=n+4|0,t[n>>2]=t[n>>2]&-2,t[k+4>>2]=s|1,t[k+s>>2]=s,n=s>>>3,s>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=k,t[n+12>>2]=k,t[k+8>>2]=n,t[k+12>>2]=r;break}n=s>>>8;do if(!n)n=0;else{if(s>>>0>16777215){n=31;break}pe=(n+1048320|0)>>>16&8,_e=n<>>16&4,_e=_e<>>16&2,n=14-(qe|pe|n)+(_e<>>15)|0,n=s>>>(n+7|0)&1|n<<1}while(0);if(o=11436+(n<<2)|0,t[k+28>>2]=n,e=k+16|0,t[e+4>>2]=0,t[e>>2]=0,e=t[2784]|0,r=1<>2]=k,t[k+24>>2]=o,t[k+12>>2]=k,t[k+8>>2]=k;break}for(e=s<<((n|0)==31?0:25-(n>>>1)|0),r=t[o>>2]|0;;){if((t[r+4>>2]&-8|0)==(s|0)){pe=194;break}if(o=r+16+(e>>>31<<2)|0,n=t[o>>2]|0,n)e=e<<1,r=n;else{pe=193;break}}if((pe|0)==193){t[o>>2]=k,t[k+24>>2]=r,t[k+12>>2]=k,t[k+8>>2]=k;break}else if((pe|0)==194){pe=r+8|0,_e=t[pe>>2]|0,t[_e+12>>2]=k,t[pe>>2]=k,t[k+8>>2]=_e,t[k+12>>2]=r,t[k+24>>2]=0;break}}else _e=(t[2786]|0)+_|0,t[2786]=_e,t[2789]=k,t[k+4>>2]=_e|1;while(0);return _e=T+8|0,h=vt,_e|0}for(n=11580;e=t[n>>2]|0,!(e>>>0<=y>>>0?(_e=e+(t[n+4>>2]|0)|0,_e>>>0>y>>>0):0);)n=t[n+8>>2]|0;s=_e+-47|0,e=s+8|0,e=s+((e&7|0)==0?0:0-e&7)|0,s=y+16|0,e=e>>>0>>0?y:e,n=e+8|0,r=l+8|0,r=(r&7|0)==0?0:0-r&7,pe=l+r|0,r=d+-40-r|0,t[2789]=pe,t[2786]=r,t[pe+4>>2]=r|1,t[pe+r+4>>2]=40,t[2790]=t[2905],r=e+4|0,t[r>>2]=27,t[n>>2]=t[2895],t[n+4>>2]=t[2896],t[n+8>>2]=t[2897],t[n+12>>2]=t[2898],t[2895]=l,t[2896]=d,t[2898]=0,t[2897]=n,n=e+24|0;do pe=n,n=n+4|0,t[n>>2]=7;while((pe+8|0)>>>0<_e>>>0);if((e|0)!=(y|0)){if(l=e-y|0,t[r>>2]=t[r>>2]&-2,t[y+4>>2]=l|1,t[e>>2]=l,n=l>>>3,l>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=y,t[n+12>>2]=y,t[y+8>>2]=n,t[y+12>>2]=r;break}if(n=l>>>8,n?l>>>0>16777215?r=31:(pe=(n+1048320|0)>>>16&8,_e=n<>>16&4,_e=_e<>>16&2,r=14-(qe|pe|r)+(_e<>>15)|0,r=l>>>(r+7|0)&1|r<<1):r=0,o=11436+(r<<2)|0,t[y+28>>2]=r,t[y+20>>2]=0,t[s>>2]=0,n=t[2784]|0,e=1<>2]=y,t[y+24>>2]=o,t[y+12>>2]=y,t[y+8>>2]=y;break}for(e=l<<((r|0)==31?0:25-(r>>>1)|0),r=t[o>>2]|0;;){if((t[r+4>>2]&-8|0)==(l|0)){pe=216;break}if(o=r+16+(e>>>31<<2)|0,n=t[o>>2]|0,n)e=e<<1,r=n;else{pe=215;break}}if((pe|0)==215){t[o>>2]=y,t[y+24>>2]=r,t[y+12>>2]=y,t[y+8>>2]=y;break}else if((pe|0)==216){pe=r+8|0,_e=t[pe>>2]|0,t[_e+12>>2]=y,t[pe>>2]=y,t[y+8>>2]=_e,t[y+12>>2]=r,t[y+24>>2]=0;break}}}else{_e=t[2787]|0,(_e|0)==0|l>>>0<_e>>>0&&(t[2787]=l),t[2895]=l,t[2896]=d,t[2898]=0,t[2792]=t[2901],t[2791]=-1,n=0;do _e=11172+(n<<1<<2)|0,t[_e+12>>2]=_e,t[_e+8>>2]=_e,n=n+1|0;while((n|0)!=32);_e=l+8|0,_e=(_e&7|0)==0?0:0-_e&7,pe=l+_e|0,_e=d+-40-_e|0,t[2789]=pe,t[2786]=_e,t[pe+4>>2]=_e|1,t[pe+_e+4>>2]=40,t[2790]=t[2905]}while(0);if(n=t[2786]|0,n>>>0>P>>>0)return qe=n-P|0,t[2786]=qe,_e=t[2789]|0,pe=_e+P|0,t[2789]=pe,t[pe+4>>2]=qe|1,t[_e+4>>2]=P|3,_e=_e+8|0,h=vt,_e|0}return t[(ca()|0)>>2]=12,_e=0,h=vt,_e|0}function sh(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0;if(!!e){r=e+-8|0,s=t[2787]|0,e=t[e+-4>>2]|0,n=e&-8,y=r+n|0;do if(e&1)_=r,d=r;else{if(o=t[r>>2]|0,!(e&3)||(d=r+(0-o)|0,l=o+n|0,d>>>0>>0))return;if((d|0)==(t[2788]|0)){if(e=y+4|0,n=t[e>>2]|0,(n&3|0)!=3){_=d,n=l;break}t[2785]=l,t[e>>2]=n&-2,t[d+4>>2]=l|1,t[d+l>>2]=l;return}if(r=o>>>3,o>>>0<256)if(e=t[d+8>>2]|0,n=t[d+12>>2]|0,(n|0)==(e|0)){t[2783]=t[2783]&~(1<>2]=n,t[n+8>>2]=e,_=d,n=l;break}s=t[d+24>>2]|0,e=t[d+12>>2]|0;do if((e|0)==(d|0)){if(r=d+16|0,n=r+4|0,e=t[n>>2]|0,!e)if(e=t[r>>2]|0,e)n=r;else{e=0;break}for(;;){if(r=e+20|0,o=t[r>>2]|0,o|0){e=o,n=r;continue}if(r=e+16|0,o=t[r>>2]|0,o)e=o,n=r;else break}t[n>>2]=0}else _=t[d+8>>2]|0,t[_+12>>2]=e,t[e+8>>2]=_;while(0);if(s){if(n=t[d+28>>2]|0,r=11436+(n<<2)|0,(d|0)==(t[r>>2]|0)){if(t[r>>2]=e,!e){t[2784]=t[2784]&~(1<>2]|0)!=(d|0)&1)<<2)>>2]=e,!e){_=d,n=l;break}t[e+24>>2]=s,n=d+16|0,r=t[n>>2]|0,r|0&&(t[e+16>>2]=r,t[r+24>>2]=e),n=t[n+4>>2]|0,n?(t[e+20>>2]=n,t[n+24>>2]=e,_=d,n=l):(_=d,n=l)}else _=d,n=l}while(0);if(!(d>>>0>=y>>>0)&&(e=y+4|0,o=t[e>>2]|0,!!(o&1))){if(o&2)t[e>>2]=o&-2,t[_+4>>2]=n|1,t[d+n>>2]=n,s=n;else{if(e=t[2788]|0,(y|0)==(t[2789]|0)){if(y=(t[2786]|0)+n|0,t[2786]=y,t[2789]=_,t[_+4>>2]=y|1,(_|0)!=(e|0))return;t[2788]=0,t[2785]=0;return}if((y|0)==(e|0)){y=(t[2785]|0)+n|0,t[2785]=y,t[2788]=d,t[_+4>>2]=y|1,t[d+y>>2]=y;return}s=(o&-8)+n|0,r=o>>>3;do if(o>>>0<256)if(n=t[y+8>>2]|0,e=t[y+12>>2]|0,(e|0)==(n|0)){t[2783]=t[2783]&~(1<>2]=e,t[e+8>>2]=n;break}else{l=t[y+24>>2]|0,e=t[y+12>>2]|0;do if((e|0)==(y|0)){if(r=y+16|0,n=r+4|0,e=t[n>>2]|0,!e)if(e=t[r>>2]|0,e)n=r;else{r=0;break}for(;;){if(r=e+20|0,o=t[r>>2]|0,o|0){e=o,n=r;continue}if(r=e+16|0,o=t[r>>2]|0,o)e=o,n=r;else break}t[n>>2]=0,r=e}else r=t[y+8>>2]|0,t[r+12>>2]=e,t[e+8>>2]=r,r=e;while(0);if(l|0){if(e=t[y+28>>2]|0,n=11436+(e<<2)|0,(y|0)==(t[n>>2]|0)){if(t[n>>2]=r,!r){t[2784]=t[2784]&~(1<>2]|0)!=(y|0)&1)<<2)>>2]=r,!r)break;t[r+24>>2]=l,e=y+16|0,n=t[e>>2]|0,n|0&&(t[r+16>>2]=n,t[n+24>>2]=r),e=t[e+4>>2]|0,e|0&&(t[r+20>>2]=e,t[e+24>>2]=r)}}while(0);if(t[_+4>>2]=s|1,t[d+s>>2]=s,(_|0)==(t[2788]|0)){t[2785]=s;return}}if(e=s>>>3,s>>>0<256){r=11172+(e<<1<<2)|0,n=t[2783]|0,e=1<>2]|0):(t[2783]=n|e,e=r,n=r+8|0),t[n>>2]=_,t[e+12>>2]=_,t[_+8>>2]=e,t[_+12>>2]=r;return}e=s>>>8,e?s>>>0>16777215?e=31:(d=(e+1048320|0)>>>16&8,y=e<>>16&4,y=y<>>16&2,e=14-(l|d|e)+(y<>>15)|0,e=s>>>(e+7|0)&1|e<<1):e=0,o=11436+(e<<2)|0,t[_+28>>2]=e,t[_+20>>2]=0,t[_+16>>2]=0,n=t[2784]|0,r=1<>>1)|0),r=t[o>>2]|0;;){if((t[r+4>>2]&-8|0)==(s|0)){e=73;break}if(o=r+16+(n>>>31<<2)|0,e=t[o>>2]|0,e)n=n<<1,r=e;else{e=72;break}}if((e|0)==72){t[o>>2]=_,t[_+24>>2]=r,t[_+12>>2]=_,t[_+8>>2]=_;break}else if((e|0)==73){d=r+8|0,y=t[d>>2]|0,t[y+12>>2]=_,t[d>>2]=_,t[_+8>>2]=y,t[_+12>>2]=r,t[_+24>>2]=0;break}}else t[2784]=n|r,t[o>>2]=_,t[_+24>>2]=o,t[_+12>>2]=_,t[_+8>>2]=_;while(0);if(y=(t[2791]|0)+-1|0,t[2791]=y,!y)e=11588;else return;for(;e=t[e>>2]|0,e;)e=e+8|0;t[2791]=-1}}}function rL(){return 11628}function iL(e){e=e|0;var n=0,r=0;return n=h,h=h+16|0,r=n,t[r>>2]=sL(t[e+60>>2]|0)|0,e=lh(Ms(6,r|0)|0)|0,h=n,e|0}function j8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0;P=h,h=h+48|0,k=P+16|0,l=P,s=P+32|0,_=e+28|0,o=t[_>>2]|0,t[s>>2]=o,y=e+20|0,o=(t[y>>2]|0)-o|0,t[s+4>>2]=o,t[s+8>>2]=n,t[s+12>>2]=r,o=o+r|0,d=e+60|0,t[l>>2]=t[d>>2],t[l+4>>2]=s,t[l+8>>2]=2,l=lh(G0(146,l|0)|0)|0;e:do if((o|0)!=(l|0)){for(n=2;!((l|0)<0);)if(o=o-l|0,we=t[s+4>>2]|0,q=l>>>0>we>>>0,s=q?s+8|0:s,n=(q<<31>>31)+n|0,we=l-(q?we:0)|0,t[s>>2]=(t[s>>2]|0)+we,q=s+4|0,t[q>>2]=(t[q>>2]|0)-we,t[k>>2]=t[d>>2],t[k+4>>2]=s,t[k+8>>2]=n,l=lh(G0(146,k|0)|0)|0,(o|0)==(l|0)){T=3;break e}t[e+16>>2]=0,t[_>>2]=0,t[y>>2]=0,t[e>>2]=t[e>>2]|32,(n|0)==2?r=0:r=r-(t[s+4>>2]|0)|0}else T=3;while(0);return(T|0)==3&&(we=t[e+44>>2]|0,t[e+16>>2]=we+(t[e+48>>2]|0),t[_>>2]=we,t[y>>2]=we),h=P,r|0}function oL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;return s=h,h=h+32|0,l=s,o=s+20|0,t[l>>2]=t[e+60>>2],t[l+4>>2]=0,t[l+8>>2]=n,t[l+12>>2]=o,t[l+16>>2]=r,(lh(Uu(140,l|0)|0)|0)<0?(t[o>>2]=-1,e=-1):e=t[o>>2]|0,h=s,e|0}function lh(e){return e=e|0,e>>>0>4294963200&&(t[(ca()|0)>>2]=0-e,e=-1),e|0}function ca(){return(uL()|0)+64|0}function uL(){return b4()|0}function b4(){return 2084}function sL(e){return e=e|0,e|0}function lL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;return s=h,h=h+32|0,o=s,t[e+36>>2]=1,((t[e>>2]&64|0)==0?(t[o>>2]=t[e+60>>2],t[o+4>>2]=21523,t[o+8>>2]=s+16,su(54,o|0)|0):0)&&(c[e+75>>0]=-1),o=j8(e,n,r)|0,h=s,o|0}function U8(e,n){e=e|0,n=n|0;var r=0,o=0;if(r=c[e>>0]|0,o=c[n>>0]|0,r<<24>>24==0?1:r<<24>>24!=o<<24>>24)e=o;else{do e=e+1|0,n=n+1|0,r=c[e>>0]|0,o=c[n>>0]|0;while(!(r<<24>>24==0?1:r<<24>>24!=o<<24>>24));e=o}return(r&255)-(e&255)|0}function fL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;e:do if(!r)e=0;else{for(;o=c[e>>0]|0,s=c[n>>0]|0,o<<24>>24==s<<24>>24;)if(r=r+-1|0,r)e=e+1|0,n=n+1|0;else{e=0;break e}e=(o&255)-(s&255)|0}while(0);return e|0}function q8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0;ie=h,h=h+224|0,T=ie+120|0,P=ie+80|0,we=ie,le=ie+136|0,o=P,s=o+40|0;do t[o>>2]=0,o=o+4|0;while((o|0)<(s|0));return t[T>>2]=t[r>>2],(G4(0,n,T,we,P)|0)<0?r=-1:((t[e+76>>2]|0)>-1?q=cL(e)|0:q=0,r=t[e>>2]|0,k=r&32,(c[e+74>>0]|0)<1&&(t[e>>2]=r&-33),o=e+48|0,t[o>>2]|0?r=G4(e,n,T,we,P)|0:(s=e+44|0,l=t[s>>2]|0,t[s>>2]=le,d=e+28|0,t[d>>2]=le,_=e+20|0,t[_>>2]=le,t[o>>2]=80,y=e+16|0,t[y>>2]=le+80,r=G4(e,n,T,we,P)|0,l&&(dh[t[e+36>>2]&7](e,0,0)|0,r=(t[_>>2]|0)==0?-1:r,t[s>>2]=l,t[o>>2]=0,t[y>>2]=0,t[d>>2]=0,t[_>>2]=0)),o=t[e>>2]|0,t[e>>2]=o|k,q|0&&aL(e),r=(o&32|0)==0?r:-1),h=ie,r|0}function G4(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0;zt=h,h=h+64|0,Ht=zt+16|0,It=zt,vt=zt+24|0,gn=zt+8|0,Pn=zt+20|0,t[Ht>>2]=n,qe=(e|0)!=0,pe=vt+40|0,_e=pe,vt=vt+39|0,Ln=gn+4|0,d=0,l=0,T=0;e:for(;;){do if((l|0)>-1)if((d|0)>(2147483647-l|0)){t[(ca()|0)>>2]=75,l=-1;break}else{l=d+l|0;break}while(0);if(d=c[n>>0]|0,d<<24>>24)_=n;else{ke=87;break}t:for(;;){switch(d<<24>>24){case 37:{d=_,ke=9;break t}case 0:{d=_;break t}default:}Pe=_+1|0,t[Ht>>2]=Pe,d=c[Pe>>0]|0,_=Pe}t:do if((ke|0)==9)for(;;){if(ke=0,(c[_+1>>0]|0)!=37)break t;if(d=d+1|0,_=_+2|0,t[Ht>>2]=_,(c[_>>0]|0)==37)ke=9;else break}while(0);if(d=d-n|0,qe&&ri(e,n,d),d|0){n=_;continue}y=_+1|0,d=(c[y>>0]|0)+-48|0,d>>>0<10?(Pe=(c[_+2>>0]|0)==36,ie=Pe?d:-1,T=Pe?1:T,y=Pe?_+3|0:y):ie=-1,t[Ht>>2]=y,d=c[y>>0]|0,_=(d<<24>>24)+-32|0;t:do if(_>>>0<32)for(k=0,P=d;;){if(d=1<<_,!(d&75913)){d=P;break t}if(k=d|k,y=y+1|0,t[Ht>>2]=y,d=c[y>>0]|0,_=(d<<24>>24)+-32|0,_>>>0>=32)break;P=d}else k=0;while(0);if(d<<24>>24==42){if(_=y+1|0,d=(c[_>>0]|0)+-48|0,d>>>0<10?(c[y+2>>0]|0)==36:0)t[s+(d<<2)>>2]=10,d=t[o+((c[_>>0]|0)+-48<<3)>>2]|0,T=1,y=y+3|0;else{if(T|0){l=-1;break}qe?(T=(t[r>>2]|0)+(4-1)&~(4-1),d=t[T>>2]|0,t[r>>2]=T+4,T=0,y=_):(d=0,T=0,y=_)}t[Ht>>2]=y,Pe=(d|0)<0,d=Pe?0-d|0:d,k=Pe?k|8192:k}else{if(d=z8(Ht)|0,(d|0)<0){l=-1;break}y=t[Ht>>2]|0}do if((c[y>>0]|0)==46){if((c[y+1>>0]|0)!=42){t[Ht>>2]=y+1,_=z8(Ht)|0,y=t[Ht>>2]|0;break}if(P=y+2|0,_=(c[P>>0]|0)+-48|0,_>>>0<10?(c[y+3>>0]|0)==36:0){t[s+(_<<2)>>2]=10,_=t[o+((c[P>>0]|0)+-48<<3)>>2]|0,y=y+4|0,t[Ht>>2]=y;break}if(T|0){l=-1;break e}qe?(Pe=(t[r>>2]|0)+(4-1)&~(4-1),_=t[Pe>>2]|0,t[r>>2]=Pe+4):_=0,t[Ht>>2]=P,y=P}else _=-1;while(0);for(le=0;;){if(((c[y>>0]|0)+-65|0)>>>0>57){l=-1;break e}if(Pe=y+1|0,t[Ht>>2]=Pe,P=c[(c[y>>0]|0)+-65+(5178+(le*58|0))>>0]|0,q=P&255,(q+-1|0)>>>0<8)le=q,y=Pe;else break}if(!(P<<24>>24)){l=-1;break}we=(ie|0)>-1;do if(P<<24>>24==19)if(we){l=-1;break e}else ke=49;else{if(we){t[s+(ie<<2)>>2]=q,we=o+(ie<<3)|0,ie=t[we+4>>2]|0,ke=It,t[ke>>2]=t[we>>2],t[ke+4>>2]=ie,ke=49;break}if(!qe){l=0;break e}W8(It,q,r)}while(0);if((ke|0)==49?(ke=0,!qe):0){d=0,n=Pe;continue}y=c[y>>0]|0,y=(le|0)!=0&(y&15|0)==3?y&-33:y,we=k&-65537,ie=(k&8192|0)==0?k:we;t:do switch(y|0){case 110:switch((le&255)<<24>>24){case 0:{t[t[It>>2]>>2]=l,d=0,n=Pe;continue e}case 1:{t[t[It>>2]>>2]=l,d=0,n=Pe;continue e}case 2:{d=t[It>>2]|0,t[d>>2]=l,t[d+4>>2]=((l|0)<0)<<31>>31,d=0,n=Pe;continue e}case 3:{g[t[It>>2]>>1]=l,d=0,n=Pe;continue e}case 4:{c[t[It>>2]>>0]=l,d=0,n=Pe;continue e}case 6:{t[t[It>>2]>>2]=l,d=0,n=Pe;continue e}case 7:{d=t[It>>2]|0,t[d>>2]=l,t[d+4>>2]=((l|0)<0)<<31>>31,d=0,n=Pe;continue e}default:{d=0,n=Pe;continue e}}case 112:{y=120,_=_>>>0>8?_:8,n=ie|8,ke=61;break}case 88:case 120:{n=ie,ke=61;break}case 111:{y=It,n=t[y>>2]|0,y=t[y+4>>2]|0,q=pL(n,y,pe)|0,we=_e-q|0,k=0,P=5642,_=(ie&8|0)==0|(_|0)>(we|0)?_:we+1|0,we=ie,ke=67;break}case 105:case 100:if(y=It,n=t[y>>2]|0,y=t[y+4>>2]|0,(y|0)<0){n=fh(0,0,n|0,y|0)|0,y=be,k=It,t[k>>2]=n,t[k+4>>2]=y,k=1,P=5642,ke=66;break t}else{k=(ie&2049|0)!=0&1,P=(ie&2048|0)==0?(ie&1|0)==0?5642:5644:5643,ke=66;break t}case 117:{y=It,k=0,P=5642,n=t[y>>2]|0,y=t[y+4>>2]|0,ke=66;break}case 99:{c[vt>>0]=t[It>>2],n=vt,k=0,P=5642,q=pe,y=1,_=we;break}case 109:{y=hL(t[(ca()|0)>>2]|0)|0,ke=71;break}case 115:{y=t[It>>2]|0,y=y|0?y:5652,ke=71;break}case 67:{t[gn>>2]=t[It>>2],t[Ln>>2]=0,t[It>>2]=gn,q=-1,y=gn,ke=75;break}case 83:{n=t[It>>2]|0,_?(q=_,y=n,ke=75):(wi(e,32,d,0,ie),n=0,ke=84);break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{d=vL(e,+L[It>>3],d,_,ie,y)|0,n=Pe;continue e}default:k=0,P=5642,q=pe,y=_,_=ie}while(0);t:do if((ke|0)==61)ie=It,le=t[ie>>2]|0,ie=t[ie+4>>2]|0,q=dL(le,ie,pe,y&32)|0,P=(n&8|0)==0|(le|0)==0&(ie|0)==0,k=P?0:2,P=P?5642:5642+(y>>4)|0,we=n,n=le,y=ie,ke=67;else if((ke|0)==66)q=aa(n,y,pe)|0,we=ie,ke=67;else if((ke|0)==71)ke=0,ie=mL(y,0,_)|0,le=(ie|0)==0,n=y,k=0,P=5642,q=le?y+_|0:ie,y=le?_:ie-y|0,_=we;else if((ke|0)==75){for(ke=0,P=y,n=0,_=0;k=t[P>>2]|0,!(!k||(_=H8(Pn,k)|0,(_|0)<0|_>>>0>(q-n|0)>>>0));)if(n=_+n|0,q>>>0>n>>>0)P=P+4|0;else break;if((_|0)<0){l=-1;break e}if(wi(e,32,d,n,ie),!n)n=0,ke=84;else for(k=0;;){if(_=t[y>>2]|0,!_){ke=84;break t}if(_=H8(Pn,_)|0,k=_+k|0,(k|0)>(n|0)){ke=84;break t}if(ri(e,Pn,_),k>>>0>=n>>>0){ke=84;break}else y=y+4|0}}while(0);if((ke|0)==67)ke=0,y=(n|0)!=0|(y|0)!=0,ie=(_|0)!=0|y,y=((y^1)&1)+(_e-q)|0,n=ie?q:pe,q=pe,y=ie?(_|0)>(y|0)?_:y:_,_=(_|0)>-1?we&-65537:we;else if((ke|0)==84){ke=0,wi(e,32,d,n,ie^8192),d=(d|0)>(n|0)?d:n,n=Pe;continue}le=q-n|0,we=(y|0)<(le|0)?le:y,ie=we+k|0,d=(d|0)<(ie|0)?ie:d,wi(e,32,d,ie,_),ri(e,P,k),wi(e,48,d,ie,_^65536),wi(e,48,we,le,0),ri(e,n,le),wi(e,32,d,ie,_^8192),n=Pe}e:do if((ke|0)==87&&!e)if(!T)l=0;else{for(l=1;n=t[s+(l<<2)>>2]|0,!!n;)if(W8(o+(l<<3)|0,n,r),l=l+1|0,(l|0)>=10){l=1;break e}for(;;){if(t[s+(l<<2)>>2]|0){l=-1;break e}if(l=l+1|0,(l|0)>=10){l=1;break}}}while(0);return h=zt,l|0}function cL(e){return e=e|0,0}function aL(e){e=e|0}function ri(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]&32||TL(n,r,e)|0}function z8(e){e=e|0;var n=0,r=0,o=0;if(r=t[e>>2]|0,o=(c[r>>0]|0)+-48|0,o>>>0<10){n=0;do n=o+(n*10|0)|0,r=r+1|0,t[e>>2]=r,o=(c[r>>0]|0)+-48|0;while(o>>>0<10)}else n=0;return n|0}function W8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;e:do if(n>>>0<=20)do switch(n|0){case 9:{o=(t[r>>2]|0)+(4-1)&~(4-1),n=t[o>>2]|0,t[r>>2]=o+4,t[e>>2]=n;break e}case 10:{o=(t[r>>2]|0)+(4-1)&~(4-1),n=t[o>>2]|0,t[r>>2]=o+4,o=e,t[o>>2]=n,t[o+4>>2]=((n|0)<0)<<31>>31;break e}case 11:{o=(t[r>>2]|0)+(4-1)&~(4-1),n=t[o>>2]|0,t[r>>2]=o+4,o=e,t[o>>2]=n,t[o+4>>2]=0;break e}case 12:{o=(t[r>>2]|0)+(8-1)&~(8-1),n=o,s=t[n>>2]|0,n=t[n+4>>2]|0,t[r>>2]=o+8,o=e,t[o>>2]=s,t[o+4>>2]=n;break e}case 13:{s=(t[r>>2]|0)+(4-1)&~(4-1),o=t[s>>2]|0,t[r>>2]=s+4,o=(o&65535)<<16>>16,s=e,t[s>>2]=o,t[s+4>>2]=((o|0)<0)<<31>>31;break e}case 14:{s=(t[r>>2]|0)+(4-1)&~(4-1),o=t[s>>2]|0,t[r>>2]=s+4,s=e,t[s>>2]=o&65535,t[s+4>>2]=0;break e}case 15:{s=(t[r>>2]|0)+(4-1)&~(4-1),o=t[s>>2]|0,t[r>>2]=s+4,o=(o&255)<<24>>24,s=e,t[s>>2]=o,t[s+4>>2]=((o|0)<0)<<31>>31;break e}case 16:{s=(t[r>>2]|0)+(4-1)&~(4-1),o=t[s>>2]|0,t[r>>2]=s+4,s=e,t[s>>2]=o&255,t[s+4>>2]=0;break e}case 17:{s=(t[r>>2]|0)+(8-1)&~(8-1),l=+L[s>>3],t[r>>2]=s+8,L[e>>3]=l;break e}case 18:{s=(t[r>>2]|0)+(8-1)&~(8-1),l=+L[s>>3],t[r>>2]=s+8,L[e>>3]=l;break e}default:break e}while(0);while(0)}function dL(e,n,r,o){if(e=e|0,n=n|0,r=r|0,o=o|0,!((e|0)==0&(n|0)==0))do r=r+-1|0,c[r>>0]=C[5694+(e&15)>>0]|0|o,e=ch(e|0,n|0,4)|0,n=be;while(!((e|0)==0&(n|0)==0));return r|0}function pL(e,n,r){if(e=e|0,n=n|0,r=r|0,!((e|0)==0&(n|0)==0))do r=r+-1|0,c[r>>0]=e&7|48,e=ch(e|0,n|0,3)|0,n=be;while(!((e|0)==0&(n|0)==0));return r|0}function aa(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;if(n>>>0>0|(n|0)==0&e>>>0>4294967295){for(;o=K4(e|0,n|0,10,0)|0,r=r+-1|0,c[r>>0]=o&255|48,o=e,e=$4(e|0,n|0,10,0)|0,n>>>0>9|(n|0)==9&o>>>0>4294967295;)n=be;n=e}else n=e;if(n)for(;r=r+-1|0,c[r>>0]=(n>>>0)%10|0|48,!(n>>>0<10);)n=(n>>>0)/10|0;return r|0}function hL(e){return e=e|0,DL(e,t[(wL()|0)+188>>2]|0)|0}function mL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;l=n&255,o=(r|0)!=0;e:do if(o&(e&3|0)!=0)for(s=n&255;;){if((c[e>>0]|0)==s<<24>>24){d=6;break e}if(e=e+1|0,r=r+-1|0,o=(r|0)!=0,!(o&(e&3|0)!=0)){d=5;break}}else d=5;while(0);(d|0)==5&&(o?d=6:r=0);e:do if((d|0)==6&&(s=n&255,(c[e>>0]|0)!=s<<24>>24)){o=Un(l,16843009)|0;t:do if(r>>>0>3){for(;l=t[e>>2]^o,!((l&-2139062144^-2139062144)&l+-16843009|0);)if(e=e+4|0,r=r+-4|0,r>>>0<=3){d=11;break t}}else d=11;while(0);if((d|0)==11&&!r){r=0;break}for(;;){if((c[e>>0]|0)==s<<24>>24)break e;if(e=e+1|0,r=r+-1|0,!r){r=0;break}}}while(0);return(r|0?e:0)|0}function wi(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0;if(d=h,h=h+256|0,l=d,(r|0)>(o|0)&(s&73728|0)==0){if(s=r-o|0,pa(l|0,n|0,(s>>>0<256?s:256)|0)|0,s>>>0>255){n=r-o|0;do ri(e,l,256),s=s+-256|0;while(s>>>0>255);s=n&255}ri(e,l,s)}h=d}function H8(e,n){return e=e|0,n=n|0,e?e=_L(e,n,0)|0:e=0,e|0}function vL(e,n,r,o,s,l){e=e|0,n=+n,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=0;Dr=h,h=h+560|0,y=Dr+8|0,Pe=Dr,zt=Dr+524|0,Pn=zt,k=Dr+512|0,t[Pe>>2]=0,gn=k+12|0,b8(n)|0,(be|0)<0?(n=-n,Ht=1,Ln=5659):(Ht=(s&2049|0)!=0&1,Ln=(s&2048|0)==0?(s&1|0)==0?5660:5665:5662),b8(n)|0,It=be&2146435072;do if(It>>>0<2146435072|(It|0)==2146435072&0<0){if(we=+gL(n,Pe)*2,d=we!=0,d&&(t[Pe>>2]=(t[Pe>>2]|0)+-1),qe=l|32,(qe|0)==97){le=l&32,q=(le|0)==0?Ln:Ln+9|0,P=Ht|2,d=12-o|0;do if(o>>>0>11|(d|0)==0)n=we;else{n=8;do d=d+-1|0,n=n*16;while((d|0)!=0);if((c[q>>0]|0)==45){n=-(n+(-we-n));break}else{n=we+n-n;break}}while(0);_=t[Pe>>2]|0,d=(_|0)<0?0-_|0:_,d=aa(d,((d|0)<0)<<31>>31,gn)|0,(d|0)==(gn|0)&&(d=k+11|0,c[d>>0]=48),c[d+-1>>0]=(_>>31&2)+43,T=d+-2|0,c[T>>0]=l+15,k=(o|0)<1,y=(s&8|0)==0,d=zt;do It=~~n,_=d+1|0,c[d>>0]=C[5694+It>>0]|le,n=(n-+(It|0))*16,((_-Pn|0)==1?!(y&(k&n==0)):0)?(c[_>>0]=46,d=d+2|0):d=_;while(n!=0);It=d-Pn|0,Pn=gn-T|0,gn=(o|0)!=0&(It+-2|0)<(o|0)?o+2|0:It,d=Pn+P+gn|0,wi(e,32,r,d,s),ri(e,q,P),wi(e,48,r,d,s^65536),ri(e,zt,It),wi(e,48,gn-It|0,0,0),ri(e,T,Pn),wi(e,32,r,d,s^8192);break}_=(o|0)<0?6:o,d?(d=(t[Pe>>2]|0)+-28|0,t[Pe>>2]=d,n=we*268435456):(n=we,d=t[Pe>>2]|0),It=(d|0)<0?y:y+288|0,y=It;do _e=~~n>>>0,t[y>>2]=_e,y=y+4|0,n=(n-+(_e>>>0))*1e9;while(n!=0);if((d|0)>0)for(k=It,P=y;;){if(T=(d|0)<29?d:29,d=P+-4|0,d>>>0>=k>>>0){y=0;do pe=X8(t[d>>2]|0,0,T|0)|0,pe=Y4(pe|0,be|0,y|0,0)|0,_e=be,ke=K4(pe|0,_e|0,1e9,0)|0,t[d>>2]=ke,y=$4(pe|0,_e|0,1e9,0)|0,d=d+-4|0;while(d>>>0>=k>>>0);y&&(k=k+-4|0,t[k>>2]=y)}for(y=P;!(y>>>0<=k>>>0);)if(d=y+-4|0,!(t[d>>2]|0))y=d;else break;if(d=(t[Pe>>2]|0)-T|0,t[Pe>>2]=d,(d|0)>0)P=y;else break}else k=It;if((d|0)<0){o=((_+25|0)/9|0)+1|0,ie=(qe|0)==102;do{if(le=0-d|0,le=(le|0)<9?le:9,k>>>0>>0){T=(1<>>le,q=0,d=k;do _e=t[d>>2]|0,t[d>>2]=(_e>>>le)+q,q=Un(_e&T,P)|0,d=d+4|0;while(d>>>0>>0);d=(t[k>>2]|0)==0?k+4|0:k,q?(t[y>>2]=q,k=d,d=y+4|0):(k=d,d=y)}else k=(t[k>>2]|0)==0?k+4|0:k,d=y;y=ie?It:k,y=(d-y>>2|0)>(o|0)?y+(o<<2)|0:d,d=(t[Pe>>2]|0)+le|0,t[Pe>>2]=d}while((d|0)<0);d=k,o=y}else d=k,o=y;if(_e=It,d>>>0>>0){if(y=(_e-d>>2)*9|0,T=t[d>>2]|0,T>>>0>=10){k=10;do k=k*10|0,y=y+1|0;while(T>>>0>=k>>>0)}}else y=0;if(ie=(qe|0)==103,ke=(_|0)!=0,k=_-((qe|0)!=102?y:0)+((ke&ie)<<31>>31)|0,(k|0)<(((o-_e>>2)*9|0)+-9|0)){if(k=k+9216|0,le=It+4+(((k|0)/9|0)+-1024<<2)|0,k=((k|0)%9|0)+1|0,(k|0)<9){T=10;do T=T*10|0,k=k+1|0;while((k|0)!=9)}else T=10;if(P=t[le>>2]|0,q=(P>>>0)%(T>>>0)|0,k=(le+4|0)==(o|0),k&(q|0)==0)k=le;else if(we=(((P>>>0)/(T>>>0)|0)&1|0)==0?9007199254740992:9007199254740994,pe=(T|0)/2|0,n=q>>>0>>0?.5:k&(q|0)==(pe|0)?1:1.5,Ht&&(pe=(c[Ln>>0]|0)==45,n=pe?-n:n,we=pe?-we:we),k=P-q|0,t[le>>2]=k,we+n!=we){if(pe=k+T|0,t[le>>2]=pe,pe>>>0>999999999)for(y=le;k=y+-4|0,t[y>>2]=0,k>>>0>>0&&(d=d+-4|0,t[d>>2]=0),pe=(t[k>>2]|0)+1|0,t[k>>2]=pe,pe>>>0>999999999;)y=k;else k=le;if(y=(_e-d>>2)*9|0,P=t[d>>2]|0,P>>>0>=10){T=10;do T=T*10|0,y=y+1|0;while(P>>>0>=T>>>0)}}else k=le;k=k+4|0,k=o>>>0>k>>>0?k:o,pe=d}else k=o,pe=d;for(qe=k;;){if(qe>>>0<=pe>>>0){Pe=0;break}if(d=qe+-4|0,!(t[d>>2]|0))qe=d;else{Pe=1;break}}o=0-y|0;do if(ie)if(d=((ke^1)&1)+_|0,(d|0)>(y|0)&(y|0)>-5?(T=l+-1|0,_=d+-1-y|0):(T=l+-2|0,_=d+-1|0),d=s&8,d)le=d;else{if(Pe?(vt=t[qe+-4>>2]|0,(vt|0)!=0):0)if((vt>>>0)%10|0)k=0;else{k=0,d=10;do d=d*10|0,k=k+1|0;while(!((vt>>>0)%(d>>>0)|0|0))}else k=9;if(d=((qe-_e>>2)*9|0)+-9|0,(T|32|0)==102){le=d-k|0,le=(le|0)>0?le:0,_=(_|0)<(le|0)?_:le,le=0;break}else{le=d+y-k|0,le=(le|0)>0?le:0,_=(_|0)<(le|0)?_:le,le=0;break}}else T=l,le=s&8;while(0);if(ie=_|le,P=(ie|0)!=0&1,q=(T|32|0)==102,q)ke=0,d=(y|0)>0?y:0;else{if(d=(y|0)<0?o:y,d=aa(d,((d|0)<0)<<31>>31,gn)|0,k=gn,(k-d|0)<2)do d=d+-1|0,c[d>>0]=48;while((k-d|0)<2);c[d+-1>>0]=(y>>31&2)+43,d=d+-2|0,c[d>>0]=T,ke=d,d=k-d|0}if(d=Ht+1+_+P+d|0,wi(e,32,r,d,s),ri(e,Ln,Ht),wi(e,48,r,d,s^65536),q){T=pe>>>0>It>>>0?It:pe,le=zt+9|0,P=le,q=zt+8|0,k=T;do{if(y=aa(t[k>>2]|0,0,le)|0,(k|0)==(T|0))(y|0)==(le|0)&&(c[q>>0]=48,y=q);else if(y>>>0>zt>>>0){pa(zt|0,48,y-Pn|0)|0;do y=y+-1|0;while(y>>>0>zt>>>0)}ri(e,y,P-y|0),k=k+4|0}while(k>>>0<=It>>>0);if(ie|0&&ri(e,5710,1),k>>>0>>0&(_|0)>0)for(;;){if(y=aa(t[k>>2]|0,0,le)|0,y>>>0>zt>>>0){pa(zt|0,48,y-Pn|0)|0;do y=y+-1|0;while(y>>>0>zt>>>0)}if(ri(e,y,(_|0)<9?_:9),k=k+4|0,y=_+-9|0,k>>>0>>0&(_|0)>9)_=y;else{_=y;break}}wi(e,48,_+9|0,9,0)}else{if(ie=Pe?qe:pe+4|0,(_|0)>-1){Pe=zt+9|0,le=(le|0)==0,o=Pe,P=0-Pn|0,q=zt+8|0,T=pe;do{y=aa(t[T>>2]|0,0,Pe)|0,(y|0)==(Pe|0)&&(c[q>>0]=48,y=q);do if((T|0)==(pe|0)){if(k=y+1|0,ri(e,y,1),le&(_|0)<1){y=k;break}ri(e,5710,1),y=k}else{if(y>>>0<=zt>>>0)break;pa(zt|0,48,y+P|0)|0;do y=y+-1|0;while(y>>>0>zt>>>0)}while(0);Pn=o-y|0,ri(e,y,(_|0)>(Pn|0)?Pn:_),_=_-Pn|0,T=T+4|0}while(T>>>0>>0&(_|0)>-1)}wi(e,48,_+18|0,18,0),ri(e,ke,gn-ke|0)}wi(e,32,r,d,s^8192)}else zt=(l&32|0)!=0,d=Ht+3|0,wi(e,32,r,d,s&-65537),ri(e,Ln,Ht),ri(e,n!=n|!1?zt?5686:5690:zt?5678:5682,3),wi(e,32,r,d,s^8192);while(0);return h=Dr,((d|0)<(r|0)?r:d)|0}function b8(e){e=+e;var n=0;return L[j>>3]=e,n=t[j>>2]|0,be=t[j+4>>2]|0,n|0}function gL(e,n){return e=+e,n=n|0,+ +G8(e,n)}function G8(e,n){e=+e,n=n|0;var r=0,o=0,s=0;switch(L[j>>3]=e,r=t[j>>2]|0,o=t[j+4>>2]|0,s=ch(r|0,o|0,52)|0,s&2047){case 0:{e!=0?(e=+G8(e*18446744073709552e3,n),r=(t[n>>2]|0)+-64|0):r=0,t[n>>2]=r;break}case 2047:break;default:t[n>>2]=(s&2047)+-1022,t[j>>2]=r,t[j+4>>2]=o&-2146435073|1071644672,e=+L[j>>3]}return+e}function _L(e,n,r){e=e|0,n=n|0,r=r|0;do if(e){if(n>>>0<128){c[e>>0]=n,e=1;break}if(!(t[t[(yL()|0)+188>>2]>>2]|0))if((n&-128|0)==57216){c[e>>0]=n,e=1;break}else{t[(ca()|0)>>2]=84,e=-1;break}if(n>>>0<2048){c[e>>0]=n>>>6|192,c[e+1>>0]=n&63|128,e=2;break}if(n>>>0<55296|(n&-8192|0)==57344){c[e>>0]=n>>>12|224,c[e+1>>0]=n>>>6&63|128,c[e+2>>0]=n&63|128,e=3;break}if((n+-65536|0)>>>0<1048576){c[e>>0]=n>>>18|240,c[e+1>>0]=n>>>12&63|128,c[e+2>>0]=n>>>6&63|128,c[e+3>>0]=n&63|128,e=4;break}else{t[(ca()|0)>>2]=84,e=-1;break}}else e=1;while(0);return e|0}function yL(){return b4()|0}function wL(){return b4()|0}function DL(e,n){e=e|0,n=n|0;var r=0,o=0;for(o=0;;){if((C[5712+o>>0]|0)==(e|0)){e=2;break}if(r=o+1|0,(r|0)==87){r=5800,o=87,e=5;break}else o=r}if((e|0)==2&&(o?(r=5800,e=5):r=5800),(e|0)==5)for(;;){do e=r,r=r+1|0;while((c[e>>0]|0)!=0);if(o=o+-1|0,o)e=5;else break}return EL(r,t[n+20>>2]|0)|0}function EL(e,n){return e=e|0,n=n|0,SL(e,n)|0}function SL(e,n){return e=e|0,n=n|0,n?n=CL(t[n>>2]|0,t[n+4>>2]|0,e)|0:n=0,(n|0?n:e)|0}function CL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;q=(t[e>>2]|0)+1794895138|0,l=fc(t[e+8>>2]|0,q)|0,o=fc(t[e+12>>2]|0,q)|0,s=fc(t[e+16>>2]|0,q)|0;e:do if((l>>>0>>2>>>0?(P=n-(l<<2)|0,o>>>0

>>0&s>>>0

>>0):0)?((s|o)&3|0)==0:0){for(P=o>>>2,T=s>>>2,k=0;;){if(_=l>>>1,y=k+_|0,d=y<<1,s=d+P|0,o=fc(t[e+(s<<2)>>2]|0,q)|0,s=fc(t[e+(s+1<<2)>>2]|0,q)|0,!(s>>>0>>0&o>>>0<(n-s|0)>>>0)){o=0;break e}if(c[e+(s+o)>>0]|0){o=0;break e}if(o=U8(r,e+s|0)|0,!o)break;if(o=(o|0)<0,(l|0)==1){o=0;break e}else k=o?k:y,l=o?_:l-_|0}o=d+T|0,s=fc(t[e+(o<<2)>>2]|0,q)|0,o=fc(t[e+(o+1<<2)>>2]|0,q)|0,o>>>0>>0&s>>>0<(n-o|0)>>>0?o=(c[e+(o+s)>>0]|0)==0?e+o|0:0:o=0}else o=0;while(0);return o|0}function fc(e,n){e=e|0,n=n|0;var r=0;return r=Z8(e|0)|0,((n|0)==0?e:r)|0}function TL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=r+16|0,s=t[o>>2]|0,s?l=5:xL(r)|0?o=0:(s=t[o>>2]|0,l=5);e:do if((l|0)==5){if(_=r+20|0,d=t[_>>2]|0,o=d,(s-d|0)>>>0>>0){o=dh[t[r+36>>2]&7](r,e,n)|0;break}t:do if((c[r+75>>0]|0)>-1){for(d=n;;){if(!d){l=0,s=e;break t}if(s=d+-1|0,(c[e+s>>0]|0)==10)break;d=s}if(o=dh[t[r+36>>2]&7](r,e,d)|0,o>>>0>>0)break e;l=d,s=e+d|0,n=n-d|0,o=t[_>>2]|0}else l=0,s=e;while(0);vn(o|0,s|0,n|0)|0,t[_>>2]=(t[_>>2]|0)+n,o=l+n|0}while(0);return o|0}function xL(e){e=e|0;var n=0,r=0;return n=e+74|0,r=c[n>>0]|0,c[n>>0]=r+255|r,n=t[e>>2]|0,n&8?(t[e>>2]=n|32,e=-1):(t[e+8>>2]=0,t[e+4>>2]=0,r=t[e+44>>2]|0,t[e+28>>2]=r,t[e+20>>2]=r,t[e+16>>2]=r+(t[e+48>>2]|0),e=0),e|0}function Ur(e,n){e=w(e),n=w(n);var r=0,o=0;r=V8(e)|0;do if((r&2147483647)>>>0<=2139095040){if(o=V8(n)|0,(o&2147483647)>>>0<=2139095040)if((o^r|0)<0){e=(r|0)<0?n:e;break}else{e=e>2]=e,t[j>>2]|0|0}function cc(e,n){e=w(e),n=w(n);var r=0,o=0;r=Y8(e)|0;do if((r&2147483647)>>>0<=2139095040){if(o=Y8(n)|0,(o&2147483647)>>>0<=2139095040)if((o^r|0)<0){e=(r|0)<0?e:n;break}else{e=e>2]=e,t[j>>2]|0|0}function V4(e,n){e=w(e),n=w(n);var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;l=(D[j>>2]=e,t[j>>2]|0),_=(D[j>>2]=n,t[j>>2]|0),r=l>>>23&255,d=_>>>23&255,y=l&-2147483648,s=_<<1;e:do if((s|0)!=0?!((r|0)==255|((kL(n)|0)&2147483647)>>>0>2139095040):0){if(o=l<<1,o>>>0<=s>>>0)return n=w(e*w(0)),w((o|0)==(s|0)?n:e);if(r)o=l&8388607|8388608;else{if(r=l<<9,(r|0)>-1){o=r,r=0;do r=r+-1|0,o=o<<1;while((o|0)>-1)}else r=0;o=l<<1-r}if(d)_=_&8388607|8388608;else{if(l=_<<9,(l|0)>-1){s=0;do s=s+-1|0,l=l<<1;while((l|0)>-1)}else s=0;d=s,_=_<<1-s}s=o-_|0,l=(s|0)>-1;t:do if((r|0)>(d|0)){for(;;){if(l)if(s)o=s;else break;if(o=o<<1,r=r+-1|0,s=o-_|0,l=(s|0)>-1,(r|0)<=(d|0))break t}n=w(e*w(0));break e}while(0);if(l)if(s)o=s;else{n=w(e*w(0));break}if(o>>>0<8388608)do o=o<<1,r=r+-1|0;while(o>>>0<8388608);(r|0)>0?r=o+-8388608|r<<23:r=o>>>(1-r|0),n=(t[j>>2]=r|y,w(D[j>>2]))}else k=3;while(0);return(k|0)==3&&(n=w(e*n),n=w(n/n)),w(n)}function kL(e){return e=w(e),D[j>>2]=e,t[j>>2]|0|0}function AL(e,n){return e=e|0,n=n|0,q8(t[582]|0,e,n)|0}function $n(e){e=e|0,_n()}function da(e){e=e|0}function OL(e,n){return e=e|0,n=n|0,0}function IL(e){return e=e|0,($8(e+4|0)|0)==-1?(Nl[t[(t[e>>2]|0)+8>>2]&127](e),e=1):e=0,e|0}function $8(e){e=e|0;var n=0;return n=t[e>>2]|0,t[e>>2]=n+-1,n+-1|0}function Tf(e){e=e|0,IL(e)|0&&PL(e)}function PL(e){e=e|0;var n=0;n=e+8|0,((t[n>>2]|0)!=0?($8(n)|0)!=-1:0)||Nl[t[(t[e>>2]|0)+16>>2]&127](e)}function Tt(e){e=e|0;var n=0;for(n=(e|0)==0?1:e;e=uh(n)|0,!(e|0);){if(e=FL()|0,!e){e=0;break}fD[e&0]()}return e|0}function K8(e){return e=e|0,Tt(e)|0}function Ve(e){e=e|0,sh(e)}function ML(e){e=e|0,(c[e+11>>0]|0)<0&&Ve(t[e>>2]|0)}function FL(){var e=0;return e=t[2923]|0,t[2923]=e+0,e|0}function LL(){}function fh(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,o=n-o-(r>>>0>e>>>0|0)>>>0,be=o,e-r>>>0|0|0}function Y4(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,r=e+r>>>0,be=n+o+(r>>>0>>0|0)>>>0,r|0|0}function pa(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;if(l=e+r|0,n=n&255,(r|0)>=67){for(;e&3;)c[e>>0]=n,e=e+1|0;for(o=l&-4|0,s=o-64|0,d=n|n<<8|n<<16|n<<24;(e|0)<=(s|0);)t[e>>2]=d,t[e+4>>2]=d,t[e+8>>2]=d,t[e+12>>2]=d,t[e+16>>2]=d,t[e+20>>2]=d,t[e+24>>2]=d,t[e+28>>2]=d,t[e+32>>2]=d,t[e+36>>2]=d,t[e+40>>2]=d,t[e+44>>2]=d,t[e+48>>2]=d,t[e+52>>2]=d,t[e+56>>2]=d,t[e+60>>2]=d,e=e+64|0;for(;(e|0)<(o|0);)t[e>>2]=d,e=e+4|0}for(;(e|0)<(l|0);)c[e>>0]=n,e=e+1|0;return l-r|0}function X8(e,n,r){return e=e|0,n=n|0,r=r|0,(r|0)<32?(be=n<>>32-r,e<>>r,e>>>r|(n&(1<>>r-32|0)}function vn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;if((r|0)>=8192)return wo(e|0,n|0,r|0)|0;if(l=e|0,s=e+r|0,(e&3)==(n&3)){for(;e&3;){if(!r)return l|0;c[e>>0]=c[n>>0]|0,e=e+1|0,n=n+1|0,r=r-1|0}for(r=s&-4|0,o=r-64|0;(e|0)<=(o|0);)t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2],t[e+16>>2]=t[n+16>>2],t[e+20>>2]=t[n+20>>2],t[e+24>>2]=t[n+24>>2],t[e+28>>2]=t[n+28>>2],t[e+32>>2]=t[n+32>>2],t[e+36>>2]=t[n+36>>2],t[e+40>>2]=t[n+40>>2],t[e+44>>2]=t[n+44>>2],t[e+48>>2]=t[n+48>>2],t[e+52>>2]=t[n+52>>2],t[e+56>>2]=t[n+56>>2],t[e+60>>2]=t[n+60>>2],e=e+64|0,n=n+64|0;for(;(e|0)<(r|0);)t[e>>2]=t[n>>2],e=e+4|0,n=n+4|0}else for(r=s-4|0;(e|0)<(r|0);)c[e>>0]=c[n>>0]|0,c[e+1>>0]=c[n+1>>0]|0,c[e+2>>0]=c[n+2>>0]|0,c[e+3>>0]=c[n+3>>0]|0,e=e+4|0,n=n+4|0;for(;(e|0)<(s|0);)c[e>>0]=c[n>>0]|0,e=e+1|0,n=n+1|0;return l|0}function J8(e){e=e|0;var n=0;return n=c[ce+(e&255)>>0]|0,(n|0)<8?n|0:(n=c[ce+(e>>8&255)>>0]|0,(n|0)<8?n+8|0:(n=c[ce+(e>>16&255)>>0]|0,(n|0)<8?n+16|0:(c[ce+(e>>>24)>>0]|0)+24|0))}function Q8(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0;if(T=e,y=n,k=y,d=r,q=o,_=q,!k)return l=(s|0)!=0,_?l?(t[s>>2]=e|0,t[s+4>>2]=n&0,q=0,s=0,be=q,s|0):(q=0,s=0,be=q,s|0):(l&&(t[s>>2]=(T>>>0)%(d>>>0),t[s+4>>2]=0),q=0,s=(T>>>0)/(d>>>0)>>>0,be=q,s|0);l=(_|0)==0;do if(d){if(!l){if(l=(cr(_|0)|0)-(cr(k|0)|0)|0,l>>>0<=31){P=l+1|0,_=31-l|0,n=l-31>>31,d=P,e=T>>>(P>>>0)&n|k<<_,n=k>>>(P>>>0)&n,l=0,_=T<<_;break}return s?(t[s>>2]=e|0,t[s+4>>2]=y|n&0,q=0,s=0,be=q,s|0):(q=0,s=0,be=q,s|0)}if(l=d-1|0,l&d|0){_=(cr(d|0)|0)+33-(cr(k|0)|0)|0,le=64-_|0,P=32-_|0,y=P>>31,we=_-32|0,n=we>>31,d=_,e=P-1>>31&k>>>(we>>>0)|(k<>>(_>>>0))&n,n=n&k>>>(_>>>0),l=T<>>(we>>>0))&y|T<>31;break}return s|0&&(t[s>>2]=l&T,t[s+4>>2]=0),(d|0)==1?(we=y|n&0,le=e|0|0,be=we,le|0):(le=J8(d|0)|0,we=k>>>(le>>>0)|0,le=k<<32-le|T>>>(le>>>0)|0,be=we,le|0)}else{if(l)return s|0&&(t[s>>2]=(k>>>0)%(d>>>0),t[s+4>>2]=0),we=0,le=(k>>>0)/(d>>>0)>>>0,be=we,le|0;if(!T)return s|0&&(t[s>>2]=0,t[s+4>>2]=(k>>>0)%(_>>>0)),we=0,le=(k>>>0)/(_>>>0)>>>0,be=we,le|0;if(l=_-1|0,!(l&_))return s|0&&(t[s>>2]=e|0,t[s+4>>2]=l&k|n&0),we=0,le=k>>>((J8(_|0)|0)>>>0),be=we,le|0;if(l=(cr(_|0)|0)-(cr(k|0)|0)|0,l>>>0<=30){n=l+1|0,_=31-l|0,d=n,e=k<<_|T>>>(n>>>0),n=k>>>(n>>>0),l=0,_=T<<_;break}return s?(t[s>>2]=e|0,t[s+4>>2]=y|n&0,we=0,le=0,be=we,le|0):(we=0,le=0,be=we,le|0)}while(0);if(!d)k=_,y=0,_=0;else{P=r|0|0,T=q|o&0,k=Y4(P|0,T|0,-1,-1)|0,r=be,y=_,_=0;do o=y,y=l>>>31|y<<1,l=_|l<<1,o=e<<1|o>>>31|0,q=e>>>31|n<<1|0,fh(k|0,r|0,o|0,q|0)|0,le=be,we=le>>31|((le|0)<0?-1:0)<<1,_=we&1,e=fh(o|0,q|0,we&P|0,(((le|0)<0?-1:0)>>31|((le|0)<0?-1:0)<<1)&T|0)|0,n=be,d=d-1|0;while((d|0)!=0);k=y,y=0}return d=0,s|0&&(t[s>>2]=e,t[s+4>>2]=n),we=(l|0)>>>31|(k|d)<<1|(d<<1|l>>>31)&0|y,le=(l<<1|0>>>31)&-2|_,be=we,le|0}function $4(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,Q8(e,n,r,o,0)|0}function xf(e){e=e|0;var n=0,r=0;return r=e+15&-16|0,n=t[N>>2]|0,e=n+r|0,(r|0)>0&(e|0)<(n|0)|(e|0)<0?(vr()|0,Os(12),-1):(t[N>>2]=e,((e|0)>(Xn()|0)?(Bn()|0)==0:0)?(t[N>>2]=n,Os(12),-1):n|0)}function Y1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;if((n|0)<(e|0)&(e|0)<(n+r|0)){for(o=e,n=n+r|0,e=e+r|0;(r|0)>0;)e=e-1|0,n=n-1|0,r=r-1|0,c[e>>0]=c[n>>0]|0;e=o}else vn(e,n,r)|0;return e|0}function K4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;return l=h,h=h+16|0,s=l|0,Q8(e,n,r,o,s)|0,h=l,be=t[s+4>>2]|0,t[s>>2]|0|0}function Z8(e){return e=e|0,(e&255)<<24|(e>>8&255)<<16|(e>>16&255)<<8|e>>>24|0}function RL(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,eD[e&1](n|0,r|0,o|0,s|0,l|0)}function NL(e,n,r){e=e|0,n=n|0,r=w(r),tD[e&1](n|0,w(r))}function BL(e,n,r){e=e|0,n=n|0,r=+r,nD[e&31](n|0,+r)}function jL(e,n,r,o){return e=e|0,n=n|0,r=w(r),o=w(o),w(rD[e&0](n|0,w(r),w(o)))}function UL(e,n){e=e|0,n=n|0,Nl[e&127](n|0)}function qL(e,n,r){e=e|0,n=n|0,r=r|0,Bl[e&31](n|0,r|0)}function zL(e,n){return e=e|0,n=n|0,dc[e&31](n|0)|0}function WL(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0,iD[e&1](n|0,+r,+o,s|0)}function HL(e,n,r,o){e=e|0,n=n|0,r=+r,o=+o,CR[e&1](n|0,+r,+o)}function bL(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,dh[e&7](n|0,r|0,o|0)|0}function VL(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,+TR[e&1](n|0,r|0,o|0)}function YL(e,n){return e=e|0,n=n|0,+oD[e&15](n|0)}function $L(e,n,r){return e=e|0,n=n|0,r=+r,xR[e&1](n|0,+r)|0}function KL(e,n,r){return e=e|0,n=n|0,r=r|0,J4[e&15](n|0,r|0)|0}function XL(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=+o,s=+s,l=l|0,kR[e&1](n|0,r|0,+o,+s,l|0)}function JL(e,n,r,o,s,l,d){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0,AR[e&1](n|0,r|0,o|0,s|0,l|0,d|0)}function QL(e,n,r){return e=e|0,n=n|0,r=r|0,+uD[e&7](n|0,r|0)}function ZL(e){return e=e|0,ph[e&7]()|0}function eR(e,n,r,o,s,l){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,sD[e&1](n|0,r|0,o|0,s|0,l|0)|0}function tR(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=+s,OR[e&1](n|0,r|0,o|0,+s)}function nR(e,n,r,o,s,l,d){e=e|0,n=n|0,r=r|0,o=w(o),s=s|0,l=w(l),d=d|0,lD[e&1](n|0,r|0,w(o),s|0,w(l),d|0)}function rR(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,X1[e&15](n|0,r|0,o|0)}function iR(e){e=e|0,fD[e&0]()}function oR(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o,cD[e&15](n|0,r|0,+o)}function uR(e,n,r){return e=e|0,n=+n,r=+r,IR[e&1](+n,+r)|0}function sR(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,Q4[e&15](n|0,r|0,o|0,s|0)}function lR(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,pt(0)}function fR(e,n){e=e|0,n=w(n),pt(1)}function Lo(e,n){e=e|0,n=+n,pt(2)}function cR(e,n,r){return e=e|0,n=w(n),r=w(r),pt(3),tt}function tn(e){e=e|0,pt(4)}function $1(e,n){e=e|0,n=n|0,pt(5)}function tu(e){return e=e|0,pt(6),0}function aR(e,n,r,o){e=e|0,n=+n,r=+r,o=o|0,pt(7)}function dR(e,n,r){e=e|0,n=+n,r=+r,pt(8)}function pR(e,n,r){return e=e|0,n=n|0,r=r|0,pt(9),0}function hR(e,n,r){return e=e|0,n=n|0,r=r|0,pt(10),0}function ac(e){return e=e|0,pt(11),0}function mR(e,n){return e=e|0,n=+n,pt(12),0}function K1(e,n){return e=e|0,n=n|0,pt(13),0}function vR(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0,pt(14)}function gR(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,pt(15)}function X4(e,n){return e=e|0,n=n|0,pt(16),0}function _R(){return pt(17),0}function yR(e,n,r,o,s){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,pt(18),0}function wR(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o,pt(19)}function DR(e,n,r,o,s,l){e=e|0,n=n|0,r=w(r),o=o|0,s=w(s),l=l|0,pt(20)}function ah(e,n,r){e=e|0,n=n|0,r=r|0,pt(21)}function ER(){pt(22)}function ha(e,n,r){e=e|0,n=n|0,r=+r,pt(23)}function SR(e,n){return e=+e,n=+n,pt(24),0}function ma(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,pt(25)}var eD=[lR,_I],tD=[fR,x0],nD=[Lo,Kf,Tl,xl,hf,xo,mf,Wa,Hs,mi,Xf,Rc,Jf,ao,$o,kl,Nc,Al,vf,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo],rD=[cR],Nl=[tn,da,Km,Xm,es,a_,d_,p_,YA,$A,KA,oI,uI,sI,kF,AF,OF,Sn,Oc,pf,ti,vi,Nm,Uc,r1,Hd,Pl,mv,Av,Kc,Jc,yp,Eg,na,Ug,Yg,u_,k_,q_,J_,a4,Ct,w9,U9,ex,hx,Ix,_0,s7,S7,W7,uk,Dk,Wk,Qk,tA,_A,DA,jA,JA,eO,gO,RO,d1,vP,YP,lM,SM,GM,uF,gF,wF,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn],Bl=[$1,ja,Ua,$f,gu,co,qa,Ws,za,Mc,Fc,Lc,po,Ce,ze,Et,on,sr,mn,Zf,gd,xd,H9,rx,ck,yP,HO,C8,$1,$1,$1,$1],dc=[tu,iL,Ba,m,b,ee,Ye,Ze,ut,In,jr,gi,Pm,Ha,Ya,Fx,Tk,wO,SP,Qo,tu,tu,tu,tu,tu,tu,tu,tu,tu,tu,tu,tu],iD=[aR,Sd],CR=[dR,zA],dh=[pR,j8,oL,lL,Gv,P_,a7,kM],TR=[hR,Op],oD=[ac,_i,Re,pr,Cd,ho,bs,$a,Td,qc,ac,ac,ac,ac,ac,ac],xR=[mR,Kk],J4=[K1,OL,vd,Vc,_v,ig,pg,f_,H_,_x,Xu,dM,K1,K1,K1,K1],kR=[vR,iv],AR=[gR,KM],uD=[X4,Hr,Ka,kd,Xa,Jg,X4,X4],ph=[_R,Ja,Z0,g0,oA,TA,iO,CF],sD=[yR,or],OR=[wR,m4],lD=[DR,Bc],X1=[ah,S,A0,Vn,ni,Mv,Tg,dn,C9,fo,zI,JP,cF,ah,ah,ah],fD=[ER],cD=[ha,Ic,vu,Pc,Qu,Qf,k0,v,W1,k7,Gk,ha,ha,ha,ha,ha],IR=[SR,GA],Q4=[ma,Fg,zx,V7,Lk,aA,PA,aO,qO,OP,RF,ma,ma,ma,ma,ma];return{_llvm_bswap_i32:Z8,dynCall_idd:uR,dynCall_i:ZL,_i64Subtract:fh,___udivdi3:$4,dynCall_vif:NL,setThrew:vl,dynCall_viii:rR,_bitshift64Lshr:ch,_bitshift64Shl:X8,dynCall_vi:UL,dynCall_viiddi:XL,dynCall_diii:VL,dynCall_iii:KL,_memset:pa,_sbrk:xf,_memcpy:vn,__GLOBAL__sub_I_Yoga_cpp:t0,dynCall_vii:qL,___uremdi3:K4,dynCall_vid:BL,stackAlloc:zi,_nbind_init:VF,getTempRet0:fu,dynCall_di:YL,dynCall_iid:$L,setTempRet0:gl,_i64Add:Y4,dynCall_fiff:jL,dynCall_iiii:bL,_emscripten_get_global_libc:rL,dynCall_viid:oR,dynCall_viiid:tR,dynCall_viififi:nR,dynCall_ii:zL,__GLOBAL__sub_I_Binding_cc:lP,dynCall_viiii:sR,dynCall_iiiiii:eR,stackSave:lu,dynCall_viiiii:RL,__GLOBAL__sub_I_nbind_cc:Gs,dynCall_vidd:HL,_free:sh,runPostSets:LL,dynCall_viiiiii:JL,establishStackSpace:O0,_memmove:Y1,stackRestore:Ho,_malloc:uh,__GLOBAL__sub_I_common_cc:AO,dynCall_viddi:WL,dynCall_dii:QL,dynCall_v:iR}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,getTempRet0=Module.getTempRet0=asm.getTempRet0,___udivdi3=Module.___udivdi3=asm.___udivdi3,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_memset=Module._memset=asm._memset,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,___uremdi3=Module.___uremdi3=asm.___uremdi3,_nbind_init=Module._nbind_init=asm._nbind_init,_i64Subtract=Module._i64Subtract=asm._i64Subtract,setTempRet0=Module.setTempRet0=asm.setTempRet0,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,__GLOBAL__sub_I_Yoga_cpp=Module.__GLOBAL__sub_I_Yoga_cpp=asm.__GLOBAL__sub_I_Yoga_cpp,__GLOBAL__sub_I_Binding_cc=Module.__GLOBAL__sub_I_Binding_cc=asm.__GLOBAL__sub_I_Binding_cc,stackSave=Module.stackSave=asm.stackSave,__GLOBAL__sub_I_nbind_cc=Module.__GLOBAL__sub_I_nbind_cc=asm.__GLOBAL__sub_I_nbind_cc,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,_memmove=Module._memmove=asm._memmove,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,__GLOBAL__sub_I_common_cc=Module.__GLOBAL__sub_I_common_cc=asm.__GLOBAL__sub_I_common_cc,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vif=Module.dynCall_vif=asm.dynCall_vif,dynCall_vid=Module.dynCall_vid=asm.dynCall_vid,dynCall_fiff=Module.dynCall_fiff=asm.dynCall_fiff,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viddi=Module.dynCall_viddi=asm.dynCall_viddi,dynCall_vidd=Module.dynCall_vidd=asm.dynCall_vidd,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_diii=Module.dynCall_diii=asm.dynCall_diii,dynCall_di=Module.dynCall_di=asm.dynCall_di,dynCall_iid=Module.dynCall_iid=asm.dynCall_iid,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiddi=Module.dynCall_viiddi=asm.dynCall_viiddi,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_dii=Module.dynCall_dii=asm.dynCall_dii,dynCall_i=Module.dynCall_i=asm.dynCall_i,dynCall_iiiiii=Module.dynCall_iiiiii=asm.dynCall_iiiiii,dynCall_viiid=Module.dynCall_viiid=asm.dynCall_viiid,dynCall_viififi=Module.dynCall_viififi=asm.dynCall_viififi,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viid=Module.dynCall_viid=asm.dynCall_viid,dynCall_idd=Module.dynCall_idd=asm.dynCall_idd,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii;Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm;function ExitStatus(i){this.name="ExitStatus",this.message="Program terminated with exit("+i+")",this.status=i}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function i(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=i)},Module.callMain=Module.callMain=function(u){u=u||[],ensureInitRuntime();var f=u.length+1;function c(){for(var x=0;x<4-1;x++)g.push(0)}var g=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];c();for(var t=0;t0||(preRun(),runDependencies>0)||Module.calledRun)return;function u(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(i),postRun()))}Module.setStatus?(Module.setStatus("Running..."),setTimeout(function(){setTimeout(function(){Module.setStatus("")},1),u()},1)):u()}Module.run=Module.run=run;function exit(i,u){u&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=i,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(i)),ENVIRONMENT_IS_NODE&&process.exit(i),Module.quit(i,new ExitStatus(i)))}Module.exit=Module.exit=exit;var abortDecorators=[];function abort(i){Module.onAbort&&Module.onAbort(i),i!==void 0?(Module.print(i),Module.printErr(i),i=JSON.stringify(i)):i="",ABORT=!0,EXITSTATUS=1;var u=` -If this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.`,f="abort("+i+") at "+stackTrace()+u;throw abortDecorators&&abortDecorators.forEach(function(c){f=c(f,i)}),f}if(Module.abort=Module.abort=abort,Module.preInit)for(typeof Module.preInit=="function"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()})});var hc=Me((hb,vE)=>{"use strict";var wN=hE(),DN=mE(),Py=!1,My=null;DN({},function(i,u){if(!Py){if(Py=!0,i)throw i;My=u}});if(!Py)throw new Error("Failed to load the yoga module - it needed to be loaded synchronously, but didn't");vE.exports=wN(My.bind,My.lib)});var _E=Me((mb,gE)=>{"use strict";gE.exports=({onlyFirst:i=!1}={})=>{let u=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(u,i?void 0:"g")}});var Fy=Me((vb,yE)=>{"use strict";var EN=_E();yE.exports=i=>typeof i=="string"?i.replace(EN(),""):i});var Ry=Me((gb,Ly)=>{"use strict";var wE=i=>Number.isNaN(i)?!1:i>=4352&&(i<=4447||i===9001||i===9002||11904<=i&&i<=12871&&i!==12351||12880<=i&&i<=19903||19968<=i&&i<=42182||43360<=i&&i<=43388||44032<=i&&i<=55203||63744<=i&&i<=64255||65040<=i&&i<=65049||65072<=i&&i<=65131||65281<=i&&i<=65376||65504<=i&&i<=65510||110592<=i&&i<=110593||127488<=i&&i<=127569||131072<=i&&i<=262141);Ly.exports=wE;Ly.exports.default=wE});var EE=Me((_b,DE)=>{"use strict";DE.exports=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g}});var Mh=Me((yb,Ny)=>{"use strict";var SN=Fy(),CN=Ry(),TN=EE(),SE=i=>{if(i=i.replace(TN()," "),typeof i!="string"||i.length===0)return 0;i=SN(i);let u=0;for(let f=0;f=127&&c<=159||c>=768&&c<=879||(c>65535&&f++,u+=CN(c)?2:1)}return u};Ny.exports=SE;Ny.exports.default=SE});var jy=Me((wb,By)=>{"use strict";var xN=Mh(),CE=i=>{let u=0;for(let f of i.split(` -`))u=Math.max(u,xN(f));return u};By.exports=CE;By.exports.default=CE});var TE=Me(a2=>{"use strict";var kN=a2&&a2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(a2,"__esModule",{value:!0});var AN=kN(jy()),Uy={};a2.default=i=>{if(i.length===0)return{width:0,height:0};if(Uy[i])return Uy[i];let u=AN.default(i),f=i.split(` -`).length;return Uy[i]={width:u,height:f},{width:u,height:f}}});var xE=Me(d2=>{"use strict";var ON=d2&&d2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(d2,"__esModule",{value:!0});var hr=ON(hc()),IN=(i,u)=>{"position"in u&&i.setPositionType(u.position==="absolute"?hr.default.POSITION_TYPE_ABSOLUTE:hr.default.POSITION_TYPE_RELATIVE)},PN=(i,u)=>{"marginLeft"in u&&i.setMargin(hr.default.EDGE_START,u.marginLeft||0),"marginRight"in u&&i.setMargin(hr.default.EDGE_END,u.marginRight||0),"marginTop"in u&&i.setMargin(hr.default.EDGE_TOP,u.marginTop||0),"marginBottom"in u&&i.setMargin(hr.default.EDGE_BOTTOM,u.marginBottom||0)},MN=(i,u)=>{"paddingLeft"in u&&i.setPadding(hr.default.EDGE_LEFT,u.paddingLeft||0),"paddingRight"in u&&i.setPadding(hr.default.EDGE_RIGHT,u.paddingRight||0),"paddingTop"in u&&i.setPadding(hr.default.EDGE_TOP,u.paddingTop||0),"paddingBottom"in u&&i.setPadding(hr.default.EDGE_BOTTOM,u.paddingBottom||0)},FN=(i,u)=>{var f;"flexGrow"in u&&i.setFlexGrow((f=u.flexGrow)!==null&&f!==void 0?f:0),"flexShrink"in u&&i.setFlexShrink(typeof u.flexShrink=="number"?u.flexShrink:1),"flexDirection"in u&&(u.flexDirection==="row"&&i.setFlexDirection(hr.default.FLEX_DIRECTION_ROW),u.flexDirection==="row-reverse"&&i.setFlexDirection(hr.default.FLEX_DIRECTION_ROW_REVERSE),u.flexDirection==="column"&&i.setFlexDirection(hr.default.FLEX_DIRECTION_COLUMN),u.flexDirection==="column-reverse"&&i.setFlexDirection(hr.default.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in u&&(typeof u.flexBasis=="number"?i.setFlexBasis(u.flexBasis):typeof u.flexBasis=="string"?i.setFlexBasisPercent(Number.parseInt(u.flexBasis,10)):i.setFlexBasis(NaN)),"alignItems"in u&&((u.alignItems==="stretch"||!u.alignItems)&&i.setAlignItems(hr.default.ALIGN_STRETCH),u.alignItems==="flex-start"&&i.setAlignItems(hr.default.ALIGN_FLEX_START),u.alignItems==="center"&&i.setAlignItems(hr.default.ALIGN_CENTER),u.alignItems==="flex-end"&&i.setAlignItems(hr.default.ALIGN_FLEX_END)),"alignSelf"in u&&((u.alignSelf==="auto"||!u.alignSelf)&&i.setAlignSelf(hr.default.ALIGN_AUTO),u.alignSelf==="flex-start"&&i.setAlignSelf(hr.default.ALIGN_FLEX_START),u.alignSelf==="center"&&i.setAlignSelf(hr.default.ALIGN_CENTER),u.alignSelf==="flex-end"&&i.setAlignSelf(hr.default.ALIGN_FLEX_END)),"justifyContent"in u&&((u.justifyContent==="flex-start"||!u.justifyContent)&&i.setJustifyContent(hr.default.JUSTIFY_FLEX_START),u.justifyContent==="center"&&i.setJustifyContent(hr.default.JUSTIFY_CENTER),u.justifyContent==="flex-end"&&i.setJustifyContent(hr.default.JUSTIFY_FLEX_END),u.justifyContent==="space-between"&&i.setJustifyContent(hr.default.JUSTIFY_SPACE_BETWEEN),u.justifyContent==="space-around"&&i.setJustifyContent(hr.default.JUSTIFY_SPACE_AROUND))},LN=(i,u)=>{var f,c;"width"in u&&(typeof u.width=="number"?i.setWidth(u.width):typeof u.width=="string"?i.setWidthPercent(Number.parseInt(u.width,10)):i.setWidthAuto()),"height"in u&&(typeof u.height=="number"?i.setHeight(u.height):typeof u.height=="string"?i.setHeightPercent(Number.parseInt(u.height,10)):i.setHeightAuto()),"minWidth"in u&&(typeof u.minWidth=="string"?i.setMinWidthPercent(Number.parseInt(u.minWidth,10)):i.setMinWidth((f=u.minWidth)!==null&&f!==void 0?f:0)),"minHeight"in u&&(typeof u.minHeight=="string"?i.setMinHeightPercent(Number.parseInt(u.minHeight,10)):i.setMinHeight((c=u.minHeight)!==null&&c!==void 0?c:0))},RN=(i,u)=>{"display"in u&&i.setDisplay(u.display==="flex"?hr.default.DISPLAY_FLEX:hr.default.DISPLAY_NONE)},NN=(i,u)=>{if("borderStyle"in u){let f=typeof u.borderStyle=="string"?1:0;i.setBorder(hr.default.EDGE_TOP,f),i.setBorder(hr.default.EDGE_BOTTOM,f),i.setBorder(hr.default.EDGE_LEFT,f),i.setBorder(hr.default.EDGE_RIGHT,f)}};d2.default=(i,u={})=>{IN(i,u),PN(i,u),MN(i,u),FN(i,u),LN(i,u),RN(i,u),NN(i,u)}});var AE=Me((Sb,kE)=>{"use strict";kE.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var qy=Me((Cb,OE)=>{var p2=AE(),IE={};for(let i of Object.keys(p2))IE[p2[i]]=i;var Xt={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};OE.exports=Xt;for(let i of Object.keys(Xt)){if(!("channels"in Xt[i]))throw new Error("missing channels property: "+i);if(!("labels"in Xt[i]))throw new Error("missing channel labels property: "+i);if(Xt[i].labels.length!==Xt[i].channels)throw new Error("channel and label counts mismatch: "+i);let{channels:u,labels:f}=Xt[i];delete Xt[i].channels,delete Xt[i].labels,Object.defineProperty(Xt[i],"channels",{value:u}),Object.defineProperty(Xt[i],"labels",{value:f})}Xt.rgb.hsl=function(i){let u=i[0]/255,f=i[1]/255,c=i[2]/255,g=Math.min(u,f,c),t=Math.max(u,f,c),C=t-g,A,x;t===g?A=0:u===t?A=(f-c)/C:f===t?A=2+(c-u)/C:c===t&&(A=4+(u-f)/C),A=Math.min(A*60,360),A<0&&(A+=360);let D=(g+t)/2;return t===g?x=0:D<=.5?x=C/(t+g):x=C/(2-t-g),[A,x*100,D*100]};Xt.rgb.hsv=function(i){let u,f,c,g,t,C=i[0]/255,A=i[1]/255,x=i[2]/255,D=Math.max(C,A,x),L=D-Math.min(C,A,x),N=function(j){return(D-j)/6/L+1/2};return L===0?(g=0,t=0):(t=L/D,u=N(C),f=N(A),c=N(x),C===D?g=c-f:A===D?g=1/3+u-c:x===D&&(g=2/3+f-u),g<0?g+=1:g>1&&(g-=1)),[g*360,t*100,D*100]};Xt.rgb.hwb=function(i){let u=i[0],f=i[1],c=i[2],g=Xt.rgb.hsl(i)[0],t=1/255*Math.min(u,Math.min(f,c));return c=1-1/255*Math.max(u,Math.max(f,c)),[g,t*100,c*100]};Xt.rgb.cmyk=function(i){let u=i[0]/255,f=i[1]/255,c=i[2]/255,g=Math.min(1-u,1-f,1-c),t=(1-u-g)/(1-g)||0,C=(1-f-g)/(1-g)||0,A=(1-c-g)/(1-g)||0;return[t*100,C*100,A*100,g*100]};function BN(i,u){return(i[0]-u[0])**2+(i[1]-u[1])**2+(i[2]-u[2])**2}Xt.rgb.keyword=function(i){let u=IE[i];if(u)return u;let f=Infinity,c;for(let g of Object.keys(p2)){let t=p2[g],C=BN(i,t);C.04045?((u+.055)/1.055)**2.4:u/12.92,f=f>.04045?((f+.055)/1.055)**2.4:f/12.92,c=c>.04045?((c+.055)/1.055)**2.4:c/12.92;let g=u*.4124+f*.3576+c*.1805,t=u*.2126+f*.7152+c*.0722,C=u*.0193+f*.1192+c*.9505;return[g*100,t*100,C*100]};Xt.rgb.lab=function(i){let u=Xt.rgb.xyz(i),f=u[0],c=u[1],g=u[2];f/=95.047,c/=100,g/=108.883,f=f>.008856?f**(1/3):7.787*f+16/116,c=c>.008856?c**(1/3):7.787*c+16/116,g=g>.008856?g**(1/3):7.787*g+16/116;let t=116*c-16,C=500*(f-c),A=200*(c-g);return[t,C,A]};Xt.hsl.rgb=function(i){let u=i[0]/360,f=i[1]/100,c=i[2]/100,g,t,C;if(f===0)return C=c*255,[C,C,C];c<.5?g=c*(1+f):g=c+f-c*f;let A=2*c-g,x=[0,0,0];for(let D=0;D<3;D++)t=u+1/3*-(D-1),t<0&&t++,t>1&&t--,6*t<1?C=A+(g-A)*6*t:2*t<1?C=g:3*t<2?C=A+(g-A)*(2/3-t)*6:C=A,x[D]=C*255;return x};Xt.hsl.hsv=function(i){let u=i[0],f=i[1]/100,c=i[2]/100,g=f,t=Math.max(c,.01);c*=2,f*=c<=1?c:2-c,g*=t<=1?t:2-t;let C=(c+f)/2,A=c===0?2*g/(t+g):2*f/(c+f);return[u,A*100,C*100]};Xt.hsv.rgb=function(i){let u=i[0]/60,f=i[1]/100,c=i[2]/100,g=Math.floor(u)%6,t=u-Math.floor(u),C=255*c*(1-f),A=255*c*(1-f*t),x=255*c*(1-f*(1-t));switch(c*=255,g){case 0:return[c,x,C];case 1:return[A,c,C];case 2:return[C,c,x];case 3:return[C,A,c];case 4:return[x,C,c];case 5:return[c,C,A]}};Xt.hsv.hsl=function(i){let u=i[0],f=i[1]/100,c=i[2]/100,g=Math.max(c,.01),t,C;C=(2-f)*c;let A=(2-f)*g;return t=f*g,t/=A<=1?A:2-A,t=t||0,C/=2,[u,t*100,C*100]};Xt.hwb.rgb=function(i){let u=i[0]/360,f=i[1]/100,c=i[2]/100,g=f+c,t;g>1&&(f/=g,c/=g);let C=Math.floor(6*u),A=1-c;t=6*u-C,(C&1)!=0&&(t=1-t);let x=f+t*(A-f),D,L,N;switch(C){default:case 6:case 0:D=A,L=x,N=f;break;case 1:D=x,L=A,N=f;break;case 2:D=f,L=A,N=x;break;case 3:D=f,L=x,N=A;break;case 4:D=x,L=f,N=A;break;case 5:D=A,L=f,N=x;break}return[D*255,L*255,N*255]};Xt.cmyk.rgb=function(i){let u=i[0]/100,f=i[1]/100,c=i[2]/100,g=i[3]/100,t=1-Math.min(1,u*(1-g)+g),C=1-Math.min(1,f*(1-g)+g),A=1-Math.min(1,c*(1-g)+g);return[t*255,C*255,A*255]};Xt.xyz.rgb=function(i){let u=i[0]/100,f=i[1]/100,c=i[2]/100,g,t,C;return g=u*3.2406+f*-1.5372+c*-.4986,t=u*-.9689+f*1.8758+c*.0415,C=u*.0557+f*-.204+c*1.057,g=g>.0031308?1.055*g**(1/2.4)-.055:g*12.92,t=t>.0031308?1.055*t**(1/2.4)-.055:t*12.92,C=C>.0031308?1.055*C**(1/2.4)-.055:C*12.92,g=Math.min(Math.max(0,g),1),t=Math.min(Math.max(0,t),1),C=Math.min(Math.max(0,C),1),[g*255,t*255,C*255]};Xt.xyz.lab=function(i){let u=i[0],f=i[1],c=i[2];u/=95.047,f/=100,c/=108.883,u=u>.008856?u**(1/3):7.787*u+16/116,f=f>.008856?f**(1/3):7.787*f+16/116,c=c>.008856?c**(1/3):7.787*c+16/116;let g=116*f-16,t=500*(u-f),C=200*(f-c);return[g,t,C]};Xt.lab.xyz=function(i){let u=i[0],f=i[1],c=i[2],g,t,C;t=(u+16)/116,g=f/500+t,C=t-c/200;let A=t**3,x=g**3,D=C**3;return t=A>.008856?A:(t-16/116)/7.787,g=x>.008856?x:(g-16/116)/7.787,C=D>.008856?D:(C-16/116)/7.787,g*=95.047,t*=100,C*=108.883,[g,t,C]};Xt.lab.lch=function(i){let u=i[0],f=i[1],c=i[2],g;g=Math.atan2(c,f)*360/2/Math.PI,g<0&&(g+=360);let C=Math.sqrt(f*f+c*c);return[u,C,g]};Xt.lch.lab=function(i){let u=i[0],f=i[1],g=i[2]/360*2*Math.PI,t=f*Math.cos(g),C=f*Math.sin(g);return[u,t,C]};Xt.rgb.ansi16=function(i,u=null){let[f,c,g]=i,t=u===null?Xt.rgb.hsv(i)[2]:u;if(t=Math.round(t/50),t===0)return 30;let C=30+(Math.round(g/255)<<2|Math.round(c/255)<<1|Math.round(f/255));return t===2&&(C+=60),C};Xt.hsv.ansi16=function(i){return Xt.rgb.ansi16(Xt.hsv.rgb(i),i[2])};Xt.rgb.ansi256=function(i){let u=i[0],f=i[1],c=i[2];return u===f&&f===c?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(f/255*5)+Math.round(c/255*5)};Xt.ansi16.rgb=function(i){let u=i%10;if(u===0||u===7)return i>50&&(u+=3.5),u=u/10.5*255,[u,u,u];let f=(~~(i>50)+1)*.5,c=(u&1)*f*255,g=(u>>1&1)*f*255,t=(u>>2&1)*f*255;return[c,g,t]};Xt.ansi256.rgb=function(i){if(i>=232){let t=(i-232)*10+8;return[t,t,t]}i-=16;let u,f=Math.floor(i/36)/5*255,c=Math.floor((u=i%36)/6)/5*255,g=u%6/5*255;return[f,c,g]};Xt.rgb.hex=function(i){let f=(((Math.round(i[0])&255)<<16)+((Math.round(i[1])&255)<<8)+(Math.round(i[2])&255)).toString(16).toUpperCase();return"000000".substring(f.length)+f};Xt.hex.rgb=function(i){let u=i.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!u)return[0,0,0];let f=u[0];u[0].length===3&&(f=f.split("").map(A=>A+A).join(""));let c=parseInt(f,16),g=c>>16&255,t=c>>8&255,C=c&255;return[g,t,C]};Xt.rgb.hcg=function(i){let u=i[0]/255,f=i[1]/255,c=i[2]/255,g=Math.max(Math.max(u,f),c),t=Math.min(Math.min(u,f),c),C=g-t,A,x;return C<1?A=t/(1-C):A=0,C<=0?x=0:g===u?x=(f-c)/C%6:g===f?x=2+(c-u)/C:x=4+(u-f)/C,x/=6,x%=1,[x*360,C*100,A*100]};Xt.hsl.hcg=function(i){let u=i[1]/100,f=i[2]/100,c=f<.5?2*u*f:2*u*(1-f),g=0;return c<1&&(g=(f-.5*c)/(1-c)),[i[0],c*100,g*100]};Xt.hsv.hcg=function(i){let u=i[1]/100,f=i[2]/100,c=u*f,g=0;return c<1&&(g=(f-c)/(1-c)),[i[0],c*100,g*100]};Xt.hcg.rgb=function(i){let u=i[0]/360,f=i[1]/100,c=i[2]/100;if(f===0)return[c*255,c*255,c*255];let g=[0,0,0],t=u%1*6,C=t%1,A=1-C,x=0;switch(Math.floor(t)){case 0:g[0]=1,g[1]=C,g[2]=0;break;case 1:g[0]=A,g[1]=1,g[2]=0;break;case 2:g[0]=0,g[1]=1,g[2]=C;break;case 3:g[0]=0,g[1]=A,g[2]=1;break;case 4:g[0]=C,g[1]=0,g[2]=1;break;default:g[0]=1,g[1]=0,g[2]=A}return x=(1-f)*c,[(f*g[0]+x)*255,(f*g[1]+x)*255,(f*g[2]+x)*255]};Xt.hcg.hsv=function(i){let u=i[1]/100,f=i[2]/100,c=u+f*(1-u),g=0;return c>0&&(g=u/c),[i[0],g*100,c*100]};Xt.hcg.hsl=function(i){let u=i[1]/100,c=i[2]/100*(1-u)+.5*u,g=0;return c>0&&c<.5?g=u/(2*c):c>=.5&&c<1&&(g=u/(2*(1-c))),[i[0],g*100,c*100]};Xt.hcg.hwb=function(i){let u=i[1]/100,f=i[2]/100,c=u+f*(1-u);return[i[0],(c-u)*100,(1-c)*100]};Xt.hwb.hcg=function(i){let u=i[1]/100,f=i[2]/100,c=1-f,g=c-u,t=0;return g<1&&(t=(c-g)/(1-g)),[i[0],g*100,t*100]};Xt.apple.rgb=function(i){return[i[0]/65535*255,i[1]/65535*255,i[2]/65535*255]};Xt.rgb.apple=function(i){return[i[0]/255*65535,i[1]/255*65535,i[2]/255*65535]};Xt.gray.rgb=function(i){return[i[0]/100*255,i[0]/100*255,i[0]/100*255]};Xt.gray.hsl=function(i){return[0,0,i[0]]};Xt.gray.hsv=Xt.gray.hsl;Xt.gray.hwb=function(i){return[0,100,i[0]]};Xt.gray.cmyk=function(i){return[0,0,0,i[0]]};Xt.gray.lab=function(i){return[i[0],0,0]};Xt.gray.hex=function(i){let u=Math.round(i[0]/100*255)&255,c=((u<<16)+(u<<8)+u).toString(16).toUpperCase();return"000000".substring(c.length)+c};Xt.rgb.gray=function(i){return[(i[0]+i[1]+i[2])/3/255*100]}});var ME=Me((Tb,PE)=>{var Fh=qy();function jN(){let i={},u=Object.keys(Fh);for(let f=u.length,c=0;c{var zy=qy(),WN=ME(),Ca={},HN=Object.keys(zy);function bN(i){let u=function(...f){let c=f[0];return c==null?c:(c.length>1&&(f=c),i(f))};return"conversion"in i&&(u.conversion=i.conversion),u}function GN(i){let u=function(...f){let c=f[0];if(c==null)return c;c.length>1&&(f=c);let g=i(f);if(typeof g=="object")for(let t=g.length,C=0;C{Ca[i]={},Object.defineProperty(Ca[i],"channels",{value:zy[i].channels}),Object.defineProperty(Ca[i],"labels",{value:zy[i].labels});let u=WN(i);Object.keys(u).forEach(c=>{let g=u[c];Ca[i][c]=GN(g),Ca[i][c].raw=bN(g)})});FE.exports=Ca});var Rh=Me((kb,RE)=>{"use strict";var NE=(i,u)=>(...f)=>`[${i(...f)+u}m`,BE=(i,u)=>(...f)=>{let c=i(...f);return`[${38+u};5;${c}m`},jE=(i,u)=>(...f)=>{let c=i(...f);return`[${38+u};2;${c[0]};${c[1]};${c[2]}m`},Lh=i=>i,UE=(i,u,f)=>[i,u,f],Ta=(i,u,f)=>{Object.defineProperty(i,u,{get:()=>{let c=f();return Object.defineProperty(i,u,{value:c,enumerable:!0,configurable:!0}),c},enumerable:!0,configurable:!0})},Wy,xa=(i,u,f,c)=>{Wy===void 0&&(Wy=LE());let g=c?10:0,t={};for(let[C,A]of Object.entries(Wy)){let x=C==="ansi16"?"ansi":C;C===u?t[x]=i(f,g):typeof A=="object"&&(t[x]=i(A[u],g))}return t};function VN(){let i=new Map,u={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};u.color.gray=u.color.blackBright,u.bgColor.bgGray=u.bgColor.bgBlackBright,u.color.grey=u.color.blackBright,u.bgColor.bgGrey=u.bgColor.bgBlackBright;for(let[f,c]of Object.entries(u)){for(let[g,t]of Object.entries(c))u[g]={open:`[${t[0]}m`,close:`[${t[1]}m`},c[g]=u[g],i.set(t[0],t[1]);Object.defineProperty(u,f,{value:c,enumerable:!1})}return Object.defineProperty(u,"codes",{value:i,enumerable:!1}),u.color.close="",u.bgColor.close="",Ta(u.color,"ansi",()=>xa(NE,"ansi16",Lh,!1)),Ta(u.color,"ansi256",()=>xa(BE,"ansi256",Lh,!1)),Ta(u.color,"ansi16m",()=>xa(jE,"rgb",UE,!1)),Ta(u.bgColor,"ansi",()=>xa(NE,"ansi16",Lh,!0)),Ta(u.bgColor,"ansi256",()=>xa(BE,"ansi256",Lh,!0)),Ta(u.bgColor,"ansi16m",()=>xa(jE,"rgb",UE,!0)),u}Object.defineProperty(RE,"exports",{enumerable:!0,get:VN})});var WE=Me((Ab,qE)=>{"use strict";var h2=Mh(),YN=Fy(),$N=Rh(),Hy=new Set(["","\x9B"]),KN=39,zE=i=>`${Hy.values().next().value}[${i}m`,XN=i=>i.split(" ").map(u=>h2(u)),by=(i,u,f)=>{let c=[...u],g=!1,t=h2(YN(i[i.length-1]));for(let[C,A]of c.entries()){let x=h2(A);if(t+x<=f?i[i.length-1]+=A:(i.push(A),t=0),Hy.has(A))g=!0;else if(g&&A==="m"){g=!1;continue}g||(t+=x,t===f&&C0&&i.length>1&&(i[i.length-2]+=i.pop())},JN=i=>{let u=i.split(" "),f=u.length;for(;f>0&&!(h2(u[f-1])>0);)f--;return f===u.length?i:u.slice(0,f).join(" ")+u.slice(f).join("")},QN=(i,u,f={})=>{if(f.trim!==!1&&i.trim()==="")return"";let c="",g="",t,C=XN(i),A=[""];for(let[x,D]of i.split(" ").entries()){f.trim!==!1&&(A[A.length-1]=A[A.length-1].trimLeft());let L=h2(A[A.length-1]);if(x!==0&&(L>=u&&(f.wordWrap===!1||f.trim===!1)&&(A.push(""),L=0),(L>0||f.trim===!1)&&(A[A.length-1]+=" ",L++)),f.hard&&C[x]>u){let N=u-L,j=1+Math.floor((C[x]-N-1)/u);Math.floor((C[x]-1)/u)u&&L>0&&C[x]>0){if(f.wordWrap===!1&&Lu&&f.wordWrap===!1){by(A,D,u);continue}A[A.length-1]+=D}f.trim!==!1&&(A=A.map(JN)),c=A.join(` -`);for(let[x,D]of[...c].entries()){if(g+=D,Hy.has(D)){let N=parseFloat(/\d[^m]*/.exec(c.slice(x,x+4)));t=N===KN?null:N}let L=$N.codes.get(Number(t));t&&L&&(c[x+1]===` -`?g+=zE(L):D===` -`&&(g+=zE(t)))}return g};qE.exports=(i,u,f)=>String(i).normalize().replace(/\r\n/g,` -`).split(` -`).map(c=>QN(c,u,f)).join(` -`)});var GE=Me((Ob,HE)=>{"use strict";var bE="[\uD800-\uDBFF][\uDC00-\uDFFF]",ZN=i=>i&&i.exact?new RegExp(`^${bE}$`):new RegExp(bE,"g");HE.exports=ZN});var Gy=Me((Ib,VE)=>{"use strict";var eB=Ry(),tB=GE(),YE=Rh(),$E=["","\x9B"],Nh=i=>`${$E[0]}[${i}m`,KE=(i,u,f)=>{let c=[];i=[...i];for(let g of i){let t=g;g.match(";")&&(g=g.split(";")[0][0]+"0");let C=YE.codes.get(parseInt(g,10));if(C){let A=i.indexOf(C.toString());A>=0?i.splice(A,1):c.push(Nh(u?C:t))}else if(u){c.push(Nh(0));break}else c.push(Nh(t))}if(u&&(c=c.filter((g,t)=>c.indexOf(g)===t),f!==void 0)){let g=Nh(YE.codes.get(parseInt(f,10)));c=c.reduce((t,C)=>C===g?[C,...t]:[...t,C],[])}return c.join("")};VE.exports=(i,u,f)=>{let c=[...i.normalize()],g=[];f=typeof f=="number"?f:c.length;let t=!1,C,A=0,x="";for(let[D,L]of c.entries()){let N=!1;if($E.includes(L)){let j=/\d[^m]*/.exec(i.slice(D,D+18));C=j&&j.length>0?j[0]:void 0,Au&&A<=f)x+=L;else if(A===u&&!t&&C!==void 0)x=KE(g);else if(A>=f){x+=KE(g,!0,C);break}}return x}});var JE=Me((Pb,XE)=>{"use strict";var Bf=Gy(),nB=Mh();function Bh(i,u,f){if(i.charAt(u)===" ")return u;for(let c=1;c<=3;c++)if(f){if(i.charAt(u+c)===" ")return u+c}else if(i.charAt(u-c)===" ")return u-c;return u}XE.exports=(i,u,f)=>{f=dt({position:"end",preferTruncationOnSpace:!1},f);let{position:c,space:g,preferTruncationOnSpace:t}=f,C="\u2026",A=1;if(typeof i!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof i}`);if(typeof u!="number")throw new TypeError(`Expected \`columns\` to be a number, got ${typeof u}`);if(u<1)return"";if(u===1)return C;let x=nB(i);if(x<=u)return i;if(c==="start"){if(t){let D=Bh(i,x-u+1,!0);return C+Bf(i,D,x).trim()}return g===!0&&(C+=" ",A=2),C+Bf(i,x-u+A,x)}if(c==="middle"){g===!0&&(C=" "+C+" ",A=3);let D=Math.floor(u/2);if(t){let L=Bh(i,D),N=Bh(i,x-(u-D)+1,!0);return Bf(i,0,L)+C+Bf(i,N,x).trim()}return Bf(i,0,D)+C+Bf(i,x-(u-D)+A,x)}if(c==="end"){if(t){let D=Bh(i,u-1);return Bf(i,0,D)+C}return g===!0&&(C=" "+C,A=2),Bf(i,0,u-A)+C}throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${c}`)}});var Yy=Me(m2=>{"use strict";var QE=m2&&m2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(m2,"__esModule",{value:!0});var rB=QE(WE()),iB=QE(JE()),Vy={};m2.default=(i,u,f)=>{let c=i+String(u)+String(f);if(Vy[c])return Vy[c];let g=i;if(f==="wrap"&&(g=rB.default(i,u,{trim:!1,hard:!0})),f.startsWith("truncate")){let t="end";f==="truncate-middle"&&(t="middle"),f==="truncate-start"&&(t="start"),g=iB.default(i,u,{position:t})}return Vy[c]=g,g}});var Ky=Me($y=>{"use strict";Object.defineProperty($y,"__esModule",{value:!0});var ZE=i=>{let u="";if(i.childNodes.length>0)for(let f of i.childNodes){let c="";f.nodeName==="#text"?c=f.nodeValue:((f.nodeName==="ink-text"||f.nodeName==="ink-virtual-text")&&(c=ZE(f)),c.length>0&&typeof f.internal_transform=="function"&&(c=f.internal_transform(c))),u+=c}return u};$y.default=ZE});var Xy=Me(Zr=>{"use strict";var v2=Zr&&Zr.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Zr,"__esModule",{value:!0});Zr.setTextNodeValue=Zr.createTextNode=Zr.setStyle=Zr.setAttribute=Zr.removeChildNode=Zr.insertBeforeNode=Zr.appendChildNode=Zr.createNode=Zr.TEXT_NAME=void 0;var oB=v2(hc()),e6=v2(TE()),uB=v2(xE()),sB=v2(Yy()),lB=v2(Ky());Zr.TEXT_NAME="#text";Zr.createNode=i=>{var u;let f={nodeName:i,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:i==="ink-virtual-text"?void 0:oB.default.Node.create()};return i==="ink-text"&&((u=f.yogaNode)===null||u===void 0||u.setMeasureFunc(fB.bind(null,f))),f};Zr.appendChildNode=(i,u)=>{var f;u.parentNode&&Zr.removeChildNode(u.parentNode,u),u.parentNode=i,i.childNodes.push(u),u.yogaNode&&((f=i.yogaNode)===null||f===void 0||f.insertChild(u.yogaNode,i.yogaNode.getChildCount())),(i.nodeName==="ink-text"||i.nodeName==="ink-virtual-text")&&jh(i)};Zr.insertBeforeNode=(i,u,f)=>{var c,g;u.parentNode&&Zr.removeChildNode(u.parentNode,u),u.parentNode=i;let t=i.childNodes.indexOf(f);if(t>=0){i.childNodes.splice(t,0,u),u.yogaNode&&((c=i.yogaNode)===null||c===void 0||c.insertChild(u.yogaNode,t));return}i.childNodes.push(u),u.yogaNode&&((g=i.yogaNode)===null||g===void 0||g.insertChild(u.yogaNode,i.yogaNode.getChildCount())),(i.nodeName==="ink-text"||i.nodeName==="ink-virtual-text")&&jh(i)};Zr.removeChildNode=(i,u)=>{var f,c;u.yogaNode&&((c=(f=u.parentNode)===null||f===void 0?void 0:f.yogaNode)===null||c===void 0||c.removeChild(u.yogaNode)),u.parentNode=null;let g=i.childNodes.indexOf(u);g>=0&&i.childNodes.splice(g,1),(i.nodeName==="ink-text"||i.nodeName==="ink-virtual-text")&&jh(i)};Zr.setAttribute=(i,u,f)=>{i.attributes[u]=f};Zr.setStyle=(i,u)=>{i.style=u,i.yogaNode&&uB.default(i.yogaNode,u)};Zr.createTextNode=i=>{let u={nodeName:"#text",nodeValue:i,yogaNode:void 0,parentNode:null,style:{}};return Zr.setTextNodeValue(u,i),u};var fB=function(i,u){var f,c;let g=i.nodeName==="#text"?i.nodeValue:lB.default(i),t=e6.default(g);if(t.width<=u||t.width>=1&&u>0&&u<1)return t;let C=(c=(f=i.style)===null||f===void 0?void 0:f.textWrap)!==null&&c!==void 0?c:"wrap",A=sB.default(g,u,C);return e6.default(A)},t6=i=>{var u;if(!(!i||!i.parentNode))return(u=i.yogaNode)!==null&&u!==void 0?u:t6(i.parentNode)},jh=i=>{let u=t6(i);u==null||u.markDirty()};Zr.setTextNodeValue=(i,u)=>{typeof u!="string"&&(u=String(u)),i.nodeValue=u,jh(i)}});var mc=Me((Rb,n6)=>{"use strict";n6.exports={BINARY_TYPES:["nodebuffer","arraybuffer","fragments"],GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),EMPTY_BUFFER:Buffer.alloc(0),NOOP:()=>{}}});var g2=Me((Nb,Jy)=>{"use strict";var{EMPTY_BUFFER:cB}=mc();function r6(i,u){if(i.length===0)return cB;if(i.length===1)return i[0];let f=Buffer.allocUnsafe(u),c=0;for(let g=0;g{"use strict";var l6=Symbol("kDone"),Qy=Symbol("kRun"),f6=class{constructor(u){this[l6]=()=>{this.pending--,this[Qy]()},this.concurrency=u||Infinity,this.jobs=[],this.pending=0}add(u){this.jobs.push(u),this[Qy]()}[Qy](){if(this.pending!==this.concurrency&&this.jobs.length){let u=this.jobs.shift();this.pending++,u(this[l6])}}};s6.exports=f6});var w2=Me((jb,a6)=>{"use strict";var _2=require("zlib"),d6=g2(),aB=c6(),{kStatusCode:p6,NOOP:dB}=mc(),pB=Buffer.from([0,0,255,255]),qh=Symbol("permessage-deflate"),Xl=Symbol("total-length"),y2=Symbol("callback"),jf=Symbol("buffers"),Zy=Symbol("error"),zh,h6=class{constructor(u,f,c){if(this._maxPayload=c|0,this._options=u||{},this._threshold=this._options.threshold!==void 0?this._options.threshold:1024,this._isServer=!!f,this._deflate=null,this._inflate=null,this.params=null,!zh){let g=this._options.concurrencyLimit!==void 0?this._options.concurrencyLimit:10;zh=new aB(g)}}static get extensionName(){return"permessage-deflate"}offer(){let u={};return this._options.serverNoContextTakeover&&(u.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(u.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(u.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?u.client_max_window_bits=this._options.clientMaxWindowBits:this._options.clientMaxWindowBits==null&&(u.client_max_window_bits=!0),u}accept(u){return u=this.normalizeParams(u),this.params=this._isServer?this.acceptAsServer(u):this.acceptAsClient(u),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){let u=this._deflate[y2];this._deflate.close(),this._deflate=null,u&&u(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(u){let f=this._options,c=u.find(g=>!(f.serverNoContextTakeover===!1&&g.server_no_context_takeover||g.server_max_window_bits&&(f.serverMaxWindowBits===!1||typeof f.serverMaxWindowBits=="number"&&f.serverMaxWindowBits>g.server_max_window_bits)||typeof f.clientMaxWindowBits=="number"&&!g.client_max_window_bits));if(!c)throw new Error("None of the extension offers can be accepted");return f.serverNoContextTakeover&&(c.server_no_context_takeover=!0),f.clientNoContextTakeover&&(c.client_no_context_takeover=!0),typeof f.serverMaxWindowBits=="number"&&(c.server_max_window_bits=f.serverMaxWindowBits),typeof f.clientMaxWindowBits=="number"?c.client_max_window_bits=f.clientMaxWindowBits:(c.client_max_window_bits===!0||f.clientMaxWindowBits===!1)&&delete c.client_max_window_bits,c}acceptAsClient(u){let f=u[0];if(this._options.clientNoContextTakeover===!1&&f.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(!f.client_max_window_bits)typeof this._options.clientMaxWindowBits=="number"&&(f.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===!1||typeof this._options.clientMaxWindowBits=="number"&&f.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"');return f}normalizeParams(u){return u.forEach(f=>{Object.keys(f).forEach(c=>{let g=f[c];if(g.length>1)throw new Error(`Parameter "${c}" must have only a single value`);if(g=g[0],c==="client_max_window_bits"){if(g!==!0){let t=+g;if(!Number.isInteger(t)||t<8||t>15)throw new TypeError(`Invalid value for parameter "${c}": ${g}`);g=t}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${c}": ${g}`)}else if(c==="server_max_window_bits"){let t=+g;if(!Number.isInteger(t)||t<8||t>15)throw new TypeError(`Invalid value for parameter "${c}": ${g}`);g=t}else if(c==="client_no_context_takeover"||c==="server_no_context_takeover"){if(g!==!0)throw new TypeError(`Invalid value for parameter "${c}": ${g}`)}else throw new Error(`Unknown parameter "${c}"`);f[c]=g})}),u}decompress(u,f,c){zh.add(g=>{this._decompress(u,f,(t,C)=>{g(),c(t,C)})})}compress(u,f,c){zh.add(g=>{this._compress(u,f,(t,C)=>{g(),c(t,C)})})}_decompress(u,f,c){let g=this._isServer?"client":"server";if(!this._inflate){let t=`${g}_max_window_bits`,C=typeof this.params[t]!="number"?_2.Z_DEFAULT_WINDOWBITS:this.params[t];this._inflate=_2.createInflateRaw(zn(dt({},this._options.zlibInflateOptions),{windowBits:C})),this._inflate[qh]=this,this._inflate[Xl]=0,this._inflate[jf]=[],this._inflate.on("error",mB),this._inflate.on("data",m6)}this._inflate[y2]=c,this._inflate.write(u),f&&this._inflate.write(pB),this._inflate.flush(()=>{let t=this._inflate[Zy];if(t){this._inflate.close(),this._inflate=null,c(t);return}let C=d6.concat(this._inflate[jf],this._inflate[Xl]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[Xl]=0,this._inflate[jf]=[],f&&this.params[`${g}_no_context_takeover`]&&this._inflate.reset()),c(null,C)})}_compress(u,f,c){let g=this._isServer?"server":"client";if(!this._deflate){let t=`${g}_max_window_bits`,C=typeof this.params[t]!="number"?_2.Z_DEFAULT_WINDOWBITS:this.params[t];this._deflate=_2.createDeflateRaw(zn(dt({},this._options.zlibDeflateOptions),{windowBits:C})),this._deflate[Xl]=0,this._deflate[jf]=[],this._deflate.on("error",dB),this._deflate.on("data",hB)}this._deflate[y2]=c,this._deflate.write(u),this._deflate.flush(_2.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let t=d6.concat(this._deflate[jf],this._deflate[Xl]);f&&(t=t.slice(0,t.length-4)),this._deflate[y2]=null,this._deflate[Xl]=0,this._deflate[jf]=[],f&&this.params[`${g}_no_context_takeover`]&&this._deflate.reset(),c(null,t)})}};a6.exports=h6;function hB(i){this[jf].push(i),this[Xl]+=i.length}function m6(i){if(this[Xl]+=i.length,this[qh]._maxPayload<1||this[Xl]<=this[qh]._maxPayload){this[jf].push(i);return}this[Zy]=new RangeError("Max payload size exceeded"),this[Zy][p6]=1009,this.removeListener("data",m6),this.reset()}function mB(i){this[qh]._inflate=null,i[p6]=1007,this[y2](i)}});var t3=Me((Ub,e3)=>{"use strict";function v6(i){return i>=1e3&&i<=1014&&i!==1004&&i!==1005&&i!==1006||i>=3e3&&i<=4999}function g6(i){let u=i.length,f=0;for(;f=u||(i[f+1]&192)!=128||(i[f+2]&192)!=128||i[f]===224&&(i[f+1]&224)==128||i[f]===237&&(i[f+1]&224)==160)return!1;f+=3}else if((i[f]&248)==240){if(f+3>=u||(i[f+1]&192)!=128||(i[f+2]&192)!=128||(i[f+3]&192)!=128||i[f]===240&&(i[f+1]&240)==128||i[f]===244&&i[f+1]>143||i[f]>244)return!1;f+=4}else return!1;return!0}try{let i=require("utf-8-validate");typeof i=="object"&&(i=i.Validation.isValidUTF8),e3.exports={isValidStatusCode:v6,isValidUTF8(u){return u.length<150?g6(u):i(u)}}}catch(i){e3.exports={isValidStatusCode:v6,isValidUTF8:g6}}});var i3=Me((qb,_6)=>{"use strict";var{Writable:vB}=require("stream"),y6=w2(),{BINARY_TYPES:gB,EMPTY_BUFFER:_B,kStatusCode:yB,kWebSocket:wB}=mc(),{concat:n3,toArrayBuffer:DB,unmask:EB}=g2(),{isValidStatusCode:SB,isValidUTF8:w6}=t3(),D2=0,D6=1,E6=2,S6=3,r3=4,CB=5,C6=class extends vB{constructor(u,f,c,g){super();this._binaryType=u||gB[0],this[wB]=void 0,this._extensions=f||{},this._isServer=!!c,this._maxPayload=g|0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._state=D2,this._loop=!1}_write(u,f,c){if(this._opcode===8&&this._state==D2)return c();this._bufferedBytes+=u.length,this._buffers.push(u),this.startLoop(c)}consume(u){if(this._bufferedBytes-=u,u===this._buffers[0].length)return this._buffers.shift();if(u=c.length?f.set(this._buffers.shift(),g):(f.set(new Uint8Array(c.buffer,c.byteOffset,u),g),this._buffers[0]=c.slice(u)),u-=c.length}while(u>0);return f}startLoop(u){let f;this._loop=!0;do switch(this._state){case D2:f=this.getInfo();break;case D6:f=this.getPayloadLength16();break;case E6:f=this.getPayloadLength64();break;case S6:this.getMask();break;case r3:f=this.getData(u);break;default:this._loop=!1;return}while(this._loop);u(f)}getInfo(){if(this._bufferedBytes<2){this._loop=!1;return}let u=this.consume(2);if((u[0]&48)!=0)return this._loop=!1,ii(RangeError,"RSV2 and RSV3 must be clear",!0,1002);let f=(u[0]&64)==64;if(f&&!this._extensions[y6.extensionName])return this._loop=!1,ii(RangeError,"RSV1 must be clear",!0,1002);if(this._fin=(u[0]&128)==128,this._opcode=u[0]&15,this._payloadLength=u[1]&127,this._opcode===0){if(f)return this._loop=!1,ii(RangeError,"RSV1 must be clear",!0,1002);if(!this._fragmented)return this._loop=!1,ii(RangeError,"invalid opcode 0",!0,1002);this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented)return this._loop=!1,ii(RangeError,`invalid opcode ${this._opcode}`,!0,1002);this._compressed=f}else if(this._opcode>7&&this._opcode<11){if(!this._fin)return this._loop=!1,ii(RangeError,"FIN must be set",!0,1002);if(f)return this._loop=!1,ii(RangeError,"RSV1 must be clear",!0,1002);if(this._payloadLength>125)return this._loop=!1,ii(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002)}else return this._loop=!1,ii(RangeError,`invalid opcode ${this._opcode}`,!0,1002);if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(u[1]&128)==128,this._isServer){if(!this._masked)return this._loop=!1,ii(RangeError,"MASK must be set",!0,1002)}else if(this._masked)return this._loop=!1,ii(RangeError,"MASK must be clear",!0,1002);if(this._payloadLength===126)this._state=D6;else if(this._payloadLength===127)this._state=E6;else return this.haveLength()}getPayloadLength16(){if(this._bufferedBytes<2){this._loop=!1;return}return this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength()}getPayloadLength64(){if(this._bufferedBytes<8){this._loop=!1;return}let u=this.consume(8),f=u.readUInt32BE(0);return f>Math.pow(2,53-32)-1?(this._loop=!1,ii(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009)):(this._payloadLength=f*Math.pow(2,32)+u.readUInt32BE(4),this.haveLength())}haveLength(){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0))return this._loop=!1,ii(RangeError,"Max payload size exceeded",!1,1009);this._masked?this._state=S6:this._state=r3}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=r3}getData(u){let f=_B;if(this._payloadLength){if(this._bufferedBytes7)return this.controlMessage(f);if(this._compressed){this._state=CB,this.decompress(f,u);return}return f.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(f)),this.dataMessage()}decompress(u,f){this._extensions[y6.extensionName].decompress(u,this._fin,(g,t)=>{if(g)return f(g);if(t.length){if(this._messageLength+=t.length,this._messageLength>this._maxPayload&&this._maxPayload>0)return f(ii(RangeError,"Max payload size exceeded",!1,1009));this._fragments.push(t)}let C=this.dataMessage();if(C)return f(C);this.startLoop(f)})}dataMessage(){if(this._fin){let u=this._messageLength,f=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let c;this._binaryType==="nodebuffer"?c=n3(f,u):this._binaryType==="arraybuffer"?c=DB(n3(f,u)):c=f,this.emit("message",c)}else{let c=n3(f,u);if(!w6(c))return this._loop=!1,ii(Error,"invalid UTF-8 sequence",!0,1007);this.emit("message",c.toString())}}this._state=D2}controlMessage(u){if(this._opcode===8)if(this._loop=!1,u.length===0)this.emit("conclude",1005,""),this.end();else{if(u.length===1)return ii(RangeError,"invalid payload length 1",!0,1002);{let f=u.readUInt16BE(0);if(!SB(f))return ii(RangeError,`invalid status code ${f}`,!0,1002);let c=u.slice(2);if(!w6(c))return ii(Error,"invalid UTF-8 sequence",!0,1007);this.emit("conclude",f,c.toString()),this.end()}}else this._opcode===9?this.emit("ping",u):this.emit("pong",u);this._state=D2}};_6.exports=C6;function ii(i,u,f,c){let g=new i(f?`Invalid WebSocket frame: ${u}`:u);return Error.captureStackTrace(g,ii),g[yB]=c,g}});var o3=Me((zb,T6)=>{"use strict";var{randomFillSync:TB}=require("crypto"),x6=w2(),{EMPTY_BUFFER:xB}=mc(),{isValidStatusCode:kB}=t3(),{mask:k6,toBuffer:Jl}=g2(),vc=Buffer.alloc(4),Ql=class{constructor(u,f){this._extensions=f||{},this._socket=u,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._deflating=!1,this._queue=[]}static frame(u,f){let c=f.mask&&f.readOnly,g=f.mask?6:2,t=u.length;u.length>=65536?(g+=8,t=127):u.length>125&&(g+=2,t=126);let C=Buffer.allocUnsafe(c?u.length+g:g);return C[0]=f.fin?f.opcode|128:f.opcode,f.rsv1&&(C[0]|=64),C[1]=t,t===126?C.writeUInt16BE(u.length,2):t===127&&(C.writeUInt32BE(0,2),C.writeUInt32BE(u.length,6)),f.mask?(TB(vc,0,4),C[1]|=128,C[g-4]=vc[0],C[g-3]=vc[1],C[g-2]=vc[2],C[g-1]=vc[3],c?(k6(u,vc,C,g,u.length),[C]):(k6(u,vc,u,0,u.length),[C,u])):[C,u]}close(u,f,c,g){let t;if(u===void 0)t=xB;else{if(typeof u!="number"||!kB(u))throw new TypeError("First argument must be a valid error code number");if(f===void 0||f==="")t=Buffer.allocUnsafe(2),t.writeUInt16BE(u,0);else{let C=Buffer.byteLength(f);if(C>123)throw new RangeError("The message must not be greater than 123 bytes");t=Buffer.allocUnsafe(2+C),t.writeUInt16BE(u,0),t.write(f,2)}}this._deflating?this.enqueue([this.doClose,t,c,g]):this.doClose(t,c,g)}doClose(u,f,c){this.sendFrame(Ql.frame(u,{fin:!0,rsv1:!1,opcode:8,mask:f,readOnly:!1}),c)}ping(u,f,c){let g=Jl(u);if(g.length>125)throw new RangeError("The data size must not be greater than 125 bytes");this._deflating?this.enqueue([this.doPing,g,f,Jl.readOnly,c]):this.doPing(g,f,Jl.readOnly,c)}doPing(u,f,c,g){this.sendFrame(Ql.frame(u,{fin:!0,rsv1:!1,opcode:9,mask:f,readOnly:c}),g)}pong(u,f,c){let g=Jl(u);if(g.length>125)throw new RangeError("The data size must not be greater than 125 bytes");this._deflating?this.enqueue([this.doPong,g,f,Jl.readOnly,c]):this.doPong(g,f,Jl.readOnly,c)}doPong(u,f,c,g){this.sendFrame(Ql.frame(u,{fin:!0,rsv1:!1,opcode:10,mask:f,readOnly:c}),g)}send(u,f,c){let g=Jl(u),t=this._extensions[x6.extensionName],C=f.binary?2:1,A=f.compress;if(this._firstFragment?(this._firstFragment=!1,A&&t&&(A=g.length>=t._threshold),this._compress=A):(A=!1,C=0),f.fin&&(this._firstFragment=!0),t){let x={fin:f.fin,rsv1:A,opcode:C,mask:f.mask,readOnly:Jl.readOnly};this._deflating?this.enqueue([this.dispatch,g,this._compress,x,c]):this.dispatch(g,this._compress,x,c)}else this.sendFrame(Ql.frame(g,{fin:f.fin,rsv1:!1,opcode:C,mask:f.mask,readOnly:Jl.readOnly}),c)}dispatch(u,f,c,g){if(!f){this.sendFrame(Ql.frame(u,c),g);return}let t=this._extensions[x6.extensionName];this._bufferedBytes+=u.length,this._deflating=!0,t.compress(u,c.fin,(C,A)=>{if(this._socket.destroyed){let x=new Error("The socket was closed while data was being compressed");typeof g=="function"&&g(x);for(let D=0;D{"use strict";var E2=class{constructor(u,f){this.target=f,this.type=u}},O6=class extends E2{constructor(u,f){super("message",f);this.data=u}},I6=class extends E2{constructor(u,f,c){super("close",c);this.wasClean=c._closeFrameReceived&&c._closeFrameSent,this.reason=f,this.code=u}},P6=class extends E2{constructor(u){super("open",u)}},M6=class extends E2{constructor(u,f){super("error",f);this.message=u.message,this.error=u}},AB={addEventListener(i,u,f){if(typeof u!="function")return;function c(x){u.call(this,new O6(x,this))}function g(x,D){u.call(this,new I6(x,D,this))}function t(x){u.call(this,new M6(x,this))}function C(){u.call(this,new P6(this))}let A=f&&f.once?"once":"on";i==="message"?(c._listener=u,this[A](i,c)):i==="close"?(g._listener=u,this[A](i,g)):i==="error"?(t._listener=u,this[A](i,t)):i==="open"?(C._listener=u,this[A](i,C)):this[A](i,u)},removeEventListener(i,u){let f=this.listeners(i);for(let c=0;c{"use strict";var S2=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0];function rl(i,u,f){i[u]===void 0?i[u]=[f]:i[u].push(f)}function OB(i){let u=Object.create(null);if(i===void 0||i==="")return u;let f=Object.create(null),c=!1,g=!1,t=!1,C,A,x=-1,D=-1,L=0;for(;L{let f=i[u];return Array.isArray(f)||(f=[f]),f.map(c=>[u].concat(Object.keys(c).map(g=>{let t=c[g];return Array.isArray(t)||(t=[t]),t.map(C=>C===!0?g:`${g}=${C}`).join("; ")})).join("; ")).join(", ")}).join(", ")}L6.exports={format:IB,parse:OB}});var a3=Me((bb,R6)=>{"use strict";var PB=require("events"),MB=require("https"),FB=require("http"),N6=require("net"),LB=require("tls"),{randomBytes:RB,createHash:NB}=require("crypto"),{URL:s3}=require("url"),Uf=w2(),BB=i3(),jB=o3(),{BINARY_TYPES:B6,EMPTY_BUFFER:l3,GUID:UB,kStatusCode:qB,kWebSocket:No,NOOP:j6}=mc(),{addEventListener:zB,removeEventListener:WB}=F6(),{format:HB,parse:bB}=u3(),{toBuffer:GB}=g2(),U6=["CONNECTING","OPEN","CLOSING","CLOSED"],f3=[8,13],VB=30*1e3,mr=class extends PB{constructor(u,f,c){super();this._binaryType=B6[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage="",this._closeTimer=null,this._extensions={},this._protocol="",this._readyState=mr.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,u!==null?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,Array.isArray(f)?f=f.join(", "):typeof f=="object"&&f!==null&&(c=f,f=void 0),q6(this,u,f,c)):this._isServer=!0}get binaryType(){return this._binaryType}set binaryType(u){!B6.includes(u)||(this._binaryType=u,this._receiver&&(this._receiver._binaryType=u))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(u,f,c){let g=new BB(this.binaryType,this._extensions,this._isServer,c);this._sender=new jB(u,this._extensions),this._receiver=g,this._socket=u,g[No]=this,u[No]=this,g.on("conclude",YB),g.on("drain",$B),g.on("error",KB),g.on("message",XB),g.on("ping",JB),g.on("pong",QB),u.setTimeout(0),u.setNoDelay(),f.length>0&&u.unshift(f),u.on("close",z6),u.on("data",Wh),u.on("end",W6),u.on("error",H6),this._readyState=mr.OPEN,this.emit("open")}emitClose(){if(!this._socket){this._readyState=mr.CLOSED,this.emit("close",this._closeCode,this._closeMessage);return}this._extensions[Uf.extensionName]&&this._extensions[Uf.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=mr.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(u,f){if(this.readyState!==mr.CLOSED){if(this.readyState===mr.CONNECTING){let c="WebSocket was closed before the connection was established";return Zl(this,this._req,c)}if(this.readyState===mr.CLOSING){this._closeFrameSent&&this._closeFrameReceived&&this._socket.end();return}this._readyState=mr.CLOSING,this._sender.close(u,f,!this._isServer,c=>{c||(this._closeFrameSent=!0,this._closeFrameReceived&&this._socket.end())}),this._closeTimer=setTimeout(this._socket.destroy.bind(this._socket),VB)}}ping(u,f,c){if(this.readyState===mr.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof u=="function"?(c=u,u=f=void 0):typeof f=="function"&&(c=f,f=void 0),typeof u=="number"&&(u=u.toString()),this.readyState!==mr.OPEN){c3(this,u,c);return}f===void 0&&(f=!this._isServer),this._sender.ping(u||l3,f,c)}pong(u,f,c){if(this.readyState===mr.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof u=="function"?(c=u,u=f=void 0):typeof f=="function"&&(c=f,f=void 0),typeof u=="number"&&(u=u.toString()),this.readyState!==mr.OPEN){c3(this,u,c);return}f===void 0&&(f=!this._isServer),this._sender.pong(u||l3,f,c)}send(u,f,c){if(this.readyState===mr.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof f=="function"&&(c=f,f={}),typeof u=="number"&&(u=u.toString()),this.readyState!==mr.OPEN){c3(this,u,c);return}let g=dt({binary:typeof u!="string",mask:!this._isServer,compress:!0,fin:!0},f);this._extensions[Uf.extensionName]||(g.compress=!1),this._sender.send(u||l3,g,c)}terminate(){if(this.readyState!==mr.CLOSED){if(this.readyState===mr.CONNECTING){let u="WebSocket was closed before the connection was established";return Zl(this,this._req,u)}this._socket&&(this._readyState=mr.CLOSING,this._socket.destroy())}}};U6.forEach((i,u)=>{let f={enumerable:!0,value:u};Object.defineProperty(mr.prototype,i,f),Object.defineProperty(mr,i,f)});["binaryType","bufferedAmount","extensions","protocol","readyState","url"].forEach(i=>{Object.defineProperty(mr.prototype,i,{enumerable:!0})});["open","error","close","message"].forEach(i=>{Object.defineProperty(mr.prototype,`on${i}`,{configurable:!0,enumerable:!0,get(){let u=this.listeners(i);for(let f=0;f{Zl(i,j,"Opening handshake has timed out")}),j.on("error",$=>{j===null||j.aborted||(j=i._req=null,i._readyState=mr.CLOSING,i.emit("error",$),i.emitClose())}),j.on("response",$=>{let h=$.headers.location,re=$.statusCode;if(h&&g.followRedirects&&re>=300&&re<400){if(++i._redirects>g.maxRedirects){Zl(i,j,"Maximum redirects exceeded");return}j.abort();let ce=new s3(h,u);q6(i,ce,f,c)}else i.emit("unexpected-response",j,$)||Zl(i,j,`Unexpected server response: ${$.statusCode}`)}),j.on("upgrade",($,h,re)=>{if(i.emit("upgrade",$),i.readyState!==mr.CONNECTING)return;j=i._req=null;let ce=NB("sha1").update(D+UB).digest("base64");if($.headers["sec-websocket-accept"]!==ce){Zl(i,h,"Invalid Sec-WebSocket-Accept header");return}let Q=$.headers["sec-websocket-protocol"],oe=(f||"").split(/, */),Se;if(!f&&Q?Se="Server sent a subprotocol but none was requested":f&&!Q?Se="Server sent no subprotocol":Q&&!oe.includes(Q)&&(Se="Server sent an invalid subprotocol"),Se){Zl(i,h,Se);return}if(Q&&(i._protocol=Q),N)try{let me=bB($.headers["sec-websocket-extensions"]);me[Uf.extensionName]&&(N.accept(me[Uf.extensionName]),i._extensions[Uf.extensionName]=N)}catch(me){Zl(i,h,"Invalid Sec-WebSocket-Extensions header");return}i.setSocket(h,re,g.maxPayload)})}function ZB(i){return i.path=i.socketPath,N6.connect(i)}function ej(i){return i.path=void 0,!i.servername&&i.servername!==""&&(i.servername=N6.isIP(i.host)?"":i.host),LB.connect(i)}function Zl(i,u,f){i._readyState=mr.CLOSING;let c=new Error(f);Error.captureStackTrace(c,Zl),u.setHeader?(u.abort(),u.socket&&!u.socket.destroyed&&u.socket.destroy(),u.once("abort",i.emitClose.bind(i)),i.emit("error",c)):(u.destroy(c),u.once("error",i.emit.bind(i,"error")),u.once("close",i.emitClose.bind(i)))}function c3(i,u,f){if(u){let c=GB(u).length;i._socket?i._sender._bufferedBytes+=c:i._bufferedAmount+=c}if(f){let c=new Error(`WebSocket is not open: readyState ${i.readyState} (${U6[i.readyState]})`);f(c)}}function YB(i,u){let f=this[No];f._socket.removeListener("data",Wh),f._socket.resume(),f._closeFrameReceived=!0,f._closeMessage=u,f._closeCode=i,i===1005?f.close():f.close(i,u)}function $B(){this[No]._socket.resume()}function KB(i){let u=this[No];u._socket.removeListener("data",Wh),u._readyState=mr.CLOSING,u._closeCode=i[qB],u.emit("error",i),u._socket.destroy()}function b6(){this[No].emitClose()}function XB(i){this[No].emit("message",i)}function JB(i){let u=this[No];u.pong(i,!u._isServer,j6),u.emit("ping",i)}function QB(i){this[No].emit("pong",i)}function z6(){let i=this[No];this.removeListener("close",z6),this.removeListener("end",W6),i._readyState=mr.CLOSING,i._socket.read(),i._receiver.end(),this.removeListener("data",Wh),this[No]=void 0,clearTimeout(i._closeTimer),i._receiver._writableState.finished||i._receiver._writableState.errorEmitted?i.emitClose():(i._receiver.on("error",b6),i._receiver.on("finish",b6))}function Wh(i){this[No]._receiver.write(i)||this.pause()}function W6(){let i=this[No];i._readyState=mr.CLOSING,i._receiver.end(),this.end()}function H6(){let i=this[No];this.removeListener("error",H6),this.on("error",j6),i&&(i._readyState=mr.CLOSING,this.destroy())}});var $6=Me((Gb,G6)=>{"use strict";var{Duplex:tj}=require("stream");function V6(i){i.emit("close")}function nj(){!this.destroyed&&this._writableState.finished&&this.destroy()}function Y6(i){this.removeListener("error",Y6),this.destroy(),this.listenerCount("error")===0&&this.emit("error",i)}function rj(i,u){let f=!0;function c(){f&&i._socket.resume()}i.readyState===i.CONNECTING?i.once("open",function(){i._receiver.removeAllListeners("drain"),i._receiver.on("drain",c)}):(i._receiver.removeAllListeners("drain"),i._receiver.on("drain",c));let g=new tj(zn(dt({},u),{autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1}));return i.on("message",function(C){g.push(C)||(f=!1,i._socket.pause())}),i.once("error",function(C){g.destroyed||g.destroy(C)}),i.once("close",function(){g.destroyed||g.push(null)}),g._destroy=function(t,C){if(i.readyState===i.CLOSED){C(t),process.nextTick(V6,g);return}let A=!1;i.once("error",function(D){A=!0,C(D)}),i.once("close",function(){A||C(t),process.nextTick(V6,g)}),i.terminate()},g._final=function(t){if(i.readyState===i.CONNECTING){i.once("open",function(){g._final(t)});return}i._socket!==null&&(i._socket._writableState.finished?(t(),g._readableState.endEmitted&&g.destroy()):(i._socket.once("finish",function(){t()}),i.close()))},g._read=function(){i.readyState===i.OPEN&&!f&&(f=!0,i._receiver._writableState.needDrain||i._socket.resume())},g._write=function(t,C,A){if(i.readyState===i.CONNECTING){i.once("open",function(){g._write(t,C,A)});return}i.send(t,A)},g.on("end",nj),g.on("error",Y6),g}G6.exports=rj});var J6=Me((Vb,K6)=>{"use strict";var ij=require("events"),{createHash:oj}=require("crypto"),{createServer:uj,STATUS_CODES:d3}=require("http"),gc=w2(),sj=a3(),{format:lj,parse:fj}=u3(),{GUID:cj,kWebSocket:aj}=mc(),dj=/^[+/0-9A-Za-z]{22}==$/,X6=class extends ij{constructor(u,f){super();if(u=dt({maxPayload:100*1024*1024,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null},u),u.port==null&&!u.server&&!u.noServer)throw new TypeError('One of the "port", "server", or "noServer" options must be specified');if(u.port!=null?(this._server=uj((c,g)=>{let t=d3[426];g.writeHead(426,{"Content-Length":t.length,"Content-Type":"text/plain"}),g.end(t)}),this._server.listen(u.port,u.host,u.backlog,f)):u.server&&(this._server=u.server),this._server){let c=this.emit.bind(this,"connection");this._removeListeners=pj(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(g,t,C)=>{this.handleUpgrade(g,t,C,c)}})}u.perMessageDeflate===!0&&(u.perMessageDeflate={}),u.clientTracking&&(this.clients=new Set),this.options=u}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(u){if(u&&this.once("close",u),this.clients)for(let c of this.clients)c.terminate();let f=this._server;if(f&&(this._removeListeners(),this._removeListeners=this._server=null,this.options.port!=null)){f.close(()=>this.emit("close"));return}process.nextTick(hj,this)}shouldHandle(u){if(this.options.path){let f=u.url.indexOf("?");if((f!==-1?u.url.slice(0,f):u.url)!==this.options.path)return!1}return!0}handleUpgrade(u,f,c,g){f.on("error",p3);let t=u.headers["sec-websocket-key"]!==void 0?u.headers["sec-websocket-key"].trim():!1,C=+u.headers["sec-websocket-version"],A={};if(u.method!=="GET"||u.headers.upgrade.toLowerCase()!=="websocket"||!t||!dj.test(t)||C!==8&&C!==13||!this.shouldHandle(u))return Hh(f,400);if(this.options.perMessageDeflate){let x=new gc(this.options.perMessageDeflate,!0,this.options.maxPayload);try{let D=fj(u.headers["sec-websocket-extensions"]);D[gc.extensionName]&&(x.accept(D[gc.extensionName]),A[gc.extensionName]=x)}catch(D){return Hh(f,400)}}if(this.options.verifyClient){let x={origin:u.headers[`${C===8?"sec-websocket-origin":"origin"}`],secure:!!(u.socket.authorized||u.socket.encrypted),req:u};if(this.options.verifyClient.length===2){this.options.verifyClient(x,(D,L,N,j)=>{if(!D)return Hh(f,L||401,N,j);this.completeUpgrade(t,A,u,f,c,g)});return}if(!this.options.verifyClient(x))return Hh(f,401)}this.completeUpgrade(t,A,u,f,c,g)}completeUpgrade(u,f,c,g,t,C){if(!g.readable||!g.writable)return g.destroy();if(g[aj])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");let A=oj("sha1").update(u+cj).digest("base64"),x=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${A}`],D=new sj(null),L=c.headers["sec-websocket-protocol"];if(L&&(L=L.split(",").map(mj),this.options.handleProtocols?L=this.options.handleProtocols(L,c):L=L[0],L&&(x.push(`Sec-WebSocket-Protocol: ${L}`),D._protocol=L)),f[gc.extensionName]){let N=f[gc.extensionName].params,j=lj({[gc.extensionName]:[N]});x.push(`Sec-WebSocket-Extensions: ${j}`),D._extensions=f}this.emit("headers",x,c),g.write(x.concat(`\r -`).join(`\r -`)),g.removeListener("error",p3),D.setSocket(g,t,this.options.maxPayload),this.clients&&(this.clients.add(D),D.on("close",()=>this.clients.delete(D))),C(D,c)}};K6.exports=X6;function pj(i,u){for(let f of Object.keys(u))i.on(f,u[f]);return function(){for(let c of Object.keys(u))i.removeListener(c,u[c])}}function hj(i){i.emit("close")}function p3(){this.destroy()}function Hh(i,u,f,c){i.writable&&(f=f||d3[u],c=dt({Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(f)},c),i.write(`HTTP/1.1 ${u} ${d3[u]}\r -`+Object.keys(c).map(g=>`${g}: ${c[g]}`).join(`\r -`)+`\r -\r -`+f)),i.removeListener("error",p3),i.destroy()}function mj(i){return i.trim()}});var Z6=Me((Yb,Q6)=>{"use strict";var C2=a3();C2.createWebSocketStream=$6();C2.Server=J6();C2.Receiver=i3();C2.Sender=o3();Q6.exports=C2});var eS=Me(bh=>{"use strict";var vj=bh&&bh.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(bh,"__esModule",{value:!0});var gj=vj(Z6()),T2=global;T2.WebSocket||(T2.WebSocket=gj.default);T2.window||(T2.window=global);T2.window.__REACT_DEVTOOLS_COMPONENT_FILTERS__=[{type:1,value:7,isEnabled:!0},{type:2,value:"InternalApp",isEnabled:!0,isValid:!0},{type:2,value:"InternalAppContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStdoutContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStderrContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStdinContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalFocusContext",isEnabled:!0,isValid:!0}]});var tS=Me((Gh,h3)=>{(function(i,u){typeof Gh=="object"&&typeof h3=="object"?h3.exports=u():typeof define=="function"&&define.amd?define([],u):typeof Gh=="object"?Gh.ReactDevToolsBackend=u():i.ReactDevToolsBackend=u()})(window,function(){return function(i){var u={};function f(c){if(u[c])return u[c].exports;var g=u[c]={i:c,l:!1,exports:{}};return i[c].call(g.exports,g,g.exports,f),g.l=!0,g.exports}return f.m=i,f.c=u,f.d=function(c,g,t){f.o(c,g)||Object.defineProperty(c,g,{enumerable:!0,get:t})},f.r=function(c){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})},f.t=function(c,g){if(1&g&&(c=f(c)),8&g||4&g&&typeof c=="object"&&c&&c.__esModule)return c;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:c}),2&g&&typeof c!="string")for(var C in c)f.d(t,C,function(A){return c[A]}.bind(null,C));return t},f.n=function(c){var g=c&&c.__esModule?function(){return c.default}:function(){return c};return f.d(g,"a",g),g},f.o=function(c,g){return Object.prototype.hasOwnProperty.call(c,g)},f.p="",f(f.s=20)}([function(i,u,f){"use strict";i.exports=f(12)},function(i,u,f){"use strict";var c=Object.getOwnPropertySymbols,g=Object.prototype.hasOwnProperty,t=Object.prototype.propertyIsEnumerable;function C(A){if(A==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(A)}i.exports=function(){try{if(!Object.assign)return!1;var A=new String("abc");if(A[5]="de",Object.getOwnPropertyNames(A)[0]==="5")return!1;for(var x={},D=0;D<10;D++)x["_"+String.fromCharCode(D)]=D;if(Object.getOwnPropertyNames(x).map(function(N){return x[N]}).join("")!=="0123456789")return!1;var L={};return"abcdefghijklmnopqrst".split("").forEach(function(N){L[N]=N}),Object.keys(Object.assign({},L)).join("")==="abcdefghijklmnopqrst"}catch(N){return!1}}()?Object.assign:function(A,x){for(var D,L,N=C(A),j=1;j=J||Ft<0||Nt&&it-At>=ot}function Z(){var it=ce();if(ge(it))return Ae(it);Ue=setTimeout(Z,function(Ft){var jt=J-(Ft-be);return Nt?re(jt,ot-(Ft-At)):jt}(it))}function Ae(it){return Ue=void 0,Je&&Oe?V(it):(Oe=Le=void 0,ct)}function at(){var it=ce(),Ft=ge(it);if(Oe=arguments,Le=this,be=it,Ft){if(Ue===void 0)return ne(be);if(Nt)return Ue=setTimeout(Z,J),V(be)}return Ue===void 0&&(Ue=setTimeout(Z,J)),ct}return J=me(J)||0,oe(Te)&&(Ot=!!Te.leading,ot=(Nt="maxWait"in Te)?h(me(Te.maxWait)||0,J):ot,Je="trailing"in Te?!!Te.trailing:Je),at.cancel=function(){Ue!==void 0&&clearTimeout(Ue),At=0,Oe=be=Le=Ue=void 0},at.flush=function(){return Ue===void 0?ct:Ae(ce())},at}function oe(De){var J=g(De);return!!De&&(J=="object"||J=="function")}function Se(De){return g(De)=="symbol"||function(J){return!!J&&g(J)=="object"}(De)&&$.call(De)=="[object Symbol]"}function me(De){if(typeof De=="number")return De;if(Se(De))return NaN;if(oe(De)){var J=typeof De.valueOf=="function"?De.valueOf():De;De=oe(J)?J+"":J}if(typeof De!="string")return De===0?De:+De;De=De.replace(t,"");var Te=A.test(De);return Te||x.test(De)?D(De.slice(2),Te?2:8):C.test(De)?NaN:+De}i.exports=function(De,J,Te){var Oe=!0,Le=!0;if(typeof De!="function")throw new TypeError("Expected a function");return oe(Te)&&(Oe="leading"in Te?!!Te.leading:Oe,Le="trailing"in Te?!!Te.trailing:Le),Q(De,J,{leading:Oe,maxWait:J,trailing:Le})}}).call(this,f(4))},function(i,u,f){(function(c){function g(V){return(g=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(ne){return typeof ne}:function(ne){return ne&&typeof Symbol=="function"&&ne.constructor===Symbol&&ne!==Symbol.prototype?"symbol":typeof ne})(V)}var t;u=i.exports=h,t=(c===void 0?"undefined":g(c))==="object"&&c.env&&c.env.NODE_DEBUG&&/\bsemver\b/i.test(c.env.NODE_DEBUG)?function(){var V=Array.prototype.slice.call(arguments,0);V.unshift("SEMVER"),console.log.apply(console,V)}:function(){},u.SEMVER_SPEC_VERSION="2.0.0";var C=Number.MAX_SAFE_INTEGER||9007199254740991,A=u.re=[],x=u.src=[],D=u.tokens={},L=0;function N(V){D[V]=L++}N("NUMERICIDENTIFIER"),x[D.NUMERICIDENTIFIER]="0|[1-9]\\d*",N("NUMERICIDENTIFIERLOOSE"),x[D.NUMERICIDENTIFIERLOOSE]="[0-9]+",N("NONNUMERICIDENTIFIER"),x[D.NONNUMERICIDENTIFIER]="\\d*[a-zA-Z-][a-zA-Z0-9-]*",N("MAINVERSION"),x[D.MAINVERSION]="("+x[D.NUMERICIDENTIFIER]+")\\.("+x[D.NUMERICIDENTIFIER]+")\\.("+x[D.NUMERICIDENTIFIER]+")",N("MAINVERSIONLOOSE"),x[D.MAINVERSIONLOOSE]="("+x[D.NUMERICIDENTIFIERLOOSE]+")\\.("+x[D.NUMERICIDENTIFIERLOOSE]+")\\.("+x[D.NUMERICIDENTIFIERLOOSE]+")",N("PRERELEASEIDENTIFIER"),x[D.PRERELEASEIDENTIFIER]="(?:"+x[D.NUMERICIDENTIFIER]+"|"+x[D.NONNUMERICIDENTIFIER]+")",N("PRERELEASEIDENTIFIERLOOSE"),x[D.PRERELEASEIDENTIFIERLOOSE]="(?:"+x[D.NUMERICIDENTIFIERLOOSE]+"|"+x[D.NONNUMERICIDENTIFIER]+")",N("PRERELEASE"),x[D.PRERELEASE]="(?:-("+x[D.PRERELEASEIDENTIFIER]+"(?:\\."+x[D.PRERELEASEIDENTIFIER]+")*))",N("PRERELEASELOOSE"),x[D.PRERELEASELOOSE]="(?:-?("+x[D.PRERELEASEIDENTIFIERLOOSE]+"(?:\\."+x[D.PRERELEASEIDENTIFIERLOOSE]+")*))",N("BUILDIDENTIFIER"),x[D.BUILDIDENTIFIER]="[0-9A-Za-z-]+",N("BUILD"),x[D.BUILD]="(?:\\+("+x[D.BUILDIDENTIFIER]+"(?:\\."+x[D.BUILDIDENTIFIER]+")*))",N("FULL"),N("FULLPLAIN"),x[D.FULLPLAIN]="v?"+x[D.MAINVERSION]+x[D.PRERELEASE]+"?"+x[D.BUILD]+"?",x[D.FULL]="^"+x[D.FULLPLAIN]+"$",N("LOOSEPLAIN"),x[D.LOOSEPLAIN]="[v=\\s]*"+x[D.MAINVERSIONLOOSE]+x[D.PRERELEASELOOSE]+"?"+x[D.BUILD]+"?",N("LOOSE"),x[D.LOOSE]="^"+x[D.LOOSEPLAIN]+"$",N("GTLT"),x[D.GTLT]="((?:<|>)?=?)",N("XRANGEIDENTIFIERLOOSE"),x[D.XRANGEIDENTIFIERLOOSE]=x[D.NUMERICIDENTIFIERLOOSE]+"|x|X|\\*",N("XRANGEIDENTIFIER"),x[D.XRANGEIDENTIFIER]=x[D.NUMERICIDENTIFIER]+"|x|X|\\*",N("XRANGEPLAIN"),x[D.XRANGEPLAIN]="[v=\\s]*("+x[D.XRANGEIDENTIFIER]+")(?:\\.("+x[D.XRANGEIDENTIFIER]+")(?:\\.("+x[D.XRANGEIDENTIFIER]+")(?:"+x[D.PRERELEASE]+")?"+x[D.BUILD]+"?)?)?",N("XRANGEPLAINLOOSE"),x[D.XRANGEPLAINLOOSE]="[v=\\s]*("+x[D.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+x[D.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+x[D.XRANGEIDENTIFIERLOOSE]+")(?:"+x[D.PRERELEASELOOSE]+")?"+x[D.BUILD]+"?)?)?",N("XRANGE"),x[D.XRANGE]="^"+x[D.GTLT]+"\\s*"+x[D.XRANGEPLAIN]+"$",N("XRANGELOOSE"),x[D.XRANGELOOSE]="^"+x[D.GTLT]+"\\s*"+x[D.XRANGEPLAINLOOSE]+"$",N("COERCE"),x[D.COERCE]="(^|[^\\d])(\\d{1,16})(?:\\.(\\d{1,16}))?(?:\\.(\\d{1,16}))?(?:$|[^\\d])",N("COERCERTL"),A[D.COERCERTL]=new RegExp(x[D.COERCE],"g"),N("LONETILDE"),x[D.LONETILDE]="(?:~>?)",N("TILDETRIM"),x[D.TILDETRIM]="(\\s*)"+x[D.LONETILDE]+"\\s+",A[D.TILDETRIM]=new RegExp(x[D.TILDETRIM],"g"),N("TILDE"),x[D.TILDE]="^"+x[D.LONETILDE]+x[D.XRANGEPLAIN]+"$",N("TILDELOOSE"),x[D.TILDELOOSE]="^"+x[D.LONETILDE]+x[D.XRANGEPLAINLOOSE]+"$",N("LONECARET"),x[D.LONECARET]="(?:\\^)",N("CARETTRIM"),x[D.CARETTRIM]="(\\s*)"+x[D.LONECARET]+"\\s+",A[D.CARETTRIM]=new RegExp(x[D.CARETTRIM],"g"),N("CARET"),x[D.CARET]="^"+x[D.LONECARET]+x[D.XRANGEPLAIN]+"$",N("CARETLOOSE"),x[D.CARETLOOSE]="^"+x[D.LONECARET]+x[D.XRANGEPLAINLOOSE]+"$",N("COMPARATORLOOSE"),x[D.COMPARATORLOOSE]="^"+x[D.GTLT]+"\\s*("+x[D.LOOSEPLAIN]+")$|^$",N("COMPARATOR"),x[D.COMPARATOR]="^"+x[D.GTLT]+"\\s*("+x[D.FULLPLAIN]+")$|^$",N("COMPARATORTRIM"),x[D.COMPARATORTRIM]="(\\s*)"+x[D.GTLT]+"\\s*("+x[D.LOOSEPLAIN]+"|"+x[D.XRANGEPLAIN]+")",A[D.COMPARATORTRIM]=new RegExp(x[D.COMPARATORTRIM],"g"),N("HYPHENRANGE"),x[D.HYPHENRANGE]="^\\s*("+x[D.XRANGEPLAIN]+")\\s+-\\s+("+x[D.XRANGEPLAIN]+")\\s*$",N("HYPHENRANGELOOSE"),x[D.HYPHENRANGELOOSE]="^\\s*("+x[D.XRANGEPLAINLOOSE]+")\\s+-\\s+("+x[D.XRANGEPLAINLOOSE]+")\\s*$",N("STAR"),x[D.STAR]="(<|>)?=?\\s*\\*";for(var j=0;j256||!(ne.loose?A[D.LOOSE]:A[D.FULL]).test(V))return null;try{return new h(V,ne)}catch(ge){return null}}function h(V,ne){if(ne&&g(ne)==="object"||(ne={loose:!!ne,includePrerelease:!1}),V instanceof h){if(V.loose===ne.loose)return V;V=V.version}else if(typeof V!="string")throw new TypeError("Invalid Version: "+V);if(V.length>256)throw new TypeError("version is longer than 256 characters");if(!(this instanceof h))return new h(V,ne);t("SemVer",V,ne),this.options=ne,this.loose=!!ne.loose;var ge=V.trim().match(ne.loose?A[D.LOOSE]:A[D.FULL]);if(!ge)throw new TypeError("Invalid Version: "+V);if(this.raw=V,this.major=+ge[1],this.minor=+ge[2],this.patch=+ge[3],this.major>C||this.major<0)throw new TypeError("Invalid major version");if(this.minor>C||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>C||this.patch<0)throw new TypeError("Invalid patch version");ge[4]?this.prerelease=ge[4].split(".").map(function(Z){if(/^[0-9]+$/.test(Z)){var Ae=+Z;if(Ae>=0&&Ae=0;)typeof this.prerelease[ge]=="number"&&(this.prerelease[ge]++,ge=-2);ge===-1&&this.prerelease.push(0)}ne&&(this.prerelease[0]===ne?isNaN(this.prerelease[1])&&(this.prerelease=[ne,0]):this.prerelease=[ne,0]);break;default:throw new Error("invalid increment argument: "+V)}return this.format(),this.raw=this.version,this},u.inc=function(V,ne,ge,Z){typeof ge=="string"&&(Z=ge,ge=void 0);try{return new h(V,ge).inc(ne,Z).version}catch(Ae){return null}},u.diff=function(V,ne){if(me(V,ne))return null;var ge=$(V),Z=$(ne),Ae="";if(ge.prerelease.length||Z.prerelease.length){Ae="pre";var at="prerelease"}for(var it in ge)if((it==="major"||it==="minor"||it==="patch")&&ge[it]!==Z[it])return Ae+it;return at},u.compareIdentifiers=ce;var re=/^[0-9]+$/;function ce(V,ne){var ge=re.test(V),Z=re.test(ne);return ge&&Z&&(V=+V,ne=+ne),V===ne?0:ge&&!Z?-1:Z&&!ge?1:V0}function Se(V,ne,ge){return Q(V,ne,ge)<0}function me(V,ne,ge){return Q(V,ne,ge)===0}function De(V,ne,ge){return Q(V,ne,ge)!==0}function J(V,ne,ge){return Q(V,ne,ge)>=0}function Te(V,ne,ge){return Q(V,ne,ge)<=0}function Oe(V,ne,ge,Z){switch(ne){case"===":return g(V)==="object"&&(V=V.version),g(ge)==="object"&&(ge=ge.version),V===ge;case"!==":return g(V)==="object"&&(V=V.version),g(ge)==="object"&&(ge=ge.version),V!==ge;case"":case"=":case"==":return me(V,ge,Z);case"!=":return De(V,ge,Z);case">":return oe(V,ge,Z);case">=":return J(V,ge,Z);case"<":return Se(V,ge,Z);case"<=":return Te(V,ge,Z);default:throw new TypeError("Invalid operator: "+ne)}}function Le(V,ne){if(ne&&g(ne)==="object"||(ne={loose:!!ne,includePrerelease:!1}),V instanceof Le){if(V.loose===!!ne.loose)return V;V=V.value}if(!(this instanceof Le))return new Le(V,ne);t("comparator",V,ne),this.options=ne,this.loose=!!ne.loose,this.parse(V),this.semver===ot?this.value="":this.value=this.operator+this.semver.version,t("comp",this)}u.rcompareIdentifiers=function(V,ne){return ce(ne,V)},u.major=function(V,ne){return new h(V,ne).major},u.minor=function(V,ne){return new h(V,ne).minor},u.patch=function(V,ne){return new h(V,ne).patch},u.compare=Q,u.compareLoose=function(V,ne){return Q(V,ne,!0)},u.compareBuild=function(V,ne,ge){var Z=new h(V,ge),Ae=new h(ne,ge);return Z.compare(Ae)||Z.compareBuild(Ae)},u.rcompare=function(V,ne,ge){return Q(ne,V,ge)},u.sort=function(V,ne){return V.sort(function(ge,Z){return u.compareBuild(ge,Z,ne)})},u.rsort=function(V,ne){return V.sort(function(ge,Z){return u.compareBuild(Z,ge,ne)})},u.gt=oe,u.lt=Se,u.eq=me,u.neq=De,u.gte=J,u.lte=Te,u.cmp=Oe,u.Comparator=Le;var ot={};function ct(V,ne){if(ne&&g(ne)==="object"||(ne={loose:!!ne,includePrerelease:!1}),V instanceof ct)return V.loose===!!ne.loose&&V.includePrerelease===!!ne.includePrerelease?V:new ct(V.raw,ne);if(V instanceof Le)return new ct(V.value,ne);if(!(this instanceof ct))return new ct(V,ne);if(this.options=ne,this.loose=!!ne.loose,this.includePrerelease=!!ne.includePrerelease,this.raw=V,this.set=V.split(/\s*\|\|\s*/).map(function(ge){return this.parseRange(ge.trim())},this).filter(function(ge){return ge.length}),!this.set.length)throw new TypeError("Invalid SemVer Range: "+V);this.format()}function Ue(V,ne){for(var ge=!0,Z=V.slice(),Ae=Z.pop();ge&&Z.length;)ge=Z.every(function(at){return Ae.intersects(at,ne)}),Ae=Z.pop();return ge}function be(V){return!V||V.toLowerCase()==="x"||V==="*"}function At(V,ne,ge,Z,Ae,at,it,Ft,jt,hn,Un,Jt,Yt){return((ne=be(ge)?"":be(Z)?">="+ge+".0.0":be(Ae)?">="+ge+"."+Z+".0":">="+ne)+" "+(Ft=be(jt)?"":be(hn)?"<"+(+jt+1)+".0.0":be(Un)?"<"+jt+"."+(+hn+1)+".0":Jt?"<="+jt+"."+hn+"."+Un+"-"+Jt:"<="+Ft)).trim()}function Ot(V,ne,ge){for(var Z=0;Z0){var Ae=V[Z].semver;if(Ae.major===ne.major&&Ae.minor===ne.minor&&Ae.patch===ne.patch)return!0}return!1}return!0}function Nt(V,ne,ge){try{ne=new ct(ne,ge)}catch(Z){return!1}return ne.test(V)}function Je(V,ne,ge,Z){var Ae,at,it,Ft,jt;switch(V=new h(V,Z),ne=new ct(ne,Z),ge){case">":Ae=oe,at=Te,it=Se,Ft=">",jt=">=";break;case"<":Ae=Se,at=J,it=oe,Ft="<",jt="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Nt(V,ne,Z))return!1;for(var hn=0;hn=0.0.0")),Jt=Jt||cr,Yt=Yt||cr,Ae(cr.semver,Jt.semver,Z)?Jt=cr:it(cr.semver,Yt.semver,Z)&&(Yt=cr)}),Jt.operator===Ft||Jt.operator===jt||(!Yt.operator||Yt.operator===Ft)&&at(V,Yt.semver)||Yt.operator===jt&&it(V,Yt.semver))return!1}return!0}Le.prototype.parse=function(V){var ne=this.options.loose?A[D.COMPARATORLOOSE]:A[D.COMPARATOR],ge=V.match(ne);if(!ge)throw new TypeError("Invalid comparator: "+V);this.operator=ge[1]!==void 0?ge[1]:"",this.operator==="="&&(this.operator=""),ge[2]?this.semver=new h(ge[2],this.options.loose):this.semver=ot},Le.prototype.toString=function(){return this.value},Le.prototype.test=function(V){if(t("Comparator.test",V,this.options.loose),this.semver===ot||V===ot)return!0;if(typeof V=="string")try{V=new h(V,this.options)}catch(ne){return!1}return Oe(V,this.operator,this.semver,this.options)},Le.prototype.intersects=function(V,ne){if(!(V instanceof Le))throw new TypeError("a Comparator is required");var ge;if(ne&&g(ne)==="object"||(ne={loose:!!ne,includePrerelease:!1}),this.operator==="")return this.value===""||(ge=new ct(V.value,ne),Nt(this.value,ge,ne));if(V.operator==="")return V.value===""||(ge=new ct(this.value,ne),Nt(V.semver,ge,ne));var Z=!(this.operator!==">="&&this.operator!==">"||V.operator!==">="&&V.operator!==">"),Ae=!(this.operator!=="<="&&this.operator!=="<"||V.operator!=="<="&&V.operator!=="<"),at=this.semver.version===V.semver.version,it=!(this.operator!==">="&&this.operator!=="<="||V.operator!==">="&&V.operator!=="<="),Ft=Oe(this.semver,"<",V.semver,ne)&&(this.operator===">="||this.operator===">")&&(V.operator==="<="||V.operator==="<"),jt=Oe(this.semver,">",V.semver,ne)&&(this.operator==="<="||this.operator==="<")&&(V.operator===">="||V.operator===">");return Z||Ae||at&&it||Ft||jt},u.Range=ct,ct.prototype.format=function(){return this.range=this.set.map(function(V){return V.join(" ").trim()}).join("||").trim(),this.range},ct.prototype.toString=function(){return this.range},ct.prototype.parseRange=function(V){var ne=this.options.loose;V=V.trim();var ge=ne?A[D.HYPHENRANGELOOSE]:A[D.HYPHENRANGE];V=V.replace(ge,At),t("hyphen replace",V),V=V.replace(A[D.COMPARATORTRIM],"$1$2$3"),t("comparator trim",V,A[D.COMPARATORTRIM]),V=(V=(V=V.replace(A[D.TILDETRIM],"$1~")).replace(A[D.CARETTRIM],"$1^")).split(/\s+/).join(" ");var Z=ne?A[D.COMPARATORLOOSE]:A[D.COMPARATOR],Ae=V.split(" ").map(function(at){return function(it,Ft){return t("comp",it,Ft),it=function(jt,hn){return jt.trim().split(/\s+/).map(function(Un){return function(Jt,Yt){t("caret",Jt,Yt);var cr=Yt.loose?A[D.CARETLOOSE]:A[D.CARET];return Jt.replace(cr,function(w,pt,Mn,Bn,Xn){var vr;return t("caret",Jt,w,pt,Mn,Bn,Xn),be(pt)?vr="":be(Mn)?vr=">="+pt+".0.0 <"+(+pt+1)+".0.0":be(Bn)?vr=pt==="0"?">="+pt+"."+Mn+".0 <"+pt+"."+(+Mn+1)+".0":">="+pt+"."+Mn+".0 <"+(+pt+1)+".0.0":Xn?(t("replaceCaret pr",Xn),vr=pt==="0"?Mn==="0"?">="+pt+"."+Mn+"."+Bn+"-"+Xn+" <"+pt+"."+Mn+"."+(+Bn+1):">="+pt+"."+Mn+"."+Bn+"-"+Xn+" <"+pt+"."+(+Mn+1)+".0":">="+pt+"."+Mn+"."+Bn+"-"+Xn+" <"+(+pt+1)+".0.0"):(t("no pr"),vr=pt==="0"?Mn==="0"?">="+pt+"."+Mn+"."+Bn+" <"+pt+"."+Mn+"."+(+Bn+1):">="+pt+"."+Mn+"."+Bn+" <"+pt+"."+(+Mn+1)+".0":">="+pt+"."+Mn+"."+Bn+" <"+(+pt+1)+".0.0"),t("caret return",vr),vr})}(Un,hn)}).join(" ")}(it,Ft),t("caret",it),it=function(jt,hn){return jt.trim().split(/\s+/).map(function(Un){return function(Jt,Yt){var cr=Yt.loose?A[D.TILDELOOSE]:A[D.TILDE];return Jt.replace(cr,function(w,pt,Mn,Bn,Xn){var vr;return t("tilde",Jt,w,pt,Mn,Bn,Xn),be(pt)?vr="":be(Mn)?vr=">="+pt+".0.0 <"+(+pt+1)+".0.0":be(Bn)?vr=">="+pt+"."+Mn+".0 <"+pt+"."+(+Mn+1)+".0":Xn?(t("replaceTilde pr",Xn),vr=">="+pt+"."+Mn+"."+Bn+"-"+Xn+" <"+pt+"."+(+Mn+1)+".0"):vr=">="+pt+"."+Mn+"."+Bn+" <"+pt+"."+(+Mn+1)+".0",t("tilde return",vr),vr})}(Un,hn)}).join(" ")}(it,Ft),t("tildes",it),it=function(jt,hn){return t("replaceXRanges",jt,hn),jt.split(/\s+/).map(function(Un){return function(Jt,Yt){Jt=Jt.trim();var cr=Yt.loose?A[D.XRANGELOOSE]:A[D.XRANGE];return Jt.replace(cr,function(w,pt,Mn,Bn,Xn,vr){t("xRange",Jt,w,pt,Mn,Bn,Xn,vr);var gr=be(Mn),r0=gr||be(Bn),Ci=r0||be(Xn),yo=Ci;return pt==="="&&yo&&(pt=""),vr=Yt.includePrerelease?"-0":"",gr?w=pt===">"||pt==="<"?"<0.0.0-0":"*":pt&&yo?(r0&&(Bn=0),Xn=0,pt===">"?(pt=">=",r0?(Mn=+Mn+1,Bn=0,Xn=0):(Bn=+Bn+1,Xn=0)):pt==="<="&&(pt="<",r0?Mn=+Mn+1:Bn=+Bn+1),w=pt+Mn+"."+Bn+"."+Xn+vr):r0?w=">="+Mn+".0.0"+vr+" <"+(+Mn+1)+".0.0"+vr:Ci&&(w=">="+Mn+"."+Bn+".0"+vr+" <"+Mn+"."+(+Bn+1)+".0"+vr),t("xRange return",w),w})}(Un,hn)}).join(" ")}(it,Ft),t("xrange",it),it=function(jt,hn){return t("replaceStars",jt,hn),jt.trim().replace(A[D.STAR],"")}(it,Ft),t("stars",it),it}(at,this.options)},this).join(" ").split(/\s+/);return this.options.loose&&(Ae=Ae.filter(function(at){return!!at.match(Z)})),Ae=Ae.map(function(at){return new Le(at,this.options)},this)},ct.prototype.intersects=function(V,ne){if(!(V instanceof ct))throw new TypeError("a Range is required");return this.set.some(function(ge){return Ue(ge,ne)&&V.set.some(function(Z){return Ue(Z,ne)&&ge.every(function(Ae){return Z.every(function(at){return Ae.intersects(at,ne)})})})})},u.toComparators=function(V,ne){return new ct(V,ne).set.map(function(ge){return ge.map(function(Z){return Z.value}).join(" ").trim().split(" ")})},ct.prototype.test=function(V){if(!V)return!1;if(typeof V=="string")try{V=new h(V,this.options)}catch(ge){return!1}for(var ne=0;ne":at.prerelease.length===0?at.patch++:at.prerelease.push(0),at.raw=at.format();case"":case">=":ge&&!oe(ge,at)||(ge=at);break;case"<":case"<=":break;default:throw new Error("Unexpected operation: "+Ae.operator)}});return ge&&V.test(ge)?ge:null},u.validRange=function(V,ne){try{return new ct(V,ne).range||"*"}catch(ge){return null}},u.ltr=function(V,ne,ge){return Je(V,ne,"<",ge)},u.gtr=function(V,ne,ge){return Je(V,ne,">",ge)},u.outside=Je,u.prerelease=function(V,ne){var ge=$(V,ne);return ge&&ge.prerelease.length?ge.prerelease:null},u.intersects=function(V,ne,ge){return V=new ct(V,ge),ne=new ct(ne,ge),V.intersects(ne)},u.coerce=function(V,ne){if(V instanceof h)return V;if(typeof V=="number"&&(V=String(V)),typeof V!="string")return null;var ge=null;if((ne=ne||{}).rtl){for(var Z;(Z=A[D.COERCERTL].exec(V))&&(!ge||ge.index+ge[0].length!==V.length);)ge&&Z.index+Z[0].length===ge.index+ge[0].length||(ge=Z),A[D.COERCERTL].lastIndex=Z.index+Z[1].length+Z[2].length;A[D.COERCERTL].lastIndex=-1}else ge=V.match(A[D.COERCE]);return ge===null?null:$(ge[2]+"."+(ge[3]||"0")+"."+(ge[4]||"0"),ne)}}).call(this,f(5))},function(i,u){function f(g){return(f=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(g)}var c;c=function(){return this}();try{c=c||new Function("return this")()}catch(g){(typeof window=="undefined"?"undefined":f(window))==="object"&&(c=window)}i.exports=c},function(i,u){var f,c,g=i.exports={};function t(){throw new Error("setTimeout has not been defined")}function C(){throw new Error("clearTimeout has not been defined")}function A(ce){if(f===setTimeout)return setTimeout(ce,0);if((f===t||!f)&&setTimeout)return f=setTimeout,setTimeout(ce,0);try{return f(ce,0)}catch(Q){try{return f.call(null,ce,0)}catch(oe){return f.call(this,ce,0)}}}(function(){try{f=typeof setTimeout=="function"?setTimeout:t}catch(ce){f=t}try{c=typeof clearTimeout=="function"?clearTimeout:C}catch(ce){c=C}})();var x,D=[],L=!1,N=-1;function j(){L&&x&&(L=!1,x.length?D=x.concat(D):N=-1,D.length&&$())}function $(){if(!L){var ce=A(j);L=!0;for(var Q=D.length;Q;){for(x=D,D=[];++N1)for(var oe=1;oethis[C])return De(this,this[h].get(Ue)),!1;var Je=this[h].get(Ue).value;return this[N]&&(this[j]||this[N](Ue,Je.value)),Je.now=Ot,Je.maxAge=At,Je.value=be,this[A]+=Nt-Je.length,Je.length=Nt,this.get(Ue),me(this),!0}var V=new J(Ue,be,Nt,Ot,At);return V.length>this[C]?(this[N]&&this[N](Ue,be),!1):(this[A]+=V.length,this[$].unshift(V),this[h].set(Ue,this[$].head),me(this),!0)}},{key:"has",value:function(Ue){if(!this[h].has(Ue))return!1;var be=this[h].get(Ue).value;return!Se(this,be)}},{key:"get",value:function(Ue){return oe(this,Ue,!0)}},{key:"peek",value:function(Ue){return oe(this,Ue,!1)}},{key:"pop",value:function(){var Ue=this[$].tail;return Ue?(De(this,Ue),Ue.value):null}},{key:"del",value:function(Ue){De(this,this[h].get(Ue))}},{key:"load",value:function(Ue){this.reset();for(var be=Date.now(),At=Ue.length-1;At>=0;At--){var Ot=Ue[At],Nt=Ot.e||0;if(Nt===0)this.set(Ot.k,Ot.v);else{var Je=Nt-be;Je>0&&this.set(Ot.k,Ot.v,Je)}}}},{key:"prune",value:function(){var Ue=this;this[h].forEach(function(be,At){return oe(Ue,At,!1)})}},{key:"max",set:function(Ue){if(typeof Ue!="number"||Ue<0)throw new TypeError("max must be a non-negative number");this[C]=Ue||1/0,me(this)},get:function(){return this[C]}},{key:"allowStale",set:function(Ue){this[D]=!!Ue},get:function(){return this[D]}},{key:"maxAge",set:function(Ue){if(typeof Ue!="number")throw new TypeError("maxAge must be a non-negative number");this[L]=Ue,me(this)},get:function(){return this[L]}},{key:"lengthCalculator",set:function(Ue){var be=this;typeof Ue!="function"&&(Ue=ce),Ue!==this[x]&&(this[x]=Ue,this[A]=0,this[$].forEach(function(At){At.length=be[x](At.value,At.key),be[A]+=At.length})),me(this)},get:function(){return this[x]}},{key:"length",get:function(){return this[A]}},{key:"itemCount",get:function(){return this[$].length}}])&&g(Le.prototype,ot),ct&&g(Le,ct),Oe}(),oe=function(Oe,Le,ot){var ct=Oe[h].get(Le);if(ct){var Ue=ct.value;if(Se(Oe,Ue)){if(De(Oe,ct),!Oe[D])return}else ot&&(Oe[re]&&(ct.value.now=Date.now()),Oe[$].unshiftNode(ct));return Ue.value}},Se=function(Oe,Le){if(!Le||!Le.maxAge&&!Oe[L])return!1;var ot=Date.now()-Le.now;return Le.maxAge?ot>Le.maxAge:Oe[L]&&ot>Oe[L]},me=function(Oe){if(Oe[A]>Oe[C])for(var Le=Oe[$].tail;Oe[A]>Oe[C]&&Le!==null;){var ot=Le.prev;De(Oe,Le),Le=ot}},De=function(Oe,Le){if(Le){var ot=Le.value;Oe[N]&&Oe[N](ot.key,ot.value),Oe[A]-=ot.length,Oe[h].delete(ot.key),Oe[$].removeNode(Le)}},J=function Oe(Le,ot,ct,Ue,be){c(this,Oe),this.key=Le,this.value=ot,this.length=ct,this.now=Ue,this.maxAge=be||0},Te=function(Oe,Le,ot,ct){var Ue=ot.value;Se(Oe,Ue)&&(De(Oe,ot),Oe[D]||(Ue=void 0)),Ue&&Le.call(ct,Ue.value,Ue.key,Oe)};i.exports=Q},function(i,u,f){(function(c){function g(t){return(g=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(C){return typeof C}:function(C){return C&&typeof Symbol=="function"&&C.constructor===Symbol&&C!==Symbol.prototype?"symbol":typeof C})(t)}i.exports=function(){if(typeof document=="undefined"||!document.addEventListener)return null;var t,C,A,x={};return x.copy=function(){var D=!1,L=null,N=!1;function j(){D=!1,L=null,N&&window.getSelection().removeAllRanges(),N=!1}return document.addEventListener("copy",function($){if(D){for(var h in L)$.clipboardData.setData(h,L[h]);$.preventDefault()}}),function($){return new Promise(function(h,re){D=!0,typeof $=="string"?L={"text/plain":$}:$ instanceof Node?L={"text/html":new XMLSerializer().serializeToString($)}:$ instanceof Object?L=$:re("Invalid data type. Must be string, DOM node, or an object mapping MIME types to strings."),function ce(Q){try{if(document.execCommand("copy"))j(),h();else{if(Q)throw j(),new Error("Unable to copy. Perhaps it's not available in your browser?");(function(){var oe=document.getSelection();if(!document.queryCommandEnabled("copy")&&oe.isCollapsed){var Se=document.createRange();Se.selectNodeContents(document.body),oe.removeAllRanges(),oe.addRange(Se),N=!0}})(),ce(!0)}}catch(oe){j(),re(oe)}}(!1)})}}(),x.paste=(A=!1,document.addEventListener("paste",function(D){if(A){A=!1,D.preventDefault();var L=t;t=null,L(D.clipboardData.getData(C))}}),function(D){return new Promise(function(L,N){A=!0,t=L,C=D||"text/plain";try{document.execCommand("paste")||(A=!1,N(new Error("Unable to paste. Pasting only works in Internet Explorer at the moment.")))}catch(j){A=!1,N(new Error(j))}})}),typeof ClipboardEvent=="undefined"&&window.clipboardData!==void 0&&window.clipboardData.setData!==void 0&&(function(D){function L(me,De){return function(){me.apply(De,arguments)}}function N(me){if(g(this)!="object")throw new TypeError("Promises must be constructed via new");if(typeof me!="function")throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],Q(me,L($,this),L(h,this))}function j(me){var De=this;return this._state===null?void this._deferreds.push(me):void oe(function(){var J=De._state?me.onFulfilled:me.onRejected;if(J!==null){var Te;try{Te=J(De._value)}catch(Oe){return void me.reject(Oe)}me.resolve(Te)}else(De._state?me.resolve:me.reject)(De._value)})}function $(me){try{if(me===this)throw new TypeError("A promise cannot be resolved with itself.");if(me&&(g(me)=="object"||typeof me=="function")){var De=me.then;if(typeof De=="function")return void Q(L(De,me),L($,this),L(h,this))}this._state=!0,this._value=me,re.call(this)}catch(J){h.call(this,J)}}function h(me){this._state=!1,this._value=me,re.call(this)}function re(){for(var me=0,De=this._deferreds.length;De>me;me++)j.call(this,this._deferreds[me]);this._deferreds=null}function ce(me,De,J,Te){this.onFulfilled=typeof me=="function"?me:null,this.onRejected=typeof De=="function"?De:null,this.resolve=J,this.reject=Te}function Q(me,De,J){var Te=!1;try{me(function(Oe){Te||(Te=!0,De(Oe))},function(Oe){Te||(Te=!0,J(Oe))})}catch(Oe){if(Te)return;Te=!0,J(Oe)}}var oe=N.immediateFn||typeof c=="function"&&c||function(me){setTimeout(me,1)},Se=Array.isArray||function(me){return Object.prototype.toString.call(me)==="[object Array]"};N.prototype.catch=function(me){return this.then(null,me)},N.prototype.then=function(me,De){var J=this;return new N(function(Te,Oe){j.call(J,new ce(me,De,Te,Oe))})},N.all=function(){var me=Array.prototype.slice.call(arguments.length===1&&Se(arguments[0])?arguments[0]:arguments);return new N(function(De,J){function Te(ot,ct){try{if(ct&&(g(ct)=="object"||typeof ct=="function")){var Ue=ct.then;if(typeof Ue=="function")return void Ue.call(ct,function(be){Te(ot,be)},J)}me[ot]=ct,--Oe==0&&De(me)}catch(be){J(be)}}if(me.length===0)return De([]);for(var Oe=me.length,Le=0;LeTe;Te++)me[Te].then(De,J)})},i.exports?i.exports=N:D.Promise||(D.Promise=N)}(this),x.copy=function(D){return new Promise(function(L,N){if(typeof D!="string"&&!("text/plain"in D))throw new Error("You must provide a text/plain type.");var j=typeof D=="string"?D:D["text/plain"];window.clipboardData.setData("Text",j)?L():N(new Error("Copying was rejected."))})},x.paste=function(){return new Promise(function(D,L){var N=window.clipboardData.getData("Text");N?D(N):L(new Error("Pasting was rejected."))})}),x}()}).call(this,f(13).setImmediate)},function(i,u,f){"use strict";i.exports=f(15)},function(i,u,f){"use strict";f.r(u),u.default=`:root { - /** - * IMPORTANT: When new theme variables are added below\u2013 also add them to SettingsContext updateThemeVariables() - */ - - /* Light theme */ - --light-color-attribute-name: #ef6632; - --light-color-attribute-name-not-editable: #23272f; - --light-color-attribute-name-inverted: rgba(255, 255, 255, 0.7); - --light-color-attribute-value: #1a1aa6; - --light-color-attribute-value-inverted: #ffffff; - --light-color-attribute-editable-value: #1a1aa6; - --light-color-background: #ffffff; - --light-color-background-hover: rgba(0, 136, 250, 0.1); - --light-color-background-inactive: #e5e5e5; - --light-color-background-invalid: #fff0f0; - --light-color-background-selected: #0088fa; - --light-color-button-background: #ffffff; - --light-color-button-background-focus: #ededed; - --light-color-button: #5f6673; - --light-color-button-disabled: #cfd1d5; - --light-color-button-active: #0088fa; - --light-color-button-focus: #23272f; - --light-color-button-hover: #23272f; - --light-color-border: #eeeeee; - --light-color-commit-did-not-render-fill: #cfd1d5; - --light-color-commit-did-not-render-fill-text: #000000; - --light-color-commit-did-not-render-pattern: #cfd1d5; - --light-color-commit-did-not-render-pattern-text: #333333; - --light-color-commit-gradient-0: #37afa9; - --light-color-commit-gradient-1: #63b19e; - --light-color-commit-gradient-2: #80b393; - --light-color-commit-gradient-3: #97b488; - --light-color-commit-gradient-4: #abb67d; - --light-color-commit-gradient-5: #beb771; - --light-color-commit-gradient-6: #cfb965; - --light-color-commit-gradient-7: #dfba57; - --light-color-commit-gradient-8: #efbb49; - --light-color-commit-gradient-9: #febc38; - --light-color-commit-gradient-text: #000000; - --light-color-component-name: #6a51b2; - --light-color-component-name-inverted: #ffffff; - --light-color-component-badge-background: rgba(0, 0, 0, 0.1); - --light-color-component-badge-background-inverted: rgba(255, 255, 255, 0.25); - --light-color-component-badge-count: #777d88; - --light-color-component-badge-count-inverted: rgba(255, 255, 255, 0.7); - --light-color-context-background: rgba(0,0,0,.9); - --light-color-context-background-hover: rgba(255, 255, 255, 0.1); - --light-color-context-background-selected: #178fb9; - --light-color-context-border: #3d424a; - --light-color-context-text: #ffffff; - --light-color-context-text-selected: #ffffff; - --light-color-dim: #777d88; - --light-color-dimmer: #cfd1d5; - --light-color-dimmest: #eff0f1; - --light-color-error-background: hsl(0, 100%, 97%); - --light-color-error-border: hsl(0, 100%, 92%); - --light-color-error-text: #ff0000; - --light-color-expand-collapse-toggle: #777d88; - --light-color-link: #0000ff; - --light-color-modal-background: rgba(255, 255, 255, 0.75); - --light-color-record-active: #fc3a4b; - --light-color-record-hover: #3578e5; - --light-color-record-inactive: #0088fa; - --light-color-scroll-thumb: #c2c2c2; - --light-color-scroll-track: #fafafa; - --light-color-search-match: yellow; - --light-color-search-match-current: #f7923b; - --light-color-selected-tree-highlight-active: rgba(0, 136, 250, 0.1); - --light-color-selected-tree-highlight-inactive: rgba(0, 0, 0, 0.05); - --light-color-shadow: rgba(0, 0, 0, 0.25); - --light-color-tab-selected-border: #0088fa; - --light-color-text: #000000; - --light-color-text-invalid: #ff0000; - --light-color-text-selected: #ffffff; - --light-color-toggle-background-invalid: #fc3a4b; - --light-color-toggle-background-on: #0088fa; - --light-color-toggle-background-off: #cfd1d5; - --light-color-toggle-text: #ffffff; - --light-color-tooltip-background: rgba(0, 0, 0, 0.9); - --light-color-tooltip-text: #ffffff; - - /* Dark theme */ - --dark-color-attribute-name: #9d87d2; - --dark-color-attribute-name-not-editable: #ededed; - --dark-color-attribute-name-inverted: #282828; - --dark-color-attribute-value: #cedae0; - --dark-color-attribute-value-inverted: #ffffff; - --dark-color-attribute-editable-value: yellow; - --dark-color-background: #282c34; - --dark-color-background-hover: rgba(255, 255, 255, 0.1); - --dark-color-background-inactive: #3d424a; - --dark-color-background-invalid: #5c0000; - --dark-color-background-selected: #178fb9; - --dark-color-button-background: #282c34; - --dark-color-button-background-focus: #3d424a; - --dark-color-button: #afb3b9; - --dark-color-button-active: #61dafb; - --dark-color-button-disabled: #4f5766; - --dark-color-button-focus: #a2e9fc; - --dark-color-button-hover: #ededed; - --dark-color-border: #3d424a; - --dark-color-commit-did-not-render-fill: #777d88; - --dark-color-commit-did-not-render-fill-text: #000000; - --dark-color-commit-did-not-render-pattern: #666c77; - --dark-color-commit-did-not-render-pattern-text: #ffffff; - --dark-color-commit-gradient-0: #37afa9; - --dark-color-commit-gradient-1: #63b19e; - --dark-color-commit-gradient-2: #80b393; - --dark-color-commit-gradient-3: #97b488; - --dark-color-commit-gradient-4: #abb67d; - --dark-color-commit-gradient-5: #beb771; - --dark-color-commit-gradient-6: #cfb965; - --dark-color-commit-gradient-7: #dfba57; - --dark-color-commit-gradient-8: #efbb49; - --dark-color-commit-gradient-9: #febc38; - --dark-color-commit-gradient-text: #000000; - --dark-color-component-name: #61dafb; - --dark-color-component-name-inverted: #282828; - --dark-color-component-badge-background: rgba(255, 255, 255, 0.25); - --dark-color-component-badge-background-inverted: rgba(0, 0, 0, 0.25); - --dark-color-component-badge-count: #8f949d; - --dark-color-component-badge-count-inverted: rgba(255, 255, 255, 0.7); - --dark-color-context-background: rgba(255,255,255,.9); - --dark-color-context-background-hover: rgba(0, 136, 250, 0.1); - --dark-color-context-background-selected: #0088fa; - --dark-color-context-border: #eeeeee; - --dark-color-context-text: #000000; - --dark-color-context-text-selected: #ffffff; - --dark-color-dim: #8f949d; - --dark-color-dimmer: #777d88; - --dark-color-dimmest: #4f5766; - --dark-color-error-background: #200; - --dark-color-error-border: #900; - --dark-color-error-text: #f55; - --dark-color-expand-collapse-toggle: #8f949d; - --dark-color-link: #61dafb; - --dark-color-modal-background: rgba(0, 0, 0, 0.75); - --dark-color-record-active: #fc3a4b; - --dark-color-record-hover: #a2e9fc; - --dark-color-record-inactive: #61dafb; - --dark-color-scroll-thumb: #afb3b9; - --dark-color-scroll-track: #313640; - --dark-color-search-match: yellow; - --dark-color-search-match-current: #f7923b; - --dark-color-selected-tree-highlight-active: rgba(23, 143, 185, 0.15); - --dark-color-selected-tree-highlight-inactive: rgba(255, 255, 255, 0.05); - --dark-color-shadow: rgba(0, 0, 0, 0.5); - --dark-color-tab-selected-border: #178fb9; - --dark-color-text: #ffffff; - --dark-color-text-invalid: #ff8080; - --dark-color-text-selected: #ffffff; - --dark-color-toggle-background-invalid: #fc3a4b; - --dark-color-toggle-background-on: #178fb9; - --dark-color-toggle-background-off: #777d88; - --dark-color-toggle-text: #ffffff; - --dark-color-tooltip-background: rgba(255, 255, 255, 0.9); - --dark-color-tooltip-text: #000000; - - /* Font smoothing */ - --light-font-smoothing: auto; - --dark-font-smoothing: antialiased; - --font-smoothing: auto; - - /* Compact density */ - --compact-font-size-monospace-small: 9px; - --compact-font-size-monospace-normal: 11px; - --compact-font-size-monospace-large: 15px; - --compact-font-size-sans-small: 10px; - --compact-font-size-sans-normal: 12px; - --compact-font-size-sans-large: 14px; - --compact-line-height-data: 18px; - --compact-root-font-size: 16px; - - /* Comfortable density */ - --comfortable-font-size-monospace-small: 10px; - --comfortable-font-size-monospace-normal: 13px; - --comfortable-font-size-monospace-large: 17px; - --comfortable-font-size-sans-small: 12px; - --comfortable-font-size-sans-normal: 14px; - --comfortable-font-size-sans-large: 16px; - --comfortable-line-height-data: 22px; - --comfortable-root-font-size: 20px; - - /* GitHub.com system fonts */ - --font-family-monospace: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, - Courier, monospace; - --font-family-sans: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, - Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; - - /* Constant values shared between JS and CSS */ - --interaction-commit-size: 10px; - --interaction-label-width: 200px; -} -`},function(i,u,f){"use strict";function c(x){var D=this;if(D instanceof c||(D=new c),D.tail=null,D.head=null,D.length=0,x&&typeof x.forEach=="function")x.forEach(function(j){D.push(j)});else if(arguments.length>0)for(var L=0,N=arguments.length;L1)L=D;else{if(!this.head)throw new TypeError("Reduce of empty list with no initial value");N=this.head.next,L=this.head.value}for(var j=0;N!==null;j++)L=x(L,N.value,j),N=N.next;return L},c.prototype.reduceReverse=function(x,D){var L,N=this.tail;if(arguments.length>1)L=D;else{if(!this.tail)throw new TypeError("Reduce of empty list with no initial value");N=this.tail.prev,L=this.tail.value}for(var j=this.length-1;N!==null;j--)L=x(L,N.value,j),N=N.prev;return L},c.prototype.toArray=function(){for(var x=new Array(this.length),D=0,L=this.head;L!==null;D++)x[D]=L.value,L=L.next;return x},c.prototype.toArrayReverse=function(){for(var x=new Array(this.length),D=0,L=this.tail;L!==null;D++)x[D]=L.value,L=L.prev;return x},c.prototype.slice=function(x,D){(D=D||this.length)<0&&(D+=this.length),(x=x||0)<0&&(x+=this.length);var L=new c;if(Dthis.length&&(D=this.length);for(var N=0,j=this.head;j!==null&&Nthis.length&&(D=this.length);for(var N=this.length,j=this.tail;j!==null&&N>D;N--)j=j.prev;for(;j!==null&&N>x;N--,j=j.prev)L.push(j.value);return L},c.prototype.splice=function(x,D){x>this.length&&(x=this.length-1),x<0&&(x=this.length+x);for(var L=0,N=this.head;N!==null&&L=0&&(A._idleTimeoutId=setTimeout(function(){A._onTimeout&&A._onTimeout()},x))},f(14),u.setImmediate=typeof self!="undefined"&&self.setImmediate||c!==void 0&&c.setImmediate||this&&this.setImmediate,u.clearImmediate=typeof self!="undefined"&&self.clearImmediate||c!==void 0&&c.clearImmediate||this&&this.clearImmediate}).call(this,f(4))},function(i,u,f){(function(c,g){(function(t,C){"use strict";if(!t.setImmediate){var A,x,D,L,N,j=1,$={},h=!1,re=t.document,ce=Object.getPrototypeOf&&Object.getPrototypeOf(t);ce=ce&&ce.setTimeout?ce:t,{}.toString.call(t.process)==="[object process]"?A=function(Se){g.nextTick(function(){oe(Se)})}:function(){if(t.postMessage&&!t.importScripts){var Se=!0,me=t.onmessage;return t.onmessage=function(){Se=!1},t.postMessage("","*"),t.onmessage=me,Se}}()?(L="setImmediate$"+Math.random()+"$",N=function(Se){Se.source===t&&typeof Se.data=="string"&&Se.data.indexOf(L)===0&&oe(+Se.data.slice(L.length))},t.addEventListener?t.addEventListener("message",N,!1):t.attachEvent("onmessage",N),A=function(Se){t.postMessage(L+Se,"*")}):t.MessageChannel?((D=new MessageChannel).port1.onmessage=function(Se){oe(Se.data)},A=function(Se){D.port2.postMessage(Se)}):re&&"onreadystatechange"in re.createElement("script")?(x=re.documentElement,A=function(Se){var me=re.createElement("script");me.onreadystatechange=function(){oe(Se),me.onreadystatechange=null,x.removeChild(me),me=null},x.appendChild(me)}):A=function(Se){setTimeout(oe,0,Se)},ce.setImmediate=function(Se){typeof Se!="function"&&(Se=new Function(""+Se));for(var me=new Array(arguments.length-1),De=0;Dene;ne++)if((V=Q(Je,Ot,ne))!==-1){ce=ne,Ot=V;break e}Ot=-1}}e:{if(Je=Nt,(V=j().get(At.primitive))!==void 0){for(ne=0;neOt-Je?null:Nt.slice(Je,Ot-1))!==null){if(Ot=0,Le!==null){for(;OtOt;Le--)ot=Ue.pop()}for(Le=Nt.length-Ot-1;1<=Le;Le--)Ot=[],ot.push({id:null,isStateEditable:!1,name:Se(Nt[Le-1].functionName),value:void 0,subHooks:Ot}),Ue.push(ot),ot=Ot;Le=Nt}Ot=(Nt=At.primitive)==="Context"||Nt==="DebugValue"?null:ct++,ot.push({id:Ot,isStateEditable:Nt==="Reducer"||Nt==="State",name:Nt,value:At.value,subHooks:[]})}return function ge(Z,Ae){for(var at=[],it=0;it-1&&($=$.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(\),.*$)/g,""));var h=$.replace(/^\s+/,"").replace(/\(eval code/g,"("),re=h.match(/ (\((.+):(\d+):(\d+)\)$)/),ce=(h=re?h.replace(re[0],""):h).split(/\s+/).slice(1),Q=this.extractLocation(re?re[1]:ce.pop()),oe=ce.join(" ")||void 0,Se=["eval",""].indexOf(Q[0])>-1?void 0:Q[0];return new x({functionName:oe,fileName:Se,lineNumber:Q[1],columnNumber:Q[2],source:$})},this)},parseFFOrSafari:function(j){return j.stack.split(` -`).filter(function($){return!$.match(N)},this).map(function($){if($.indexOf(" > eval")>-1&&($=$.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),$.indexOf("@")===-1&&$.indexOf(":")===-1)return new x({functionName:$});var h=/((.*".+"[^@]*)?[^@]*)(?:@)/,re=$.match(h),ce=re&&re[1]?re[1]:void 0,Q=this.extractLocation($.replace(h,""));return new x({functionName:ce,fileName:Q[0],lineNumber:Q[1],columnNumber:Q[2],source:$})},this)},parseOpera:function(j){return!j.stacktrace||j.message.indexOf(` -`)>-1&&j.message.split(` -`).length>j.stacktrace.split(` -`).length?this.parseOpera9(j):j.stack?this.parseOpera11(j):this.parseOpera10(j)},parseOpera9:function(j){for(var $=/Line (\d+).*script (?:in )?(\S+)/i,h=j.message.split(` -`),re=[],ce=2,Q=h.length;ce/,"$2").replace(/\([^)]*\)/g,"")||void 0;Q.match(/\(([^)]*)\)/)&&(h=Q.replace(/^[^(]+\(([^)]*)\)$/,"$1"));var Se=h===void 0||h==="[arguments not available]"?void 0:h.split(",");return new x({functionName:oe,args:Se,fileName:ce[0],lineNumber:ce[1],columnNumber:ce[2],source:$})},this)}}})=="function"?c.apply(u,g):c)===void 0||(i.exports=t)})()},function(i,u,f){var c,g,t;(function(C,A){"use strict";g=[],(t=typeof(c=function(){function x(oe){return oe.charAt(0).toUpperCase()+oe.substring(1)}function D(oe){return function(){return this[oe]}}var L=["isConstructor","isEval","isNative","isToplevel"],N=["columnNumber","lineNumber"],j=["fileName","functionName","source"],$=L.concat(N,j,["args"]);function h(oe){if(oe)for(var Se=0;Se<$.length;Se++)oe[$[Se]]!==void 0&&this["set"+x($[Se])](oe[$[Se]])}h.prototype={getArgs:function(){return this.args},setArgs:function(oe){if(Object.prototype.toString.call(oe)!=="[object Array]")throw new TypeError("Args must be an Array");this.args=oe},getEvalOrigin:function(){return this.evalOrigin},setEvalOrigin:function(oe){if(oe instanceof h)this.evalOrigin=oe;else{if(!(oe instanceof Object))throw new TypeError("Eval Origin must be an Object or StackFrame");this.evalOrigin=new h(oe)}},toString:function(){var oe=this.getFileName()||"",Se=this.getLineNumber()||"",me=this.getColumnNumber()||"",De=this.getFunctionName()||"";return this.getIsEval()?oe?"[eval] ("+oe+":"+Se+":"+me+")":"[eval]:"+Se+":"+me:De?De+" ("+oe+":"+Se+":"+me+")":oe+":"+Se+":"+me}},h.fromString=function(oe){var Se=oe.indexOf("("),me=oe.lastIndexOf(")"),De=oe.substring(0,Se),J=oe.substring(Se+1,me).split(","),Te=oe.substring(me+1);if(Te.indexOf("@")===0)var Oe=/@(.+?)(?::(\d+))?(?::(\d+))?$/.exec(Te,""),Le=Oe[1],ot=Oe[2],ct=Oe[3];return new h({functionName:De,args:J||void 0,fileName:Le,lineNumber:ot||void 0,columnNumber:ct||void 0})};for(var re=0;re1?de-1:0),ve=1;ve=0&&de.splice(W,1)}}}])&&c(R.prototype,U),H&&c(R,H),F}(),t=f(2),C=f.n(t);try{var A=f(9).default,x=function(F){var R=new RegExp("".concat(F,": ([0-9]+)")),U=A.match(R);return parseInt(U[1],10)};x("comfortable-line-height-data"),x("compact-line-height-data")}catch(F){}function D(F){try{return sessionStorage.getItem(F)}catch(R){return null}}function L(F){try{sessionStorage.removeItem(F)}catch(R){}}function N(F,R){try{return sessionStorage.setItem(F,R)}catch(U){}}var j=function(F,R){return F===R},$=f(1),h=f.n($);function re(F){return F.ownerDocument?F.ownerDocument.defaultView:null}function ce(F){var R=re(F);return R?R.frameElement:null}function Q(F){var R=me(F);return oe([F.getBoundingClientRect(),{top:R.borderTop,left:R.borderLeft,bottom:R.borderBottom,right:R.borderRight,width:0,height:0}])}function oe(F){return F.reduce(function(R,U){return R==null?U:{top:R.top+U.top,left:R.left+U.left,width:R.width,height:R.height,bottom:R.bottom+U.bottom,right:R.right+U.right}})}function Se(F,R){var U=ce(F);if(U&&U!==R){for(var H=[F.getBoundingClientRect()],fe=U,ue=!1;fe;){var de=Q(fe);if(H.push(de),fe=ce(fe),ue)break;fe&&re(fe)===R&&(ue=!0)}return oe(H)}return F.getBoundingClientRect()}function me(F){var R=window.getComputedStyle(F);return{borderLeft:parseInt(R.borderLeftWidth,10),borderRight:parseInt(R.borderRightWidth,10),borderTop:parseInt(R.borderTopWidth,10),borderBottom:parseInt(R.borderBottomWidth,10),marginLeft:parseInt(R.marginLeft,10),marginRight:parseInt(R.marginRight,10),marginTop:parseInt(R.marginTop,10),marginBottom:parseInt(R.marginBottom,10),paddingLeft:parseInt(R.paddingLeft,10),paddingRight:parseInt(R.paddingRight,10),paddingTop:parseInt(R.paddingTop,10),paddingBottom:parseInt(R.paddingBottom,10)}}function De(F,R){var U;if(typeof Symbol=="undefined"||F[Symbol.iterator]==null){if(Array.isArray(F)||(U=function(ve,Fe){if(!!ve){if(typeof ve=="string")return J(ve,Fe);var Ge=Object.prototype.toString.call(ve).slice(8,-1);if(Ge==="Object"&&ve.constructor&&(Ge=ve.constructor.name),Ge==="Map"||Ge==="Set")return Array.from(ve);if(Ge==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(Ge))return J(ve,Fe)}}(F))||R&&F&&typeof F.length=="number"){U&&(F=U);var H=0,fe=function(){};return{s:fe,n:function(){return H>=F.length?{done:!0}:{done:!1,value:F[H++]}},e:function(ve){throw ve},f:fe}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ue,de=!0,W=!1;return{s:function(){U=F[Symbol.iterator]()},n:function(){var ve=U.next();return de=ve.done,ve},e:function(ve){W=!0,ue=ve},f:function(){try{de||U.return==null||U.return()}finally{if(W)throw ue}}}}function J(F,R){(R==null||R>F.length)&&(R=F.length);for(var U=0,H=new Array(R);Ude.left+de.width&&(K=de.left+de.width-Ge-5),{style:{top:ve+="px",left:K+="px"}}}(R,U,{width:H.width,height:H.height});h()(this.tip.style,fe.style)}}]),F}(),Ue=function(){function F(){Te(this,F);var R=window.__REACT_DEVTOOLS_TARGET_WINDOW__||window;this.window=R;var U=window.__REACT_DEVTOOLS_TARGET_WINDOW__||window;this.tipBoundsWindow=U;var H=R.document;this.container=H.createElement("div"),this.container.style.zIndex="10000000",this.tip=new ct(H,this.container),this.rects=[],H.body.appendChild(this.container)}return Le(F,[{key:"remove",value:function(){this.tip.remove(),this.rects.forEach(function(R){R.remove()}),this.rects.length=0,this.container.parentNode&&this.container.parentNode.removeChild(this.container)}},{key:"inspect",value:function(R,U){for(var H=this,fe=R.filter(function(Xe){return Xe.nodeType===Node.ELEMENT_NODE});this.rects.length>fe.length;)this.rects.pop().remove();if(fe.length!==0){for(;this.rects.length1&&arguments[1]!==void 0?arguments[1]:j,je=void 0,Xe=[],rt=void 0,st=!1,xt=function(lt,Rt){return xe(lt,Xe[Rt])},wt=function(){for(var lt=arguments.length,Rt=Array(lt),yn=0;yn5&&arguments[5]!==void 0?arguments[5]:0,W=cl(F);switch(W){case"html_element":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F.tagName,type:W};case"function":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:typeof F.name!="function"&&F.name?F.name:"function",type:W};case"string":return F.length<=500?F:F.slice(0,500)+"...";case"bigint":case"symbol":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F.toString(),type:W};case"react_element":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:al(F)||"Unknown",type:W};case"array_buffer":case"data_view":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:W==="data_view"?"DataView":"ArrayBuffer",size:F.byteLength,type:W};case"array":return ue=fe(H),de>=2&&!ue?yo(W,!0,F,R,H):F.map(function(Ge,K){return Ds(Ge,R,U,H.concat([K]),fe,ue?1:de+1)});case"html_all_collection":case"typed_array":case"iterator":if(ue=fe(H),de>=2&&!ue)return yo(W,!0,F,R,H);var ve={unserializable:!0,type:W,readonly:!0,size:W==="typed_array"?F.length:void 0,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F.constructor&&F.constructor.name!=="Object"?F.constructor.name:""};return r0(F[Symbol.iterator])&&Array.from(F).forEach(function(Ge,K){return ve[K]=Ds(Ge,R,U,H.concat([K]),fe,ue?1:de+1)}),U.push(H),ve;case"opaque_iterator":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F[Symbol.toStringTag],type:W};case"date":case"regexp":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F.toString(),type:W};case"object":if(ue=fe(H),de>=2&&!ue)return yo(W,!0,F,R,H);var Fe={};return Es(F).forEach(function(Ge){var K=Ge.toString();Fe[K]=Ds(F[Ge],R,U,H.concat([K]),fe,ue?1:de+1)}),Fe;case"infinity":case"nan":case"undefined":return R.push(H),{type:W};default:return F}}function Mu(F){return(Mu=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(R){return typeof R}:function(R){return R&&typeof Symbol=="function"&&R.constructor===Symbol&&R!==Symbol.prototype?"symbol":typeof R})(F)}function Gf(F){return function(R){if(Array.isArray(R))return iu(R)}(F)||function(R){if(typeof Symbol!="undefined"&&Symbol.iterator in Object(R))return Array.from(R)}(F)||function(R,U){if(!!R){if(typeof R=="string")return iu(R,U);var H=Object.prototype.toString.call(R).slice(8,-1);if(H==="Object"&&R.constructor&&(H=R.constructor.name),H==="Map"||H==="Set")return Array.from(R);if(H==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(H))return iu(R,U)}}(F)||function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function iu(F,R){(R==null||R>F.length)&&(R=F.length);for(var U=0,H=new Array(R);UR.toString()?1:R.toString()>F.toString()?-1:0}function Es(F){for(var R=[],U=F,H=function(){var fe=[].concat(Gf(Object.keys(U)),Gf(Object.getOwnPropertySymbols(U))),ue=Object.getOwnPropertyDescriptors(U);fe.forEach(function(de){ue[de].enumerable&&R.push(de)}),U=Object.getPrototypeOf(U)};U!=null;)H();return R}function Uo(F){var R=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"Anonymous",U=ou.get(F);if(U!=null)return U;var H=R;return typeof F.displayName=="string"?H=F.displayName:typeof F.name=="string"&&F.name!==""&&(H=F.name),ou.set(F,H),H}var sl=0;function Ss(){return++sl}function Cs(F){var R=ol.get(F);if(R!==void 0)return R;for(var U=new Array(F.length),H=0;H1&&arguments[1]!==void 0?arguments[1]:50;return F.length>R?F.substr(0,R)+"\u2026":F}function Mr(F,R){if(F!=null&&hasOwnProperty.call(F,Ci.type))return R?F[Ci.preview_long]:F[Ci.preview_short];switch(cl(F)){case"html_element":return"<".concat(Ui(F.tagName.toLowerCase())," />");case"function":return Ui("\u0192 ".concat(typeof F.name=="function"?"":F.name,"() {}"));case"string":return'"'.concat(F,'"');case"bigint":return Ui(F.toString()+"n");case"regexp":case"symbol":return Ui(F.toString());case"react_element":return"<".concat(Ui(al(F)||"Unknown")," />");case"array_buffer":return"ArrayBuffer(".concat(F.byteLength,")");case"data_view":return"DataView(".concat(F.buffer.byteLength,")");case"array":if(R){for(var U="",H=0;H0&&(U+=", "),!((U+=Mr(F[H],!1)).length>50));H++);return"[".concat(Ui(U),"]")}var fe=hasOwnProperty.call(F,Ci.size)?F[Ci.size]:F.length;return"Array(".concat(fe,")");case"typed_array":var ue="".concat(F.constructor.name,"(").concat(F.length,")");if(R){for(var de="",W=0;W0&&(de+=", "),!((de+=F[W]).length>50));W++);return"".concat(ue," [").concat(Ui(de),"]")}return ue;case"iterator":var ve=F.constructor.name;if(R){for(var Fe=Array.from(F),Ge="",K=0;K0&&(Ge+=", "),Array.isArray(xe)){var je=Mr(xe[0],!0),Xe=Mr(xe[1],!1);Ge+="".concat(je," => ").concat(Xe)}else Ge+=Mr(xe,!1);if(Ge.length>50)break}return"".concat(ve,"(").concat(F.size,") {").concat(Ui(Ge),"}")}return"".concat(ve,"(").concat(F.size,")");case"opaque_iterator":return F[Symbol.toStringTag];case"date":return F.toString();case"object":if(R){for(var rt=Es(F).sort(ul),st="",xt=0;xt0&&(st+=", "),(st+="".concat(wt.toString(),": ").concat(Mr(F[wt],!1))).length>50)break}return"{".concat(Ui(st),"}")}return"{\u2026}";case"boolean":case"number":case"infinity":case"nan":case"null":case"undefined":return F;default:try{return Ui(""+F)}catch(lt){return"unserializable"}}}var Ac=f(7);function of(F){return(of=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(R){return typeof R}:function(R){return R&&typeof Symbol=="function"&&R.constructor===Symbol&&R!==Symbol.prototype?"symbol":typeof R})(F)}function Ts(F,R){var U=Object.keys(F);if(Object.getOwnPropertySymbols){var H=Object.getOwnPropertySymbols(F);R&&(H=H.filter(function(fe){return Object.getOwnPropertyDescriptor(F,fe).enumerable})),U.push.apply(U,H)}return U}function xs(F){for(var R=1;R2&&arguments[2]!==void 0?arguments[2]:[];if(F!==null){var H=[],fe=[],ue=Ds(F,H,fe,U,R);return{data:ue,cleaned:H,unserializable:fe}}return null}function qo(F){var R,U,H=(R=F,U=new Set,JSON.stringify(R,function(de,W){if(of(W)==="object"&&W!==null){if(U.has(W))return;U.add(W)}return typeof W=="bigint"?W.toString()+"n":W})),fe=H===void 0?"undefined":H,ue=window.__REACT_DEVTOOLS_GLOBAL_HOOK__.clipboardCopyText;typeof ue=="function"?ue(fe).catch(function(de){}):Object(Ac.copy)(fe)}function kr(F,R){var U=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,H=R[U],fe=Array.isArray(F)?F.slice():xs({},F);return U+1===R.length?Array.isArray(fe)?fe.splice(H,1):delete fe[H]:fe[H]=kr(F[H],R,U+1),fe}function Fr(F,R,U){var H=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,fe=R[H],ue=Array.isArray(F)?F.slice():xs({},F);if(H+1===R.length){var de=U[H];ue[de]=ue[fe],Array.isArray(ue)?ue.splice(fe,1):delete ue[fe]}else ue[fe]=Fr(F[fe],R,U,H+1);return ue}function si(F,R,U){var H=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;if(H>=R.length)return U;var fe=R[H],ue=Array.isArray(F)?F.slice():xs({},F);return ue[fe]=si(F[fe],R,U,H+1),ue}var H0=f(8);function b0(F,R){var U=Object.keys(F);if(Object.getOwnPropertySymbols){var H=Object.getOwnPropertySymbols(F);R&&(H=H.filter(function(fe){return Object.getOwnPropertyDescriptor(F,fe).enumerable})),U.push.apply(U,H)}return U}function Bt(F){for(var R=1;R=F.length?{done:!0}:{done:!1,value:F[H++]}},e:function(ve){throw ve},f:fe}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ue,de=!0,W=!1;return{s:function(){U=F[Symbol.iterator]()},n:function(){var ve=U.next();return de=ve.done,ve},e:function(ve){W=!0,ue=ve},f:function(){try{de||U.return==null||U.return()}finally{if(W)throw ue}}}}function As(F,R){if(F){if(typeof F=="string")return uu(F,R);var U=Object.prototype.toString.call(F).slice(8,-1);return U==="Object"&&F.constructor&&(U=F.constructor.name),U==="Map"||U==="Set"?Array.from(F):U==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(U)?uu(F,R):void 0}}function uu(F,R){(R==null||R>F.length)&&(R=F.length);for(var U=0,H=new Array(R);U0){var et=ue(X);if(et!=null){var Dt,bt=ks(du);try{for(bt.s();!(Dt=bt.n()).done;)if(Dt.value.test(et))return!0}catch(fn){bt.e(fn)}finally{bt.f()}}}if(Y!=null&&Yu.size>0){var Zt,qt=Y.fileName,Ut=ks(Yu);try{for(Ut.s();!(Zt=Ut.n()).done;)if(Zt.value.test(qt))return!0}catch(fn){Ut.e(fn)}finally{Ut.f()}}return!1}function Gr(X){var Y=X.type;switch(X.tag){case Xe:case ar:return 1;case je:case rn:return 5;case wt:return 6;case lt:return 11;case yn:return 7;case Rt:case sn:case xt:return 9;case Hn:case Cr:return 8;case He:return 12;case Qe:return 13;default:switch(de(Y)){case 60111:case"Symbol(react.concurrent_mode)":case"Symbol(react.async_mode)":return 9;case 60109:case"Symbol(react.provider)":return 2;case 60110:case"Symbol(react.context)":return 2;case 60108:case"Symbol(react.strict_mode)":return 9;case 60114:case"Symbol(react.profiler)":return 10;default:return 9}}}function ir(X){if(Co.has(X))return X;var Y=X.alternate;return Y!=null&&Co.has(Y)?Y:(Co.add(X),X)}window.__REACT_DEVTOOLS_COMPONENT_FILTERS__!=null?qs(window.__REACT_DEVTOOLS_COMPONENT_FILTERS__):qs([{type:1,value:7,isEnabled:!0}]);var L0=new Map,Y0=new Map,Co=new Set,$u=new Map,Vo=new Map,Rr=-1;function Jn(X){if(!L0.has(X)){var Y=Ss();L0.set(X,Y),Y0.set(Y,X)}return L0.get(X)}function ai(X){switch(Gr(X)){case 1:if(N0!==null){var Y=Jn(ir(X)),ye=Vr(X);ye!==null&&N0.set(Y,ye)}}}var o0={};function Vr(X){switch(Gr(X)){case 1:var Y=X.stateNode,ye=o0,he=o0;return Y!=null&&(Y.constructor&&Y.constructor.contextType!=null?he=Y.context:(ye=Y.context)&&Object.keys(ye).length===0&&(ye=o0)),[ye,he];default:return null}}function ff(X){switch(Gr(X)){case 1:if(N0!==null){var Y=Jn(ir(X)),ye=N0.has(Y)?N0.get(Y):null,he=Vr(X);if(ye==null||he==null)return null;var We=Ru(ye,2),et=We[0],Dt=We[1],bt=Ru(he,2),Zt=bt[0],qt=bt[1];if(Zt!==o0)return $0(et,Zt);if(qt!==o0)return Dt!==qt}}return null}function cf(X,Y){if(X==null||Y==null)return!1;if(Y.hasOwnProperty("baseState")&&Y.hasOwnProperty("memoizedState")&&Y.hasOwnProperty("next")&&Y.hasOwnProperty("queue"))for(;Y!==null;){if(Y.memoizedState!==X.memoizedState)return!0;Y=Y.next,X=X.next}return!1}function $0(X,Y){if(X==null||Y==null||Y.hasOwnProperty("baseState")&&Y.hasOwnProperty("memoizedState")&&Y.hasOwnProperty("next")&&Y.hasOwnProperty("queue"))return null;var ye,he=[],We=ks(new Set([].concat(c0(Object.keys(X)),c0(Object.keys(Y)))));try{for(We.s();!(ye=We.n()).done;){var et=ye.value;X[et]!==Y[et]&&he.push(et)}}catch(Dt){We.e(Dt)}finally{We.f()}return he}function K0(X,Y){switch(Y.tag){case Xe:case je:case rt:case Hn:case Cr:return(zo(Y)&K)===K;default:return X.memoizedProps!==Y.memoizedProps||X.memoizedState!==Y.memoizedState||X.ref!==Y.ref}}var ae=[],Be=[],Ie=[],ht=[],mt=new Map,wn=0,Gn=null;function $t(X){ae.push(X)}function X0(X){if(ae.length!==0||Be.length!==0||Ie.length!==0||Gn!==null||u0){var Y=Be.length+Ie.length+(Gn===null?0:1),ye=new Array(3+wn+(Y>0?2+Y:0)+ae.length),he=0;if(ye[he++]=R,ye[he++]=Rr,ye[he++]=wn,mt.forEach(function(bt,Zt){ye[he++]=Zt.length;for(var qt=Cs(Zt),Ut=0;Ut0){ye[he++]=2,ye[he++]=Y;for(var We=Be.length-1;We>=0;We--)ye[he++]=Be[We];for(var et=0;et0?X.forEach(function(Y){F.emit("operations",Y)}):(Fn!==null&&(zr=!0),F.getFiberRoots(R).forEach(function(Y){T0(Rr=Jn(ir(Y.current)),Y.current),u0&&Y.memoizedInteractions!=null&&(uo={changeDescriptions:To?new Map:null,durations:[],commitTime:Os()-v0,interactions:Array.from(Y.memoizedInteractions).map(function(ye){return Bt(Bt({},ye),{},{timestamp:ye.timestamp-v0})}),maxActualDuration:0,priorityLevel:null}),$r(Y.current,null,!1,!1),X0(),Rr=-1}))},getBestMatchForTrackedPath:function(){if(Fn===null||pi===null)return null;for(var X=pi;X!==null&&F0(X);)X=X.return;return X===null?null:{id:Jn(ir(X)),isFullMatch:Br===Fn.length-1}},getDisplayNameForFiberID:function(X){var Y=Y0.get(X);return Y!=null?ue(Y):null},getFiberIDForNative:function(X){var Y=arguments.length>1&&arguments[1]!==void 0&&arguments[1],ye=U.findFiberByHostInstance(X);if(ye!=null){if(Y)for(;ye!==null&&F0(ye);)ye=ye.return;return Jn(ir(ye))}return null},getInstanceAndStyle:function(X){var Y=null,ye=null,he=J0(X);return he!==null&&(Y=he.stateNode,he.memoizedProps!==null&&(ye=he.memoizedProps.style)),{instance:Y,style:ye}},getOwnersList:function(X){var Y=J0(X);if(Y==null)return null;var ye=Y._debugOwner,he=[{displayName:ue(Y)||"Anonymous",id:X,type:Gr(Y)}];if(ye)for(var We=ye;We!==null;)he.unshift({displayName:ue(We)||"Anonymous",id:Jn(ir(We)),type:Gr(We)}),We=We._debugOwner||null;return he},getPathForElement:function(X){var Y=Y0.get(X);if(Y==null)return null;for(var ye=[];Y!==null;)ye.push(Ai(Y)),Y=Y.return;return ye.reverse(),ye},getProfilingData:function(){var X=[];if(pu===null)throw Error("getProfilingData() called before any profiling data was recorded");return pu.forEach(function(Y,ye){var he=[],We=[],et=new Map,Dt=new Map,bt=so!==null&&so.get(ye)||"Unknown";C0!=null&&C0.forEach(function(Zt,qt){di!=null&&di.get(qt)===ye&&We.push([qt,Zt])}),Y.forEach(function(Zt,qt){var Ut=Zt.changeDescriptions,fn=Zt.durations,_t=Zt.interactions,_r=Zt.maxActualDuration,Wr=Zt.priorityLevel,Ar=Zt.commitTime,z=[];_t.forEach(function(s0){et.has(s0.id)||et.set(s0.id,s0),z.push(s0.id);var t0=Dt.get(s0.id);t0!=null?t0.push(qt):Dt.set(s0.id,[qt])});for(var dr=[],Or=[],Qn=0;Qn1?kn.set(Ut,fn-1):kn.delete(Ut),wr.delete(Zt)}(Rr),Yr(ye,!1))}else T0(Rr,ye),$r(ye,null,!1,!1);if(u0&&We){var bt=pu.get(Rr);bt!=null?bt.push(uo):pu.set(Rr,[uo])}X0(),oo&&F.emit("traceUpdates",Hi),Rr=-1},handleCommitFiberUnmount:function(X){Yr(X,!1)},inspectElement:function(X,Y){if(Tr(X)){if(Y!=null){R0(Y);var ye=null;return Y[0]==="hooks"&&(ye="hooks"),{id:X,type:"hydrated-path",path:Y,value:qi(Ti(S0,Y),Nr(null,ye),Y)}}return{id:X,type:"no-change"}}if(El=!1,S0!==null&&S0.id===X||(Q0={}),(S0=af(X))===null)return{id:X,type:"not-found"};Y!=null&&R0(Y),function(We){var et=We.hooks,Dt=We.id,bt=We.props,Zt=Y0.get(Dt);if(Zt!=null){var qt=Zt.elementType,Ut=Zt.stateNode,fn=Zt.tag,_t=Zt.type;switch(fn){case Xe:case ar:case rn:H.$r=Ut;break;case je:H.$r={hooks:et,props:bt,type:_t};break;case wt:H.$r={props:bt,type:_t.render};break;case Hn:case Cr:H.$r={props:bt,type:qt!=null&&qt.type!=null?qt.type:_t};break;default:H.$r=null}}else console.warn('Could not find Fiber with id "'.concat(Dt,'"'))}(S0);var he=Bt({},S0);return he.context=qi(he.context,Nr("context",null)),he.hooks=qi(he.hooks,Nr("hooks","hooks")),he.props=qi(he.props,Nr("props",null)),he.state=qi(he.state,Nr("state",null)),{id:X,type:"full-data",value:he}},logElementToConsole:function(X){var Y=Tr(X)?S0:af(X);if(Y!==null){var ye=typeof console.groupCollapsed=="function";ye&&console.groupCollapsed("[Click to expand] %c<".concat(Y.displayName||"Component"," />"),"color: var(--dom-tag-name-color); font-weight: normal;"),Y.props!==null&&console.log("Props:",Y.props),Y.state!==null&&console.log("State:",Y.state),Y.hooks!==null&&console.log("Hooks:",Y.hooks);var he=zs(X);he!==null&&console.log("Nodes:",he),Y.source!==null&&console.log("Location:",Y.source),(window.chrome||/firefox/i.test(navigator.userAgent))&&console.log("Right-click any value to save it as a global variable for further inspection."),ye&&console.groupEnd()}else console.warn('Could not find Fiber with id "'.concat(X,'"'))},prepareViewAttributeSource:function(X,Y){Tr(X)&&(window.$attribute=Ti(S0,Y))},prepareViewElementSource:function(X){var Y=Y0.get(X);if(Y!=null){var ye=Y.elementType,he=Y.tag,We=Y.type;switch(he){case Xe:case ar:case rn:case je:H.$type=We;break;case wt:H.$type=We.render;break;case Hn:case Cr:H.$type=ye!=null&&ye.type!=null?ye.type:We;break;default:H.$type=null}}else console.warn('Could not find Fiber with id "'.concat(X,'"'))},overrideSuspense:function(X,Y){if(typeof Eo!="function"||typeof So!="function")throw new Error("Expected overrideSuspense() to not get called for earlier React versions.");Y?(B0.add(X),B0.size===1&&Eo(hu)):(B0.delete(X),B0.size===0&&Eo(Cl));var ye=Y0.get(X);ye!=null&&So(ye)},overrideValueAtPath:function(X,Y,ye,he,We){var et=J0(Y);if(et!==null){var Dt=et.stateNode;switch(X){case"context":switch(he=he.slice(1),et.tag){case Xe:he.length===0?Dt.context=We:fl(Dt.context,he,We),Dt.forceUpdate()}break;case"hooks":typeof p0=="function"&&p0(et,ye,he,We);break;case"props":switch(et.tag){case Xe:et.pendingProps=si(Dt.props,he,We),Dt.forceUpdate();break;default:typeof xi=="function"&&xi(et,he,We)}break;case"state":switch(et.tag){case Xe:fl(Dt.state,he,We),Dt.forceUpdate()}}}},renamePath:function(X,Y,ye,he,We){var et=J0(Y);if(et!==null){var Dt=et.stateNode;switch(X){case"context":switch(he=he.slice(1),We=We.slice(1),et.tag){case Xe:he.length===0||ll(Dt.context,he,We),Dt.forceUpdate()}break;case"hooks":typeof ci=="function"&&ci(et,ye,he,We);break;case"props":Dt===null?typeof qr=="function"&&qr(et,he,We):(et.pendingProps=Fr(Dt.props,he,We),Dt.forceUpdate());break;case"state":ll(Dt.state,he,We),Dt.forceUpdate()}}},renderer:U,setTraceUpdatesEnabled:function(X){oo=X},setTrackedPath:lo,startProfiling:Sl,stopProfiling:function(){u0=!1,To=!1},storeAsGlobal:function(X,Y,ye){if(Tr(X)){var he=Ti(S0,Y),We="$reactTemp".concat(ye);window[We]=he,console.log(We),console.log(he)}},updateComponentFilters:function(X){if(u0)throw Error("Cannot modify filter preferences while profiling");F.getFiberRoots(R).forEach(function(Y){Rr=Jn(ir(Y.current)),m0(Y.current),Yr(Y.current,!1),Rr=-1}),qs(X),kn.clear(),F.getFiberRoots(R).forEach(function(Y){T0(Rr=Jn(ir(Y.current)),Y.current),$r(Y.current,null,!1,!1),X0(Y),Rr=-1})}}}var _n;function Nu(F){return(Nu=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(R){return typeof R}:function(R){return R&&typeof Symbol=="function"&&R.constructor===Symbol&&R!==Symbol.prototype?"symbol":typeof R})(F)}function Wo(F,R,U){if(_n===void 0)try{throw Error()}catch(fe){var H=fe.stack.trim().match(/\n( *(at )?)/);_n=H&&H[1]||""}return` -`+_n+F}var su=!1;function Ps(F,R,U){if(!F||su)return"";var H,fe=Error.prepareStackTrace;Error.prepareStackTrace=void 0,su=!0;var ue=U.current;U.current=null;try{if(R){var de=function(){throw Error()};if(Object.defineProperty(de.prototype,"props",{set:function(){throw Error()}}),(typeof Reflect=="undefined"?"undefined":Nu(Reflect))==="object"&&Reflect.construct){try{Reflect.construct(de,[])}catch(xe){H=xe}Reflect.construct(F,[],de)}else{try{de.call()}catch(xe){H=xe}F.call(de.prototype)}}else{try{throw Error()}catch(xe){H=xe}F()}}catch(xe){if(xe&&H&&typeof xe.stack=="string"){for(var W=xe.stack.split(` -`),ve=H.stack.split(` -`),Fe=W.length-1,Ge=ve.length-1;Fe>=1&&Ge>=0&&W[Fe]!==ve[Ge];)Ge--;for(;Fe>=1&&Ge>=0;Fe--,Ge--)if(W[Fe]!==ve[Ge]){if(Fe!==1||Ge!==1)do if(Fe--,--Ge<0||W[Fe]!==ve[Ge])return` -`+W[Fe].replace(" at new "," at ");while(Fe>=1&&Ge>=0);break}}}finally{su=!1,Error.prepareStackTrace=fe,U.current=ue}var K=F?F.displayName||F.name:"";return K?Wo(K):""}function pl(F,R,U,H){return Ps(F,!1,H)}function Vf(F,R,U){var H=F.HostComponent,fe=F.LazyComponent,ue=F.SuspenseComponent,de=F.SuspenseListComponent,W=F.FunctionComponent,ve=F.IndeterminateComponent,Fe=F.SimpleMemoComponent,Ge=F.ForwardRef,K=F.Block,xe=F.ClassComponent;switch(R.tag){case H:return Wo(R.type);case fe:return Wo("Lazy");case ue:return Wo("Suspense");case de:return Wo("SuspenseList");case W:case ve:case Fe:return pl(R.type,0,0,U);case Ge:return pl(R.type.render,0,0,U);case K:return pl(R.type._render,0,0,U);case xe:return function(je,Xe,rt,st){return Ps(je,!0,st)}(R.type,0,0,U);default:return""}}function hl(F,R,U){try{var H="",fe=R;do H+=Vf(F,fe,U),fe=fe.return;while(fe);return H}catch(ue){return` -Error generating stack: `+ue.message+` -`+ue.stack}}function Bu(F,R){var U;if(typeof Symbol=="undefined"||F[Symbol.iterator]==null){if(Array.isArray(F)||(U=function(ve,Fe){if(!!ve){if(typeof ve=="string")return ju(ve,Fe);var Ge=Object.prototype.toString.call(ve).slice(8,-1);if(Ge==="Object"&&ve.constructor&&(Ge=ve.constructor.name),Ge==="Map"||Ge==="Set")return Array.from(ve);if(Ge==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(Ge))return ju(ve,Fe)}}(F))||R&&F&&typeof F.length=="number"){U&&(F=U);var H=0,fe=function(){};return{s:fe,n:function(){return H>=F.length?{done:!0}:{done:!1,value:F[H++]}},e:function(ve){throw ve},f:fe}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ue,de=!0,W=!1;return{s:function(){U=F[Symbol.iterator]()},n:function(){var ve=U.next();return de=ve.done,ve},e:function(ve){W=!0,ue=ve},f:function(){try{de||U.return==null||U.return()}finally{if(W)throw ue}}}}function ju(F,R){(R==null||R>F.length)&&(R=F.length);for(var U=0,H=new Array(R);U0?Fe[Fe.length-1]:null,xe=K!==null&&(ro.test(K)||Ms.test(K));if(!xe){var je,Xe=Bu(ml.values());try{for(Xe.s();!(je=Xe.n()).done;){var rt=je.value,st=rt.currentDispatcherRef,xt=rt.getCurrentFiber,wt=rt.workTagMap,lt=xt();if(lt!=null){var Rt=hl(wt,lt,st);Rt!==""&&Fe.push(Rt);break}}}catch(yn){Xe.e(yn)}finally{Xe.f()}}}catch(yn){}ue.apply(void 0,Fe)};de.__REACT_DEVTOOLS_ORIGINAL_METHOD__=ue,Uu[fe]=de}catch(W){}})}}function O0(F){return(O0=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(R){return typeof R}:function(R){return R&&typeof Symbol=="function"&&R.constructor===Symbol&&R!==Symbol.prototype?"symbol":typeof R})(F)}function vl(F,R){for(var U=0;UF.length)&&(R=F.length);for(var U=0,H=new Array(R);U1?W-1:0),Fe=1;Fe0?K[K.length-1]:0),K.push(St),W.set(Ne,Fe(ft._topLevelWrapper));try{var Qt=He.apply(this,Qe);return K.pop(),Qt}catch(bn){throw K=[],bn}finally{if(K.length===0){var Cn=W.get(Ne);if(Cn===void 0)throw new Error("Expected to find root ID.");yn(Cn)}}},performUpdateIfNecessary:function(He,Qe){var Ne=Qe[0];if(P0(Ne)===9)return He.apply(this,Qe);var ft=Fe(Ne);K.push(ft);var St=ln(Ne);try{var Qt=He.apply(this,Qe),Cn=ln(Ne);return Ge(St,Cn)||Xe(Ne,ft,Cn),K.pop(),Qt}catch(p0){throw K=[],p0}finally{if(K.length===0){var bn=W.get(Ne);if(bn===void 0)throw new Error("Expected to find root ID.");yn(bn)}}},receiveComponent:function(He,Qe){var Ne=Qe[0];if(P0(Ne)===9)return He.apply(this,Qe);var ft=Fe(Ne);K.push(ft);var St=ln(Ne);try{var Qt=He.apply(this,Qe),Cn=ln(Ne);return Ge(St,Cn)||Xe(Ne,ft,Cn),K.pop(),Qt}catch(p0){throw K=[],p0}finally{if(K.length===0){var bn=W.get(Ne);if(bn===void 0)throw new Error("Expected to find root ID.");yn(bn)}}},unmountComponent:function(He,Qe){var Ne=Qe[0];if(P0(Ne)===9)return He.apply(this,Qe);var ft=Fe(Ne);K.push(ft);try{var St=He.apply(this,Qe);return K.pop(),function(Cn,bn){wt.push(bn),ue.delete(bn)}(0,ft),St}catch(Cn){throw K=[],Cn}finally{if(K.length===0){var Qt=W.get(Ne);if(Qt===void 0)throw new Error("Expected to find root ID.");yn(Qt)}}}}));var st=[],xt=new Map,wt=[],lt=0,Rt=null;function yn(He){if(st.length!==0||wt.length!==0||Rt!==null){var Qe=wt.length+(Rt===null?0:1),Ne=new Array(3+lt+(Qe>0?2+Qe:0)+st.length),ft=0;if(Ne[ft++]=R,Ne[ft++]=He,Ne[ft++]=lt,xt.forEach(function(Cn,bn){Ne[ft++]=bn.length;for(var p0=Cs(bn),h0=0;h00){Ne[ft++]=2,Ne[ft++]=Qe;for(var St=0;St"),"color: var(--dom-tag-name-color); font-weight: normal;"),Qe.props!==null&&console.log("Props:",Qe.props),Qe.state!==null&&console.log("State:",Qe.state),Qe.context!==null&&console.log("Context:",Qe.context);var ft=fe(He);ft!==null&&console.log("Node:",ft),(window.chrome||/firefox/i.test(navigator.userAgent))&&console.log("Right-click any value to save it as a global variable for further inspection."),Ne&&console.groupEnd()}else console.warn('Could not find element with id "'.concat(He,'"'))},overrideSuspense:function(){throw new Error("overrideSuspense not supported by this renderer")},overrideValueAtPath:function(He,Qe,Ne,ft,St){var Qt=ue.get(Qe);if(Qt!=null){var Cn=Qt._instance;if(Cn!=null)switch(He){case"context":fl(Cn.context,ft,St),a0(Cn);break;case"hooks":throw new Error("Hooks not supported by this renderer");case"props":var bn=Qt._currentElement;Qt._currentElement=V0(V0({},bn),{},{props:si(bn.props,ft,St)}),a0(Cn);break;case"state":fl(Cn.state,ft,St),a0(Cn)}}},renamePath:function(He,Qe,Ne,ft,St){var Qt=ue.get(Qe);if(Qt!=null){var Cn=Qt._instance;if(Cn!=null)switch(He){case"context":ll(Cn.context,ft,St),a0(Cn);break;case"hooks":throw new Error("Hooks not supported by this renderer");case"props":var bn=Qt._currentElement;Qt._currentElement=V0(V0({},bn),{},{props:Fr(bn.props,ft,St)}),a0(Cn);break;case"state":ll(Cn.state,ft,St),a0(Cn)}}},prepareViewAttributeSource:function(He,Qe){var Ne=Cr(He);Ne!==null&&(window.$attribute=Ti(Ne,Qe))},prepareViewElementSource:function(He){var Qe=ue.get(He);if(Qe!=null){var Ne=Qe._currentElement;Ne!=null?H.$type=Ne.type:console.warn('Could not find element with id "'.concat(He,'"'))}else console.warn('Could not find instance with id "'.concat(He,'"'))},renderer:U,setTraceUpdatesEnabled:function(He){},setTrackedPath:function(He){},startProfiling:function(){},stopProfiling:function(){},storeAsGlobal:function(He,Qe,Ne){var ft=Cr(He);if(ft!==null){var St=Ti(ft,Qe),Qt="$reactTemp".concat(Ne);window[Qt]=St,console.log(Qt),console.log(St)}},updateComponentFilters:function(He){}}}function nr(F,R){var U=!1,H={bottom:0,left:0,right:0,top:0},fe=R[F];if(fe!=null){for(var ue=0,de=Object.keys(H);ue0?"development":"production";var st=Function.prototype.toString;if(rt.Mount&&rt.Mount._renderNewRootComponent){var xt=st.call(rt.Mount._renderNewRootComponent);return xt.indexOf("function")!==0?"production":xt.indexOf("storedMeasure")!==-1?"development":xt.indexOf("should be a pure function")!==-1?xt.indexOf("NODE_ENV")!==-1||xt.indexOf("development")!==-1||xt.indexOf("true")!==-1?"development":xt.indexOf("nextElement")!==-1||xt.indexOf("nextComponent")!==-1?"unminified":"development":xt.indexOf("nextElement")!==-1||xt.indexOf("nextComponent")!==-1?"unminified":"outdated"}}catch(wt){}return"production"}(ve);try{var K=window.__REACT_DEVTOOLS_APPEND_COMPONENT_STACK__!==!1,xe=window.__REACT_DEVTOOLS_BREAK_ON_CONSOLE_ERRORS__===!0;(K||xe)&&(zi(ve),Ho({appendComponentStack:K,breakOnConsoleErrors:xe}))}catch(rt){}var je=F.__REACT_DEVTOOLS_ATTACH__;if(typeof je=="function"){var Xe=je(W,Fe,ve,F);W.rendererInterfaces.set(Fe,Xe)}return W.emit("renderer",{id:Fe,renderer:ve,reactBuildType:Ge}),Fe},on:function(ve,Fe){ue[ve]||(ue[ve]=[]),ue[ve].push(Fe)},off:function(ve,Fe){if(ue[ve]){var Ge=ue[ve].indexOf(Fe);Ge!==-1&&ue[ve].splice(Ge,1),ue[ve].length||delete ue[ve]}},sub:function(ve,Fe){return W.on(ve,Fe),function(){return W.off(ve,Fe)}},supportsFiber:!0,checkDCE:function(ve){try{Function.prototype.toString.call(ve).indexOf("^_^")>-1&&(U=!0,setTimeout(function(){throw new Error("React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build")}))}catch(Fe){}},onCommitFiberUnmount:function(ve,Fe){var Ge=fe.get(ve);Ge!=null&&Ge.handleCommitFiberUnmount(Fe)},onCommitFiberRoot:function(ve,Fe,Ge){var K=W.getFiberRoots(ve),xe=Fe.current,je=K.has(Fe),Xe=xe.memoizedState==null||xe.memoizedState.element==null;je||Xe?je&&Xe&&K.delete(Fe):K.add(Fe);var rt=fe.get(ve);rt!=null&&rt.handleCommitFiberRoot(Fe,Ge)}};Object.defineProperty(F,"__REACT_DEVTOOLS_GLOBAL_HOOK__",{configurable:!1,enumerable:!1,get:function(){return W}})})(window);var M0=window.__REACT_DEVTOOLS_GLOBAL_HOOK__,au=[{type:1,value:7,isEnabled:!0}];function Lr(F){if(M0!=null){var R=F||{},U=R.host,H=U===void 0?"localhost":U,fe=R.nativeStyleEditorValidAttributes,ue=R.useHttps,de=ue!==void 0&&ue,W=R.port,ve=W===void 0?8097:W,Fe=R.websocket,Ge=R.resolveRNStyle,K=Ge===void 0?null:Ge,xe=R.isAppActive,je=de?"wss":"ws",Xe=null;if((xe===void 0?function(){return!0}:xe)()){var rt=null,st=[],xt=je+"://"+H+":"+ve,wt=Fe||new window.WebSocket(xt);wt.onclose=function(){rt!==null&&rt.emit("shutdown"),lt()},wt.onerror=function(){lt()},wt.onmessage=function(Rt){var yn;try{if(typeof Rt.data!="string")throw Error();yn=JSON.parse(Rt.data)}catch(sn){return void console.error("[React DevTools] Failed to parse JSON: "+Rt.data)}st.forEach(function(sn){try{sn(yn)}catch(ar){throw console.log("[React DevTools] Error calling listener",yn),console.log("error:",ar),ar}})},wt.onopen=function(){(rt=new Do({listen:function(rn){return st.push(rn),function(){var Hn=st.indexOf(rn);Hn>=0&&st.splice(Hn,1)}},send:function(rn,Hn,d0){wt.readyState===wt.OPEN?wt.send(JSON.stringify({event:rn,payload:Hn})):(rt!==null&&rt.shutdown(),lt())}})).addListener("inspectElement",function(rn){var Hn=rn.id,d0=rn.rendererID,Cr=Rt.rendererInterfaces[d0];if(Cr!=null){var He=Cr.findNativeNodesForFiberID(Hn);He!=null&&He[0]!=null&&Rt.emit("showNativeHighlight",He[0])}}),rt.addListener("updateComponentFilters",function(rn){au=rn}),window.__REACT_DEVTOOLS_COMPONENT_FILTERS__==null&&rt.send("overrideComponentFilters",au);var Rt=new I0(rt);if(Rt.addListener("shutdown",function(){M0.emit("shutdown")}),function(rn,Hn,d0){if(rn==null)return function(){};var Cr=[rn.sub("renderer-attached",function(Ne){var ft=Ne.id,St=(Ne.renderer,Ne.rendererInterface);Hn.setRendererInterface(ft,St),St.flushInitialOperations()}),rn.sub("unsupported-renderer-version",function(Ne){Hn.onUnsupportedRenderer(Ne)}),rn.sub("operations",Hn.onHookOperations),rn.sub("traceUpdates",Hn.onTraceUpdates)],He=function(Ne,ft){var St=rn.rendererInterfaces.get(Ne);St==null&&(typeof ft.findFiberByHostInstance=="function"?St=uf(rn,Ne,ft,d0):ft.ComponentTree&&(St=lf(rn,Ne,ft,d0)),St!=null&&rn.rendererInterfaces.set(Ne,St)),St!=null?rn.emit("renderer-attached",{id:Ne,renderer:ft,rendererInterface:St}):rn.emit("unsupported-renderer-version",Ne)};rn.renderers.forEach(function(Ne,ft){He(ft,Ne)}),Cr.push(rn.sub("renderer",function(Ne){var ft=Ne.id,St=Ne.renderer;He(ft,St)})),rn.emit("react-devtools",Hn),rn.reactDevtoolsAgent=Hn;var Qe=function(){Cr.forEach(function(Ne){return Ne()}),rn.rendererInterfaces.forEach(function(Ne){Ne.cleanup()}),rn.reactDevtoolsAgent=null};Hn.addListener("shutdown",Qe),Cr.push(function(){Hn.removeListener("shutdown",Qe)})}(M0,Rt,window),K!=null||M0.resolveRNStyle!=null)Gu(rt,Rt,K||M0.resolveRNStyle,fe||M0.nativeStyleEditorValidAttributes||null);else{var yn,sn,ar=function(){rt!==null&&Gu(rt,Rt,yn,sn)};M0.hasOwnProperty("resolveRNStyle")||Object.defineProperty(M0,"resolveRNStyle",{enumerable:!1,get:function(){return yn},set:function(rn){yn=rn,ar()}}),M0.hasOwnProperty("nativeStyleEditorValidAttributes")||Object.defineProperty(M0,"nativeStyleEditorValidAttributes",{enumerable:!1,get:function(){return sn},set:function(rn){sn=rn,ar()}})}}}else lt()}function lt(){Xe===null&&(Xe=setTimeout(function(){return Lr(F)},2e3))}}}])})});var rS=Me(nS=>{"use strict";Object.defineProperty(nS,"__esModule",{value:!0});eS();var _j=tS();_j.connectToDevTools()});var lS=Me(x2=>{"use strict";var iS=x2&&x2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(x2,"__esModule",{value:!0});var oS=Ay(),yj=iS(lE()),uS=iS(hc()),no=Xy();process.env.DEV==="true"&&rS();var sS=i=>{i==null||i.unsetMeasureFunc(),i==null||i.freeRecursive()};x2.default=yj.default({schedulePassiveEffects:oS.unstable_scheduleCallback,cancelPassiveEffects:oS.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>{},resetAfterCommit:i=>{if(i.isStaticDirty){i.isStaticDirty=!1,typeof i.onImmediateRender=="function"&&i.onImmediateRender();return}typeof i.onRender=="function"&&i.onRender()},getChildHostContext:(i,u)=>{let f=i.isInsideText,c=u==="ink-text"||u==="ink-virtual-text";return f===c?i:{isInsideText:c}},shouldSetTextContent:()=>!1,createInstance:(i,u,f,c)=>{if(c.isInsideText&&i==="ink-box")throw new Error(" can\u2019t be nested inside component");let g=i==="ink-text"&&c.isInsideText?"ink-virtual-text":i,t=no.createNode(g);for(let[C,A]of Object.entries(u))C!=="children"&&(C==="style"?no.setStyle(t,A):C==="internal_transform"?t.internal_transform=A:C==="internal_static"?t.internal_static=!0:no.setAttribute(t,C,A));return t},createTextInstance:(i,u,f)=>{if(!f.isInsideText)throw new Error(`Text string "${i}" must be rendered inside component`);return no.createTextNode(i)},resetTextContent:()=>{},hideTextInstance:i=>{no.setTextNodeValue(i,"")},unhideTextInstance:(i,u)=>{no.setTextNodeValue(i,u)},getPublicInstance:i=>i,hideInstance:i=>{var u;(u=i.yogaNode)===null||u===void 0||u.setDisplay(uS.default.DISPLAY_NONE)},unhideInstance:i=>{var u;(u=i.yogaNode)===null||u===void 0||u.setDisplay(uS.default.DISPLAY_FLEX)},appendInitialChild:no.appendChildNode,appendChild:no.appendChildNode,insertBefore:no.insertBeforeNode,finalizeInitialChildren:(i,u,f,c)=>(i.internal_static&&(c.isStaticDirty=!0,c.staticNode=i),!1),supportsMutation:!0,appendChildToContainer:no.appendChildNode,insertInContainerBefore:no.insertBeforeNode,removeChildFromContainer:(i,u)=>{no.removeChildNode(i,u),sS(u.yogaNode)},prepareUpdate:(i,u,f,c,g)=>{i.internal_static&&(g.isStaticDirty=!0);let t={},C=Object.keys(c);for(let A of C)if(c[A]!==f[A]){if(A==="style"&&typeof c.style=="object"&&typeof f.style=="object"){let D=c.style,L=f.style,N=Object.keys(D);for(let j of N){if(j==="borderStyle"||j==="borderColor"){if(typeof t.style!="object"){let $={};t.style=$}t.style.borderStyle=D.borderStyle,t.style.borderColor=D.borderColor}if(D[j]!==L[j]){if(typeof t.style!="object"){let $={};t.style=$}t.style[j]=D[j]}}continue}t[A]=c[A]}return t},commitUpdate:(i,u)=>{for(let[f,c]of Object.entries(u))f!=="children"&&(f==="style"?no.setStyle(i,c):f==="internal_transform"?i.internal_transform=c:f==="internal_static"?i.internal_static=!0:no.setAttribute(i,f,c))},commitTextUpdate:(i,u,f)=>{no.setTextNodeValue(i,f)},removeChild:(i,u)=>{no.removeChildNode(i,u),sS(u.yogaNode)}})});var cS=Me((Jb,fS)=>{"use strict";fS.exports=(i,u=1,f)=>{if(f=dt({indent:" ",includeEmptyLines:!1},f),typeof i!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof i}\``);if(typeof u!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof u}\``);if(typeof f.indent!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof f.indent}\``);if(u===0)return i;let c=f.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return i.replace(c,f.indent.repeat(u))}});var aS=Me(k2=>{"use strict";var wj=k2&&k2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(k2,"__esModule",{value:!0});var Vh=wj(hc());k2.default=i=>i.getComputedWidth()-i.getComputedPadding(Vh.default.EDGE_LEFT)-i.getComputedPadding(Vh.default.EDGE_RIGHT)-i.getComputedBorder(Vh.default.EDGE_LEFT)-i.getComputedBorder(Vh.default.EDGE_RIGHT)});var pS=Me((Zb,dS)=>{dS.exports={single:{topLeft:"\u250C",topRight:"\u2510",bottomRight:"\u2518",bottomLeft:"\u2514",vertical:"\u2502",horizontal:"\u2500"},double:{topLeft:"\u2554",topRight:"\u2557",bottomRight:"\u255D",bottomLeft:"\u255A",vertical:"\u2551",horizontal:"\u2550"},round:{topLeft:"\u256D",topRight:"\u256E",bottomRight:"\u256F",bottomLeft:"\u2570",vertical:"\u2502",horizontal:"\u2500"},bold:{topLeft:"\u250F",topRight:"\u2513",bottomRight:"\u251B",bottomLeft:"\u2517",vertical:"\u2503",horizontal:"\u2501"},singleDouble:{topLeft:"\u2553",topRight:"\u2556",bottomRight:"\u255C",bottomLeft:"\u2559",vertical:"\u2551",horizontal:"\u2500"},doubleSingle:{topLeft:"\u2552",topRight:"\u2555",bottomRight:"\u255B",bottomLeft:"\u2558",vertical:"\u2502",horizontal:"\u2550"},classic:{topLeft:"+",topRight:"+",bottomRight:"+",bottomLeft:"+",vertical:"|",horizontal:"-"}}});var mS=Me((eG,m3)=>{"use strict";var hS=pS();m3.exports=hS;m3.exports.default=hS});var gS=Me((tG,vS)=>{"use strict";vS.exports=(i,u=process.argv)=>{let f=i.startsWith("-")?"":i.length===1?"-":"--",c=u.indexOf(f+i),g=u.indexOf("--");return c!==-1&&(g===-1||c{"use strict";var Dj=require("os"),yS=require("tty"),Pu=gS(),{env:oi}=process,qf;Pu("no-color")||Pu("no-colors")||Pu("color=false")||Pu("color=never")?qf=0:(Pu("color")||Pu("colors")||Pu("color=true")||Pu("color=always"))&&(qf=1);"FORCE_COLOR"in oi&&(oi.FORCE_COLOR==="true"?qf=1:oi.FORCE_COLOR==="false"?qf=0:qf=oi.FORCE_COLOR.length===0?1:Math.min(parseInt(oi.FORCE_COLOR,10),3));function v3(i){return i===0?!1:{level:i,hasBasic:!0,has256:i>=2,has16m:i>=3}}function g3(i,u){if(qf===0)return 0;if(Pu("color=16m")||Pu("color=full")||Pu("color=truecolor"))return 3;if(Pu("color=256"))return 2;if(i&&!u&&qf===void 0)return 0;let f=qf||0;if(oi.TERM==="dumb")return f;if(process.platform==="win32"){let c=Dj.release().split(".");return Number(c[0])>=10&&Number(c[2])>=10586?Number(c[2])>=14931?3:2:1}if("CI"in oi)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(c=>c in oi)||oi.CI_NAME==="codeship"?1:f;if("TEAMCITY_VERSION"in oi)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(oi.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in oi)return 1;if(oi.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in oi){let c=parseInt((oi.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(oi.TERM_PROGRAM){case"iTerm.app":return c>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(oi.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(oi.TERM)||"COLORTERM"in oi?1:f}function Ej(i){let u=g3(i,i&&i.isTTY);return v3(u)}_S.exports={supportsColor:Ej,stdout:v3(g3(!0,yS.isatty(1))),stderr:v3(g3(!0,yS.isatty(2)))}});var ES=Me((rG,DS)=>{"use strict";var Sj=(i,u,f)=>{let c=i.indexOf(u);if(c===-1)return i;let g=u.length,t=0,C="";do C+=i.substr(t,c-t)+u+f,t=c+g,c=i.indexOf(u,t);while(c!==-1);return C+=i.substr(t),C},Cj=(i,u,f,c)=>{let g=0,t="";do{let C=i[c-1]==="\r";t+=i.substr(g,(C?c-1:c)-g)+u+(C?`\r -`:` -`)+f,g=c+1,c=i.indexOf(` -`,g)}while(c!==-1);return t+=i.substr(g),t};DS.exports={stringReplaceAll:Sj,stringEncaseCRLFWithFirstIndex:Cj}});var kS=Me((iG,SS)=>{"use strict";var Tj=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,CS=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,xj=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,kj=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,Aj=new Map([["n",` -`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a","\x07"]]);function TS(i){let u=i[0]==="u",f=i[1]==="{";return u&&!f&&i.length===5||i[0]==="x"&&i.length===3?String.fromCharCode(parseInt(i.slice(1),16)):u&&f?String.fromCodePoint(parseInt(i.slice(2,-1),16)):Aj.get(i)||i}function Oj(i,u){let f=[],c=u.trim().split(/\s*,\s*/g),g;for(let t of c){let C=Number(t);if(!Number.isNaN(C))f.push(C);else if(g=t.match(xj))f.push(g[2].replace(kj,(A,x,D)=>x?TS(x):D));else throw new Error(`Invalid Chalk template style argument: ${t} (in style '${i}')`)}return f}function Ij(i){CS.lastIndex=0;let u=[],f;for(;(f=CS.exec(i))!==null;){let c=f[1];if(f[2]){let g=Oj(c,f[2]);u.push([c].concat(g))}else u.push([c])}return u}function xS(i,u){let f={};for(let g of u)for(let t of g.styles)f[t[0]]=g.inverse?null:t.slice(1);let c=i;for(let[g,t]of Object.entries(f))if(!!Array.isArray(t)){if(!(g in c))throw new Error(`Unknown Chalk style: ${g}`);c=t.length>0?c[g](...t):c[g]}return c}SS.exports=(i,u)=>{let f=[],c=[],g=[];if(u.replace(Tj,(t,C,A,x,D,L)=>{if(C)g.push(TS(C));else if(x){let N=g.join("");g=[],c.push(f.length===0?N:xS(i,f)(N)),f.push({inverse:A,styles:Ij(x)})}else if(D){if(f.length===0)throw new Error("Found extraneous } in Chalk template literal");c.push(xS(i,f)(g.join(""))),g=[],f.pop()}else g.push(L)}),c.push(g.join("")),f.length>0){let t=`Chalk template literal is missing ${f.length} closing bracket${f.length===1?"":"s"} (\`}\`)`;throw new Error(t)}return c.join("")}});var Jh=Me((oG,AS)=>{"use strict";var A2=Rh(),{stdout:_3,stderr:y3}=wS(),{stringReplaceAll:Pj,stringEncaseCRLFWithFirstIndex:Mj}=ES(),{isArray:Yh}=Array,OS=["ansi","ansi","ansi256","ansi16m"],ka=Object.create(null),Fj=(i,u={})=>{if(u.level&&!(Number.isInteger(u.level)&&u.level>=0&&u.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let f=_3?_3.level:0;i.level=u.level===void 0?f:u.level},IS=class{constructor(u){return PS(u)}},PS=i=>{let u={};return Fj(u,i),u.template=(...f)=>MS(u.template,...f),Object.setPrototypeOf(u,$h.prototype),Object.setPrototypeOf(u.template,u),u.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},u.template.Instance=IS,u.template};function $h(i){return PS(i)}for(let[i,u]of Object.entries(A2))ka[i]={get(){let f=Kh(this,w3(u.open,u.close,this._styler),this._isEmpty);return Object.defineProperty(this,i,{value:f}),f}};ka.visible={get(){let i=Kh(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:i}),i}};var LS=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let i of LS)ka[i]={get(){let{level:u}=this;return function(...f){let c=w3(A2.color[OS[u]][i](...f),A2.color.close,this._styler);return Kh(this,c,this._isEmpty)}}};for(let i of LS){let u="bg"+i[0].toUpperCase()+i.slice(1);ka[u]={get(){let{level:f}=this;return function(...c){let g=w3(A2.bgColor[OS[f]][i](...c),A2.bgColor.close,this._styler);return Kh(this,g,this._isEmpty)}}}}var Lj=Object.defineProperties(()=>{},zn(dt({},ka),{level:{enumerable:!0,get(){return this._generator.level},set(i){this._generator.level=i}}})),w3=(i,u,f)=>{let c,g;return f===void 0?(c=i,g=u):(c=f.openAll+i,g=u+f.closeAll),{open:i,close:u,openAll:c,closeAll:g,parent:f}},Kh=(i,u,f)=>{let c=(...g)=>Yh(g[0])&&Yh(g[0].raw)?RS(c,MS(c,...g)):RS(c,g.length===1?""+g[0]:g.join(" "));return Object.setPrototypeOf(c,Lj),c._generator=i,c._styler=u,c._isEmpty=f,c},RS=(i,u)=>{if(i.level<=0||!u)return i._isEmpty?"":u;let f=i._styler;if(f===void 0)return u;let{openAll:c,closeAll:g}=f;if(u.indexOf("")!==-1)for(;f!==void 0;)u=Pj(u,f.close,f.open),f=f.parent;let t=u.indexOf(` -`);return t!==-1&&(u=Mj(u,g,c,t)),c+u+g},D3,MS=(i,...u)=>{let[f]=u;if(!Yh(f)||!Yh(f.raw))return u.join(" ");let c=u.slice(1),g=[f.raw[0]];for(let t=1;t{"use strict";var Rj=O2&&O2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(O2,"__esModule",{value:!0});var I2=Rj(Jh()),Nj=/^(rgb|hsl|hsv|hwb)\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,Bj=/^(ansi|ansi256)\(\s?(\d+)\s?\)$/,Qh=(i,u)=>u==="foreground"?i:"bg"+i[0].toUpperCase()+i.slice(1);O2.default=(i,u,f)=>{if(!u)return i;if(u in I2.default){let g=Qh(u,f);return I2.default[g](i)}if(u.startsWith("#")){let g=Qh("hex",f);return I2.default[g](u)(i)}if(u.startsWith("ansi")){let g=Bj.exec(u);if(!g)return i;let t=Qh(g[1],f),C=Number(g[2]);return I2.default[t](C)(i)}if(u.startsWith("rgb")||u.startsWith("hsl")||u.startsWith("hsv")||u.startsWith("hwb")){let g=Nj.exec(u);if(!g)return i;let t=Qh(g[1],f),C=Number(g[2]),A=Number(g[3]),x=Number(g[4]);return I2.default[t](C,A,x)(i)}return i}});var BS=Me(P2=>{"use strict";var NS=P2&&P2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(P2,"__esModule",{value:!0});var jj=NS(mS()),S3=NS(E3());P2.default=(i,u,f,c)=>{if(typeof f.style.borderStyle=="string"){let g=f.yogaNode.getComputedWidth(),t=f.yogaNode.getComputedHeight(),C=f.style.borderColor,A=jj.default[f.style.borderStyle],x=S3.default(A.topLeft+A.horizontal.repeat(g-2)+A.topRight,C,"foreground"),D=(S3.default(A.vertical,C,"foreground")+` -`).repeat(t-2),L=S3.default(A.bottomLeft+A.horizontal.repeat(g-2)+A.bottomRight,C,"foreground");c.write(i,u,x,{transformers:[]}),c.write(i,u+1,D,{transformers:[]}),c.write(i+g-1,u+1,D,{transformers:[]}),c.write(i,u+t-1,L,{transformers:[]})}}});var US=Me(M2=>{"use strict";var _c=M2&&M2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(M2,"__esModule",{value:!0});var Uj=_c(hc()),qj=_c(jy()),zj=_c(cS()),Wj=_c(Yy()),Hj=_c(aS()),bj=_c(Ky()),Gj=_c(BS()),Vj=(i,u)=>{var f;let c=(f=i.childNodes[0])===null||f===void 0?void 0:f.yogaNode;if(c){let g=c.getComputedLeft(),t=c.getComputedTop();u=` -`.repeat(t)+zj.default(u,g)}return u},jS=(i,u,f)=>{var c;let{offsetX:g=0,offsetY:t=0,transformers:C=[],skipStaticElements:A}=f;if(A&&i.internal_static)return;let{yogaNode:x}=i;if(x){if(x.getDisplay()===Uj.default.DISPLAY_NONE)return;let D=g+x.getComputedLeft(),L=t+x.getComputedTop(),N=C;if(typeof i.internal_transform=="function"&&(N=[i.internal_transform,...C]),i.nodeName==="ink-text"){let j=bj.default(i);if(j.length>0){let $=qj.default(j),h=Hj.default(x);if($>h){let re=(c=i.style.textWrap)!==null&&c!==void 0?c:"wrap";j=Wj.default(j,h,re)}j=Vj(i,j),u.write(D,L,j,{transformers:N})}return}if(i.nodeName==="ink-box"&&Gj.default(D,L,i,u),i.nodeName==="ink-root"||i.nodeName==="ink-box")for(let j of i.childNodes)jS(j,u,{offsetX:D,offsetY:L,transformers:N,skipStaticElements:A})}};M2.default=jS});var zS=Me((fG,qS)=>{"use strict";qS.exports=i=>{i=Object.assign({onlyFirst:!1},i);let u=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(u,i.onlyFirst?void 0:"g")}});var HS=Me((cG,C3)=>{"use strict";var Yj=zS(),WS=i=>typeof i=="string"?i.replace(Yj(),""):i;C3.exports=WS;C3.exports.default=WS});var VS=Me((aG,bS)=>{"use strict";var GS="[\uD800-\uDBFF][\uDC00-\uDFFF]";bS.exports=i=>i&&i.exact?new RegExp(`^${GS}$`):new RegExp(GS,"g")});var $S=Me((dG,T3)=>{"use strict";var $j=HS(),Kj=VS(),YS=i=>$j(i).replace(Kj()," ").length;T3.exports=YS;T3.exports.default=YS});var QS=Me(F2=>{"use strict";var KS=F2&&F2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(F2,"__esModule",{value:!0});var XS=KS(Gy()),Xj=KS($S()),JS=class{constructor(u){this.writes=[];let{width:f,height:c}=u;this.width=f,this.height=c}write(u,f,c,g){let{transformers:t}=g;!c||this.writes.push({x:u,y:f,text:c,transformers:t})}get(){let u=[];for(let c=0;cc.trimRight()).join(` -`),height:u.length}}};F2.default=JS});var t5=Me(L2=>{"use strict";var x3=L2&&L2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(L2,"__esModule",{value:!0});var Jj=x3(hc()),ZS=x3(US()),e5=x3(QS());L2.default=(i,u)=>{var f;if(i.yogaNode.setWidth(u),i.yogaNode){i.yogaNode.calculateLayout(void 0,void 0,Jj.default.DIRECTION_LTR);let c=new e5.default({width:i.yogaNode.getComputedWidth(),height:i.yogaNode.getComputedHeight()});ZS.default(i,c,{skipStaticElements:!0});let g;((f=i.staticNode)===null||f===void 0?void 0:f.yogaNode)&&(g=new e5.default({width:i.staticNode.yogaNode.getComputedWidth(),height:i.staticNode.yogaNode.getComputedHeight()}),ZS.default(i.staticNode,g,{skipStaticElements:!1}));let{output:t,height:C}=c.get();return{output:t,outputHeight:C,staticOutput:g?`${g.get().output} -`:""}}return{output:"",outputHeight:0,staticOutput:""}}});var o5=Me((mG,n5)=>{"use strict";var r5=require("stream"),i5=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],k3={},Qj=i=>{let u=new r5.PassThrough,f=new r5.PassThrough;u.write=g=>i("stdout",g),f.write=g=>i("stderr",g);let c=new console.Console(u,f);for(let g of i5)k3[g]=console[g],console[g]=c[g];return()=>{for(let g of i5)console[g]=k3[g];k3={}}};n5.exports=Qj});var O3=Me(A3=>{"use strict";Object.defineProperty(A3,"__esModule",{value:!0});A3.default=new WeakMap});var P3=Me(I3=>{"use strict";Object.defineProperty(I3,"__esModule",{value:!0});var Zj=lr(),u5=Zj.createContext({exit:()=>{}});u5.displayName="InternalAppContext";I3.default=u5});var F3=Me(M3=>{"use strict";Object.defineProperty(M3,"__esModule",{value:!0});var eU=lr(),s5=eU.createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});s5.displayName="InternalStdinContext";M3.default=s5});var R3=Me(L3=>{"use strict";Object.defineProperty(L3,"__esModule",{value:!0});var tU=lr(),l5=tU.createContext({stdout:void 0,write:()=>{}});l5.displayName="InternalStdoutContext";L3.default=l5});var B3=Me(N3=>{"use strict";Object.defineProperty(N3,"__esModule",{value:!0});var nU=lr(),f5=nU.createContext({stderr:void 0,write:()=>{}});f5.displayName="InternalStderrContext";N3.default=f5});var Zh=Me(j3=>{"use strict";Object.defineProperty(j3,"__esModule",{value:!0});var rU=lr(),c5=rU.createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{}});c5.displayName="InternalFocusContext";j3.default=c5});var d5=Me((EG,a5)=>{"use strict";var iU=/[|\\{}()[\]^$+*?.-]/g;a5.exports=i=>{if(typeof i!="string")throw new TypeError("Expected a string");return i.replace(iU,"\\$&")}});var v5=Me((SG,p5)=>{"use strict";var oU=d5(),h5=[].concat(require("module").builtinModules,"bootstrap_node","node").map(i=>new RegExp(`(?:\\(${i}\\.js:\\d+:\\d+\\)$|^\\s*at ${i}\\.js:\\d+:\\d+$)`));h5.push(/\(internal\/[^:]+:\d+:\d+\)$/,/\s*at internal\/[^:]+:\d+:\d+$/,/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/);var em=class{constructor(u){u=dt({ignoredPackages:[]},u),"internals"in u||(u.internals=em.nodeInternals()),"cwd"in u||(u.cwd=process.cwd()),this._cwd=u.cwd.replace(/\\/g,"/"),this._internals=[].concat(u.internals,uU(u.ignoredPackages)),this._wrapCallSite=u.wrapCallSite||!1}static nodeInternals(){return[...h5]}clean(u,f=0){f=" ".repeat(f),Array.isArray(u)||(u=u.split(` -`)),!/^\s*at /.test(u[0])&&/^\s*at /.test(u[1])&&(u=u.slice(1));let c=!1,g=null,t=[];return u.forEach(C=>{if(C=C.replace(/\\/g,"/"),this._internals.some(x=>x.test(C)))return;let A=/^\s*at /.test(C);c?C=C.trimEnd().replace(/^(\s+)at /,"$1"):(C=C.trim(),A&&(C=C.slice(3))),C=C.replace(`${this._cwd}/`,""),C&&(A?(g&&(t.push(g),g=null),t.push(C)):(c=!0,g=C))}),t.map(C=>`${f}${C} -`).join("")}captureString(u,f=this.captureString){typeof u=="function"&&(f=u,u=Infinity);let{stackTraceLimit:c}=Error;u&&(Error.stackTraceLimit=u);let g={};Error.captureStackTrace(g,f);let{stack:t}=g;return Error.stackTraceLimit=c,this.clean(t)}capture(u,f=this.capture){typeof u=="function"&&(f=u,u=Infinity);let{prepareStackTrace:c,stackTraceLimit:g}=Error;Error.prepareStackTrace=(A,x)=>this._wrapCallSite?x.map(this._wrapCallSite):x,u&&(Error.stackTraceLimit=u);let t={};Error.captureStackTrace(t,f);let{stack:C}=t;return Object.assign(Error,{prepareStackTrace:c,stackTraceLimit:g}),C}at(u=this.at){let[f]=this.capture(1,u);if(!f)return{};let c={line:f.getLineNumber(),column:f.getColumnNumber()};m5(c,f.getFileName(),this._cwd),f.isConstructor()&&(c.constructor=!0),f.isEval()&&(c.evalOrigin=f.getEvalOrigin()),f.isNative()&&(c.native=!0);let g;try{g=f.getTypeName()}catch(A){}g&&g!=="Object"&&g!=="[object Object]"&&(c.type=g);let t=f.getFunctionName();t&&(c.function=t);let C=f.getMethodName();return C&&t!==C&&(c.method=C),c}parseLine(u){let f=u&&u.match(sU);if(!f)return null;let c=f[1]==="new",g=f[2],t=f[3],C=f[4],A=Number(f[5]),x=Number(f[6]),D=f[7],L=f[8],N=f[9],j=f[10]==="native",$=f[11]===")",h,re={};if(L&&(re.line=Number(L)),N&&(re.column=Number(N)),$&&D){let ce=0;for(let Q=D.length-1;Q>0;Q--)if(D.charAt(Q)===")")ce++;else if(D.charAt(Q)==="("&&D.charAt(Q-1)===" "&&(ce--,ce===-1&&D.charAt(Q-1)===" ")){let oe=D.slice(0,Q-1);D=D.slice(Q+1),g+=` (${oe}`;break}}if(g){let ce=g.match(lU);ce&&(g=ce[1],h=ce[2])}return m5(re,D,this._cwd),c&&(re.constructor=!0),t&&(re.evalOrigin=t,re.evalLine=A,re.evalColumn=x,re.evalFile=C&&C.replace(/\\/g,"/")),j&&(re.native=!0),g&&(re.function=g),h&&g!==h&&(re.method=h),re}};function m5(i,u,f){u&&(u=u.replace(/\\/g,"/"),u.startsWith(`${f}/`)&&(u=u.slice(f.length+1)),i.file=u)}function uU(i){if(i.length===0)return[];let u=i.map(f=>oU(f));return new RegExp(`[/\\\\]node_modules[/\\\\](?:${u.join("|")})[/\\\\][^:]+:\\d+:\\d+`)}var sU=new RegExp("^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"),lU=/^(.*?) \[as (.*?)\]$/;p5.exports=em});var _5=Me((CG,g5)=>{"use strict";g5.exports=(i,u)=>i.replace(/^\t+/gm,f=>" ".repeat(f.length*(u||2)))});var w5=Me((TG,y5)=>{"use strict";var fU=_5(),cU=(i,u)=>{let f=[],c=i-u,g=i+u;for(let t=c;t<=g;t++)f.push(t);return f};y5.exports=(i,u,f)=>{if(typeof i!="string")throw new TypeError("Source code is missing.");if(!u||u<1)throw new TypeError("Line number must start from `1`.");if(i=fU(i).split(/\r?\n/),!(u>i.length))return f=dt({around:3},f),cU(u,f.around).filter(c=>i[c-1]!==void 0).map(c=>({line:c,value:i[c-1]}))}});var tm=Me(hs=>{"use strict";var aU=hs&&hs.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),dU=hs&&hs.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),pU=hs&&hs.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&aU(u,i,f);return dU(u,i),u},hU=hs&&hs.__rest||function(i,u){var f={};for(var c in i)Object.prototype.hasOwnProperty.call(i,c)&&u.indexOf(c)<0&&(f[c]=i[c]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var g=0,c=Object.getOwnPropertySymbols(i);g{var{children:f}=i,c=hU(i,["children"]);let g=Object.assign(Object.assign({},c),{marginLeft:c.marginLeft||c.marginX||c.margin||0,marginRight:c.marginRight||c.marginX||c.margin||0,marginTop:c.marginTop||c.marginY||c.margin||0,marginBottom:c.marginBottom||c.marginY||c.margin||0,paddingLeft:c.paddingLeft||c.paddingX||c.padding||0,paddingRight:c.paddingRight||c.paddingX||c.padding||0,paddingTop:c.paddingTop||c.paddingY||c.padding||0,paddingBottom:c.paddingBottom||c.paddingY||c.padding||0});return D5.default.createElement("ink-box",{ref:u,style:g},f)});U3.displayName="Box";U3.defaultProps={flexDirection:"row",flexGrow:0,flexShrink:1};hs.default=U3});var W3=Me(R2=>{"use strict";var q3=R2&&R2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(R2,"__esModule",{value:!0});var mU=q3(lr()),Aa=q3(Jh()),E5=q3(E3()),z3=({color:i,backgroundColor:u,dimColor:f,bold:c,italic:g,underline:t,strikethrough:C,inverse:A,wrap:x,children:D})=>{if(D==null)return null;let L=N=>(f&&(N=Aa.default.dim(N)),i&&(N=E5.default(N,i,"foreground")),u&&(N=E5.default(N,u,"background")),c&&(N=Aa.default.bold(N)),g&&(N=Aa.default.italic(N)),t&&(N=Aa.default.underline(N)),C&&(N=Aa.default.strikethrough(N)),A&&(N=Aa.default.inverse(N)),N);return mU.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row",textWrap:x},internal_transform:L},D)};z3.displayName="Text";z3.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:"wrap"};R2.default=z3});var x5=Me(ms=>{"use strict";var vU=ms&&ms.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),gU=ms&&ms.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),_U=ms&&ms.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&vU(u,i,f);return gU(u,i),u},N2=ms&&ms.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(ms,"__esModule",{value:!0});var S5=_U(require("fs")),ui=N2(lr()),C5=N2(v5()),yU=N2(w5()),ef=N2(tm()),il=N2(W3()),T5=new C5.default({cwd:process.cwd(),internals:C5.default.nodeInternals()}),wU=({error:i})=>{let u=i.stack?i.stack.split(` -`).slice(1):void 0,f=u?T5.parseLine(u[0]):void 0,c,g=0;if((f==null?void 0:f.file)&&(f==null?void 0:f.line)&&S5.existsSync(f.file)){let t=S5.readFileSync(f.file,"utf8");if(c=yU.default(t,f.line),c)for(let{line:C}of c)g=Math.max(g,String(C).length)}return ui.default.createElement(ef.default,{flexDirection:"column",padding:1},ui.default.createElement(ef.default,null,ui.default.createElement(il.default,{backgroundColor:"red",color:"white"}," ","ERROR"," "),ui.default.createElement(il.default,null," ",i.message)),f&&ui.default.createElement(ef.default,{marginTop:1},ui.default.createElement(il.default,{dimColor:!0},f.file,":",f.line,":",f.column)),f&&c&&ui.default.createElement(ef.default,{marginTop:1,flexDirection:"column"},c.map(({line:t,value:C})=>ui.default.createElement(ef.default,{key:t},ui.default.createElement(ef.default,{width:g+1},ui.default.createElement(il.default,{dimColor:t!==f.line,backgroundColor:t===f.line?"red":void 0,color:t===f.line?"white":void 0},String(t).padStart(g," "),":")),ui.default.createElement(il.default,{key:t,backgroundColor:t===f.line?"red":void 0,color:t===f.line?"white":void 0}," "+C)))),i.stack&&ui.default.createElement(ef.default,{marginTop:1,flexDirection:"column"},i.stack.split(` -`).slice(1).map(t=>{let C=T5.parseLine(t);return C?ui.default.createElement(ef.default,{key:t},ui.default.createElement(il.default,{dimColor:!0},"- "),ui.default.createElement(il.default,{dimColor:!0,bold:!0},C.function),ui.default.createElement(il.default,{dimColor:!0,color:"gray"}," ","(",C.file,":",C.line,":",C.column,")")):ui.default.createElement(ef.default,{key:t},ui.default.createElement(il.default,{dimColor:!0},"- "),ui.default.createElement(il.default,{dimColor:!0,bold:!0},t))})))};ms.default=wU});var A5=Me(vs=>{"use strict";var DU=vs&&vs.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),EU=vs&&vs.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),SU=vs&&vs.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&DU(u,i,f);return EU(u,i),u},yc=vs&&vs.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(vs,"__esModule",{value:!0});var wc=SU(lr()),k5=yc(gy()),CU=yc(P3()),TU=yc(F3()),xU=yc(R3()),kU=yc(B3()),AU=yc(Zh()),OU=yc(x5()),IU=" ",PU="",MU="",H3=class extends wc.PureComponent{constructor(){super(...arguments);this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=u=>{let{stdin:f}=this.props;if(!this.isRawModeSupported())throw f===process.stdin?new Error(`Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default. -Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`):new Error(`Raw mode is not supported on the stdin provided to Ink. -Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`);if(f.setEncoding("utf8"),u){this.rawModeEnabledCount===0&&(f.addListener("data",this.handleInput),f.resume(),f.setRawMode(!0)),this.rawModeEnabledCount++;return}--this.rawModeEnabledCount==0&&(f.setRawMode(!1),f.removeListener("data",this.handleInput),f.pause())},this.handleInput=u=>{u===""&&this.props.exitOnCtrlC&&this.handleExit(),u===MU&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(u===IU&&this.focusNext(),u===PU&&this.focusPrevious())},this.handleExit=u=>{this.isRawModeSupported()&&this.handleSetRawMode(!1),this.props.onExit(u)},this.enableFocus=()=>{this.setState({isFocusEnabled:!0})},this.disableFocus=()=>{this.setState({isFocusEnabled:!1})},this.focusNext=()=>{this.setState(u=>{let f=u.focusables[0].id;return{activeFocusId:this.findNextFocusable(u)||f}})},this.focusPrevious=()=>{this.setState(u=>{let f=u.focusables[u.focusables.length-1].id;return{activeFocusId:this.findPreviousFocusable(u)||f}})},this.addFocusable=(u,{autoFocus:f})=>{this.setState(c=>{let g=c.activeFocusId;return!g&&f&&(g=u),{activeFocusId:g,focusables:[...c.focusables,{id:u,isActive:!0}]}})},this.removeFocusable=u=>{this.setState(f=>({activeFocusId:f.activeFocusId===u?void 0:f.activeFocusId,focusables:f.focusables.filter(c=>c.id!==u)}))},this.activateFocusable=u=>{this.setState(f=>({focusables:f.focusables.map(c=>c.id!==u?c:{id:u,isActive:!0})}))},this.deactivateFocusable=u=>{this.setState(f=>({activeFocusId:f.activeFocusId===u?void 0:f.activeFocusId,focusables:f.focusables.map(c=>c.id!==u?c:{id:u,isActive:!1})}))},this.findNextFocusable=u=>{let f=u.focusables.findIndex(c=>c.id===u.activeFocusId);for(let c=f+1;c{let f=u.focusables.findIndex(c=>c.id===u.activeFocusId);for(let c=f-1;c>=0;c--)if(u.focusables[c].isActive)return u.focusables[c].id}}static getDerivedStateFromError(u){return{error:u}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return wc.default.createElement(CU.default.Provider,{value:{exit:this.handleExit}},wc.default.createElement(TU.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},wc.default.createElement(xU.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},wc.default.createElement(kU.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},wc.default.createElement(AU.default.Provider,{value:{activeId:this.state.activeFocusId,add:this.addFocusable,remove:this.removeFocusable,activate:this.activateFocusable,deactivate:this.deactivateFocusable,enableFocus:this.enableFocus,disableFocus:this.disableFocus,focusNext:this.focusNext,focusPrevious:this.focusPrevious}},this.state.error?wc.default.createElement(OU.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){k5.default.hide(this.props.stdout)}componentWillUnmount(){k5.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(u){this.handleExit(u)}};vs.default=H3;H3.displayName="InternalApp"});var M5=Me(gs=>{"use strict";var FU=gs&&gs.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),LU=gs&&gs.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),RU=gs&&gs.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&FU(u,i,f);return LU(u,i),u},_s=gs&&gs.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(gs,"__esModule",{value:!0});var NU=_s(lr()),O5=AD(),BU=_s(WD()),jU=_s(ay()),UU=_s(KD()),qU=_s(JD()),nm=_s(lS()),zU=_s(t5()),WU=_s(vy()),HU=_s(o5()),bU=RU(Xy()),GU=_s(O3()),VU=_s(A5()),Oa=process.env.CI==="false"?!1:UU.default,I5=()=>{},P5=class{constructor(u){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;let{output:f,outputHeight:c,staticOutput:g}=zU.default(this.rootNode,this.options.stdout.columns||80),t=g&&g!==` -`;if(this.options.debug){t&&(this.fullStaticOutput+=g),this.options.stdout.write(this.fullStaticOutput+f);return}if(Oa){t&&this.options.stdout.write(g),this.lastOutput=f;return}if(t&&(this.fullStaticOutput+=g),c>=this.options.stdout.rows){this.options.stdout.write(jU.default.clearTerminal+this.fullStaticOutput+f),this.lastOutput=f;return}t&&(this.log.clear(),this.options.stdout.write(g),this.log(f)),!t&&f!==this.lastOutput&&this.throttledLog(f),this.lastOutput=f},qU.default(this),this.options=u,this.rootNode=bU.createNode("ink-root"),this.rootNode.onRender=u.debug?this.onRender:O5.throttle(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=BU.default.create(u.stdout),this.throttledLog=u.debug?this.log:O5.throttle(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput="",this.fullStaticOutput="",this.container=nm.default.createContainer(this.rootNode,!1,!1),this.unsubscribeExit=WU.default(this.unmount,{alwaysLast:!1}),process.env.DEV==="true"&&nm.default.injectIntoDevTools({bundleType:0,version:"16.13.1",rendererPackageName:"ink"}),u.patchConsole&&this.patchConsole(),Oa||(u.stdout.on("resize",this.onRender),this.unsubscribeResize=()=>{u.stdout.off("resize",this.onRender)})}render(u){let f=NU.default.createElement(VU.default,{stdin:this.options.stdin,stdout:this.options.stdout,stderr:this.options.stderr,writeToStdout:this.writeToStdout,writeToStderr:this.writeToStderr,exitOnCtrlC:this.options.exitOnCtrlC,onExit:this.unmount},u);nm.default.updateContainer(f,this.container,null,I5)}writeToStdout(u){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(u+this.fullStaticOutput+this.lastOutput);return}if(Oa){this.options.stdout.write(u);return}this.log.clear(),this.options.stdout.write(u),this.log(this.lastOutput)}}writeToStderr(u){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(u),this.options.stdout.write(this.fullStaticOutput+this.lastOutput);return}if(Oa){this.options.stderr.write(u);return}this.log.clear(),this.options.stderr.write(u),this.log(this.lastOutput)}}unmount(u){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole=="function"&&this.restoreConsole(),typeof this.unsubscribeResize=="function"&&this.unsubscribeResize(),Oa?this.options.stdout.write(this.lastOutput+` -`):this.options.debug||this.log.done(),this.isUnmounted=!0,nm.default.updateContainer(null,this.container,null,I5),GU.default.delete(this.options.stdout),u instanceof Error?this.rejectExitPromise(u):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((u,f)=>{this.resolveExitPromise=u,this.rejectExitPromise=f})),this.exitPromise}clear(){!Oa&&!this.options.debug&&this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=HU.default((u,f)=>{u==="stdout"&&this.writeToStdout(f),u==="stderr"&&(f.startsWith("The above error occurred")||this.writeToStderr(f))}))}};gs.default=P5});var L5=Me(B2=>{"use strict";var F5=B2&&B2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(B2,"__esModule",{value:!0});var YU=F5(M5()),rm=F5(O3()),$U=require("stream"),JU=(i,u)=>{let f=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},KU(u)),c=XU(f.stdout,()=>new YU.default(f));return c.render(i),{rerender:c.render,unmount:()=>c.unmount(),waitUntilExit:c.waitUntilExit,cleanup:()=>rm.default.delete(f.stdout),clear:c.clear}};B2.default=JU;var KU=(i={})=>i instanceof $U.Stream?{stdout:i,stdin:process.stdin}:i,XU=(i,u)=>{let f;return rm.default.has(i)?f=rm.default.get(i):(f=u(),rm.default.set(i,f)),f}});var N5=Me(tf=>{"use strict";var QU=tf&&tf.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),ZU=tf&&tf.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),eq=tf&&tf.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&QU(u,i,f);return ZU(u,i),u};Object.defineProperty(tf,"__esModule",{value:!0});var j2=eq(lr()),R5=i=>{let{items:u,children:f,style:c}=i,[g,t]=j2.useState(0),C=j2.useMemo(()=>u.slice(g),[u,g]);j2.useLayoutEffect(()=>{t(u.length)},[u.length]);let A=C.map((D,L)=>f(D,g+L)),x=j2.useMemo(()=>Object.assign({position:"absolute",flexDirection:"column"},c),[c]);return j2.default.createElement("ink-box",{internal_static:!0,style:x},A)};R5.displayName="Static";tf.default=R5});var j5=Me(U2=>{"use strict";var tq=U2&&U2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(U2,"__esModule",{value:!0});var nq=tq(lr()),B5=({children:i,transform:u})=>i==null?null:nq.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row"},internal_transform:u},i);B5.displayName="Transform";U2.default=B5});var q5=Me(q2=>{"use strict";var rq=q2&&q2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(q2,"__esModule",{value:!0});var iq=rq(lr()),U5=({count:i=1})=>iq.default.createElement("ink-text",null,` -`.repeat(i));U5.displayName="Newline";q2.default=U5});var H5=Me(z2=>{"use strict";var z5=z2&&z2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(z2,"__esModule",{value:!0});var oq=z5(lr()),uq=z5(tm()),W5=()=>oq.default.createElement(uq.default,{flexGrow:1});W5.displayName="Spacer";z2.default=W5});var im=Me(W2=>{"use strict";var sq=W2&&W2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(W2,"__esModule",{value:!0});var lq=lr(),fq=sq(F3()),cq=()=>lq.useContext(fq.default);W2.default=cq});var G5=Me(H2=>{"use strict";var aq=H2&&H2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(H2,"__esModule",{value:!0});var b5=lr(),dq=aq(im()),pq=(i,u={})=>{let{stdin:f,setRawMode:c,internal_exitOnCtrlC:g}=dq.default();b5.useEffect(()=>{if(u.isActive!==!1)return c(!0),()=>{c(!1)}},[u.isActive,c]),b5.useEffect(()=>{if(u.isActive===!1)return;let t=C=>{let A=String(C),x={upArrow:A==="",downArrow:A==="",leftArrow:A==="",rightArrow:A==="",pageDown:A==="[6~",pageUp:A==="[5~",return:A==="\r",escape:A==="",ctrl:!1,shift:!1,tab:A===" "||A==="",backspace:A==="\b",delete:A==="\x7F"||A==="[3~",meta:!1};A<=""&&!x.return&&(A=String.fromCharCode(A.charCodeAt(0)+"a".charCodeAt(0)-1),x.ctrl=!0),A.startsWith("")&&(A=A.slice(1),x.meta=!0);let D=A>="A"&&A<="Z",L=A>="\u0410"&&A<="\u042F";A.length===1&&(D||L)&&(x.shift=!0),x.tab&&A==="[Z"&&(x.shift=!0),(x.tab||x.backspace||x.delete)&&(A=""),(!(A==="c"&&x.ctrl)||!g)&&i(A,x)};return f==null||f.on("data",t),()=>{f==null||f.off("data",t)}},[u.isActive,f,g,i])};H2.default=pq});var V5=Me(b2=>{"use strict";var hq=b2&&b2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(b2,"__esModule",{value:!0});var mq=lr(),vq=hq(P3()),gq=()=>mq.useContext(vq.default);b2.default=gq});var Y5=Me(G2=>{"use strict";var _q=G2&&G2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(G2,"__esModule",{value:!0});var yq=lr(),wq=_q(R3()),Dq=()=>yq.useContext(wq.default);G2.default=Dq});var $5=Me(V2=>{"use strict";var Eq=V2&&V2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(V2,"__esModule",{value:!0});var Sq=lr(),Cq=Eq(B3()),Tq=()=>Sq.useContext(Cq.default);V2.default=Tq});var X5=Me(Y2=>{"use strict";var K5=Y2&&Y2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Y2,"__esModule",{value:!0});var $2=lr(),xq=K5(Zh()),kq=K5(im()),Aq=({isActive:i=!0,autoFocus:u=!1}={})=>{let{isRawModeSupported:f,setRawMode:c}=kq.default(),{activeId:g,add:t,remove:C,activate:A,deactivate:x}=$2.useContext(xq.default),D=$2.useMemo(()=>Math.random().toString().slice(2,7),[]);return $2.useEffect(()=>(t(D,{autoFocus:u}),()=>{C(D)}),[D,u]),$2.useEffect(()=>{i?A(D):x(D)},[i,D]),$2.useEffect(()=>{if(!(!f||!i))return c(!0),()=>{c(!1)}},[i]),{isFocused:Boolean(D)&&g===D}};Y2.default=Aq});var J5=Me(K2=>{"use strict";var Oq=K2&&K2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(K2,"__esModule",{value:!0});var Iq=lr(),Pq=Oq(Zh()),Mq=()=>{let i=Iq.useContext(Pq.default);return{enableFocus:i.enableFocus,disableFocus:i.disableFocus,focusNext:i.focusNext,focusPrevious:i.focusPrevious}};K2.default=Mq});var Q5=Me(b3=>{"use strict";Object.defineProperty(b3,"__esModule",{value:!0});b3.default=i=>{var u,f,c,g;return{width:(f=(u=i.yogaNode)===null||u===void 0?void 0:u.getComputedWidth())!==null&&f!==void 0?f:0,height:(g=(c=i.yogaNode)===null||c===void 0?void 0:c.getComputedHeight())!==null&&g!==void 0?g:0}}});var ys=Me(ji=>{"use strict";Object.defineProperty(ji,"__esModule",{value:!0});var Fq=L5();Object.defineProperty(ji,"render",{enumerable:!0,get:function(){return Fq.default}});var Lq=tm();Object.defineProperty(ji,"Box",{enumerable:!0,get:function(){return Lq.default}});var Rq=W3();Object.defineProperty(ji,"Text",{enumerable:!0,get:function(){return Rq.default}});var Nq=N5();Object.defineProperty(ji,"Static",{enumerable:!0,get:function(){return Nq.default}});var Bq=j5();Object.defineProperty(ji,"Transform",{enumerable:!0,get:function(){return Bq.default}});var jq=q5();Object.defineProperty(ji,"Newline",{enumerable:!0,get:function(){return jq.default}});var Uq=H5();Object.defineProperty(ji,"Spacer",{enumerable:!0,get:function(){return Uq.default}});var qq=G5();Object.defineProperty(ji,"useInput",{enumerable:!0,get:function(){return qq.default}});var zq=V5();Object.defineProperty(ji,"useApp",{enumerable:!0,get:function(){return zq.default}});var Wq=im();Object.defineProperty(ji,"useStdin",{enumerable:!0,get:function(){return Wq.default}});var Hq=Y5();Object.defineProperty(ji,"useStdout",{enumerable:!0,get:function(){return Hq.default}});var bq=$5();Object.defineProperty(ji,"useStderr",{enumerable:!0,get:function(){return bq.default}});var Gq=X5();Object.defineProperty(ji,"useFocus",{enumerable:!0,get:function(){return Gq.default}});var Vq=J5();Object.defineProperty(ji,"useFocusManager",{enumerable:!0,get:function(){return Vq.default}});var Yq=Q5();Object.defineProperty(ji,"measureElement",{enumerable:!0,get:function(){return Yq.default}})});var lC=Me(X2=>{"use strict";Object.defineProperty(X2,"__esModule",{value:!0});X2.UncontrolledTextInput=void 0;var oC=lr(),Y3=lr(),uC=ys(),Sc=Jh(),sC=({value:i,placeholder:u="",focus:f=!0,mask:c,highlightPastedText:g=!1,showCursor:t=!0,onChange:C,onSubmit:A})=>{let[{cursorOffset:x,cursorWidth:D},L]=Y3.useState({cursorOffset:(i||"").length,cursorWidth:0});Y3.useEffect(()=>{L(re=>{if(!f||!t)return re;let ce=i||"";return re.cursorOffset>ce.length-1?{cursorOffset:ce.length,cursorWidth:0}:re})},[i,f,t]);let N=g?D:0,j=c?c.repeat(i.length):i,$=j,h=u?Sc.grey(u):void 0;if(t&&f){h=u.length>0?Sc.inverse(u[0])+Sc.grey(u.slice(1)):Sc.inverse(" "),$=j.length>0?"":Sc.inverse(" ");let re=0;for(let ce of j)re>=x-N&&re<=x?$+=Sc.inverse(ce):$+=ce,re++;j.length>0&&x===j.length&&($+=Sc.inverse(" "))}return uC.useInput((re,ce)=>{if(ce.upArrow||ce.downArrow||ce.ctrl&&re==="c"||ce.tab||ce.shift&&ce.tab)return;if(ce.return){A&&A(i);return}let Q=x,oe=i,Se=0;ce.leftArrow?t&&Q--:ce.rightArrow?t&&Q++:ce.backspace||ce.delete?x>0&&(oe=i.slice(0,x-1)+i.slice(x,i.length),Q--):(oe=i.slice(0,x)+re+i.slice(x,i.length),Q+=re.length,re.length>1&&(Se=re.length)),x<0&&(Q=0),x>i.length&&(Q=i.length),L({cursorOffset:Q,cursorWidth:Se}),oe!==i&&C(oe)},{isActive:f}),oC.createElement(uC.Text,null,u?j.length>0?$:h:$)};X2.default=sC;X2.UncontrolledTextInput=i=>{let[u,f]=Y3.useState("");return oC.createElement(sC,Object.assign({},i,{value:u,onChange:f}))}});var cC=Me(pm=>{"use strict";Object.defineProperty(pm,"__esModule",{value:!0});function J2(i){let u=[...i.caches],f=u.shift();return f===void 0?fC():{get(c,g,t={miss:()=>Promise.resolve()}){return f.get(c,g,t).catch(()=>J2({caches:u}).get(c,g,t))},set(c,g){return f.set(c,g).catch(()=>J2({caches:u}).set(c,g))},delete(c){return f.delete(c).catch(()=>J2({caches:u}).delete(c))},clear(){return f.clear().catch(()=>J2({caches:u}).clear())}}}function fC(){return{get(i,u,f={miss:()=>Promise.resolve()}){return u().then(g=>Promise.all([g,f.miss(g)])).then(([g])=>g)},set(i,u){return Promise.resolve(u)},delete(i){return Promise.resolve()},clear(){return Promise.resolve()}}}pm.createFallbackableCache=J2;pm.createNullCache=fC});var dC=Me((fV,aC)=>{aC.exports=cC()});var pC=Me($3=>{"use strict";Object.defineProperty($3,"__esModule",{value:!0});function $q(i={serializable:!0}){let u={};return{get(f,c,g={miss:()=>Promise.resolve()}){let t=JSON.stringify(f);if(t in u)return Promise.resolve(i.serializable?JSON.parse(u[t]):u[t]);let C=c(),A=g&&g.miss||(()=>Promise.resolve());return C.then(x=>A(x)).then(()=>C)},set(f,c){return u[JSON.stringify(f)]=i.serializable?JSON.stringify(c):c,Promise.resolve(c)},delete(f){return delete u[JSON.stringify(f)],Promise.resolve()},clear(){return u={},Promise.resolve()}}}$3.createInMemoryCache=$q});var mC=Me((aV,hC)=>{hC.exports=pC()});var gC=Me(ws=>{"use strict";Object.defineProperty(ws,"__esModule",{value:!0});function Kq(i,u,f){let c={"x-algolia-api-key":f,"x-algolia-application-id":u};return{headers(){return i===K3.WithinHeaders?c:{}},queryParameters(){return i===K3.WithinQueryParameters?c:{}}}}function Xq(i){let u=0,f=()=>(u++,new Promise(c=>{setTimeout(()=>{c(i(f))},Math.min(100*u,1e3))}));return i(f)}function vC(i,u=(f,c)=>Promise.resolve()){return Object.assign(i,{wait(f){return vC(i.then(c=>Promise.all([u(c,f),c])).then(c=>c[1]))}})}function Jq(i){let u=i.length-1;for(u;u>0;u--){let f=Math.floor(Math.random()*(u+1)),c=i[u];i[u]=i[f],i[f]=c}return i}function Qq(i,u){return Object.keys(u!==void 0?u:{}).forEach(f=>{i[f]=u[f](i)}),i}function Zq(i,...u){let f=0;return i.replace(/%s/g,()=>encodeURIComponent(u[f++]))}var ez="4.2.0",tz=i=>()=>i.transporter.requester.destroy(),K3={WithinQueryParameters:0,WithinHeaders:1};ws.AuthMode=K3;ws.addMethods=Qq;ws.createAuth=Kq;ws.createRetryablePromise=Xq;ws.createWaitablePromise=vC;ws.destroy=tz;ws.encode=Zq;ws.shuffle=Jq;ws.version=ez});var Q2=Me((pV,_C)=>{_C.exports=gC()});var yC=Me(X3=>{"use strict";Object.defineProperty(X3,"__esModule",{value:!0});var nz={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};X3.MethodEnum=nz});var Z2=Me((mV,wC)=>{wC.exports=yC()});var RC=Me(y0=>{"use strict";Object.defineProperty(y0,"__esModule",{value:!0});var DC=Z2();function J3(i,u){let f=i||{},c=f.data||{};return Object.keys(f).forEach(g=>{["timeout","headers","queryParameters","data","cacheable"].indexOf(g)===-1&&(c[g]=f[g])}),{data:Object.entries(c).length>0?c:void 0,timeout:f.timeout||u,headers:f.headers||{},queryParameters:f.queryParameters||{},cacheable:f.cacheable}}var hm={Read:1,Write:2,Any:3},Ia={Up:1,Down:2,Timeouted:3},EC=2*60*1e3;function Q3(i,u=Ia.Up){return zn(dt({},i),{status:u,lastUpdate:Date.now()})}function SC(i){return i.status===Ia.Up||Date.now()-i.lastUpdate>EC}function CC(i){return i.status===Ia.Timeouted&&Date.now()-i.lastUpdate<=EC}function Z3(i){return{protocol:i.protocol||"https",url:i.url,accept:i.accept||hm.Any}}function rz(i,u){return Promise.all(u.map(f=>i.get(f,()=>Promise.resolve(Q3(f))))).then(f=>{let c=f.filter(A=>SC(A)),g=f.filter(A=>CC(A)),t=[...c,...g],C=t.length>0?t.map(A=>Z3(A)):u;return{getTimeout(A,x){return(g.length===0&&A===0?1:g.length+3+A)*x},statelessHosts:C}})}var iz=({isTimedOut:i,status:u})=>!i&&~~u==0,oz=i=>{let u=i.status;return i.isTimedOut||iz(i)||~~(u/100)!=2&&~~(u/100)!=4},uz=({status:i})=>~~(i/100)==2,sz=(i,u)=>oz(i)?u.onRetry(i):uz(i)?u.onSucess(i):u.onFail(i);function PC(i,u,f,c){let g=[],t=AC(f,c),C=OC(i,c),A=f.method,x=f.method!==DC.MethodEnum.Get?{}:dt(dt({},f.data),c.data),D=dt(dt(dt({"x-algolia-agent":i.userAgent.value},i.queryParameters),x),c.queryParameters),L=0,N=(j,$)=>{let h=j.pop();if(h===void 0)throw IC(ew(g));let re={data:t,headers:C,method:A,url:kC(h,f.path,D),connectTimeout:$(L,i.timeouts.connect),responseTimeout:$(L,c.timeout)},ce=oe=>{let Se={request:re,response:oe,host:h,triesLeft:j.length};return g.push(Se),Se},Q={onSucess:oe=>TC(oe),onRetry(oe){let Se=ce(oe);return oe.isTimedOut&&L++,Promise.all([i.logger.info("Retryable failure",tw(Se)),i.hostsCache.set(h,Q3(h,oe.isTimedOut?Ia.Timeouted:Ia.Down))]).then(()=>N(j,$))},onFail(oe){throw ce(oe),xC(oe,ew(g))}};return i.requester.send(re).then(oe=>sz(oe,Q))};return rz(i.hostsCache,u).then(j=>N([...j.statelessHosts].reverse(),j.getTimeout))}function lz(i){let{hostsCache:u,logger:f,requester:c,requestsCache:g,responsesCache:t,timeouts:C,userAgent:A,hosts:x,queryParameters:D,headers:L}=i,N={hostsCache:u,logger:f,requester:c,requestsCache:g,responsesCache:t,timeouts:C,userAgent:A,headers:L,queryParameters:D,hosts:x.map(j=>Z3(j)),read(j,$){let h=J3($,N.timeouts.read),re=()=>PC(N,N.hosts.filter(oe=>(oe.accept&hm.Read)!=0),j,h);if((h.cacheable!==void 0?h.cacheable:j.cacheable)!==!0)return re();let Q={request:j,mappedRequestOptions:h,transporter:{queryParameters:N.queryParameters,headers:N.headers}};return N.responsesCache.get(Q,()=>N.requestsCache.get(Q,()=>N.requestsCache.set(Q,re()).then(oe=>Promise.all([N.requestsCache.delete(Q),oe]),oe=>Promise.all([N.requestsCache.delete(Q),Promise.reject(oe)])).then(([oe,Se])=>Se)),{miss:oe=>N.responsesCache.set(Q,oe)})},write(j,$){return PC(N,N.hosts.filter(h=>(h.accept&hm.Write)!=0),j,J3($,N.timeouts.write))}};return N}function fz(i){let u={value:`Algolia for JavaScript (${i})`,add(f){let c=`; ${f.segment}${f.version!==void 0?` (${f.version})`:""}`;return u.value.indexOf(c)===-1&&(u.value=`${u.value}${c}`),u}};return u}function TC(i){try{return JSON.parse(i.content)}catch(u){throw MC(u.message,i)}}function xC({content:i,status:u},f){let c=i;try{c=JSON.parse(i).message}catch(g){}return FC(c,u,f)}function cz(i,...u){let f=0;return i.replace(/%s/g,()=>encodeURIComponent(u[f++]))}function kC(i,u,f){let c=LC(f),g=`${i.protocol}://${i.url}/${u.charAt(0)==="/"?u.substr(1):u}`;return c.length&&(g+=`?${c}`),g}function LC(i){let u=f=>Object.prototype.toString.call(f)==="[object Object]"||Object.prototype.toString.call(f)==="[object Array]";return Object.keys(i).map(f=>cz("%s=%s",f,u(i[f])?JSON.stringify(i[f]):i[f])).join("&")}function AC(i,u){if(i.method===DC.MethodEnum.Get||i.data===void 0&&u.data===void 0)return;let f=Array.isArray(i.data)?i.data:dt(dt({},i.data),u.data);return JSON.stringify(f)}function OC(i,u){let f=dt(dt({},i.headers),u.headers),c={};return Object.keys(f).forEach(g=>{let t=f[g];c[g.toLowerCase()]=t}),c}function ew(i){return i.map(u=>tw(u))}function tw(i){let u=i.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return zn(dt({},i),{request:zn(dt({},i.request),{headers:dt(dt({},i.request.headers),u)})})}function FC(i,u,f){return{name:"ApiError",message:i,status:u,transporterStackTrace:f}}function MC(i,u){return{name:"DeserializationError",message:i,response:u}}function IC(i){return{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:i}}y0.CallEnum=hm;y0.HostStatusEnum=Ia;y0.createApiError=FC;y0.createDeserializationError=MC;y0.createMappedRequestOptions=J3;y0.createRetryError=IC;y0.createStatefulHost=Q3;y0.createStatelessHost=Z3;y0.createTransporter=lz;y0.createUserAgent=fz;y0.deserializeFailure=xC;y0.deserializeSuccess=TC;y0.isStatefulHostTimeouted=CC;y0.isStatefulHostUp=SC;y0.serializeData=AC;y0.serializeHeaders=OC;y0.serializeQueryParameters=LC;y0.serializeUrl=kC;y0.stackFrameWithoutCredentials=tw;y0.stackTraceWithoutCredentials=ew});var ed=Me((gV,NC)=>{NC.exports=RC()});var BC=Me(Hf=>{"use strict";Object.defineProperty(Hf,"__esModule",{value:!0});var Pa=Q2(),az=ed(),td=Z2(),dz=i=>{let u=i.region||"us",f=Pa.createAuth(Pa.AuthMode.WithinHeaders,i.appId,i.apiKey),c=az.createTransporter(zn(dt({hosts:[{url:`analytics.${u}.algolia.com`}]},i),{headers:dt(zn(dt({},f.headers()),{"content-type":"application/json"}),i.headers),queryParameters:dt(dt({},f.queryParameters()),i.queryParameters)})),g=i.appId;return Pa.addMethods({appId:g,transporter:c},i.methods)},pz=i=>(u,f)=>i.transporter.write({method:td.MethodEnum.Post,path:"2/abtests",data:u},f),hz=i=>(u,f)=>i.transporter.write({method:td.MethodEnum.Delete,path:Pa.encode("2/abtests/%s",u)},f),mz=i=>(u,f)=>i.transporter.read({method:td.MethodEnum.Get,path:Pa.encode("2/abtests/%s",u)},f),vz=i=>u=>i.transporter.read({method:td.MethodEnum.Get,path:"2/abtests"},u),gz=i=>(u,f)=>i.transporter.write({method:td.MethodEnum.Post,path:Pa.encode("2/abtests/%s/stop",u)},f);Hf.addABTest=pz;Hf.createAnalyticsClient=dz;Hf.deleteABTest=hz;Hf.getABTest=mz;Hf.getABTests=vz;Hf.stopABTest=gz});var UC=Me((yV,jC)=>{jC.exports=BC()});var zC=Me(nd=>{"use strict";Object.defineProperty(nd,"__esModule",{value:!0});var nw=Q2(),_z=ed(),qC=Z2(),yz=i=>{let u=i.region||"us",f=nw.createAuth(nw.AuthMode.WithinHeaders,i.appId,i.apiKey),c=_z.createTransporter(zn(dt({hosts:[{url:`recommendation.${u}.algolia.com`}]},i),{headers:dt(zn(dt({},f.headers()),{"content-type":"application/json"}),i.headers),queryParameters:dt(dt({},f.queryParameters()),i.queryParameters)}));return nw.addMethods({appId:i.appId,transporter:c},i.methods)},wz=i=>u=>i.transporter.read({method:qC.MethodEnum.Get,path:"1/strategies/personalization"},u),Dz=i=>(u,f)=>i.transporter.write({method:qC.MethodEnum.Post,path:"1/strategies/personalization",data:u},f);nd.createRecommendationClient=yz;nd.getPersonalizationStrategy=wz;nd.setPersonalizationStrategy=Dz});var HC=Me((DV,WC)=>{WC.exports=zC()});var nT=Me(yt=>{"use strict";Object.defineProperty(yt,"__esModule",{value:!0});var Wt=Q2(),jo=ed(),Rn=Z2(),Ez=require("crypto");function mm(i){let u=f=>i.request(f).then(c=>{if(i.batch!==void 0&&i.batch(c.hits),!i.shouldStop(c))return c.cursor?u({cursor:c.cursor}):u({page:(f.page||0)+1})});return u({})}var Sz=i=>{let u=i.appId,f=Wt.createAuth(i.authMode!==void 0?i.authMode:Wt.AuthMode.WithinHeaders,u,i.apiKey),c=jo.createTransporter(zn(dt({hosts:[{url:`${u}-dsn.algolia.net`,accept:jo.CallEnum.Read},{url:`${u}.algolia.net`,accept:jo.CallEnum.Write}].concat(Wt.shuffle([{url:`${u}-1.algolianet.com`},{url:`${u}-2.algolianet.com`},{url:`${u}-3.algolianet.com`}]))},i),{headers:dt(zn(dt({},f.headers()),{"content-type":"application/x-www-form-urlencoded"}),i.headers),queryParameters:dt(dt({},f.queryParameters()),i.queryParameters)})),g={transporter:c,appId:u,addAlgoliaAgent(t,C){c.userAgent.add({segment:t,version:C})},clearCache(){return Promise.all([c.requestsCache.clear(),c.responsesCache.clear()]).then(()=>{})}};return Wt.addMethods(g,i.methods)};function bC(){return{name:"MissingObjectIDError",message:"All objects must have an unique objectID (like a primary key) to be valid. Algolia is also able to generate objectIDs automatically but *it's not recommended*. To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option."}}function GC(){return{name:"ObjectNotFoundError",message:"Object not found."}}function VC(){return{name:"ValidUntilNotFoundError",message:"ValidUntil not found in given secured api key."}}var Cz=i=>(u,f)=>{let A=f||{},{queryParameters:c}=A,g=Si(A,["queryParameters"]),t=dt({acl:u},c!==void 0?{queryParameters:c}:{}),C=(x,D)=>Wt.createRetryablePromise(L=>rd(i)(x.key,D).catch(N=>{if(N.status!==404)throw N;return L()}));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:"1/keys",data:t},g),C)},Tz=i=>(u,f,c)=>{let g=jo.createMappedRequestOptions(c);return g.queryParameters["X-Algolia-User-ID"]=u,i.transporter.write({method:Rn.MethodEnum.Post,path:"1/clusters/mapping",data:{cluster:f}},g)},xz=i=>(u,f,c)=>i.transporter.write({method:Rn.MethodEnum.Post,path:"1/clusters/mapping/batch",data:{users:u,cluster:f}},c),vm=i=>(u,f,c)=>{let g=(t,C)=>id(i)(u,{methods:{waitTask:z0}}).waitTask(t.taskID,C);return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",u),data:{operation:"copy",destination:f}},c),g)},kz=i=>(u,f,c)=>vm(i)(u,f,zn(dt({},c),{scope:[gm.Rules]})),Az=i=>(u,f,c)=>vm(i)(u,f,zn(dt({},c),{scope:[gm.Settings]})),Oz=i=>(u,f,c)=>vm(i)(u,f,zn(dt({},c),{scope:[gm.Synonyms]})),Iz=i=>(u,f)=>{let c=(g,t)=>Wt.createRetryablePromise(C=>rd(i)(u,t).then(C).catch(A=>{if(A.status!==404)throw A}));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Delete,path:Wt.encode("1/keys/%s",u)},f),c)},Pz=()=>(i,u)=>{let f=jo.serializeQueryParameters(u),c=Ez.createHmac("sha256",i).update(f).digest("hex");return Buffer.from(c+f).toString("base64")},rd=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/keys/%s",u)},f),Mz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/logs"},u),Fz=()=>i=>{let u=Buffer.from(i,"base64").toString("ascii"),f=/validUntil=(\d+)/,c=u.match(f);if(c===null)throw VC();return parseInt(c[1],10)-Math.round(new Date().getTime()/1e3)},Lz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/clusters/mapping/top"},u),Rz=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/clusters/mapping/%s",u)},f),Nz=i=>u=>{let g=u||{},{retrieveMappings:f}=g,c=Si(g,["retrieveMappings"]);return f===!0&&(c.getClusters=!0),i.transporter.read({method:Rn.MethodEnum.Get,path:"1/clusters/mapping/pending"},c)},id=i=>(u,f={})=>{let c={transporter:i.transporter,appId:i.appId,indexName:u};return Wt.addMethods(c,f.methods)},Bz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/keys"},u),jz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/clusters"},u),Uz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/indexes"},u),qz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/clusters/mapping"},u),zz=i=>(u,f,c)=>{let g=(t,C)=>id(i)(u,{methods:{waitTask:z0}}).waitTask(t.taskID,C);return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",u),data:{operation:"move",destination:f}},c),g)},Wz=i=>(u,f)=>{let c=(g,t)=>Promise.all(Object.keys(g.taskID).map(C=>id(i)(C,{methods:{waitTask:z0}}).waitTask(g.taskID[C],t)));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:"1/indexes/*/batch",data:{requests:u}},f),c)},Hz=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:u}},f),bz=i=>(u,f)=>{let c=u.map(g=>zn(dt({},g),{params:jo.serializeQueryParameters(g.params||{})}));return i.transporter.read({method:Rn.MethodEnum.Post,path:"1/indexes/*/queries",data:{requests:c},cacheable:!0},f)},Gz=i=>(u,f)=>Promise.all(u.map(c=>{let A=c.params,{facetName:g,facetQuery:t}=A,C=Si(A,["facetName","facetQuery"]);return id(i)(c.indexName,{methods:{searchForFacetValues:YC}}).searchForFacetValues(g,t,dt(dt({},f),C))})),Vz=i=>(u,f)=>{let c=jo.createMappedRequestOptions(f);return c.queryParameters["X-Algolia-User-ID"]=u,i.transporter.write({method:Rn.MethodEnum.Delete,path:"1/clusters/mapping"},c)},Yz=i=>(u,f)=>{let c=(g,t)=>Wt.createRetryablePromise(C=>rd(i)(u,t).catch(A=>{if(A.status!==404)throw A;return C()}));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/keys/%s/restore",u)},f),c)},$z=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:"1/clusters/mapping/search",data:{query:u}},f),Kz=i=>(u,f)=>{let c=Object.assign({},f),L=f||{},{queryParameters:g}=L,t=Si(L,["queryParameters"]),C=g?{queryParameters:g}:{},A=["acl","indexes","referers","restrictSources","queryParameters","description","maxQueriesPerIPPerHour","maxHitsPerQuery"],x=N=>Object.keys(c).filter(j=>A.indexOf(j)!==-1).every(j=>N[j]===c[j]),D=(N,j)=>Wt.createRetryablePromise($=>rd(i)(u,j).then(h=>x(h)?Promise.resolve():$()));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Put,path:Wt.encode("1/keys/%s",u),data:C},t),D)},$C=i=>(u,f)=>{let c=(g,t)=>z0(i)(g.taskID,t);return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/batch",i.indexName),data:{requests:u}},f),c)},Xz=i=>u=>mm(zn(dt({},u),{shouldStop:f=>f.cursor===void 0,request:f=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/browse",i.indexName),data:f},u)})),Jz=i=>u=>{let f=dt({hitsPerPage:1e3},u);return mm(zn(dt({},f),{shouldStop:c=>c.hits.lengthzn(dt({},g),{hits:g.hits.map(t=>(delete t._highlightResult,t))}))}}))},Qz=i=>u=>{let f=dt({hitsPerPage:1e3},u);return mm(zn(dt({},f),{shouldStop:c=>c.hits.lengthzn(dt({},g),{hits:g.hits.map(t=>(delete t._highlightResult,t))}))}}))},_m=i=>(u,f,c)=>{let x=c||{},{batchSize:g}=x,t=Si(x,["batchSize"]),C={taskIDs:[],objectIDs:[]},A=(D=0)=>{let L=[],N;for(N=D;N({action:f,body:j})),t).then(j=>(C.objectIDs=C.objectIDs.concat(j.objectIDs),C.taskIDs.push(j.taskID),N++,A(N)))};return Wt.createWaitablePromise(A(),(D,L)=>Promise.all(D.taskIDs.map(N=>z0(i)(N,L))))},Zz=i=>u=>Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/clear",i.indexName)},u),(f,c)=>z0(i)(f.taskID,c)),eW=i=>u=>{let t=u||{},{forwardToReplicas:f}=t,c=Si(t,["forwardToReplicas"]),g=jo.createMappedRequestOptions(c);return f&&(g.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/clear",i.indexName)},g),(C,A)=>z0(i)(C.taskID,A))},tW=i=>u=>{let t=u||{},{forwardToReplicas:f}=t,c=Si(t,["forwardToReplicas"]),g=jo.createMappedRequestOptions(c);return f&&(g.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/clear",i.indexName)},g),(C,A)=>z0(i)(C.taskID,A))},nW=i=>(u,f)=>Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/deleteByQuery",i.indexName),data:u},f),(c,g)=>z0(i)(c.taskID,g)),rW=i=>u=>Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Delete,path:Wt.encode("1/indexes/%s",i.indexName)},u),(f,c)=>z0(i)(f.taskID,c)),iW=i=>(u,f)=>Wt.createWaitablePromise(JC(i)([u],f).then(c=>({taskID:c.taskIDs[0]})),(c,g)=>z0(i)(c.taskID,g)),JC=i=>(u,f)=>{let c=u.map(g=>({objectID:g}));return _m(i)(c,Cc.DeleteObject,f)},oW=i=>(u,f)=>{let C=f||{},{forwardToReplicas:c}=C,g=Si(C,["forwardToReplicas"]),t=jo.createMappedRequestOptions(g);return c&&(t.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Delete,path:Wt.encode("1/indexes/%s/rules/%s",i.indexName,u)},t),(A,x)=>z0(i)(A.taskID,x))},uW=i=>(u,f)=>{let C=f||{},{forwardToReplicas:c}=C,g=Si(C,["forwardToReplicas"]),t=jo.createMappedRequestOptions(g);return c&&(t.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Delete,path:Wt.encode("1/indexes/%s/synonyms/%s",i.indexName,u)},t),(A,x)=>z0(i)(A.taskID,x))},sW=i=>u=>QC(i)(u).then(()=>!0).catch(f=>{if(f.status!==404)throw f;return!1}),lW=i=>(u,f)=>{let x=f||{},{query:c,paginate:g}=x,t=Si(x,["query","paginate"]),C=0,A=()=>ZC(i)(c||"",zn(dt({},t),{page:C})).then(D=>{for(let[L,N]of Object.entries(D.hits))if(u(N))return{object:N,position:parseInt(L,10),page:C};if(C++,g===!1||C>=D.nbPages)throw GC();return A()});return A()},fW=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/%s",i.indexName,u)},f),cW=()=>(i,u)=>{for(let[f,c]of Object.entries(i.hits))if(c.objectID===u)return parseInt(f,10);return-1},aW=i=>(u,f)=>{let C=f||{},{attributesToRetrieve:c}=C,g=Si(C,["attributesToRetrieve"]),t=u.map(A=>dt({indexName:i.indexName,objectID:A},c?{attributesToRetrieve:c}:{}));return i.transporter.read({method:Rn.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:t}},g)},dW=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/rules/%s",i.indexName,u)},f),QC=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/settings",i.indexName),data:{getVersion:2}},u),pW=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/synonyms/%s",i.indexName,u)},f),eT=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/task/%s",i.indexName,u.toString())},f),hW=i=>(u,f)=>Wt.createWaitablePromise(tT(i)([u],f).then(c=>({objectID:c.objectIDs[0],taskID:c.taskIDs[0]})),(c,g)=>z0(i)(c.taskID,g)),tT=i=>(u,f)=>{let C=f||{},{createIfNotExists:c}=C,g=Si(C,["createIfNotExists"]),t=c?Cc.PartialUpdateObject:Cc.PartialUpdateObjectNoCreate;return _m(i)(u,t,g)},mW=i=>(u,f)=>{let h=f||{},{safe:c,autoGenerateObjectIDIfNotExist:g,batchSize:t}=h,C=Si(h,["safe","autoGenerateObjectIDIfNotExist","batchSize"]),A=(re,ce,Q,oe)=>Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",re),data:{operation:Q,destination:ce}},oe),(Se,me)=>z0(i)(Se.taskID,me)),x=Math.random().toString(36).substring(7),D=`${i.indexName}_tmp_${x}`,L=rw({appId:i.appId,transporter:i.transporter,indexName:D}),N=[],j=A(i.indexName,D,"copy",zn(dt({},C),{scope:["settings","synonyms","rules"]}));N.push(j);let $=(c?j.wait(C):j).then(()=>{let re=L(u,zn(dt({},C),{autoGenerateObjectIDIfNotExist:g,batchSize:t}));return N.push(re),c?re.wait(C):re}).then(()=>{let re=A(D,i.indexName,"move",C);return N.push(re),c?re.wait(C):re}).then(()=>Promise.all(N)).then(([re,ce,Q])=>({objectIDs:ce.objectIDs,taskIDs:[re.taskID,...ce.taskIDs,Q.taskID]}));return Wt.createWaitablePromise($,(re,ce)=>Promise.all(N.map(Q=>Q.wait(ce))))},vW=i=>(u,f)=>iw(i)(u,zn(dt({},f),{clearExistingRules:!0})),gW=i=>(u,f)=>ow(i)(u,zn(dt({},f),{replaceExistingSynonyms:!0})),_W=i=>(u,f)=>Wt.createWaitablePromise(rw(i)([u],f).then(c=>({objectID:c.objectIDs[0],taskID:c.taskIDs[0]})),(c,g)=>z0(i)(c.taskID,g)),rw=i=>(u,f)=>{let C=f||{},{autoGenerateObjectIDIfNotExist:c}=C,g=Si(C,["autoGenerateObjectIDIfNotExist"]),t=c?Cc.AddObject:Cc.UpdateObject;if(t===Cc.UpdateObject){for(let A of u)if(A.objectID===void 0)return Wt.createWaitablePromise(Promise.reject(bC()))}return _m(i)(u,t,g)},yW=i=>(u,f)=>iw(i)([u],f),iw=i=>(u,f)=>{let A=f||{},{forwardToReplicas:c,clearExistingRules:g}=A,t=Si(A,["forwardToReplicas","clearExistingRules"]),C=jo.createMappedRequestOptions(t);return c&&(C.queryParameters.forwardToReplicas=1),g&&(C.queryParameters.clearExistingRules=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/batch",i.indexName),data:u},C),(x,D)=>z0(i)(x.taskID,D))},wW=i=>(u,f)=>ow(i)([u],f),ow=i=>(u,f)=>{let A=f||{},{forwardToReplicas:c,replaceExistingSynonyms:g}=A,t=Si(A,["forwardToReplicas","replaceExistingSynonyms"]),C=jo.createMappedRequestOptions(t);return c&&(C.queryParameters.forwardToReplicas=1),g&&(C.queryParameters.replaceExistingSynonyms=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/batch",i.indexName),data:u},C),(x,D)=>z0(i)(x.taskID,D))},ZC=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/query",i.indexName),data:{query:u},cacheable:!0},f),YC=i=>(u,f,c)=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/facets/%s/query",i.indexName,u),data:{facetQuery:f},cacheable:!0},c),KC=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/search",i.indexName),data:{query:u}},f),XC=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/search",i.indexName),data:{query:u}},f),DW=i=>(u,f)=>{let C=f||{},{forwardToReplicas:c}=C,g=Si(C,["forwardToReplicas"]),t=jo.createMappedRequestOptions(g);return c&&(t.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Put,path:Wt.encode("1/indexes/%s/settings",i.indexName),data:u},t),(A,x)=>z0(i)(A.taskID,x))},z0=i=>(u,f)=>Wt.createRetryablePromise(c=>eT(i)(u,f).then(g=>g.status!=="published"?c():void 0)),EW={AddObject:"addObject",Analytics:"analytics",Browser:"browse",DeleteIndex:"deleteIndex",DeleteObject:"deleteObject",EditSettings:"editSettings",ListIndexes:"listIndexes",Logs:"logs",Recommendation:"recommendation",Search:"search",SeeUnretrievableAttributes:"seeUnretrievableAttributes",Settings:"settings",Usage:"usage"},Cc={AddObject:"addObject",UpdateObject:"updateObject",PartialUpdateObject:"partialUpdateObject",PartialUpdateObjectNoCreate:"partialUpdateObjectNoCreate",DeleteObject:"deleteObject"},gm={Settings:"settings",Synonyms:"synonyms",Rules:"rules"},SW={None:"none",StopIfEnoughMatches:"stopIfEnoughMatches"},CW={Synonym:"synonym",OneWaySynonym:"oneWaySynonym",AltCorrection1:"altCorrection1",AltCorrection2:"altCorrection2",Placeholder:"placeholder"};yt.ApiKeyACLEnum=EW;yt.BatchActionEnum=Cc;yt.ScopeEnum=gm;yt.StrategyEnum=SW;yt.SynonymEnum=CW;yt.addApiKey=Cz;yt.assignUserID=Tz;yt.assignUserIDs=xz;yt.batch=$C;yt.browseObjects=Xz;yt.browseRules=Jz;yt.browseSynonyms=Qz;yt.chunkedBatch=_m;yt.clearObjects=Zz;yt.clearRules=eW;yt.clearSynonyms=tW;yt.copyIndex=vm;yt.copyRules=kz;yt.copySettings=Az;yt.copySynonyms=Oz;yt.createBrowsablePromise=mm;yt.createMissingObjectIDError=bC;yt.createObjectNotFoundError=GC;yt.createSearchClient=Sz;yt.createValidUntilNotFoundError=VC;yt.deleteApiKey=Iz;yt.deleteBy=nW;yt.deleteIndex=rW;yt.deleteObject=iW;yt.deleteObjects=JC;yt.deleteRule=oW;yt.deleteSynonym=uW;yt.exists=sW;yt.findObject=lW;yt.generateSecuredApiKey=Pz;yt.getApiKey=rd;yt.getLogs=Mz;yt.getObject=fW;yt.getObjectPosition=cW;yt.getObjects=aW;yt.getRule=dW;yt.getSecuredApiKeyRemainingValidity=Fz;yt.getSettings=QC;yt.getSynonym=pW;yt.getTask=eT;yt.getTopUserIDs=Lz;yt.getUserID=Rz;yt.hasPendingMappings=Nz;yt.initIndex=id;yt.listApiKeys=Bz;yt.listClusters=jz;yt.listIndices=Uz;yt.listUserIDs=qz;yt.moveIndex=zz;yt.multipleBatch=Wz;yt.multipleGetObjects=Hz;yt.multipleQueries=bz;yt.multipleSearchForFacetValues=Gz;yt.partialUpdateObject=hW;yt.partialUpdateObjects=tT;yt.removeUserID=Vz;yt.replaceAllObjects=mW;yt.replaceAllRules=vW;yt.replaceAllSynonyms=gW;yt.restoreApiKey=Yz;yt.saveObject=_W;yt.saveObjects=rw;yt.saveRule=yW;yt.saveRules=iw;yt.saveSynonym=wW;yt.saveSynonyms=ow;yt.search=ZC;yt.searchForFacetValues=YC;yt.searchRules=KC;yt.searchSynonyms=XC;yt.searchUserIDs=$z;yt.setSettings=DW;yt.updateApiKey=Kz;yt.waitTask=z0});var iT=Me((SV,rT)=>{rT.exports=nT()});var oT=Me(ym=>{"use strict";Object.defineProperty(ym,"__esModule",{value:!0});function TW(){return{debug(i,u){return Promise.resolve()},info(i,u){return Promise.resolve()},error(i,u){return Promise.resolve()}}}var xW={Debug:1,Info:2,Error:3};ym.LogLevelEnum=xW;ym.createNullLogger=TW});var sT=Me((TV,uT)=>{uT.exports=oT()});var cT=Me(uw=>{"use strict";Object.defineProperty(uw,"__esModule",{value:!0});var lT=require("http"),fT=require("https"),kW=require("url");function AW(){let i={keepAlive:!0},u=new lT.Agent(i),f=new fT.Agent(i);return{send(c){return new Promise(g=>{let t=kW.parse(c.url),C=t.query===null?t.pathname:`${t.pathname}?${t.query}`,A=dt({agent:t.protocol==="https:"?f:u,hostname:t.hostname,path:C,method:c.method,headers:c.headers},t.port!==void 0?{port:t.port||""}:{}),x=(t.protocol==="https:"?fT:lT).request(A,j=>{let $="";j.on("data",h=>$+=h),j.on("end",()=>{clearTimeout(L),clearTimeout(N),g({status:j.statusCode||0,content:$,isTimedOut:!1})})}),D=(j,$)=>setTimeout(()=>{x.abort(),g({status:0,content:$,isTimedOut:!0})},j*1e3),L=D(c.connectTimeout,"Connection timeout"),N;x.on("error",j=>{clearTimeout(L),clearTimeout(N),g({status:0,content:j.message,isTimedOut:!1})}),x.once("response",()=>{clearTimeout(L),N=D(c.responseTimeout,"Socket timeout")}),c.data!==void 0&&x.write(c.data),x.end()})},destroy(){return u.destroy(),f.destroy(),Promise.resolve()}}}uw.createNodeHttpRequester=AW});var dT=Me((kV,aT)=>{aT.exports=cT()});var vT=Me((AV,pT)=>{"use strict";var hT=dC(),OW=mC(),Ma=UC(),sw=Q2(),lw=HC(),Mt=iT(),IW=sT(),PW=dT(),MW=ed();function mT(i,u,f){let c={appId:i,apiKey:u,timeouts:{connect:2,read:5,write:30},requester:PW.createNodeHttpRequester(),logger:IW.createNullLogger(),responsesCache:hT.createNullCache(),requestsCache:hT.createNullCache(),hostsCache:OW.createInMemoryCache(),userAgent:MW.createUserAgent(sw.version).add({segment:"Node.js",version:process.versions.node})};return Mt.createSearchClient(zn(dt(dt({},c),f),{methods:{search:Mt.multipleQueries,searchForFacetValues:Mt.multipleSearchForFacetValues,multipleBatch:Mt.multipleBatch,multipleGetObjects:Mt.multipleGetObjects,multipleQueries:Mt.multipleQueries,copyIndex:Mt.copyIndex,copySettings:Mt.copySettings,copyRules:Mt.copyRules,copySynonyms:Mt.copySynonyms,moveIndex:Mt.moveIndex,listIndices:Mt.listIndices,getLogs:Mt.getLogs,listClusters:Mt.listClusters,multipleSearchForFacetValues:Mt.multipleSearchForFacetValues,getApiKey:Mt.getApiKey,addApiKey:Mt.addApiKey,listApiKeys:Mt.listApiKeys,updateApiKey:Mt.updateApiKey,deleteApiKey:Mt.deleteApiKey,restoreApiKey:Mt.restoreApiKey,assignUserID:Mt.assignUserID,assignUserIDs:Mt.assignUserIDs,getUserID:Mt.getUserID,searchUserIDs:Mt.searchUserIDs,listUserIDs:Mt.listUserIDs,getTopUserIDs:Mt.getTopUserIDs,removeUserID:Mt.removeUserID,hasPendingMappings:Mt.hasPendingMappings,generateSecuredApiKey:Mt.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:Mt.getSecuredApiKeyRemainingValidity,destroy:sw.destroy,initIndex:g=>t=>Mt.initIndex(g)(t,{methods:{batch:Mt.batch,delete:Mt.deleteIndex,getObject:Mt.getObject,getObjects:Mt.getObjects,saveObject:Mt.saveObject,saveObjects:Mt.saveObjects,search:Mt.search,searchForFacetValues:Mt.searchForFacetValues,waitTask:Mt.waitTask,setSettings:Mt.setSettings,getSettings:Mt.getSettings,partialUpdateObject:Mt.partialUpdateObject,partialUpdateObjects:Mt.partialUpdateObjects,deleteObject:Mt.deleteObject,deleteObjects:Mt.deleteObjects,deleteBy:Mt.deleteBy,clearObjects:Mt.clearObjects,browseObjects:Mt.browseObjects,getObjectPosition:Mt.getObjectPosition,findObject:Mt.findObject,exists:Mt.exists,saveSynonym:Mt.saveSynonym,saveSynonyms:Mt.saveSynonyms,getSynonym:Mt.getSynonym,searchSynonyms:Mt.searchSynonyms,browseSynonyms:Mt.browseSynonyms,deleteSynonym:Mt.deleteSynonym,clearSynonyms:Mt.clearSynonyms,replaceAllObjects:Mt.replaceAllObjects,replaceAllSynonyms:Mt.replaceAllSynonyms,searchRules:Mt.searchRules,getRule:Mt.getRule,deleteRule:Mt.deleteRule,saveRule:Mt.saveRule,saveRules:Mt.saveRules,replaceAllRules:Mt.replaceAllRules,browseRules:Mt.browseRules,clearRules:Mt.clearRules}}),initAnalytics:()=>g=>Ma.createAnalyticsClient(zn(dt(dt({},c),g),{methods:{addABTest:Ma.addABTest,getABTest:Ma.getABTest,getABTests:Ma.getABTests,stopABTest:Ma.stopABTest,deleteABTest:Ma.deleteABTest}})),initRecommendation:()=>g=>lw.createRecommendationClient(zn(dt(dt({},c),g),{methods:{getPersonalizationStrategy:lw.getPersonalizationStrategy,setPersonalizationStrategy:lw.setPersonalizationStrategy}}))}}))}mT.version=sw.version;pT.exports=mT});var _T=Me((OV,fw)=>{var gT=vT();fw.exports=gT;fw.exports.default=gT});var rf=Me(dw=>{"use strict";Object.defineProperty(dw,"__esModule",{value:!0});dw.default=kT;function kT(){}kT.prototype={diff:function(u,f){var c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},g=c.callback;typeof c=="function"&&(g=c,c={}),this.options=c;var t=this;function C(re){return g?(setTimeout(function(){g(void 0,re)},0),!0):re}u=this.castInput(u),f=this.castInput(f),u=this.removeEmpty(this.tokenize(u)),f=this.removeEmpty(this.tokenize(f));var A=f.length,x=u.length,D=1,L=A+x,N=[{newPos:-1,components:[]}],j=this.extractCommon(N[0],f,u,0);if(N[0].newPos+1>=A&&j+1>=x)return C([{value:this.join(f),count:f.length}]);function $(){for(var re=-1*D;re<=D;re+=2){var ce=void 0,Q=N[re-1],oe=N[re+1],Se=(oe?oe.newPos:0)-re;Q&&(N[re-1]=void 0);var me=Q&&Q.newPos+1=A&&Se+1>=x)return C(LW(t,ce.components,f,u,t.useLongestToken));N[re]=ce}D++}if(g)(function re(){setTimeout(function(){if(D>L)return g();$()||re()},0)})();else for(;D<=L;){var h=$();if(h)return h}},pushComponent:function(u,f,c){var g=u[u.length-1];g&&g.added===f&&g.removed===c?u[u.length-1]={count:g.count+1,added:f,removed:c}:u.push({count:1,added:f,removed:c})},extractCommon:function(u,f,c,g){for(var t=f.length,C=c.length,A=u.newPos,x=A-g,D=0;A+1$.length?re:$}),D.value=i.join(L)}else D.value=i.join(f.slice(A,A+D.count));A+=D.count,D.added||(x+=D.count)}}var j=u[C-1];return C>1&&typeof j.value=="string"&&(j.added||j.removed)&&i.equals("",j.value)&&(u[C-2].value+=j.value,u.pop()),u}function RW(i){return{newPos:i.newPos,components:i.components.slice(0)}}});var OT=Me(ld=>{"use strict";Object.defineProperty(ld,"__esModule",{value:!0});ld.diffChars=NW;ld.characterDiff=void 0;var jW=BW(rf());function BW(i){return i&&i.__esModule?i:{default:i}}var AT=new jW.default;ld.characterDiff=AT;function NW(i,u,f){return AT.diff(i,u,f)}});var hw=Me(pw=>{"use strict";Object.defineProperty(pw,"__esModule",{value:!0});pw.generateOptions=UW;function UW(i,u){if(typeof i=="function")u.callback=i;else if(i)for(var f in i)i.hasOwnProperty(f)&&(u[f]=i[f]);return u}});var MT=Me(Fa=>{"use strict";Object.defineProperty(Fa,"__esModule",{value:!0});Fa.diffWords=qW;Fa.diffWordsWithSpace=zW;Fa.wordDiff=void 0;var HW=WW(rf()),bW=hw();function WW(i){return i&&i.__esModule?i:{default:i}}var IT=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,PT=/\S/,fd=new HW.default;Fa.wordDiff=fd;fd.equals=function(i,u){return this.options.ignoreCase&&(i=i.toLowerCase(),u=u.toLowerCase()),i===u||this.options.ignoreWhitespace&&!PT.test(i)&&!PT.test(u)};fd.tokenize=function(i){for(var u=i.split(/(\s+|[()[\]{}'"]|\b)/),f=0;f{"use strict";Object.defineProperty(La,"__esModule",{value:!0});La.diffLines=GW;La.diffTrimmedLines=VW;La.lineDiff=void 0;var $W=YW(rf()),KW=hw();function YW(i){return i&&i.__esModule?i:{default:i}}var Dm=new $W.default;La.lineDiff=Dm;Dm.tokenize=function(i){var u=[],f=i.split(/(\n|\r\n)/);f[f.length-1]||f.pop();for(var c=0;c{"use strict";Object.defineProperty(cd,"__esModule",{value:!0});cd.diffSentences=XW;cd.sentenceDiff=void 0;var QW=JW(rf());function JW(i){return i&&i.__esModule?i:{default:i}}var mw=new QW.default;cd.sentenceDiff=mw;mw.tokenize=function(i){return i.split(/(\S.+?[.!?])(?=\s+|$)/)};function XW(i,u,f){return mw.diff(i,u,f)}});var LT=Me(ad=>{"use strict";Object.defineProperty(ad,"__esModule",{value:!0});ad.diffCss=ZW;ad.cssDiff=void 0;var tH=eH(rf());function eH(i){return i&&i.__esModule?i:{default:i}}var vw=new tH.default;ad.cssDiff=vw;vw.tokenize=function(i){return i.split(/([{}:;,]|\s+)/)};function ZW(i,u,f){return vw.diff(i,u,f)}});var NT=Me(Ra=>{"use strict";Object.defineProperty(Ra,"__esModule",{value:!0});Ra.diffJson=nH;Ra.canonicalize=Sm;Ra.jsonDiff=void 0;var RT=rH(rf()),iH=Em();function rH(i){return i&&i.__esModule?i:{default:i}}function Cm(i){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Cm=function(f){return typeof f}:Cm=function(f){return f&&typeof Symbol=="function"&&f.constructor===Symbol&&f!==Symbol.prototype?"symbol":typeof f},Cm(i)}var oH=Object.prototype.toString,xc=new RT.default;Ra.jsonDiff=xc;xc.useLongestToken=!0;xc.tokenize=iH.lineDiff.tokenize;xc.castInput=function(i){var u=this.options,f=u.undefinedReplacement,c=u.stringifyReplacer,g=c===void 0?function(t,C){return typeof C=="undefined"?f:C}:c;return typeof i=="string"?i:JSON.stringify(Sm(i,null,null,g),g," ")};xc.equals=function(i,u){return RT.default.prototype.equals.call(xc,i.replace(/,([\r\n])/g,"$1"),u.replace(/,([\r\n])/g,"$1"))};function nH(i,u,f){return xc.diff(i,u,f)}function Sm(i,u,f,c,g){u=u||[],f=f||[],c&&(i=c(g,i));var t;for(t=0;t{"use strict";Object.defineProperty(dd,"__esModule",{value:!0});dd.diffArrays=uH;dd.arrayDiff=void 0;var lH=sH(rf());function sH(i){return i&&i.__esModule?i:{default:i}}var pd=new lH.default;dd.arrayDiff=pd;pd.tokenize=function(i){return i.slice()};pd.join=pd.removeEmpty=function(i){return i};function uH(i,u,f){return pd.diff(i,u,f)}});var Tm=Me(gw=>{"use strict";Object.defineProperty(gw,"__esModule",{value:!0});gw.parsePatch=fH;function fH(i){var u=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},f=i.split(/\r\n|[\n\v\f\r\x85]/),c=i.match(/\r\n|[\n\v\f\r\x85]/g)||[],g=[],t=0;function C(){var D={};for(g.push(D);t{"use strict";Object.defineProperty(_w,"__esModule",{value:!0});_w.default=cH;function cH(i,u,f){var c=!0,g=!1,t=!1,C=1;return function A(){if(c&&!t){if(g?C++:c=!1,i+C<=f)return C;t=!0}if(!g)return t||(c=!0),u<=i-C?-C++:(g=!0,A())}}});var zT=Me(xm=>{"use strict";Object.defineProperty(xm,"__esModule",{value:!0});xm.applyPatch=UT;xm.applyPatches=aH;var qT=Tm(),pH=dH(jT());function dH(i){return i&&i.__esModule?i:{default:i}}function UT(i,u){var f=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(typeof u=="string"&&(u=(0,qT.parsePatch)(u)),Array.isArray(u)){if(u.length>1)throw new Error("applyPatch only works with a single input.");u=u[0]}var c=i.split(/\r\n|[\n\v\f\r\x85]/),g=i.match(/\r\n|[\n\v\f\r\x85]/g)||[],t=u.hunks,C=f.compareLine||function(Ot,Nt,Je,V){return Nt===V},A=0,x=f.fuzzFactor||0,D=0,L=0,N,j;function $(Ot,Nt){for(var Je=0;Je0?V[0]:" ",ge=V.length>0?V.substr(1):V;if(ne===" "||ne==="-"){if(!C(Nt+1,c[Nt],ne,ge)&&(A++,A>x))return!1;Nt++}}return!0}for(var h=0;h0?Le[0]:" ",ct=Le.length>0?Le.substr(1):Le,Ue=J.linedelimiters[Oe];if(ot===" ")Te++;else if(ot==="-")c.splice(Te,1),g.splice(Te,1);else if(ot==="+")c.splice(Te,0,ct),g.splice(Te,0,Ue),Te++;else if(ot==="\\"){var be=J.lines[Oe-1]?J.lines[Oe-1][0]:null;be==="+"?N=!0:be==="-"&&(j=!0)}}}if(N)for(;!c[c.length-1];)c.pop(),g.pop();else j&&(c.push(""),g.push(` -`));for(var At=0;At{"use strict";Object.defineProperty(hd,"__esModule",{value:!0});hd.structuredPatch=WT;hd.createTwoFilesPatch=HT;hd.createPatch=hH;var mH=Em();function yw(i){return _H(i)||gH(i)||vH()}function vH(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function gH(i){if(Symbol.iterator in Object(i)||Object.prototype.toString.call(i)==="[object Arguments]")return Array.from(i)}function _H(i){if(Array.isArray(i)){for(var u=0,f=new Array(i.length);u0?x(J.lines.slice(-C.context)):[],L-=j.length,N-=j.length)}(De=j).push.apply(De,yw(me.map(function(At){return(Se.added?"+":"-")+At}))),Se.added?h+=me.length:$+=me.length}else{if(L)if(me.length<=C.context*2&&oe=A.length-2&&me.length<=C.context){var ct=/\n$/.test(f),Ue=/\n$/.test(c),be=me.length==0&&j.length>ot.oldLines;!ct&&be&&j.splice(ot.oldLines,0,"\\ No newline at end of file"),(!ct&&!be||!Ue)&&j.push("\\ No newline at end of file")}D.push(ot),L=0,N=0,j=[]}$+=me.length,h+=me.length}},ce=0;ce{"use strict";Object.defineProperty(km,"__esModule",{value:!0});km.arrayEqual=yH;km.arrayStartsWith=bT;function yH(i,u){return i.length!==u.length?!1:bT(i,u)}function bT(i,u){if(u.length>i.length)return!1;for(var f=0;f{"use strict";Object.defineProperty(Am,"__esModule",{value:!0});Am.calcLineCount=VT;Am.merge=wH;var DH=ww(),EH=Tm(),Dw=GT();function Na(i){return TH(i)||CH(i)||SH()}function SH(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function CH(i){if(Symbol.iterator in Object(i)||Object.prototype.toString.call(i)==="[object Arguments]")return Array.from(i)}function TH(i){if(Array.isArray(i)){for(var u=0,f=new Array(i.length);u{"use strict";Object.defineProperty(Cw,"__esModule",{value:!0});Cw.convertChangesToDMP=OH;function OH(i){for(var u=[],f,c,g=0;g{"use strict";Object.defineProperty(Tw,"__esModule",{value:!0});Tw.convertChangesToXML=IH;function IH(i){for(var u=[],f=0;f"):c.removed&&u.push(""),u.push(PH(c.value)),c.added?u.push(""):c.removed&&u.push("")}return u.join("")}function PH(i){var u=i;return u=u.replace(/&/g,"&"),u=u.replace(//g,">"),u=u.replace(/"/g,"""),u}});var f9=Me(w0=>{"use strict";Object.defineProperty(w0,"__esModule",{value:!0});Object.defineProperty(w0,"Diff",{enumerable:!0,get:function(){return MH.default}});Object.defineProperty(w0,"diffChars",{enumerable:!0,get:function(){return FH.diffChars}});Object.defineProperty(w0,"diffWords",{enumerable:!0,get:function(){return o9.diffWords}});Object.defineProperty(w0,"diffWordsWithSpace",{enumerable:!0,get:function(){return o9.diffWordsWithSpace}});Object.defineProperty(w0,"diffLines",{enumerable:!0,get:function(){return u9.diffLines}});Object.defineProperty(w0,"diffTrimmedLines",{enumerable:!0,get:function(){return u9.diffTrimmedLines}});Object.defineProperty(w0,"diffSentences",{enumerable:!0,get:function(){return LH.diffSentences}});Object.defineProperty(w0,"diffCss",{enumerable:!0,get:function(){return RH.diffCss}});Object.defineProperty(w0,"diffJson",{enumerable:!0,get:function(){return s9.diffJson}});Object.defineProperty(w0,"canonicalize",{enumerable:!0,get:function(){return s9.canonicalize}});Object.defineProperty(w0,"diffArrays",{enumerable:!0,get:function(){return NH.diffArrays}});Object.defineProperty(w0,"applyPatch",{enumerable:!0,get:function(){return l9.applyPatch}});Object.defineProperty(w0,"applyPatches",{enumerable:!0,get:function(){return l9.applyPatches}});Object.defineProperty(w0,"parsePatch",{enumerable:!0,get:function(){return BH.parsePatch}});Object.defineProperty(w0,"merge",{enumerable:!0,get:function(){return jH.merge}});Object.defineProperty(w0,"structuredPatch",{enumerable:!0,get:function(){return xw.structuredPatch}});Object.defineProperty(w0,"createTwoFilesPatch",{enumerable:!0,get:function(){return xw.createTwoFilesPatch}});Object.defineProperty(w0,"createPatch",{enumerable:!0,get:function(){return xw.createPatch}});Object.defineProperty(w0,"convertChangesToDMP",{enumerable:!0,get:function(){return UH.convertChangesToDMP}});Object.defineProperty(w0,"convertChangesToXML",{enumerable:!0,get:function(){return qH.convertChangesToXML}});var MH=zH(rf()),FH=OT(),o9=MT(),u9=Em(),LH=FT(),RH=LT(),s9=NT(),NH=BT(),l9=zT(),BH=Tm(),jH=n9(),xw=ww(),UH=r9(),qH=i9();function zH(i){return i&&i.__esModule?i:{default:i}}});var HH={};jR(HH,{default:()=>GH});var wT=Er(require("@yarnpkg/cli")),Tc=Er(require("@yarnpkg/core"));var Z5=Er(ys()),Dc=Er(lr()),om=(0,Dc.memo)(({active:i})=>{let u=(0,Dc.useMemo)(()=>i?"\u25C9":"\u25EF",[i]),f=(0,Dc.useMemo)(()=>i?"green":"yellow",[i]);return Dc.default.createElement(Z5.Text,{color:f},u)});var Wf=Er(ys()),Bo=Er(lr());var eC=Er(ys()),um=Er(lr());function zf({active:i},u,f){let{stdin:c}=(0,eC.useStdin)(),g=(0,um.useCallback)((t,C)=>u(t,C),f);(0,um.useEffect)(()=>{if(!(!i||!c))return c.on("keypress",g),()=>{c.off("keypress",g)}},[i,g,c])}var sm;(function(f){f.BEFORE="before",f.AFTER="after"})(sm||(sm={}));var tC=function({active:i},u,f){zf({active:i},(c,g)=>{g.name==="tab"&&(g.shift?u(sm.BEFORE):u(sm.AFTER))},f)};var lm=function(i,u,{active:f,minus:c,plus:g,set:t,loop:C=!0}){zf({active:f},(A,x)=>{let D=u.indexOf(i);switch(x.name){case c:{let L=D-1;if(C){t(u[(u.length+L)%u.length]);return}if(L<0)return;t(u[L])}break;case g:{let L=D+1;if(C){t(u[L%u.length]);return}if(L>=u.length)return;t(u[L])}break}},[u,i,g,t,C])};var fm=({active:i=!0,children:u=[],radius:f=10,size:c=1,loop:g=!0,onFocusRequest:t,willReachEnd:C})=>{let A=ce=>{if(ce.key===null)throw new Error("Expected all children to have a key");return ce.key},x=Bo.default.Children.map(u,ce=>A(ce)),D=x[0],[L,N]=(0,Bo.useState)(D),j=x.indexOf(L);(0,Bo.useEffect)(()=>{x.includes(L)||N(D)},[u]),(0,Bo.useEffect)(()=>{C&&j>=x.length-2&&C()},[j]),tC({active:i&&!!t},ce=>{t==null||t(ce)},[t]),lm(L,x,{active:i,minus:"up",plus:"down",set:N,loop:g});let $=j-f,h=j+f;h>x.length&&($-=h-x.length,h=x.length),$<0&&(h+=-$,$=0),h>=x.length&&(h=x.length-1);let re=[];for(let ce=$;ce<=h;++ce){let Q=x[ce],oe=i&&Q===L;re.push(Bo.default.createElement(Wf.Box,{key:Q,height:c},Bo.default.createElement(Wf.Box,{marginLeft:1,marginRight:1},Bo.default.createElement(Wf.Text,null,oe?Bo.default.createElement(Wf.Text,{color:"cyan",bold:!0},">"):" ")),Bo.default.createElement(Wf.Box,null,Bo.default.cloneElement(u[ce],{active:oe}))))}return Bo.default.createElement(Wf.Box,{flexDirection:"column",width:"100%"},re)};var cm=Er(lr());var nC=Er(ys()),nf=Er(lr()),rC=Er(require("readline")),G3=nf.default.createContext(null),iC=({children:i})=>{let{stdin:u,setRawMode:f}=(0,nC.useStdin)();(0,nf.useEffect)(()=>{f&&f(!0),u&&(0,rC.emitKeypressEvents)(u)},[u,f]);let[c,g]=(0,nf.useState)(new Map),t=(0,nf.useMemo)(()=>({getAll:()=>c,get:C=>c.get(C),set:(C,A)=>g(new Map([...c,[C,A]]))}),[c,g]);return nf.default.createElement(G3.Provider,{value:t,children:i})};function Ec(i,u){let f=(0,cm.useContext)(G3);if(f===null)throw new Error("Expected this hook to run with a ministore context attached");if(typeof i=="undefined")return f.getAll();let c=(0,cm.useCallback)(t=>{f.set(i,t)},[i,f.set]),g=f.get(i);return typeof g=="undefined"&&(g=u),[g,c]}var am=Er(ys()),V3=Er(lr());async function dm(i,u){let f,c=t=>{let{exit:C}=(0,am.useApp)();zf({active:!0},(A,x)=>{x.name==="return"&&(f=t,C())},[C,t])},{waitUntilExit:g}=(0,am.render)(V3.default.createElement(iC,null,V3.default.createElement(i,zn(dt({},u),{useSubmit:c}))));return await g(),f}var DT=Er(require("clipanion")),ET=Er(lC()),un=Er(ys()),Pt=Er(lr());var yT=Er(_T()),cw={appId:"OFCNCOG2CU",apiKey:"6fe4476ee5a1832882e326b506d14126",indexName:"npm-search"},FW=(0,yT.default)(cw.appId,cw.apiKey).initIndex(cw.indexName),aw=async(i,u=0)=>await FW.search(i,{analyticsTags:["yarn-plugin-interactive-tools"],attributesToRetrieve:["name","version","owner","repository","humanDownloadsLast30Days"],page:u,hitsPerPage:10});var od=["regular","dev","peer"],ud=class extends wT.BaseCommand{async execute(){let u=await Tc.Configuration.find(this.context.cwd,this.context.plugins),f=()=>Pt.default.createElement(un.Box,{flexDirection:"row"},Pt.default.createElement(un.Box,{flexDirection:"column",width:48},Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},""),"/",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," to move between packages.")),Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," to select a package.")),Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," again to change the target."))),Pt.default.createElement(un.Box,{flexDirection:"column"},Pt.default.createElement(un.Box,{marginLeft:1},Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," to install the selected packages.")),Pt.default.createElement(un.Box,{marginLeft:1},Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," to abort.")))),c=()=>Pt.default.createElement(Pt.default.Fragment,null,Pt.default.createElement(un.Box,{width:15},Pt.default.createElement(un.Text,{bold:!0,underline:!0,color:"gray"},"Owner")),Pt.default.createElement(un.Box,{width:11},Pt.default.createElement(un.Text,{bold:!0,underline:!0,color:"gray"},"Version")),Pt.default.createElement(un.Box,{width:10},Pt.default.createElement(un.Text,{bold:!0,underline:!0,color:"gray"},"Downloads"))),g=()=>Pt.default.createElement(un.Box,{width:17},Pt.default.createElement(un.Text,{bold:!0,underline:!0,color:"gray"},"Target")),t=({hit:$,active:h})=>{let[re,ce]=Ec($.name,null);zf({active:h},(Se,me)=>{if(me.name!=="space")return;if(!re){ce(od[0]);return}let De=od.indexOf(re)+1;De===od.length?ce(null):ce(od[De])},[re,ce]);let Q=Tc.structUtils.parseIdent($.name),oe=Tc.structUtils.prettyIdent(u,Q);return Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Box,{width:45},Pt.default.createElement(un.Text,{bold:!0,wrap:"wrap"},oe)),Pt.default.createElement(un.Box,{width:14,marginLeft:1},Pt.default.createElement(un.Text,{bold:!0,wrap:"truncate"},$.owner.name)),Pt.default.createElement(un.Box,{width:10,marginLeft:1},Pt.default.createElement(un.Text,{italic:!0,wrap:"truncate"},$.version)),Pt.default.createElement(un.Box,{width:16,marginLeft:1},Pt.default.createElement(un.Text,null,$.humanDownloadsLast30Days)))},C=({name:$,active:h})=>{let[re]=Ec($,null),ce=Tc.structUtils.parseIdent($);return Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Box,{width:47},Pt.default.createElement(un.Text,{bold:!0}," - ",Tc.structUtils.prettyIdent(u,ce))),od.map(Q=>Pt.default.createElement(un.Box,{key:Q,width:14,marginLeft:1},Pt.default.createElement(un.Text,null," ",Pt.default.createElement(om,{active:re===Q})," ",Pt.default.createElement(un.Text,{bold:!0},Q)))))},A=()=>Pt.default.createElement(un.Box,{marginTop:1},Pt.default.createElement(un.Text,null,"Powered by Algolia.")),D=await dm(({useSubmit:$})=>{let h=Ec();$(h);let re=Array.from(h.keys()).filter(Le=>h.get(Le)!==null),[ce,Q]=(0,Pt.useState)(""),[oe,Se]=(0,Pt.useState)(0),[me,De]=(0,Pt.useState)([]),J=Le=>{Le.match(/\t| /)||Q(Le)},Te=async()=>{Se(0);let Le=await aw(ce);Le.query===ce&&De(Le.hits)},Oe=async()=>{let Le=await aw(ce,oe+1);Le.query===ce&&Le.page-1===oe&&(Se(Le.page),De([...me,...Le.hits]))};return(0,Pt.useEffect)(()=>{ce?Te():De([])},[ce]),Pt.default.createElement(un.Box,{flexDirection:"column"},Pt.default.createElement(f,null),Pt.default.createElement(un.Box,{flexDirection:"row",marginTop:1},Pt.default.createElement(un.Text,{bold:!0},"Search: "),Pt.default.createElement(un.Box,{width:41},Pt.default.createElement(ET.default,{value:ce,onChange:J,placeholder:"i.e. babel, webpack, react...",showCursor:!1})),Pt.default.createElement(c,null)),me.length?Pt.default.createElement(fm,{radius:2,loop:!1,children:me.map(Le=>Pt.default.createElement(t,{key:Le.name,hit:Le,active:!1})),willReachEnd:Oe}):Pt.default.createElement(un.Text,{color:"gray"},"Start typing..."),Pt.default.createElement(un.Box,{flexDirection:"row",marginTop:1},Pt.default.createElement(un.Box,{width:49},Pt.default.createElement(un.Text,{bold:!0},"Selected:")),Pt.default.createElement(g,null)),re.length?re.map(Le=>Pt.default.createElement(C,{key:Le,name:Le,active:!1})):Pt.default.createElement(un.Text,{color:"gray"},"No selected packages..."),Pt.default.createElement(A,null))},{});if(typeof D=="undefined")return 1;let L=Array.from(D.keys()).filter($=>D.get($)==="regular"),N=Array.from(D.keys()).filter($=>D.get($)==="dev"),j=Array.from(D.keys()).filter($=>D.get($)==="peer");return L.length&&await this.cli.run(["add",...L]),N.length&&await this.cli.run(["add","--dev",...N]),j&&await this.cli.run(["add","--peer",...j]),0}};ud.paths=[["search"]],ud.usage=DT.Command.Usage({category:"Interactive commands",description:"open the search interface",details:` - This command opens a fullscreen terminal interface where you can search for and install packages from the npm registry. - `,examples:[["Open the search window","yarn search"]]});var ST=ud;var Im=Er(require("@yarnpkg/cli")),W0=Er(require("@yarnpkg/core"));var sd=Er(ys()),bf=Er(lr());var CT=Er(ys()),TT=Er(lr()),wm=({length:i,active:u})=>{if(i===0)return null;let f=i>1?` ${"-".repeat(i-1)}`:" ";return TT.default.createElement(CT.Text,{dimColor:!u},f)};var xT=function({active:i,skewer:u,options:f,value:c,onChange:g,sizes:t=[]}){let C=f.filter(({label:x})=>!!x).map(({value:x})=>x),A=f.findIndex(x=>x.value===c&&x.label!="");return lm(c,C,{active:i,minus:"left",plus:"right",set:g}),bf.default.createElement(bf.default.Fragment,null,f.map(({label:x},D)=>{let L=D===A,N=t[D]-1||0,j=x.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,""),$=Math.max(0,N-j.length-2);return x?bf.default.createElement(sd.Box,{key:x,width:N,marginLeft:1},bf.default.createElement(sd.Text,{wrap:"truncate"},bf.default.createElement(om,{active:L})," ",x),u?bf.default.createElement(wm,{active:i,length:$}):null):bf.default.createElement(sd.Box,{key:`spacer-${D}`,width:N,marginLeft:1})}))};var c9=Er(require("@yarnpkg/plugin-essentials")),a9=Er(require("clipanion")),d9=Er(f9()),tr=Er(ys()),pn=Er(lr()),p9=Er(require("semver")),h9=/^((?:[\^~]|>=?)?)([0-9]+)(\.[0-9]+)(\.[0-9]+)((?:-\S+)?)$/,WH=10,md=class extends Im.BaseCommand{async execute(){let u=await W0.Configuration.find(this.context.cwd,this.context.plugins),{project:f,workspace:c}=await W0.Project.find(u,this.context.cwd),g=await W0.Cache.find(u);if(!c)throw new Im.WorkspaceRequiredError(f.cwd,this.context.cwd);await f.restoreInstallState({restoreResolutions:!1});let t=(Q,oe)=>{let Se=(0,d9.diffWords)(Q,oe),me="";for(let De of Se)De.added?me+=W0.formatUtils.pretty(u,De.value,"green"):De.removed||(me+=De.value);return me},C=(Q,oe)=>{if(Q===oe)return oe;let Se=W0.structUtils.parseRange(Q),me=W0.structUtils.parseRange(oe),De=Se.selector.match(h9),J=me.selector.match(h9);if(!De||!J)return t(Q,oe);let Te=["gray","red","yellow","green","magenta"],Oe=null,Le="";for(let ot=1;ot{let me=await c9.suggestUtils.fetchDescriptorFrom(Q,Se,{project:f,cache:g,preserveModifier:oe,workspace:c});return me!==null?me.range:Q.range},x=async Q=>{let oe=p9.default.valid(Q.range)?`^${Q.range}`:Q.range,[Se,me]=await Promise.all([A(Q,Q.range,oe).catch(()=>null),A(Q,Q.range,"latest").catch(()=>null)]),De=[{value:null,label:Q.range}];return Se&&Se!==Q.range?De.push({value:Se,label:C(Q.range,Se)}):De.push({value:null,label:""}),me&&me!==Se&&me!==Q.range?De.push({value:me,label:C(Q.range,me)}):De.push({value:null,label:""}),De},D=()=>pn.default.createElement(tr.Box,{flexDirection:"row"},pn.default.createElement(tr.Box,{flexDirection:"column",width:49},pn.default.createElement(tr.Box,{marginLeft:1},pn.default.createElement(tr.Text,null,"Press ",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},""),"/",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},"")," to select packages.")),pn.default.createElement(tr.Box,{marginLeft:1},pn.default.createElement(tr.Text,null,"Press ",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},""),"/",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},"")," to select versions."))),pn.default.createElement(tr.Box,{flexDirection:"column"},pn.default.createElement(tr.Box,{marginLeft:1},pn.default.createElement(tr.Text,null,"Press ",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},"")," to install.")),pn.default.createElement(tr.Box,{marginLeft:1},pn.default.createElement(tr.Text,null,"Press ",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},"")," to abort.")))),L=()=>pn.default.createElement(tr.Box,{flexDirection:"row",paddingTop:1,paddingBottom:1},pn.default.createElement(tr.Box,{width:50},pn.default.createElement(tr.Text,{bold:!0},pn.default.createElement(tr.Text,{color:"greenBright"},"?")," Pick the packages you want to upgrade.")),pn.default.createElement(tr.Box,{width:17},pn.default.createElement(tr.Text,{bold:!0,underline:!0,color:"gray"},"Current")),pn.default.createElement(tr.Box,{width:17},pn.default.createElement(tr.Text,{bold:!0,underline:!0,color:"gray"},"Range")),pn.default.createElement(tr.Box,{width:17},pn.default.createElement(tr.Text,{bold:!0,underline:!0,color:"gray"},"Latest"))),N=({active:Q,descriptor:oe,suggestions:Se})=>{let[me,De]=Ec(oe.descriptorHash,null),J=W0.structUtils.stringifyIdent(oe),Te=Math.max(0,45-J.length);return pn.default.createElement(pn.default.Fragment,null,pn.default.createElement(tr.Box,null,pn.default.createElement(tr.Box,{width:45},pn.default.createElement(tr.Text,{bold:!0},W0.structUtils.prettyIdent(u,oe)),pn.default.createElement(wm,{active:Q,length:Te})),Se!==null?pn.default.createElement(xT,{active:Q,options:Se,value:me,skewer:!0,onChange:De,sizes:[17,17,17]}):pn.default.createElement(tr.Box,{marginLeft:2},pn.default.createElement(tr.Text,{color:"gray"},"Fetching suggestions..."))))},j=({dependencies:Q})=>{let[oe,Se]=(0,pn.useState)(null),me=(0,pn.useRef)(!0);return(0,pn.useEffect)(()=>()=>{me.current=!1}),(0,pn.useEffect)(()=>{Promise.all(Q.map(De=>x(De))).then(De=>{let J=Q.map((Te,Oe)=>{let Le=De[Oe];return[Te,Le]}).filter(([Te,Oe])=>Oe.filter(Le=>Le.label!=="").length>1);me.current&&Se(J)})},[]),oe?oe.length?pn.default.createElement(fm,{radius:WH,children:oe.map(([De,J])=>pn.default.createElement(N,{key:De.descriptorHash,active:!1,descriptor:De,suggestions:J}))}):pn.default.createElement(tr.Text,null,"No upgrades found"):pn.default.createElement(tr.Text,null,"Fetching suggestions...")},h=await dm(({useSubmit:Q})=>{Q(Ec());let oe=new Map;for(let me of f.workspaces)for(let De of["dependencies","devDependencies"])for(let J of me.manifest[De].values())f.tryWorkspaceByDescriptor(J)===null&&oe.set(J.descriptorHash,J);let Se=W0.miscUtils.sortMap(oe.values(),me=>W0.structUtils.stringifyDescriptor(me));return pn.default.createElement(tr.Box,{flexDirection:"column"},pn.default.createElement(D,null),pn.default.createElement(L,null),pn.default.createElement(j,{dependencies:Se}))},{});if(typeof h=="undefined")return 1;let re=!1;for(let Q of f.workspaces)for(let oe of["dependencies","devDependencies"]){let Se=Q.manifest[oe];for(let me of Se.values()){let De=h.get(me.descriptorHash);typeof De!="undefined"&&De!==null&&(Se.set(me.identHash,W0.structUtils.makeDescriptor(me,De)),re=!0)}}return re?(await W0.StreamReport.start({configuration:u,stdout:this.context.stdout,includeLogs:!this.context.quiet},async Q=>{await f.install({cache:g,report:Q})})).exitCode():0}};md.paths=[["upgrade-interactive"]],md.usage=a9.Command.Usage({category:"Interactive commands",description:"open the upgrade interface",details:` - This command opens a fullscreen terminal interface where you can see any out of date packages used by your application, their status compared to the latest versions available on the remote registry, and select packages to upgrade. - `,examples:[["Open the upgrade window","yarn upgrade-interactive"]]});var m9=md;var bH={commands:[ST,m9]},GH=bH;return HH;})(); -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ -/** - * @license - * Lodash - * Copyright OpenJS Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */ -/** @license React v0.0.0-experimental-51a3aa6af - * react-debug-tools.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -/** @license React v0.0.0-experimental-51a3aa6af - * react-is.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -/** @license React v0.0.0-experimental-51a3aa6af - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -/** @license React v0.18.0 - * scheduler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -/** @license React v0.24.0 - * react-reconciler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -/** @license React v16.13.1 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -return plugin; -} -}; diff --git a/.yarn/releases/yarn-3.3.1.cjs b/.yarn/releases/yarn-3.3.1.cjs deleted file mode 100644 index 53a282e439..0000000000 --- a/.yarn/releases/yarn-3.3.1.cjs +++ /dev/null @@ -1,823 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable */ -//prettier-ignore -(()=>{var dfe=Object.create;var jS=Object.defineProperty;var Cfe=Object.getOwnPropertyDescriptor;var mfe=Object.getOwnPropertyNames;var Efe=Object.getPrototypeOf,Ife=Object.prototype.hasOwnProperty;var J=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+r+'" is not supported')});var y=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ht=(r,e)=>{for(var t in e)jS(r,t,{get:e[t],enumerable:!0})},yfe=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of mfe(e))!Ife.call(r,n)&&n!==t&&jS(r,n,{get:()=>e[n],enumerable:!(i=Cfe(e,n))||i.enumerable});return r};var ne=(r,e,t)=>(t=r!=null?dfe(Efe(r)):{},yfe(e||!r||!r.__esModule?jS(t,"default",{value:r,enumerable:!0}):t,r));var aK=y((uZe,oK)=>{oK.exports=sK;sK.sync=Gfe;var iK=J("fs");function Hfe(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!t||(t=t.split(";"),t.indexOf("")!==-1))return!0;for(var i=0;i{uK.exports=lK;lK.sync=Yfe;var AK=J("fs");function lK(r,e,t){AK.stat(r,function(i,n){t(i,i?!1:cK(n,e))})}function Yfe(r,e){return cK(AK.statSync(r),e)}function cK(r,e){return r.isFile()&&jfe(r,e)}function jfe(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=t&c||t&l&&n===o||t&a&&i===s||t&u&&s===0;return g}});var hK=y((hZe,fK)=>{var fZe=J("fs"),OI;process.platform==="win32"||global.TESTING_WINDOWS?OI=aK():OI=gK();fK.exports=av;av.sync=qfe;function av(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){av(r,e||{},function(s,o){s?n(s):i(o)})})}OI(r,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),t(i,n)})}function qfe(r,e){try{return OI.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code==="EACCES")return!1;throw t}}});var yK=y((pZe,IK)=>{var _g=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",pK=J("path"),Jfe=_g?";":":",dK=hK(),CK=r=>Object.assign(new Error(`not found: ${r}`),{code:"ENOENT"}),mK=(r,e)=>{let t=e.colon||Jfe,i=r.match(/\//)||_g&&r.match(/\\/)?[""]:[..._g?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(t)],n=_g?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=_g?n.split(t):[""];return _g&&r.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},EK=(r,e,t)=>{typeof e=="function"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=mK(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(CK(r));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=pK.join(h,r),C=!h&&/^\.[\\\/]/.test(r)?r.slice(0,2)+p:p;u(l(C,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];dK(c+p,{pathExt:s},(C,w)=>{if(!C&&w)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return t?a(0).then(c=>t(null,c),t):a(0)},Wfe=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=mK(r,e),s=[];for(let o=0;o{"use strict";var wK=(r={})=>{let e=r.env||process.env;return(r.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};Av.exports=wK;Av.exports.default=wK});var vK=y((CZe,SK)=>{"use strict";var bK=J("path"),zfe=yK(),Vfe=BK();function QK(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(r.options.cwd)}catch{}let o;try{o=zfe.sync(r.command,{path:t[Vfe({env:t})],pathExt:e?bK.delimiter:void 0})}catch{}finally{s&&process.chdir(i)}return o&&(o=bK.resolve(n?r.options.cwd:"",o)),o}function Xfe(r){return QK(r)||QK(r,!0)}SK.exports=Xfe});var xK=y((mZe,cv)=>{"use strict";var lv=/([()\][%!^"`<>&|;, *?])/g;function _fe(r){return r=r.replace(lv,"^$1"),r}function Zfe(r,e){return r=`${r}`,r=r.replace(/(\\*)"/g,'$1$1\\"'),r=r.replace(/(\\*)$/,"$1$1"),r=`"${r}"`,r=r.replace(lv,"^$1"),e&&(r=r.replace(lv,"^$1")),r}cv.exports.command=_fe;cv.exports.argument=Zfe});var DK=y((EZe,PK)=>{"use strict";PK.exports=/^#!(.*)/});var RK=y((IZe,kK)=>{"use strict";var $fe=DK();kK.exports=(r="")=>{let e=r.match($fe);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,"").split(" "),n=t.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var NK=y((yZe,FK)=>{"use strict";var uv=J("fs"),ehe=RK();function the(r){let t=Buffer.alloc(150),i;try{i=uv.openSync(r,"r"),uv.readSync(i,t,0,150,0),uv.closeSync(i)}catch{}return ehe(t.toString())}FK.exports=the});var MK=y((wZe,OK)=>{"use strict";var rhe=J("path"),TK=vK(),LK=xK(),ihe=NK(),nhe=process.platform==="win32",she=/\.(?:com|exe)$/i,ohe=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function ahe(r){r.file=TK(r);let e=r.file&&ihe(r.file);return e?(r.args.unshift(r.file),r.command=e,TK(r)):r.file}function Ahe(r){if(!nhe)return r;let e=ahe(r),t=!she.test(e);if(r.options.forceShell||t){let i=ohe.test(e);r.command=rhe.normalize(r.command),r.command=LK.command(r.command),r.args=r.args.map(s=>LK.argument(s,i));let n=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${n}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}function lhe(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);let i={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?i:Ahe(i)}OK.exports=lhe});var HK=y((BZe,KK)=>{"use strict";var gv=process.platform==="win32";function fv(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function che(r,e){if(!gv)return;let t=r.emit;r.emit=function(i,n){if(i==="exit"){let s=UK(n,e,"spawn");if(s)return t.call(r,"error",s)}return t.apply(r,arguments)}}function UK(r,e){return gv&&r===1&&!e.file?fv(e.original,"spawn"):null}function uhe(r,e){return gv&&r===1&&!e.file?fv(e.original,"spawnSync"):null}KK.exports={hookChildProcess:che,verifyENOENT:UK,verifyENOENTSync:uhe,notFoundError:fv}});var dv=y((bZe,Zg)=>{"use strict";var GK=J("child_process"),hv=MK(),pv=HK();function YK(r,e,t){let i=hv(r,e,t),n=GK.spawn(i.command,i.args,i.options);return pv.hookChildProcess(n,i),n}function ghe(r,e,t){let i=hv(r,e,t),n=GK.spawnSync(i.command,i.args,i.options);return n.error=n.error||pv.verifyENOENTSync(n.status,i),n}Zg.exports=YK;Zg.exports.spawn=YK;Zg.exports.sync=ghe;Zg.exports._parse=hv;Zg.exports._enoent=pv});var qK=y((QZe,jK)=>{"use strict";function fhe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function uc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,uc)}fhe(uc,Error);uc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",re=de(">>",!1),me=">&",tt=de(">&",!1),Rt=">",It=de(">",!1),Ur="<<<",oi=de("<<<",!1),pi="<&",pr=de("<&",!1),di="<",ai=de("<",!1),Os=function(m){return{type:"argument",segments:[].concat(...m)}},dr=function(m){return m},Bi="$'",_n=de("$'",!1),pa="'",EA=de("'",!1),kg=function(m){return[{type:"text",text:m}]},Zn='""',IA=de('""',!1),da=function(){return{type:"text",text:""}},Jp='"',yA=de('"',!1),wA=function(m){return m},Br=function(m){return{type:"arithmetic",arithmetic:m,quoted:!0}},Vl=function(m){return{type:"shell",shell:m,quoted:!0}},Rg=function(m){return{type:"variable",...m,quoted:!0}},Eo=function(m){return{type:"text",text:m}},Fg=function(m){return{type:"arithmetic",arithmetic:m,quoted:!1}},Wp=function(m){return{type:"shell",shell:m,quoted:!1}},zp=function(m){return{type:"variable",...m,quoted:!1}},Pr=function(m){return{type:"glob",pattern:m}},oe=/^[^']/,Io=Ye(["'"],!0,!1),kn=function(m){return m.join("")},Ng=/^[^$"]/,bt=Ye(["$",'"'],!0,!1),Xl=`\\ -`,Rn=de(`\\ -`,!1),$n=function(){return""},es="\\",ut=de("\\",!1),yo=/^[\\$"`]/,at=Ye(["\\","$",'"',"`"],!1,!1),ln=function(m){return m},S="\\a",Lt=de("\\a",!1),Tg=function(){return"a"},_l="\\b",Vp=de("\\b",!1),Xp=function(){return"\b"},_p=/^[Ee]/,Zp=Ye(["E","e"],!1,!1),$p=function(){return"\x1B"},G="\\f",yt=de("\\f",!1),BA=function(){return"\f"},Wi="\\n",Zl=de("\\n",!1),We=function(){return` -`},Ca="\\r",Lg=de("\\r",!1),uI=function(){return"\r"},ed="\\t",gI=de("\\t",!1),ar=function(){return" "},Fn="\\v",$l=de("\\v",!1),td=function(){return"\v"},Ms=/^[\\'"?]/,ma=Ye(["\\","'",'"',"?"],!1,!1),cn=function(m){return String.fromCharCode(parseInt(m,16))},ke="\\x",Og=de("\\x",!1),ec="\\u",Us=de("\\u",!1),tc="\\U",bA=de("\\U",!1),Mg=function(m){return String.fromCodePoint(parseInt(m,16))},Ug=/^[0-7]/,Ea=Ye([["0","7"]],!1,!1),Ia=/^[0-9a-fA-f]/,$e=Ye([["0","9"],["a","f"],["A","f"]],!1,!1),wo=rt(),QA="-",rc=de("-",!1),Ks="+",ic=de("+",!1),fI=".",rd=de(".",!1),Kg=function(m,Q,F){return{type:"number",value:(m==="-"?-1:1)*parseFloat(Q.join("")+"."+F.join(""))}},id=function(m,Q){return{type:"number",value:(m==="-"?-1:1)*parseInt(Q.join(""))}},hI=function(m){return{type:"variable",...m}},nc=function(m){return{type:"variable",name:m}},pI=function(m){return m},Hg="*",SA=de("*",!1),Nr="/",dI=de("/",!1),Hs=function(m,Q,F){return{type:Q==="*"?"multiplication":"division",right:F}},Gs=function(m,Q){return Q.reduce((F,K)=>({left:F,...K}),m)},Gg=function(m,Q,F){return{type:Q==="+"?"addition":"subtraction",right:F}},vA="$((",R=de("$((",!1),q="))",pe=de("))",!1),Ne=function(m){return m},xe="$(",qe=de("$(",!1),dt=function(m){return m},Ft="${",Nn=de("${",!1),vS=":-",AU=de(":-",!1),lU=function(m,Q){return{name:m,defaultValue:Q}},xS=":-}",cU=de(":-}",!1),uU=function(m){return{name:m,defaultValue:[]}},PS=":+",gU=de(":+",!1),fU=function(m,Q){return{name:m,alternativeValue:Q}},DS=":+}",hU=de(":+}",!1),pU=function(m){return{name:m,alternativeValue:[]}},kS=function(m){return{name:m}},dU="$",CU=de("$",!1),mU=function(m){return e.isGlobPattern(m)},EU=function(m){return m},RS=/^[a-zA-Z0-9_]/,FS=Ye([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),NS=function(){return O()},TS=/^[$@*?#a-zA-Z0-9_\-]/,LS=Ye(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),IU=/^[(){}<>$|&; \t"']/,Yg=Ye(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),OS=/^[<>&; \t"']/,MS=Ye(["<",">","&",";"," "," ",'"',"'"],!1,!1),CI=/^[ \t]/,mI=Ye([" "," "],!1,!1),b=0,Fe=0,xA=[{line:1,column:1}],d=0,E=[],I=0,k;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function O(){return r.substring(Fe,b)}function X(){return Et(Fe,b)}function te(m,Q){throw Q=Q!==void 0?Q:Et(Fe,b),Fi([At(m)],r.substring(Fe,b),Q)}function ye(m,Q){throw Q=Q!==void 0?Q:Et(Fe,b),Tn(m,Q)}function de(m,Q){return{type:"literal",text:m,ignoreCase:Q}}function Ye(m,Q,F){return{type:"class",parts:m,inverted:Q,ignoreCase:F}}function rt(){return{type:"any"}}function wt(){return{type:"end"}}function At(m){return{type:"other",description:m}}function et(m){var Q=xA[m],F;if(Q)return Q;for(F=m-1;!xA[F];)F--;for(Q=xA[F],Q={line:Q.line,column:Q.column};Fd&&(d=b,E=[]),E.push(m))}function Tn(m,Q){return new uc(m,null,null,Q)}function Fi(m,Q,F){return new uc(uc.buildMessage(m,Q),m,Q,F)}function PA(){var m,Q;return m=b,Q=Kr(),Q===t&&(Q=null),Q!==t&&(Fe=m,Q=s(Q)),m=Q,m}function Kr(){var m,Q,F,K,ce;if(m=b,Q=Hr(),Q!==t){for(F=[],K=Me();K!==t;)F.push(K),K=Me();F!==t?(K=ya(),K!==t?(ce=ts(),ce===t&&(ce=null),ce!==t?(Fe=m,Q=o(Q,K,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;if(m===t)if(m=b,Q=Hr(),Q!==t){for(F=[],K=Me();K!==t;)F.push(K),K=Me();F!==t?(K=ya(),K===t&&(K=null),K!==t?(Fe=m,Q=a(Q,K),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;return m}function ts(){var m,Q,F,K,ce;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t)if(F=Kr(),F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();K!==t?(Fe=m,Q=l(F),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t;return m}function ya(){var m;return r.charCodeAt(b)===59?(m=c,b++):(m=t,I===0&&Be(u)),m===t&&(r.charCodeAt(b)===38?(m=g,b++):(m=t,I===0&&Be(f))),m}function Hr(){var m,Q,F;return m=b,Q=yU(),Q!==t?(F=$ge(),F===t&&(F=null),F!==t?(Fe=m,Q=h(Q,F),m=Q):(b=m,m=t)):(b=m,m=t),m}function $ge(){var m,Q,F,K,ce,Qe,ft;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t)if(F=efe(),F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();if(K!==t)if(ce=Hr(),ce!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();Qe!==t?(Fe=m,Q=p(F,ce),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;return m}function efe(){var m;return r.substr(b,2)===C?(m=C,b+=2):(m=t,I===0&&Be(w)),m===t&&(r.substr(b,2)===B?(m=B,b+=2):(m=t,I===0&&Be(v))),m}function yU(){var m,Q,F;return m=b,Q=ife(),Q!==t?(F=tfe(),F===t&&(F=null),F!==t?(Fe=m,Q=D(Q,F),m=Q):(b=m,m=t)):(b=m,m=t),m}function tfe(){var m,Q,F,K,ce,Qe,ft;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t)if(F=rfe(),F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();if(K!==t)if(ce=yU(),ce!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();Qe!==t?(Fe=m,Q=T(F,ce),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;return m}function rfe(){var m;return r.substr(b,2)===H?(m=H,b+=2):(m=t,I===0&&Be(j)),m===t&&(r.charCodeAt(b)===124?(m=$,b++):(m=t,I===0&&Be(V))),m}function EI(){var m,Q,F,K,ce,Qe;if(m=b,Q=FU(),Q!==t)if(r.charCodeAt(b)===61?(F=W,b++):(F=t,I===0&&Be(Z)),F!==t)if(K=bU(),K!==t){for(ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();ce!==t?(Fe=m,Q=A(Q,K),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t;else b=m,m=t;if(m===t)if(m=b,Q=FU(),Q!==t)if(r.charCodeAt(b)===61?(F=W,b++):(F=t,I===0&&Be(Z)),F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();K!==t?(Fe=m,Q=ae(Q),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t;return m}function ife(){var m,Q,F,K,ce,Qe,ft,Bt,Vr,Ci,rs;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t)if(r.charCodeAt(b)===40?(F=ge,b++):(F=t,I===0&&Be(_)),F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();if(K!==t)if(ce=Kr(),ce!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();if(Qe!==t)if(r.charCodeAt(b)===41?(ft=L,b++):(ft=t,I===0&&Be(N)),ft!==t){for(Bt=[],Vr=Me();Vr!==t;)Bt.push(Vr),Vr=Me();if(Bt!==t){for(Vr=[],Ci=nd();Ci!==t;)Vr.push(Ci),Ci=nd();if(Vr!==t){for(Ci=[],rs=Me();rs!==t;)Ci.push(rs),rs=Me();Ci!==t?(Fe=m,Q=ue(ce,Vr),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;if(m===t){for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t)if(r.charCodeAt(b)===123?(F=we,b++):(F=t,I===0&&Be(Te)),F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();if(K!==t)if(ce=Kr(),ce!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();if(Qe!==t)if(r.charCodeAt(b)===125?(ft=Pe,b++):(ft=t,I===0&&Be(Le)),ft!==t){for(Bt=[],Vr=Me();Vr!==t;)Bt.push(Vr),Vr=Me();if(Bt!==t){for(Vr=[],Ci=nd();Ci!==t;)Vr.push(Ci),Ci=nd();if(Vr!==t){for(Ci=[],rs=Me();rs!==t;)Ci.push(rs),rs=Me();Ci!==t?(Fe=m,Q=se(ce,Vr),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;if(m===t){for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t){for(F=[],K=EI();K!==t;)F.push(K),K=EI();if(F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();if(K!==t){if(ce=[],Qe=BU(),Qe!==t)for(;Qe!==t;)ce.push(Qe),Qe=BU();else ce=t;if(ce!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();Qe!==t?(Fe=m,Q=Ae(F,ce),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}else b=m,m=t}else b=m,m=t;if(m===t){for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t){if(F=[],K=EI(),K!==t)for(;K!==t;)F.push(K),K=EI();else F=t;if(F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();K!==t?(Fe=m,Q=be(F),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}}}return m}function wU(){var m,Q,F,K,ce;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t){if(F=[],K=II(),K!==t)for(;K!==t;)F.push(K),K=II();else F=t;if(F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();K!==t?(Fe=m,Q=fe(F),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t;return m}function BU(){var m,Q,F;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t?(F=nd(),F!==t?(Fe=m,Q=le(F),m=Q):(b=m,m=t)):(b=m,m=t),m===t){for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();Q!==t?(F=II(),F!==t?(Fe=m,Q=le(F),m=Q):(b=m,m=t)):(b=m,m=t)}return m}function nd(){var m,Q,F,K,ce;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();return Q!==t?(Ge.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(ie)),F===t&&(F=null),F!==t?(K=nfe(),K!==t?(ce=II(),ce!==t?(Fe=m,Q=Y(F,K,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function nfe(){var m;return r.substr(b,2)===he?(m=he,b+=2):(m=t,I===0&&Be(re)),m===t&&(r.substr(b,2)===me?(m=me,b+=2):(m=t,I===0&&Be(tt)),m===t&&(r.charCodeAt(b)===62?(m=Rt,b++):(m=t,I===0&&Be(It)),m===t&&(r.substr(b,3)===Ur?(m=Ur,b+=3):(m=t,I===0&&Be(oi)),m===t&&(r.substr(b,2)===pi?(m=pi,b+=2):(m=t,I===0&&Be(pr)),m===t&&(r.charCodeAt(b)===60?(m=di,b++):(m=t,I===0&&Be(ai))))))),m}function II(){var m,Q,F;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();return Q!==t?(F=bU(),F!==t?(Fe=m,Q=le(F),m=Q):(b=m,m=t)):(b=m,m=t),m}function bU(){var m,Q,F;if(m=b,Q=[],F=QU(),F!==t)for(;F!==t;)Q.push(F),F=QU();else Q=t;return Q!==t&&(Fe=m,Q=Os(Q)),m=Q,m}function QU(){var m,Q;return m=b,Q=sfe(),Q!==t&&(Fe=m,Q=dr(Q)),m=Q,m===t&&(m=b,Q=ofe(),Q!==t&&(Fe=m,Q=dr(Q)),m=Q,m===t&&(m=b,Q=afe(),Q!==t&&(Fe=m,Q=dr(Q)),m=Q,m===t&&(m=b,Q=Afe(),Q!==t&&(Fe=m,Q=dr(Q)),m=Q))),m}function sfe(){var m,Q,F,K;return m=b,r.substr(b,2)===Bi?(Q=Bi,b+=2):(Q=t,I===0&&Be(_n)),Q!==t?(F=ufe(),F!==t?(r.charCodeAt(b)===39?(K=pa,b++):(K=t,I===0&&Be(EA)),K!==t?(Fe=m,Q=kg(F),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function ofe(){var m,Q,F,K;return m=b,r.charCodeAt(b)===39?(Q=pa,b++):(Q=t,I===0&&Be(EA)),Q!==t?(F=lfe(),F!==t?(r.charCodeAt(b)===39?(K=pa,b++):(K=t,I===0&&Be(EA)),K!==t?(Fe=m,Q=kg(F),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function afe(){var m,Q,F,K;if(m=b,r.substr(b,2)===Zn?(Q=Zn,b+=2):(Q=t,I===0&&Be(IA)),Q!==t&&(Fe=m,Q=da()),m=Q,m===t)if(m=b,r.charCodeAt(b)===34?(Q=Jp,b++):(Q=t,I===0&&Be(yA)),Q!==t){for(F=[],K=SU();K!==t;)F.push(K),K=SU();F!==t?(r.charCodeAt(b)===34?(K=Jp,b++):(K=t,I===0&&Be(yA)),K!==t?(Fe=m,Q=wA(F),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;return m}function Afe(){var m,Q,F;if(m=b,Q=[],F=vU(),F!==t)for(;F!==t;)Q.push(F),F=vU();else Q=t;return Q!==t&&(Fe=m,Q=wA(Q)),m=Q,m}function SU(){var m,Q;return m=b,Q=kU(),Q!==t&&(Fe=m,Q=Br(Q)),m=Q,m===t&&(m=b,Q=RU(),Q!==t&&(Fe=m,Q=Vl(Q)),m=Q,m===t&&(m=b,Q=GS(),Q!==t&&(Fe=m,Q=Rg(Q)),m=Q,m===t&&(m=b,Q=cfe(),Q!==t&&(Fe=m,Q=Eo(Q)),m=Q))),m}function vU(){var m,Q;return m=b,Q=kU(),Q!==t&&(Fe=m,Q=Fg(Q)),m=Q,m===t&&(m=b,Q=RU(),Q!==t&&(Fe=m,Q=Wp(Q)),m=Q,m===t&&(m=b,Q=GS(),Q!==t&&(Fe=m,Q=zp(Q)),m=Q,m===t&&(m=b,Q=hfe(),Q!==t&&(Fe=m,Q=Pr(Q)),m=Q,m===t&&(m=b,Q=ffe(),Q!==t&&(Fe=m,Q=Eo(Q)),m=Q)))),m}function lfe(){var m,Q,F;for(m=b,Q=[],oe.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(Io));F!==t;)Q.push(F),oe.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(Io));return Q!==t&&(Fe=m,Q=kn(Q)),m=Q,m}function cfe(){var m,Q,F;if(m=b,Q=[],F=xU(),F===t&&(Ng.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(bt))),F!==t)for(;F!==t;)Q.push(F),F=xU(),F===t&&(Ng.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(bt)));else Q=t;return Q!==t&&(Fe=m,Q=kn(Q)),m=Q,m}function xU(){var m,Q,F;return m=b,r.substr(b,2)===Xl?(Q=Xl,b+=2):(Q=t,I===0&&Be(Rn)),Q!==t&&(Fe=m,Q=$n()),m=Q,m===t&&(m=b,r.charCodeAt(b)===92?(Q=es,b++):(Q=t,I===0&&Be(ut)),Q!==t?(yo.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(at)),F!==t?(Fe=m,Q=ln(F),m=Q):(b=m,m=t)):(b=m,m=t)),m}function ufe(){var m,Q,F;for(m=b,Q=[],F=PU(),F===t&&(oe.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(Io)));F!==t;)Q.push(F),F=PU(),F===t&&(oe.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(Io)));return Q!==t&&(Fe=m,Q=kn(Q)),m=Q,m}function PU(){var m,Q,F;return m=b,r.substr(b,2)===S?(Q=S,b+=2):(Q=t,I===0&&Be(Lt)),Q!==t&&(Fe=m,Q=Tg()),m=Q,m===t&&(m=b,r.substr(b,2)===_l?(Q=_l,b+=2):(Q=t,I===0&&Be(Vp)),Q!==t&&(Fe=m,Q=Xp()),m=Q,m===t&&(m=b,r.charCodeAt(b)===92?(Q=es,b++):(Q=t,I===0&&Be(ut)),Q!==t?(_p.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(Zp)),F!==t?(Fe=m,Q=$p(),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===G?(Q=G,b+=2):(Q=t,I===0&&Be(yt)),Q!==t&&(Fe=m,Q=BA()),m=Q,m===t&&(m=b,r.substr(b,2)===Wi?(Q=Wi,b+=2):(Q=t,I===0&&Be(Zl)),Q!==t&&(Fe=m,Q=We()),m=Q,m===t&&(m=b,r.substr(b,2)===Ca?(Q=Ca,b+=2):(Q=t,I===0&&Be(Lg)),Q!==t&&(Fe=m,Q=uI()),m=Q,m===t&&(m=b,r.substr(b,2)===ed?(Q=ed,b+=2):(Q=t,I===0&&Be(gI)),Q!==t&&(Fe=m,Q=ar()),m=Q,m===t&&(m=b,r.substr(b,2)===Fn?(Q=Fn,b+=2):(Q=t,I===0&&Be($l)),Q!==t&&(Fe=m,Q=td()),m=Q,m===t&&(m=b,r.charCodeAt(b)===92?(Q=es,b++):(Q=t,I===0&&Be(ut)),Q!==t?(Ms.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(ma)),F!==t?(Fe=m,Q=ln(F),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=gfe()))))))))),m}function gfe(){var m,Q,F,K,ce,Qe,ft,Bt,Vr,Ci,rs,YS;return m=b,r.charCodeAt(b)===92?(Q=es,b++):(Q=t,I===0&&Be(ut)),Q!==t?(F=US(),F!==t?(Fe=m,Q=cn(F),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===ke?(Q=ke,b+=2):(Q=t,I===0&&Be(Og)),Q!==t?(F=b,K=b,ce=US(),ce!==t?(Qe=Ln(),Qe!==t?(ce=[ce,Qe],K=ce):(b=K,K=t)):(b=K,K=t),K===t&&(K=US()),K!==t?F=r.substring(F,b):F=K,F!==t?(Fe=m,Q=cn(F),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===ec?(Q=ec,b+=2):(Q=t,I===0&&Be(Us)),Q!==t?(F=b,K=b,ce=Ln(),ce!==t?(Qe=Ln(),Qe!==t?(ft=Ln(),ft!==t?(Bt=Ln(),Bt!==t?(ce=[ce,Qe,ft,Bt],K=ce):(b=K,K=t)):(b=K,K=t)):(b=K,K=t)):(b=K,K=t),K!==t?F=r.substring(F,b):F=K,F!==t?(Fe=m,Q=cn(F),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===tc?(Q=tc,b+=2):(Q=t,I===0&&Be(bA)),Q!==t?(F=b,K=b,ce=Ln(),ce!==t?(Qe=Ln(),Qe!==t?(ft=Ln(),ft!==t?(Bt=Ln(),Bt!==t?(Vr=Ln(),Vr!==t?(Ci=Ln(),Ci!==t?(rs=Ln(),rs!==t?(YS=Ln(),YS!==t?(ce=[ce,Qe,ft,Bt,Vr,Ci,rs,YS],K=ce):(b=K,K=t)):(b=K,K=t)):(b=K,K=t)):(b=K,K=t)):(b=K,K=t)):(b=K,K=t)):(b=K,K=t)):(b=K,K=t),K!==t?F=r.substring(F,b):F=K,F!==t?(Fe=m,Q=Mg(F),m=Q):(b=m,m=t)):(b=m,m=t)))),m}function US(){var m;return Ug.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&Be(Ea)),m}function Ln(){var m;return Ia.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&Be($e)),m}function ffe(){var m,Q,F,K,ce;if(m=b,Q=[],F=b,r.charCodeAt(b)===92?(K=es,b++):(K=t,I===0&&Be(ut)),K!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&Be(wo)),ce!==t?(Fe=F,K=ln(ce),F=K):(b=F,F=t)):(b=F,F=t),F===t&&(F=b,K=b,I++,ce=NU(),I--,ce===t?K=void 0:(b=K,K=t),K!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&Be(wo)),ce!==t?(Fe=F,K=ln(ce),F=K):(b=F,F=t)):(b=F,F=t)),F!==t)for(;F!==t;)Q.push(F),F=b,r.charCodeAt(b)===92?(K=es,b++):(K=t,I===0&&Be(ut)),K!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&Be(wo)),ce!==t?(Fe=F,K=ln(ce),F=K):(b=F,F=t)):(b=F,F=t),F===t&&(F=b,K=b,I++,ce=NU(),I--,ce===t?K=void 0:(b=K,K=t),K!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&Be(wo)),ce!==t?(Fe=F,K=ln(ce),F=K):(b=F,F=t)):(b=F,F=t));else Q=t;return Q!==t&&(Fe=m,Q=kn(Q)),m=Q,m}function KS(){var m,Q,F,K,ce,Qe;if(m=b,r.charCodeAt(b)===45?(Q=QA,b++):(Q=t,I===0&&Be(rc)),Q===t&&(r.charCodeAt(b)===43?(Q=Ks,b++):(Q=t,I===0&&Be(ic))),Q===t&&(Q=null),Q!==t){if(F=[],Ge.test(r.charAt(b))?(K=r.charAt(b),b++):(K=t,I===0&&Be(ie)),K!==t)for(;K!==t;)F.push(K),Ge.test(r.charAt(b))?(K=r.charAt(b),b++):(K=t,I===0&&Be(ie));else F=t;if(F!==t)if(r.charCodeAt(b)===46?(K=fI,b++):(K=t,I===0&&Be(rd)),K!==t){if(ce=[],Ge.test(r.charAt(b))?(Qe=r.charAt(b),b++):(Qe=t,I===0&&Be(ie)),Qe!==t)for(;Qe!==t;)ce.push(Qe),Ge.test(r.charAt(b))?(Qe=r.charAt(b),b++):(Qe=t,I===0&&Be(ie));else ce=t;ce!==t?(Fe=m,Q=Kg(Q,F,ce),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;if(m===t){if(m=b,r.charCodeAt(b)===45?(Q=QA,b++):(Q=t,I===0&&Be(rc)),Q===t&&(r.charCodeAt(b)===43?(Q=Ks,b++):(Q=t,I===0&&Be(ic))),Q===t&&(Q=null),Q!==t){if(F=[],Ge.test(r.charAt(b))?(K=r.charAt(b),b++):(K=t,I===0&&Be(ie)),K!==t)for(;K!==t;)F.push(K),Ge.test(r.charAt(b))?(K=r.charAt(b),b++):(K=t,I===0&&Be(ie));else F=t;F!==t?(Fe=m,Q=id(Q,F),m=Q):(b=m,m=t)}else b=m,m=t;if(m===t&&(m=b,Q=GS(),Q!==t&&(Fe=m,Q=hI(Q)),m=Q,m===t&&(m=b,Q=sc(),Q!==t&&(Fe=m,Q=nc(Q)),m=Q,m===t)))if(m=b,r.charCodeAt(b)===40?(Q=ge,b++):(Q=t,I===0&&Be(_)),Q!==t){for(F=[],K=Me();K!==t;)F.push(K),K=Me();if(F!==t)if(K=DU(),K!==t){for(ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();ce!==t?(r.charCodeAt(b)===41?(Qe=L,b++):(Qe=t,I===0&&Be(N)),Qe!==t?(Fe=m,Q=pI(K),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t}return m}function HS(){var m,Q,F,K,ce,Qe,ft,Bt;if(m=b,Q=KS(),Q!==t){for(F=[],K=b,ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();if(ce!==t)if(r.charCodeAt(b)===42?(Qe=Hg,b++):(Qe=t,I===0&&Be(SA)),Qe===t&&(r.charCodeAt(b)===47?(Qe=Nr,b++):(Qe=t,I===0&&Be(dI))),Qe!==t){for(ft=[],Bt=Me();Bt!==t;)ft.push(Bt),Bt=Me();ft!==t?(Bt=KS(),Bt!==t?(Fe=K,ce=Hs(Q,Qe,Bt),K=ce):(b=K,K=t)):(b=K,K=t)}else b=K,K=t;else b=K,K=t;for(;K!==t;){for(F.push(K),K=b,ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();if(ce!==t)if(r.charCodeAt(b)===42?(Qe=Hg,b++):(Qe=t,I===0&&Be(SA)),Qe===t&&(r.charCodeAt(b)===47?(Qe=Nr,b++):(Qe=t,I===0&&Be(dI))),Qe!==t){for(ft=[],Bt=Me();Bt!==t;)ft.push(Bt),Bt=Me();ft!==t?(Bt=KS(),Bt!==t?(Fe=K,ce=Hs(Q,Qe,Bt),K=ce):(b=K,K=t)):(b=K,K=t)}else b=K,K=t;else b=K,K=t}F!==t?(Fe=m,Q=Gs(Q,F),m=Q):(b=m,m=t)}else b=m,m=t;return m}function DU(){var m,Q,F,K,ce,Qe,ft,Bt;if(m=b,Q=HS(),Q!==t){for(F=[],K=b,ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();if(ce!==t)if(r.charCodeAt(b)===43?(Qe=Ks,b++):(Qe=t,I===0&&Be(ic)),Qe===t&&(r.charCodeAt(b)===45?(Qe=QA,b++):(Qe=t,I===0&&Be(rc))),Qe!==t){for(ft=[],Bt=Me();Bt!==t;)ft.push(Bt),Bt=Me();ft!==t?(Bt=HS(),Bt!==t?(Fe=K,ce=Gg(Q,Qe,Bt),K=ce):(b=K,K=t)):(b=K,K=t)}else b=K,K=t;else b=K,K=t;for(;K!==t;){for(F.push(K),K=b,ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();if(ce!==t)if(r.charCodeAt(b)===43?(Qe=Ks,b++):(Qe=t,I===0&&Be(ic)),Qe===t&&(r.charCodeAt(b)===45?(Qe=QA,b++):(Qe=t,I===0&&Be(rc))),Qe!==t){for(ft=[],Bt=Me();Bt!==t;)ft.push(Bt),Bt=Me();ft!==t?(Bt=HS(),Bt!==t?(Fe=K,ce=Gg(Q,Qe,Bt),K=ce):(b=K,K=t)):(b=K,K=t)}else b=K,K=t;else b=K,K=t}F!==t?(Fe=m,Q=Gs(Q,F),m=Q):(b=m,m=t)}else b=m,m=t;return m}function kU(){var m,Q,F,K,ce,Qe;if(m=b,r.substr(b,3)===vA?(Q=vA,b+=3):(Q=t,I===0&&Be(R)),Q!==t){for(F=[],K=Me();K!==t;)F.push(K),K=Me();if(F!==t)if(K=DU(),K!==t){for(ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();ce!==t?(r.substr(b,2)===q?(Qe=q,b+=2):(Qe=t,I===0&&Be(pe)),Qe!==t?(Fe=m,Q=Ne(K),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;return m}function RU(){var m,Q,F,K;return m=b,r.substr(b,2)===xe?(Q=xe,b+=2):(Q=t,I===0&&Be(qe)),Q!==t?(F=Kr(),F!==t?(r.charCodeAt(b)===41?(K=L,b++):(K=t,I===0&&Be(N)),K!==t?(Fe=m,Q=dt(F),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function GS(){var m,Q,F,K,ce,Qe;return m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&Be(Nn)),Q!==t?(F=sc(),F!==t?(r.substr(b,2)===vS?(K=vS,b+=2):(K=t,I===0&&Be(AU)),K!==t?(ce=wU(),ce!==t?(r.charCodeAt(b)===125?(Qe=Pe,b++):(Qe=t,I===0&&Be(Le)),Qe!==t?(Fe=m,Q=lU(F,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&Be(Nn)),Q!==t?(F=sc(),F!==t?(r.substr(b,3)===xS?(K=xS,b+=3):(K=t,I===0&&Be(cU)),K!==t?(Fe=m,Q=uU(F),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&Be(Nn)),Q!==t?(F=sc(),F!==t?(r.substr(b,2)===PS?(K=PS,b+=2):(K=t,I===0&&Be(gU)),K!==t?(ce=wU(),ce!==t?(r.charCodeAt(b)===125?(Qe=Pe,b++):(Qe=t,I===0&&Be(Le)),Qe!==t?(Fe=m,Q=fU(F,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&Be(Nn)),Q!==t?(F=sc(),F!==t?(r.substr(b,3)===DS?(K=DS,b+=3):(K=t,I===0&&Be(hU)),K!==t?(Fe=m,Q=pU(F),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&Be(Nn)),Q!==t?(F=sc(),F!==t?(r.charCodeAt(b)===125?(K=Pe,b++):(K=t,I===0&&Be(Le)),K!==t?(Fe=m,Q=kS(F),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.charCodeAt(b)===36?(Q=dU,b++):(Q=t,I===0&&Be(CU)),Q!==t?(F=sc(),F!==t?(Fe=m,Q=kS(F),m=Q):(b=m,m=t)):(b=m,m=t)))))),m}function hfe(){var m,Q,F;return m=b,Q=pfe(),Q!==t?(Fe=b,F=mU(Q),F?F=void 0:F=t,F!==t?(Fe=m,Q=EU(Q),m=Q):(b=m,m=t)):(b=m,m=t),m}function pfe(){var m,Q,F,K,ce;if(m=b,Q=[],F=b,K=b,I++,ce=TU(),I--,ce===t?K=void 0:(b=K,K=t),K!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&Be(wo)),ce!==t?(Fe=F,K=ln(ce),F=K):(b=F,F=t)):(b=F,F=t),F!==t)for(;F!==t;)Q.push(F),F=b,K=b,I++,ce=TU(),I--,ce===t?K=void 0:(b=K,K=t),K!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&Be(wo)),ce!==t?(Fe=F,K=ln(ce),F=K):(b=F,F=t)):(b=F,F=t);else Q=t;return Q!==t&&(Fe=m,Q=kn(Q)),m=Q,m}function FU(){var m,Q,F;if(m=b,Q=[],RS.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(FS)),F!==t)for(;F!==t;)Q.push(F),RS.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(FS));else Q=t;return Q!==t&&(Fe=m,Q=NS()),m=Q,m}function sc(){var m,Q,F;if(m=b,Q=[],TS.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(LS)),F!==t)for(;F!==t;)Q.push(F),TS.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(LS));else Q=t;return Q!==t&&(Fe=m,Q=NS()),m=Q,m}function NU(){var m;return IU.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&Be(Yg)),m}function TU(){var m;return OS.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&Be(MS)),m}function Me(){var m,Q;if(m=[],CI.test(r.charAt(b))?(Q=r.charAt(b),b++):(Q=t,I===0&&Be(mI)),Q!==t)for(;Q!==t;)m.push(Q),CI.test(r.charAt(b))?(Q=r.charAt(b),b++):(Q=t,I===0&&Be(mI));else m=t;return m}if(k=n(),k!==t&&b===r.length)return k;throw k!==t&&b{"use strict";function phe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function fc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,fc)}phe(fc,Error);fc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gH&&(H=v,j=[]),j.push(ie))}function Le(ie,Y){return new fc(ie,null,null,Y)}function se(ie,Y,he){return new fc(fc.buildMessage(ie,Y),ie,Y,he)}function Ae(){var ie,Y,he,re;return ie=v,Y=be(),Y!==t?(r.charCodeAt(v)===47?(he=s,v++):(he=t,$===0&&Pe(o)),he!==t?(re=be(),re!==t?(D=ie,Y=a(Y,re),ie=Y):(v=ie,ie=t)):(v=ie,ie=t)):(v=ie,ie=t),ie===t&&(ie=v,Y=be(),Y!==t&&(D=ie,Y=l(Y)),ie=Y),ie}function be(){var ie,Y,he,re;return ie=v,Y=fe(),Y!==t?(r.charCodeAt(v)===64?(he=c,v++):(he=t,$===0&&Pe(u)),he!==t?(re=Ge(),re!==t?(D=ie,Y=g(Y,re),ie=Y):(v=ie,ie=t)):(v=ie,ie=t)):(v=ie,ie=t),ie===t&&(ie=v,Y=fe(),Y!==t&&(D=ie,Y=f(Y)),ie=Y),ie}function fe(){var ie,Y,he,re,me;return ie=v,r.charCodeAt(v)===64?(Y=c,v++):(Y=t,$===0&&Pe(u)),Y!==t?(he=le(),he!==t?(r.charCodeAt(v)===47?(re=s,v++):(re=t,$===0&&Pe(o)),re!==t?(me=le(),me!==t?(D=ie,Y=h(),ie=Y):(v=ie,ie=t)):(v=ie,ie=t)):(v=ie,ie=t)):(v=ie,ie=t),ie===t&&(ie=v,Y=le(),Y!==t&&(D=ie,Y=h()),ie=Y),ie}function le(){var ie,Y,he;if(ie=v,Y=[],p.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Pe(C)),he!==t)for(;he!==t;)Y.push(he),p.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Pe(C));else Y=t;return Y!==t&&(D=ie,Y=h()),ie=Y,ie}function Ge(){var ie,Y,he;if(ie=v,Y=[],w.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Pe(B)),he!==t)for(;he!==t;)Y.push(he),w.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Pe(B));else Y=t;return Y!==t&&(D=ie,Y=h()),ie=Y,ie}if(V=n(),V!==t&&v===r.length)return V;throw V!==t&&v{"use strict";function XK(r){return typeof r>"u"||r===null}function Che(r){return typeof r=="object"&&r!==null}function mhe(r){return Array.isArray(r)?r:XK(r)?[]:[r]}function Ehe(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t{"use strict";function md(r,e){Error.call(this),this.name="YAMLException",this.reason=r,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}md.prototype=Object.create(Error.prototype);md.prototype.constructor=md;md.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t};_K.exports=md});var e2=y((YZe,$K)=>{"use strict";var ZK=pc();function wv(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.line=i,this.column=n}wv.prototype.getSnippet=function(e,t){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,i="",n=this.position;n>0&&`\0\r -\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>t/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;ot/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),ZK.repeat(" ",e)+i+a+s+` -`+ZK.repeat(" ",e+this.position-n+i.length)+"^"};wv.prototype.toString=function(e){var t,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(i+=`: -`+t)),i};$K.exports=wv});var Ai=y((jZe,r2)=>{"use strict";var t2=tf(),whe=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],Bhe=["scalar","sequence","mapping"];function bhe(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function Qhe(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(whe.indexOf(t)===-1)throw new t2('Unknown option "'+t+'" is met in definition of "'+r+'" YAML type.')}),this.tag=r,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=bhe(e.styleAliases||null),Bhe.indexOf(this.kind)===-1)throw new t2('Unknown kind "'+this.kind+'" is specified for "'+r+'" YAML type.')}r2.exports=Qhe});var dc=y((qZe,n2)=>{"use strict";var i2=pc(),jI=tf(),She=Ai();function Bv(r,e,t){var i=[];return r.include.forEach(function(n){t=Bv(n,e,t)}),r[e].forEach(function(n){t.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),t.push(n)}),t.filter(function(n,s){return i.indexOf(s)===-1})}function vhe(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;function i(n){r[n.kind][n.tag]=r.fallback[n.tag]=n}for(e=0,t=arguments.length;e{"use strict";var xhe=Ai();s2.exports=new xhe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(r){return r!==null?r:""}})});var A2=y((WZe,a2)=>{"use strict";var Phe=Ai();a2.exports=new Phe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(r){return r!==null?r:[]}})});var c2=y((zZe,l2)=>{"use strict";var Dhe=Ai();l2.exports=new Dhe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(r){return r!==null?r:{}}})});var qI=y((VZe,u2)=>{"use strict";var khe=dc();u2.exports=new khe({explicit:[o2(),A2(),c2()]})});var f2=y((XZe,g2)=>{"use strict";var Rhe=Ai();function Fhe(r){if(r===null)return!0;var e=r.length;return e===1&&r==="~"||e===4&&(r==="null"||r==="Null"||r==="NULL")}function Nhe(){return null}function The(r){return r===null}g2.exports=new Rhe("tag:yaml.org,2002:null",{kind:"scalar",resolve:Fhe,construct:Nhe,predicate:The,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var p2=y((_Ze,h2)=>{"use strict";var Lhe=Ai();function Ohe(r){if(r===null)return!1;var e=r.length;return e===4&&(r==="true"||r==="True"||r==="TRUE")||e===5&&(r==="false"||r==="False"||r==="FALSE")}function Mhe(r){return r==="true"||r==="True"||r==="TRUE"}function Uhe(r){return Object.prototype.toString.call(r)==="[object Boolean]"}h2.exports=new Lhe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:Ohe,construct:Mhe,predicate:Uhe,represent:{lowercase:function(r){return r?"true":"false"},uppercase:function(r){return r?"TRUE":"FALSE"},camelcase:function(r){return r?"True":"False"}},defaultStyle:"lowercase"})});var C2=y((ZZe,d2)=>{"use strict";var Khe=pc(),Hhe=Ai();function Ghe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function Yhe(r){return 48<=r&&r<=55}function jhe(r){return 48<=r&&r<=57}function qhe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)return!1;if(n=r[t],(n==="-"||n==="+")&&(n=r[++t]),n==="0"){if(t+1===e)return!0;if(n=r[++t],n==="b"){for(t++;t=0?"0b"+r.toString(2):"-0b"+r.toString(2).slice(1)},octal:function(r){return r>=0?"0"+r.toString(8):"-0"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?"0x"+r.toString(16).toUpperCase():"-0x"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var I2=y(($Ze,E2)=>{"use strict";var m2=pc(),zhe=Ai(),Vhe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function Xhe(r){return!(r===null||!Vhe.test(r)||r[r.length-1]==="_")}function _he(r){var e,t,i,n;return e=r.replace(/_/g,"").toLowerCase(),t=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?t===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),t*e):t*parseFloat(e,10)}var Zhe=/^[-+]?[0-9]+e/;function $he(r,e){var t;if(isNaN(r))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===r)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===r)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(m2.isNegativeZero(r))return"-0.0";return t=r.toString(10),Zhe.test(t)?t.replace("e",".e"):t}function epe(r){return Object.prototype.toString.call(r)==="[object Number]"&&(r%1!==0||m2.isNegativeZero(r))}E2.exports=new zhe("tag:yaml.org,2002:float",{kind:"scalar",resolve:Xhe,construct:_he,predicate:epe,represent:$he,defaultStyle:"lowercase"})});var bv=y((e$e,y2)=>{"use strict";var tpe=dc();y2.exports=new tpe({include:[qI()],implicit:[f2(),p2(),C2(),I2()]})});var Qv=y((t$e,w2)=>{"use strict";var rpe=dc();w2.exports=new rpe({include:[bv()]})});var S2=y((r$e,Q2)=>{"use strict";var ipe=Ai(),B2=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),b2=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function npe(r){return r===null?!1:B2.exec(r)!==null||b2.exec(r)!==null}function spe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=B2.exec(r),e===null&&(e=b2.exec(r)),e===null)throw new Error("Date resolve error");if(t=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(t,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(t,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function ope(r){return r.toISOString()}Q2.exports=new ipe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:npe,construct:spe,instanceOf:Date,represent:ope})});var x2=y((i$e,v2)=>{"use strict";var ape=Ai();function Ape(r){return r==="<<"||r===null}v2.exports=new ape("tag:yaml.org,2002:merge",{kind:"scalar",resolve:Ape})});var k2=y((n$e,D2)=>{"use strict";var Cc;try{P2=J,Cc=P2("buffer").Buffer}catch{}var P2,lpe=Ai(),Sv=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;function cpe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=Sv;for(t=0;t64)){if(e<0)return!1;i+=6}return i%8===0}function upe(r){var e,t,i=r.replace(/[\r\n=]/g,""),n=i.length,s=Sv,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return t=n%4*6,t===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):t===18?(a.push(o>>10&255),a.push(o>>2&255)):t===12&&a.push(o>>4&255),Cc?Cc.from?Cc.from(a):new Cc(a):a}function gpe(r){var e="",t=0,i,n,s=r.length,o=Sv;for(i=0;i>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]),t=(t<<8)+r[i];return n=s%3,n===0?(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]):n===2?(e+=o[t>>10&63],e+=o[t>>4&63],e+=o[t<<2&63],e+=o[64]):n===1&&(e+=o[t>>2&63],e+=o[t<<4&63],e+=o[64],e+=o[64]),e}function fpe(r){return Cc&&Cc.isBuffer(r)}D2.exports=new lpe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:cpe,construct:upe,predicate:fpe,represent:gpe})});var F2=y((s$e,R2)=>{"use strict";var hpe=Ai(),ppe=Object.prototype.hasOwnProperty,dpe=Object.prototype.toString;function Cpe(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a.length;t{"use strict";var Epe=Ai(),Ipe=Object.prototype.toString;function ype(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e{"use strict";var Bpe=Ai(),bpe=Object.prototype.hasOwnProperty;function Qpe(r){if(r===null)return!0;var e,t=r;for(e in t)if(bpe.call(t,e)&&t[e]!==null)return!1;return!0}function Spe(r){return r!==null?r:{}}L2.exports=new Bpe("tag:yaml.org,2002:set",{kind:"mapping",resolve:Qpe,construct:Spe})});var nf=y((A$e,M2)=>{"use strict";var vpe=dc();M2.exports=new vpe({include:[Qv()],implicit:[S2(),x2()],explicit:[k2(),F2(),T2(),O2()]})});var K2=y((l$e,U2)=>{"use strict";var xpe=Ai();function Ppe(){return!0}function Dpe(){}function kpe(){return""}function Rpe(r){return typeof r>"u"}U2.exports=new xpe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:Ppe,construct:Dpe,predicate:Rpe,represent:kpe})});var G2=y((c$e,H2)=>{"use strict";var Fpe=Ai();function Npe(r){if(r===null||r.length===0)return!1;var e=r,t=/\/([gim]*)$/.exec(r),i="";return!(e[0]==="/"&&(t&&(i=t[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function Tpe(r){var e=r,t=/\/([gim]*)$/.exec(r),i="";return e[0]==="/"&&(t&&(i=t[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function Lpe(r){var e="/"+r.source+"/";return r.global&&(e+="g"),r.multiline&&(e+="m"),r.ignoreCase&&(e+="i"),e}function Ope(r){return Object.prototype.toString.call(r)==="[object RegExp]"}H2.exports=new Fpe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:Npe,construct:Tpe,predicate:Ope,represent:Lpe})});var q2=y((u$e,j2)=>{"use strict";var JI;try{Y2=J,JI=Y2("esprima")}catch{typeof window<"u"&&(JI=window.esprima)}var Y2,Mpe=Ai();function Upe(r){if(r===null)return!1;try{var e="("+r+")",t=JI.parse(e,{range:!0});return!(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function Kpe(r){var e="("+r+")",t=JI.parse(e,{range:!0}),i=[],n;if(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return t.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=t.body[0].expression.body.range,t.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function Hpe(r){return r.toString()}function Gpe(r){return Object.prototype.toString.call(r)==="[object Function]"}j2.exports=new Mpe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:Upe,construct:Kpe,predicate:Gpe,represent:Hpe})});var Ed=y((g$e,W2)=>{"use strict";var J2=dc();W2.exports=J2.DEFAULT=new J2({include:[nf()],explicit:[K2(),G2(),q2()]})});var gH=y((f$e,Id)=>{"use strict";var Qa=pc(),eH=tf(),Ype=e2(),tH=nf(),jpe=Ed(),NA=Object.prototype.hasOwnProperty,WI=1,rH=2,iH=3,zI=4,vv=1,qpe=2,z2=3,Jpe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Wpe=/[\x85\u2028\u2029]/,zpe=/[,\[\]\{\}]/,nH=/^(?:!|!!|![a-z\-]+!)$/i,sH=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function V2(r){return Object.prototype.toString.call(r)}function So(r){return r===10||r===13}function Ec(r){return r===9||r===32}function fn(r){return r===9||r===32||r===10||r===13}function sf(r){return r===44||r===91||r===93||r===123||r===125}function Vpe(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function Xpe(r){return r===120?2:r===117?4:r===85?8:0}function _pe(r){return 48<=r&&r<=57?r-48:-1}function X2(r){return r===48?"\0":r===97?"\x07":r===98?"\b":r===116||r===9?" ":r===110?` -`:r===118?"\v":r===102?"\f":r===114?"\r":r===101?"\x1B":r===32?" ":r===34?'"':r===47?"/":r===92?"\\":r===78?"\x85":r===95?"\xA0":r===76?"\u2028":r===80?"\u2029":""}function Zpe(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var oH=new Array(256),aH=new Array(256);for(mc=0;mc<256;mc++)oH[mc]=X2(mc)?1:0,aH[mc]=X2(mc);var mc;function $pe(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||jpe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function AH(r,e){return new eH(e,new Ype(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function gt(r,e){throw AH(r,e)}function VI(r,e){r.onWarning&&r.onWarning.call(null,AH(r,e))}var _2={YAML:function(e,t,i){var n,s,o;e.version!==null&>(e,"duplication of %YAML directive"),i.length!==1&>(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&>(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&>(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&VI(e,"unsupported YAML version of the document")},TAG:function(e,t,i){var n,s;i.length!==2&>(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],nH.test(n)||gt(e,"ill-formed tag handle (first argument) of the TAG directive"),NA.call(e.tagMap,n)&>(e,'there is a previously declared suffix for "'+n+'" tag handle'),sH.test(s)||gt(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function FA(r,e,t,i){var n,s,o,a;if(e1&&(r.result+=Qa.repeat(` -`,e-1))}function ede(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,f=r.result,h;if(h=r.input.charCodeAt(r.position),fn(h)||sf(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=r.input.charCodeAt(r.position+1),fn(n)||t&&sf(n)))return!1;for(r.kind="scalar",r.result="",s=o=r.position,a=!1;h!==0;){if(h===58){if(n=r.input.charCodeAt(r.position+1),fn(n)||t&&sf(n))break}else if(h===35){if(i=r.input.charCodeAt(r.position-1),fn(i))break}else{if(r.position===r.lineStart&&XI(r)||t&&sf(h))break;if(So(h))if(l=r.line,c=r.lineStart,u=r.lineIndent,_r(r,!1,-1),r.lineIndent>=e){a=!0,h=r.input.charCodeAt(r.position);continue}else{r.position=o,r.line=l,r.lineStart=c,r.lineIndent=u;break}}a&&(FA(r,s,o,!1),Pv(r,r.line-l),s=o=r.position,a=!1),Ec(h)||(o=r.position+1),h=r.input.charCodeAt(++r.position)}return FA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=f,!1)}function tde(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)return!1;for(r.kind="scalar",r.result="",r.position++,i=n=r.position;(t=r.input.charCodeAt(r.position))!==0;)if(t===39)if(FA(r,i,r.position,!0),t=r.input.charCodeAt(++r.position),t===39)i=r.position,r.position++,n=r.position;else return!0;else So(t)?(FA(r,i,n,!0),Pv(r,_r(r,!1,e)),i=n=r.position):r.position===r.lineStart&&XI(r)?gt(r,"unexpected end of the document within a single quoted scalar"):(r.position++,n=r.position);gt(r,"unexpected end of the stream within a single quoted scalar")}function rde(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!==34)return!1;for(r.kind="scalar",r.result="",r.position++,t=i=r.position;(a=r.input.charCodeAt(r.position))!==0;){if(a===34)return FA(r,t,r.position,!0),r.position++,!0;if(a===92){if(FA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),So(a))_r(r,!1,e);else if(a<256&&oH[a])r.result+=aH[a],r.position++;else if((o=Xpe(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=Vpe(a))>=0?s=(s<<4)+o:gt(r,"expected hexadecimal character");r.result+=Zpe(s),r.position++}else gt(r,"unknown escape sequence");t=i=r.position}else So(a)?(FA(r,t,i,!0),Pv(r,_r(r,!1,e)),t=i=r.position):r.position===r.lineStart&&XI(r)?gt(r,"unexpected end of the document within a double quoted scalar"):(r.position++,i=r.position)}gt(r,"unexpected end of the stream within a double quoted scalar")}function ide(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,f={},h,p,C,w;if(w=r.input.charCodeAt(r.position),w===91)l=93,g=!1,s=[];else if(w===123)l=125,g=!0,s={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),w=r.input.charCodeAt(++r.position);w!==0;){if(_r(r,!0,e),w=r.input.charCodeAt(r.position),w===l)return r.position++,r.tag=n,r.anchor=o,r.kind=g?"mapping":"sequence",r.result=s,!0;t||gt(r,"missed comma between flow collection entries"),p=h=C=null,c=u=!1,w===63&&(a=r.input.charCodeAt(r.position+1),fn(a)&&(c=u=!0,r.position++,_r(r,!0,e))),i=r.line,af(r,e,WI,!1,!0),p=r.tag,h=r.result,_r(r,!0,e),w=r.input.charCodeAt(r.position),(u||r.line===i)&&w===58&&(c=!0,w=r.input.charCodeAt(++r.position),_r(r,!0,e),af(r,e,WI,!1,!0),C=r.result),g?of(r,s,f,p,h,C):c?s.push(of(r,null,f,p,h,C)):s.push(h),_r(r,!0,e),w=r.input.charCodeAt(r.position),w===44?(t=!0,w=r.input.charCodeAt(++r.position)):t=!1}gt(r,"unexpected end of the stream within a flow collection")}function nde(r,e){var t,i,n=vv,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.charCodeAt(r.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(r.kind="scalar",r.result="";g!==0;)if(g=r.input.charCodeAt(++r.position),g===43||g===45)vv===n?n=g===43?z2:qpe:gt(r,"repeat of a chomping mode identifier");else if((u=_pe(g))>=0)u===0?gt(r,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?gt(r,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(Ec(g)){do g=r.input.charCodeAt(++r.position);while(Ec(g));if(g===35)do g=r.input.charCodeAt(++r.position);while(!So(g)&&g!==0)}for(;g!==0;){for(xv(r),r.lineIndent=0,g=r.input.charCodeAt(r.position);(!o||r.lineIndenta&&(a=r.lineIndent),So(g)){l++;continue}if(r.lineIndente)&&l!==0)gt(r,"bad indentation of a sequence entry");else if(r.lineIndente)&&(af(r,e,zI,!0,n)&&(p?f=r.result:h=r.result),p||(of(r,c,u,g,f,h,s,o),g=f=h=null),_r(r,!0,-1),w=r.input.charCodeAt(r.position)),r.lineIndent>e&&w!==0)gt(r,"bad indentation of a mapping entry");else if(r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndent tag; it should be "scalar", not "'+r.kind+'"'),g=0,f=r.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+r.kind+'"'),h.resolve(r.result)?(r.result=h.construct(r.result),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):gt(r,"cannot resolve a node with !<"+r.tag+"> explicit tag")):gt(r,"unknown tag !<"+r.tag+">");return r.listener!==null&&r.listener("close",r),r.tag!==null||r.anchor!==null||u}function lde(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap={},r.anchorMap={};(o=r.input.charCodeAt(r.position))!==0&&(_r(r,!0,-1),o=r.input.charCodeAt(r.position),!(r.lineIndent>0||o!==37));){for(s=!0,o=r.input.charCodeAt(++r.position),t=r.position;o!==0&&!fn(o);)o=r.input.charCodeAt(++r.position);for(i=r.input.slice(t,r.position),n=[],i.length<1&>(r,"directive name must not be less than one character in length");o!==0;){for(;Ec(o);)o=r.input.charCodeAt(++r.position);if(o===35){do o=r.input.charCodeAt(++r.position);while(o!==0&&!So(o));break}if(So(o))break;for(t=r.position;o!==0&&!fn(o);)o=r.input.charCodeAt(++r.position);n.push(r.input.slice(t,r.position))}o!==0&&xv(r),NA.call(_2,i)?_2[i](r,i,n):VI(r,'unknown document directive "'+i+'"')}if(_r(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,_r(r,!0,-1)):s&>(r,"directives end mark is expected"),af(r,r.lineIndent-1,zI,!1,!0),_r(r,!0,-1),r.checkLineBreaks&&Wpe.test(r.input.slice(e,r.position))&&VI(r,"non-ASCII line breaks are interpreted as content"),r.documents.push(r.result),r.position===r.lineStart&&XI(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,_r(r,!0,-1));return}if(r.position"u"&&(t=e,e=null);var i=lH(r,t);if(typeof e!="function")return i;for(var n=0,s=i.length;n"u"&&(t=e,e=null),cH(r,e,Qa.extend({schema:tH},t))}function ude(r,e){return uH(r,Qa.extend({schema:tH},e))}Id.exports.loadAll=cH;Id.exports.load=uH;Id.exports.safeLoadAll=cde;Id.exports.safeLoad=ude});var TH=y((h$e,Fv)=>{"use strict";var wd=pc(),Bd=tf(),gde=Ed(),fde=nf(),IH=Object.prototype.toString,yH=Object.prototype.hasOwnProperty,hde=9,yd=10,pde=13,dde=32,Cde=33,mde=34,wH=35,Ede=37,Ide=38,yde=39,wde=42,BH=44,Bde=45,bH=58,bde=61,Qde=62,Sde=63,vde=64,QH=91,SH=93,xde=96,vH=123,Pde=124,xH=125,Ti={};Ti[0]="\\0";Ti[7]="\\a";Ti[8]="\\b";Ti[9]="\\t";Ti[10]="\\n";Ti[11]="\\v";Ti[12]="\\f";Ti[13]="\\r";Ti[27]="\\e";Ti[34]='\\"';Ti[92]="\\\\";Ti[133]="\\N";Ti[160]="\\_";Ti[8232]="\\L";Ti[8233]="\\P";var Dde=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function kde(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Object.keys(e),n=0,s=i.length;n0?r.charCodeAt(s-1):null,f=f&&pH(o,a)}else{for(s=0;si&&r[g+1]!==" ",g=s);else if(!Af(o))return _I;a=s>0?r.charCodeAt(s-1):null,f=f&&pH(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==" "}return!l&&!c?f&&!n(r)?DH:kH:t>9&&PH(r)?_I:c?FH:RH}function Ode(r,e,t,i){r.dump=function(){if(e.length===0)return"''";if(!r.noCompatMode&&Dde.indexOf(e)!==-1)return"'"+e+"'";var n=r.indent*Math.max(1,t),s=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-n),o=i||r.flowLevel>-1&&t>=r.flowLevel;function a(l){return Fde(r,l)}switch(Lde(e,o,r.indent,s,a)){case DH:return e;case kH:return"'"+e.replace(/'/g,"''")+"'";case RH:return"|"+dH(e,r.indent)+CH(hH(e,n));case FH:return">"+dH(e,r.indent)+CH(hH(Mde(e,s),n));case _I:return'"'+Ude(e,s)+'"';default:throw new Bd("impossible error: invalid scalar style")}}()}function dH(r,e){var t=PH(r)?String(e):"",i=r[r.length-1]===` -`,n=i&&(r[r.length-2]===` -`||r===` -`),s=n?"+":i?"":"-";return t+s+` -`}function CH(r){return r[r.length-1]===` -`?r.slice(0,-1):r}function Mde(r,e){for(var t=/(\n+)([^\n]*)/g,i=function(){var c=r.indexOf(` -`);return c=c!==-1?c:r.length,t.lastIndex=c,mH(r.slice(0,c),e)}(),n=r[0]===` -`||r[0]===" ",s,o;o=t.exec(r);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` -`:"")+mH(l,e),n=s}return i}function mH(r,e){if(r===""||r[0]===" ")return r;for(var t=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=t.exec(r);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` -`+r.slice(n,s),n=s+1),o=a;return l+=` -`,r.length-n>e&&o>n?l+=r.slice(n,o)+` -`+r.slice(o+1):l+=r.slice(n),l.slice(1)}function Ude(r){for(var e="",t,i,n,s=0;s=55296&&t<=56319&&(i=r.charCodeAt(s+1),i>=56320&&i<=57343)){e+=fH((t-55296)*1024+i-56320+65536),s++;continue}n=Ti[t],e+=!n&&Af(t)?r[s]:n||fH(t)}return e}function Kde(r,e,t){var i="",n=r.tag,s,o;for(s=0,o=t.length;s1024&&(u+="? "),u+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),Ic(r,e,c,!1,!1)&&(u+=r.dump,i+=u));r.tag=n,r.dump="{"+i+"}"}function Yde(r,e,t,i){var n="",s=r.tag,o=Object.keys(t),a,l,c,u,g,f;if(r.sortKeys===!0)o.sort();else if(typeof r.sortKeys=="function")o.sort(r.sortKeys);else if(r.sortKeys)throw new Bd("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(r.dump&&yd===r.dump.charCodeAt(0)?f+="?":f+="? "),f+=r.dump,g&&(f+=Dv(r,e)),Ic(r,e+1,u,!0,g)&&(r.dump&&yd===r.dump.charCodeAt(0)?f+=":":f+=": ",f+=r.dump,n+=f));r.tag=s,r.dump=n||"{}"}function EH(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');r.dump=i}return!0}return!1}function Ic(r,e,t,i,n,s){r.tag=null,r.dump=t,EH(r,t,!1)||EH(r,t,!0);var o=IH.call(r.dump);i&&(i=r.flowLevel<0||r.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=r.duplicates.indexOf(t),c=l!==-1),(r.tag!==null&&r.tag!=="?"||c||r.indent!==2&&e>0)&&(n=!1),c&&r.usedDuplicates[l])r.dump="*ref_"+l;else{if(a&&c&&!r.usedDuplicates[l]&&(r.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(r.dump).length!==0?(Yde(r,e,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(Gde(r,e,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump));else if(o==="[object Array]"){var u=r.noArrayIndent&&e>0?e-1:e;i&&r.dump.length!==0?(Hde(r,u,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(Kde(r,u,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump))}else if(o==="[object String]")r.tag!=="?"&&Ode(r,r.dump,e,s);else{if(r.skipInvalid)return!1;throw new Bd("unacceptable kind of an object to dump "+o)}r.tag!==null&&r.tag!=="?"&&(r.dump="!<"+r.tag+"> "+r.dump)}return!0}function jde(r,e){var t=[],i=[],n,s;for(kv(r,t,i),n=0,s=i.length;n{"use strict";var ZI=gH(),LH=TH();function $I(r){return function(){throw new Error("Function "+r+" is deprecated and cannot be used.")}}Tr.exports.Type=Ai();Tr.exports.Schema=dc();Tr.exports.FAILSAFE_SCHEMA=qI();Tr.exports.JSON_SCHEMA=bv();Tr.exports.CORE_SCHEMA=Qv();Tr.exports.DEFAULT_SAFE_SCHEMA=nf();Tr.exports.DEFAULT_FULL_SCHEMA=Ed();Tr.exports.load=ZI.load;Tr.exports.loadAll=ZI.loadAll;Tr.exports.safeLoad=ZI.safeLoad;Tr.exports.safeLoadAll=ZI.safeLoadAll;Tr.exports.dump=LH.dump;Tr.exports.safeDump=LH.safeDump;Tr.exports.YAMLException=tf();Tr.exports.MINIMAL_SCHEMA=qI();Tr.exports.SAFE_SCHEMA=nf();Tr.exports.DEFAULT_SCHEMA=Ed();Tr.exports.scan=$I("scan");Tr.exports.parse=$I("parse");Tr.exports.compose=$I("compose");Tr.exports.addConstructor=$I("addConstructor")});var UH=y((d$e,MH)=>{"use strict";var Jde=OH();MH.exports=Jde});var HH=y((C$e,KH)=>{"use strict";function Wde(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function yc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,yc)}Wde(yc,Error);yc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[Ne]:pe})))},H=function(R){return R},j=function(R){return R},$=Ms("correct indentation"),V=" ",W=ar(" ",!1),Z=function(R){return R.length===vA*Gg},A=function(R){return R.length===(vA+1)*Gg},ae=function(){return vA++,!0},ge=function(){return vA--,!0},_=function(){return Lg()},L=Ms("pseudostring"),N=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,ue=Fn(["\r",` -`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),we=/^[^\r\n\t ,\][{}:#"']/,Te=Fn(["\r",` -`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),Pe=function(){return Lg().replace(/^ *| *$/g,"")},Le="--",se=ar("--",!1),Ae=/^[a-zA-Z\/0-9]/,be=Fn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),fe=/^[^\r\n\t :,]/,le=Fn(["\r",` -`," "," ",":",","],!0,!1),Ge="null",ie=ar("null",!1),Y=function(){return null},he="true",re=ar("true",!1),me=function(){return!0},tt="false",Rt=ar("false",!1),It=function(){return!1},Ur=Ms("string"),oi='"',pi=ar('"',!1),pr=function(){return""},di=function(R){return R},ai=function(R){return R.join("")},Os=/^[^"\\\0-\x1F\x7F]/,dr=Fn(['"',"\\",["\0",""],"\x7F"],!0,!1),Bi='\\"',_n=ar('\\"',!1),pa=function(){return'"'},EA="\\\\",kg=ar("\\\\",!1),Zn=function(){return"\\"},IA="\\/",da=ar("\\/",!1),Jp=function(){return"/"},yA="\\b",wA=ar("\\b",!1),Br=function(){return"\b"},Vl="\\f",Rg=ar("\\f",!1),Eo=function(){return"\f"},Fg="\\n",Wp=ar("\\n",!1),zp=function(){return` -`},Pr="\\r",oe=ar("\\r",!1),Io=function(){return"\r"},kn="\\t",Ng=ar("\\t",!1),bt=function(){return" "},Xl="\\u",Rn=ar("\\u",!1),$n=function(R,q,pe,Ne){return String.fromCharCode(parseInt(`0x${R}${q}${pe}${Ne}`))},es=/^[0-9a-fA-F]/,ut=Fn([["0","9"],["a","f"],["A","F"]],!1,!1),yo=Ms("blank space"),at=/^[ \t]/,ln=Fn([" "," "],!1,!1),S=Ms("white space"),Lt=/^[ \t\n\r]/,Tg=Fn([" "," ",` -`,"\r"],!1,!1),_l=`\r -`,Vp=ar(`\r -`,!1),Xp=` -`,_p=ar(` -`,!1),Zp="\r",$p=ar("\r",!1),G=0,yt=0,BA=[{line:1,column:1}],Wi=0,Zl=[],We=0,Ca;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function Lg(){return r.substring(yt,G)}function uI(){return cn(yt,G)}function ed(R,q){throw q=q!==void 0?q:cn(yt,G),ec([Ms(R)],r.substring(yt,G),q)}function gI(R,q){throw q=q!==void 0?q:cn(yt,G),Og(R,q)}function ar(R,q){return{type:"literal",text:R,ignoreCase:q}}function Fn(R,q,pe){return{type:"class",parts:R,inverted:q,ignoreCase:pe}}function $l(){return{type:"any"}}function td(){return{type:"end"}}function Ms(R){return{type:"other",description:R}}function ma(R){var q=BA[R],pe;if(q)return q;for(pe=R-1;!BA[pe];)pe--;for(q=BA[pe],q={line:q.line,column:q.column};peWi&&(Wi=G,Zl=[]),Zl.push(R))}function Og(R,q){return new yc(R,null,null,q)}function ec(R,q,pe){return new yc(yc.buildMessage(R,q),R,q,pe)}function Us(){var R;return R=Mg(),R}function tc(){var R,q,pe;for(R=G,q=[],pe=bA();pe!==t;)q.push(pe),pe=bA();return q!==t&&(yt=R,q=s(q)),R=q,R}function bA(){var R,q,pe,Ne,xe;return R=G,q=Ia(),q!==t?(r.charCodeAt(G)===45?(pe=o,G++):(pe=t,We===0&&ke(a)),pe!==t?(Ne=Nr(),Ne!==t?(xe=Ea(),xe!==t?(yt=R,q=l(xe),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R}function Mg(){var R,q,pe;for(R=G,q=[],pe=Ug();pe!==t;)q.push(pe),pe=Ug();return q!==t&&(yt=R,q=c(q)),R=q,R}function Ug(){var R,q,pe,Ne,xe,qe,dt,Ft,Nn;if(R=G,q=Nr(),q===t&&(q=null),q!==t){if(pe=G,r.charCodeAt(G)===35?(Ne=u,G++):(Ne=t,We===0&&ke(g)),Ne!==t){if(xe=[],qe=G,dt=G,We++,Ft=Gs(),We--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,We===0&&ke(f)),Ft!==t?(dt=[dt,Ft],qe=dt):(G=qe,qe=t)):(G=qe,qe=t),qe!==t)for(;qe!==t;)xe.push(qe),qe=G,dt=G,We++,Ft=Gs(),We--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,We===0&&ke(f)),Ft!==t?(dt=[dt,Ft],qe=dt):(G=qe,qe=t)):(G=qe,qe=t);else xe=t;xe!==t?(Ne=[Ne,xe],pe=Ne):(G=pe,pe=t)}else G=pe,pe=t;if(pe===t&&(pe=null),pe!==t){if(Ne=[],xe=Hs(),xe!==t)for(;xe!==t;)Ne.push(xe),xe=Hs();else Ne=t;Ne!==t?(yt=R,q=h(),R=q):(G=R,R=t)}else G=R,R=t}else G=R,R=t;if(R===t&&(R=G,q=Ia(),q!==t?(pe=rc(),pe!==t?(Ne=Nr(),Ne===t&&(Ne=null),Ne!==t?(r.charCodeAt(G)===58?(xe=p,G++):(xe=t,We===0&&ke(C)),xe!==t?(qe=Nr(),qe===t&&(qe=null),qe!==t?(dt=Ea(),dt!==t?(yt=R,q=w(pe,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=Ia(),q!==t?(pe=Ks(),pe!==t?(Ne=Nr(),Ne===t&&(Ne=null),Ne!==t?(r.charCodeAt(G)===58?(xe=p,G++):(xe=t,We===0&&ke(C)),xe!==t?(qe=Nr(),qe===t&&(qe=null),qe!==t?(dt=Ea(),dt!==t?(yt=R,q=w(pe,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))){if(R=G,q=Ia(),q!==t)if(pe=Ks(),pe!==t)if(Ne=Nr(),Ne!==t)if(xe=fI(),xe!==t){if(qe=[],dt=Hs(),dt!==t)for(;dt!==t;)qe.push(dt),dt=Hs();else qe=t;qe!==t?(yt=R,q=w(pe,xe),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;else G=R,R=t;else G=R,R=t;if(R===t)if(R=G,q=Ia(),q!==t)if(pe=Ks(),pe!==t){if(Ne=[],xe=G,qe=Nr(),qe===t&&(qe=null),qe!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,We===0&&ke(v)),dt!==t?(Ft=Nr(),Ft===t&&(Ft=null),Ft!==t?(Nn=Ks(),Nn!==t?(yt=xe,qe=D(pe,Nn),xe=qe):(G=xe,xe=t)):(G=xe,xe=t)):(G=xe,xe=t)):(G=xe,xe=t),xe!==t)for(;xe!==t;)Ne.push(xe),xe=G,qe=Nr(),qe===t&&(qe=null),qe!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,We===0&&ke(v)),dt!==t?(Ft=Nr(),Ft===t&&(Ft=null),Ft!==t?(Nn=Ks(),Nn!==t?(yt=xe,qe=D(pe,Nn),xe=qe):(G=xe,xe=t)):(G=xe,xe=t)):(G=xe,xe=t)):(G=xe,xe=t);else Ne=t;Ne!==t?(xe=Nr(),xe===t&&(xe=null),xe!==t?(r.charCodeAt(G)===58?(qe=p,G++):(qe=t,We===0&&ke(C)),qe!==t?(dt=Nr(),dt===t&&(dt=null),dt!==t?(Ft=Ea(),Ft!==t?(yt=R,q=T(pe,Ne,Ft),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)}else G=R,R=t;else G=R,R=t}return R}function Ea(){var R,q,pe,Ne,xe,qe,dt;if(R=G,q=G,We++,pe=G,Ne=Gs(),Ne!==t?(xe=$e(),xe!==t?(r.charCodeAt(G)===45?(qe=o,G++):(qe=t,We===0&&ke(a)),qe!==t?(dt=Nr(),dt!==t?(Ne=[Ne,xe,qe,dt],pe=Ne):(G=pe,pe=t)):(G=pe,pe=t)):(G=pe,pe=t)):(G=pe,pe=t),We--,pe!==t?(G=q,q=void 0):q=t,q!==t?(pe=Hs(),pe!==t?(Ne=wo(),Ne!==t?(xe=tc(),xe!==t?(qe=QA(),qe!==t?(yt=R,q=H(xe),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=Gs(),q!==t?(pe=wo(),pe!==t?(Ne=Mg(),Ne!==t?(xe=QA(),xe!==t?(yt=R,q=H(Ne),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))if(R=G,q=ic(),q!==t){if(pe=[],Ne=Hs(),Ne!==t)for(;Ne!==t;)pe.push(Ne),Ne=Hs();else pe=t;pe!==t?(yt=R,q=j(q),R=q):(G=R,R=t)}else G=R,R=t;return R}function Ia(){var R,q,pe;for(We++,R=G,q=[],r.charCodeAt(G)===32?(pe=V,G++):(pe=t,We===0&&ke(W));pe!==t;)q.push(pe),r.charCodeAt(G)===32?(pe=V,G++):(pe=t,We===0&&ke(W));return q!==t?(yt=G,pe=Z(q),pe?pe=void 0:pe=t,pe!==t?(q=[q,pe],R=q):(G=R,R=t)):(G=R,R=t),We--,R===t&&(q=t,We===0&&ke($)),R}function $e(){var R,q,pe;for(R=G,q=[],r.charCodeAt(G)===32?(pe=V,G++):(pe=t,We===0&&ke(W));pe!==t;)q.push(pe),r.charCodeAt(G)===32?(pe=V,G++):(pe=t,We===0&&ke(W));return q!==t?(yt=G,pe=A(q),pe?pe=void 0:pe=t,pe!==t?(q=[q,pe],R=q):(G=R,R=t)):(G=R,R=t),R}function wo(){var R;return yt=G,R=ae(),R?R=void 0:R=t,R}function QA(){var R;return yt=G,R=ge(),R?R=void 0:R=t,R}function rc(){var R;return R=nc(),R===t&&(R=rd()),R}function Ks(){var R,q,pe;if(R=nc(),R===t){if(R=G,q=[],pe=Kg(),pe!==t)for(;pe!==t;)q.push(pe),pe=Kg();else q=t;q!==t&&(yt=R,q=_()),R=q}return R}function ic(){var R;return R=id(),R===t&&(R=hI(),R===t&&(R=nc(),R===t&&(R=rd()))),R}function fI(){var R;return R=id(),R===t&&(R=nc(),R===t&&(R=Kg())),R}function rd(){var R,q,pe,Ne,xe,qe;if(We++,R=G,N.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,We===0&&ke(ue)),q!==t){for(pe=[],Ne=G,xe=Nr(),xe===t&&(xe=null),xe!==t?(we.test(r.charAt(G))?(qe=r.charAt(G),G++):(qe=t,We===0&&ke(Te)),qe!==t?(xe=[xe,qe],Ne=xe):(G=Ne,Ne=t)):(G=Ne,Ne=t);Ne!==t;)pe.push(Ne),Ne=G,xe=Nr(),xe===t&&(xe=null),xe!==t?(we.test(r.charAt(G))?(qe=r.charAt(G),G++):(qe=t,We===0&&ke(Te)),qe!==t?(xe=[xe,qe],Ne=xe):(G=Ne,Ne=t)):(G=Ne,Ne=t);pe!==t?(yt=R,q=Pe(),R=q):(G=R,R=t)}else G=R,R=t;return We--,R===t&&(q=t,We===0&&ke(L)),R}function Kg(){var R,q,pe,Ne,xe;if(R=G,r.substr(G,2)===Le?(q=Le,G+=2):(q=t,We===0&&ke(se)),q===t&&(q=null),q!==t)if(Ae.test(r.charAt(G))?(pe=r.charAt(G),G++):(pe=t,We===0&&ke(be)),pe!==t){for(Ne=[],fe.test(r.charAt(G))?(xe=r.charAt(G),G++):(xe=t,We===0&&ke(le));xe!==t;)Ne.push(xe),fe.test(r.charAt(G))?(xe=r.charAt(G),G++):(xe=t,We===0&&ke(le));Ne!==t?(yt=R,q=Pe(),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;return R}function id(){var R,q;return R=G,r.substr(G,4)===Ge?(q=Ge,G+=4):(q=t,We===0&&ke(ie)),q!==t&&(yt=R,q=Y()),R=q,R}function hI(){var R,q;return R=G,r.substr(G,4)===he?(q=he,G+=4):(q=t,We===0&&ke(re)),q!==t&&(yt=R,q=me()),R=q,R===t&&(R=G,r.substr(G,5)===tt?(q=tt,G+=5):(q=t,We===0&&ke(Rt)),q!==t&&(yt=R,q=It()),R=q),R}function nc(){var R,q,pe,Ne;return We++,R=G,r.charCodeAt(G)===34?(q=oi,G++):(q=t,We===0&&ke(pi)),q!==t?(r.charCodeAt(G)===34?(pe=oi,G++):(pe=t,We===0&&ke(pi)),pe!==t?(yt=R,q=pr(),R=q):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,r.charCodeAt(G)===34?(q=oi,G++):(q=t,We===0&&ke(pi)),q!==t?(pe=pI(),pe!==t?(r.charCodeAt(G)===34?(Ne=oi,G++):(Ne=t,We===0&&ke(pi)),Ne!==t?(yt=R,q=di(pe),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)),We--,R===t&&(q=t,We===0&&ke(Ur)),R}function pI(){var R,q,pe;if(R=G,q=[],pe=Hg(),pe!==t)for(;pe!==t;)q.push(pe),pe=Hg();else q=t;return q!==t&&(yt=R,q=ai(q)),R=q,R}function Hg(){var R,q,pe,Ne,xe,qe;return Os.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,We===0&&ke(dr)),R===t&&(R=G,r.substr(G,2)===Bi?(q=Bi,G+=2):(q=t,We===0&&ke(_n)),q!==t&&(yt=R,q=pa()),R=q,R===t&&(R=G,r.substr(G,2)===EA?(q=EA,G+=2):(q=t,We===0&&ke(kg)),q!==t&&(yt=R,q=Zn()),R=q,R===t&&(R=G,r.substr(G,2)===IA?(q=IA,G+=2):(q=t,We===0&&ke(da)),q!==t&&(yt=R,q=Jp()),R=q,R===t&&(R=G,r.substr(G,2)===yA?(q=yA,G+=2):(q=t,We===0&&ke(wA)),q!==t&&(yt=R,q=Br()),R=q,R===t&&(R=G,r.substr(G,2)===Vl?(q=Vl,G+=2):(q=t,We===0&&ke(Rg)),q!==t&&(yt=R,q=Eo()),R=q,R===t&&(R=G,r.substr(G,2)===Fg?(q=Fg,G+=2):(q=t,We===0&&ke(Wp)),q!==t&&(yt=R,q=zp()),R=q,R===t&&(R=G,r.substr(G,2)===Pr?(q=Pr,G+=2):(q=t,We===0&&ke(oe)),q!==t&&(yt=R,q=Io()),R=q,R===t&&(R=G,r.substr(G,2)===kn?(q=kn,G+=2):(q=t,We===0&&ke(Ng)),q!==t&&(yt=R,q=bt()),R=q,R===t&&(R=G,r.substr(G,2)===Xl?(q=Xl,G+=2):(q=t,We===0&&ke(Rn)),q!==t?(pe=SA(),pe!==t?(Ne=SA(),Ne!==t?(xe=SA(),xe!==t?(qe=SA(),qe!==t?(yt=R,q=$n(pe,Ne,xe,qe),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)))))))))),R}function SA(){var R;return es.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,We===0&&ke(ut)),R}function Nr(){var R,q;if(We++,R=[],at.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,We===0&&ke(ln)),q!==t)for(;q!==t;)R.push(q),at.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,We===0&&ke(ln));else R=t;return We--,R===t&&(q=t,We===0&&ke(yo)),R}function dI(){var R,q;if(We++,R=[],Lt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,We===0&&ke(Tg)),q!==t)for(;q!==t;)R.push(q),Lt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,We===0&&ke(Tg));else R=t;return We--,R===t&&(q=t,We===0&&ke(S)),R}function Hs(){var R,q,pe,Ne,xe,qe;if(R=G,q=Gs(),q!==t){for(pe=[],Ne=G,xe=Nr(),xe===t&&(xe=null),xe!==t?(qe=Gs(),qe!==t?(xe=[xe,qe],Ne=xe):(G=Ne,Ne=t)):(G=Ne,Ne=t);Ne!==t;)pe.push(Ne),Ne=G,xe=Nr(),xe===t&&(xe=null),xe!==t?(qe=Gs(),qe!==t?(xe=[xe,qe],Ne=xe):(G=Ne,Ne=t)):(G=Ne,Ne=t);pe!==t?(q=[q,pe],R=q):(G=R,R=t)}else G=R,R=t;return R}function Gs(){var R;return r.substr(G,2)===_l?(R=_l,G+=2):(R=t,We===0&&ke(Vp)),R===t&&(r.charCodeAt(G)===10?(R=Xp,G++):(R=t,We===0&&ke(_p)),R===t&&(r.charCodeAt(G)===13?(R=Zp,G++):(R=t,We===0&&ke($p)))),R}let Gg=2,vA=0;if(Ca=n(),Ca!==t&&G===r.length)return Ca;throw Ca!==t&&G{"use strict";var $de=r=>{let e=!1,t=!1,i=!1;for(let n=0;n{if(!(typeof r=="string"||Array.isArray(r)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let t=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(r)?r=r.map(n=>n.trim()).filter(n=>n.length).join("-"):r=r.trim(),r.length===0?"":r.length===1?e.pascalCase?r.toUpperCase():r.toLowerCase():(r!==r.toLowerCase()&&(r=$de(r)),r=r.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),t(r))};Tv.exports=JH;Tv.exports.default=JH});var zH=y((B$e,eCe)=>{eCe.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var wc=y(Mn=>{"use strict";var XH=zH(),vo=process.env;Object.defineProperty(Mn,"_vendors",{value:XH.map(function(r){return r.constant})});Mn.name=null;Mn.isPR=null;XH.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return VH(i)});if(Mn[r.constant]=t,t)switch(Mn.name=r.name,typeof r.pr){case"string":Mn.isPR=!!vo[r.pr];break;case"object":"env"in r.pr?Mn.isPR=r.pr.env in vo&&vo[r.pr.env]!==r.pr.ne:"any"in r.pr?Mn.isPR=r.pr.any.some(function(i){return!!vo[i]}):Mn.isPR=VH(r.pr);break;default:Mn.isPR=null}});Mn.isCI=!!(vo.CI||vo.CONTINUOUS_INTEGRATION||vo.BUILD_NUMBER||vo.RUN_ID||Mn.name);function VH(r){return typeof r=="string"?!!vo[r]:Object.keys(r).every(function(e){return vo[e]===r[e]})}});var ry=y(Un=>{"use strict";Object.defineProperty(Un,"__esModule",{value:!0});var tCe=0,rCe=1,iCe=2,nCe="",sCe="\0",oCe=-1,aCe=/^(-h|--help)(?:=([0-9]+))?$/,ACe=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,lCe=/^-[a-zA-Z]{2,}$/,cCe=/^([^=]+)=([\s\S]*)$/,uCe=process.env.DEBUG_CLI==="1";Un.BATCH_REGEX=lCe;Un.BINDING_REGEX=cCe;Un.DEBUG=uCe;Un.END_OF_INPUT=sCe;Un.HELP_COMMAND_INDEX=oCe;Un.HELP_REGEX=aCe;Un.NODE_ERRORED=iCe;Un.NODE_INITIAL=tCe;Un.NODE_SUCCESS=rCe;Un.OPTION_REGEX=ACe;Un.START_OF_INPUT=nCe});var iy=y(Qd=>{"use strict";Object.defineProperty(Qd,"__esModule",{value:!0});var gCe=ry(),Lv=class extends Error{constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageError"}},Ov=class extends Error{constructor(e,t){if(super(),this.input=e,this.candidates=t,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(i=>i.reason!==null&&i.reason===t[0].reason)){let[{reason:i}]=this.candidates;this.message=`${i} - -${this.candidates.map(({usage:n})=>`$ ${n}`).join(` -`)}`}else if(this.candidates.length===1){let[{usage:i}]=this.candidates;this.message=`Command not found; did you mean: - -$ ${i} -${Uv(e)}`}else this.message=`Command not found; did you mean one of: - -${this.candidates.map(({usage:i},n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${Uv(e)}`}},Mv=class extends Error{constructor(e,t){super(),this.input=e,this.usages=t,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: - -${this.usages.map((i,n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${Uv(e)}`}},Uv=r=>`While running ${r.filter(e=>e!==gCe.END_OF_INPUT).map(e=>{let t=JSON.stringify(e);return e.match(/\s/)||e.length===0||t!==`"${e}"`?t:e}).join(" ")}`;Qd.AmbiguousSyntaxError=Mv;Qd.UnknownSyntaxError=Ov;Qd.UsageError=Lv});var va=y(TA=>{"use strict";Object.defineProperty(TA,"__esModule",{value:!0});var _H=iy(),ZH=Symbol("clipanion/isOption");function fCe(r){return{...r,[ZH]:!0}}function hCe(r,e){return typeof r>"u"?[r,e]:typeof r=="object"&&r!==null&&!Array.isArray(r)?[void 0,r]:[r,e]}function Kv(r,e=!1){let t=r.replace(/^\.: /,"");return e&&(t=t[0].toLowerCase()+t.slice(1)),t}function $H(r,e){return e.length===1?new _H.UsageError(`${r}: ${Kv(e[0],!0)}`):new _H.UsageError(`${r}: -${e.map(t=>` -- ${Kv(t)}`).join("")}`)}function pCe(r,e,t){if(typeof t>"u")return e;let i=[],n=[],s=a=>{let l=e;return e=a,s.bind(null,l)};if(!t(e,{errors:i,coercions:n,coercion:s}))throw $H(`Invalid value for ${r}`,i);for(let[,a]of n)a();return e}TA.applyValidator=pCe;TA.cleanValidationError=Kv;TA.formatError=$H;TA.isOptionSymbol=ZH;TA.makeCommandOption=fCe;TA.rerouteArguments=hCe});var ns=y(st=>{"use strict";Object.defineProperty(st,"__esModule",{value:!0});var eG=/^[a-zA-Z_][a-zA-Z0-9_]*$/,tG=/^#[0-9a-f]{6}$/i,rG=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,iG=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,nG=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,Hv=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,sG=r=>()=>r;function Qt({test:r}){return sG(r)()}function Zr(r){return r===null?"null":r===void 0?"undefined":r===""?"an empty string":JSON.stringify(r)}function LA(r,e){var t,i,n;return typeof e=="number"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:"."}[${e}]`:eG.test(e)?`${(i=r==null?void 0:r.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=r==null?void 0:r.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function Bc(r,e){return t=>{let i=r[e];return r[e]=t,Bc(r,e).bind(null,i)}}function oG(r,e){return t=>{r[e]=t}}function ny(r,e,t){return r===1?e:t}function pt({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:"."}: ${t}`),!1}var aG=()=>Qt({test:(r,e)=>!0});function dCe(r){return Qt({test:(e,t)=>e!==r?pt(t,`Expected a literal (got ${Zr(r)})`):!0})}var CCe=()=>Qt({test:(r,e)=>typeof r!="string"?pt(e,`Expected a string (got ${Zr(r)})`):!0});function mCe(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);return Qt({test:(i,n)=>t.has(i)?!0:pt(n,`Expected a valid enumeration value (got ${Zr(i)})`)})}var ECe=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),ICe=()=>Qt({test:(r,e)=>{var t;if(typeof r!="boolean"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i=ECe.get(r);if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a boolean (got ${Zr(r)})`)}return!0}}),yCe=()=>Qt({test:(r,e)=>{var t;if(typeof r!="number"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i;if(typeof r=="string"){let n;try{n=JSON.parse(r)}catch{}if(typeof n=="number")if(JSON.stringify(n)===r)i=n;else return pt(e,`Received a number that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a number (got ${Zr(r)})`)}return!0}}),wCe=()=>Qt({test:(r,e)=>{var t;if(!(r instanceof Date)){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i;if(typeof r=="string"&&Hv.test(r))i=new Date(r);else{let n;if(typeof r=="string"){let s;try{s=JSON.parse(r)}catch{}typeof s=="number"&&(n=s)}else typeof r=="number"&&(n=r);if(typeof n<"u")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return pt(e,`Received a timestamp that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a date (got ${Zr(r)})`)}return!0}}),BCe=(r,{delimiter:e}={})=>Qt({test:(t,i)=>{var n;if(typeof t=="string"&&typeof e<"u"&&typeof(i==null?void 0:i.coercions)<"u"){if(typeof(i==null?void 0:i.coercion)>"u")return pt(i,"Unbound coercion result");t=t.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,t)])}if(!Array.isArray(t))return pt(i,`Expected an array (got ${Zr(t)})`);let s=!0;for(let o=0,a=t.length;o{let t=AG(r.length);return Qt({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e<"u"&&typeof(n==null?void 0:n.coercions)<"u"){if(typeof(n==null?void 0:n.coercion)>"u")return pt(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return pt(n,`Expected a tuple (got ${Zr(i)})`);let o=t(i,Object.assign({},n));for(let a=0,l=i.length;aQt({test:(t,i)=>{if(typeof t!="object"||t===null)return pt(i,`Expected an object (got ${Zr(t)})`);let n=Object.keys(t),s=!0;for(let o=0,a=n.length;o{let t=Object.keys(r);return Qt({test:(i,n)=>{if(typeof i!="object"||i===null)return pt(n,`Expected an object (got ${Zr(i)})`);let s=new Set([...t,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=pt(Object.assign(Object.assign({},n),{p:LA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(r,l)?r[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c<"u"?a=c(u,Object.assign(Object.assign({},n),{p:LA(n,l),coercion:Bc(i,l)}))&&a:e===null?a=pt(Object.assign(Object.assign({},n),{p:LA(n,l)}),`Extraneous property (got ${Zr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:oG(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},vCe=r=>Qt({test:(e,t)=>e instanceof r?!0:pt(t,`Expected an instance of ${r.name} (got ${Zr(e)})`)}),xCe=(r,{exclusive:e=!1}={})=>Qt({test:(t,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)<"u"?[]:void 0;for(let c=0,u=r.length;c1?pt(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),PCe=(r,e)=>Qt({test:(t,i)=>{var n,s;let o={value:t},a=typeof(i==null?void 0:i.coercions)<"u"?Bc(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)<"u"?[]:void 0;if(!r(t,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l<"u")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)<"u"){if(o.value!==t){if(typeof(i==null?void 0:i.coercion)>"u")return pt(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),DCe=r=>Qt({test:(e,t)=>typeof e>"u"?!0:r(e,t)}),kCe=r=>Qt({test:(e,t)=>e===null?!0:r(e,t)}),RCe=r=>Qt({test:(e,t)=>e.length>=r?!0:pt(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),FCe=r=>Qt({test:(e,t)=>e.length<=r?!0:pt(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),AG=r=>Qt({test:(e,t)=>e.length!==r?pt(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),NCe=({map:r}={})=>Qt({test:(e,t)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;sQt({test:(r,e)=>r<=0?!0:pt(e,`Expected to be negative (got ${r})`)}),LCe=()=>Qt({test:(r,e)=>r>=0?!0:pt(e,`Expected to be positive (got ${r})`)}),OCe=r=>Qt({test:(e,t)=>e>=r?!0:pt(t,`Expected to be at least ${r} (got ${e})`)}),MCe=r=>Qt({test:(e,t)=>e<=r?!0:pt(t,`Expected to be at most ${r} (got ${e})`)}),UCe=(r,e)=>Qt({test:(t,i)=>t>=r&&t<=e?!0:pt(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),KCe=(r,e)=>Qt({test:(t,i)=>t>=r&&tQt({test:(e,t)=>e!==Math.round(e)?pt(t,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:pt(t,`Expected to be a safe integer (got ${e})`)}),GCe=r=>Qt({test:(e,t)=>r.test(e)?!0:pt(t,`Expected to match the pattern ${r.toString()} (got ${Zr(e)})`)}),YCe=()=>Qt({test:(r,e)=>r!==r.toLowerCase()?pt(e,`Expected to be all-lowercase (got ${r})`):!0}),jCe=()=>Qt({test:(r,e)=>r!==r.toUpperCase()?pt(e,`Expected to be all-uppercase (got ${r})`):!0}),qCe=()=>Qt({test:(r,e)=>nG.test(r)?!0:pt(e,`Expected to be a valid UUID v4 (got ${Zr(r)})`)}),JCe=()=>Qt({test:(r,e)=>Hv.test(r)?!1:pt(e,`Expected to be a valid ISO 8601 date string (got ${Zr(r)})`)}),WCe=({alpha:r=!1})=>Qt({test:(e,t)=>(r?tG.test(e):rG.test(e))?!0:pt(t,`Expected to be a valid hexadecimal color string (got ${Zr(e)})`)}),zCe=()=>Qt({test:(r,e)=>iG.test(r)?!0:pt(e,`Expected to be a valid base 64 string (got ${Zr(r)})`)}),VCe=(r=aG())=>Qt({test:(e,t)=>{let i;try{i=JSON.parse(e)}catch{return pt(t,`Expected to be a valid JSON string (got ${Zr(e)})`)}return r(i,t)}}),XCe=r=>{let e=new Set(r);return Qt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?pt(i,`Missing required ${ny(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},_Ce=r=>{let e=new Set(r);return Qt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?pt(i,`Forbidden ${ny(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},ZCe=r=>{let e=new Set(r);return Qt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?pt(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(r){r.Forbids="Forbids",r.Requires="Requires"})(st.KeyRelationship||(st.KeyRelationship={}));var $Ce={[st.KeyRelationship.Forbids]:{expect:!1,message:"forbids using"},[st.KeyRelationship.Requires]:{expect:!0,message:"requires using"}},eme=(r,e,t,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(t),o=$Ce[e];return Qt({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(r)||n.has(a[r]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?pt(l,`Property "${r}" ${o.message} ${ny(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})};st.applyCascade=PCe;st.base64RegExp=iG;st.colorStringAlphaRegExp=rG;st.colorStringRegExp=tG;st.computeKey=LA;st.getPrintable=Zr;st.hasExactLength=AG;st.hasForbiddenKeys=_Ce;st.hasKeyRelationship=eme;st.hasMaxLength=FCe;st.hasMinLength=RCe;st.hasMutuallyExclusiveKeys=ZCe;st.hasRequiredKeys=XCe;st.hasUniqueItems=NCe;st.isArray=BCe;st.isAtLeast=OCe;st.isAtMost=MCe;st.isBase64=zCe;st.isBoolean=ICe;st.isDate=wCe;st.isDict=QCe;st.isEnum=mCe;st.isHexColor=WCe;st.isISO8601=JCe;st.isInExclusiveRange=KCe;st.isInInclusiveRange=UCe;st.isInstanceOf=vCe;st.isInteger=HCe;st.isJSON=VCe;st.isLiteral=dCe;st.isLowerCase=YCe;st.isNegative=TCe;st.isNullable=kCe;st.isNumber=yCe;st.isObject=SCe;st.isOneOf=xCe;st.isOptional=DCe;st.isPositive=LCe;st.isString=CCe;st.isTuple=bCe;st.isUUID4=qCe;st.isUnknown=aG;st.isUpperCase=jCe;st.iso8601RegExp=Hv;st.makeCoercionFn=Bc;st.makeSetter=oG;st.makeTrait=sG;st.makeValidator=Qt;st.matchesRegExp=GCe;st.plural=ny;st.pushError=pt;st.simpleKeyRegExp=eG;st.uuid4RegExp=nG});var bc=y(Gv=>{"use strict";Object.defineProperty(Gv,"__esModule",{value:!0});var lG=va();function tme(r){if(r&&r.__esModule)return r;var e=Object.create(null);return r&&Object.keys(r).forEach(function(t){if(t!=="default"){var i=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,i.get?i:{enumerable:!0,get:function(){return r[t]}})}}),e.default=r,Object.freeze(e)}var Sd=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let t=this.constructor.schema;if(Array.isArray(t)){let{isDict:n,isUnknown:s,applyCascade:o}=await Promise.resolve().then(function(){return tme(ns())}),a=o(n(s()),t),l=[],c=[];if(!a(this,{errors:l,coercions:c}))throw lG.formatError("Invalid option schema",l);for(let[,g]of c)g()}else if(t!=null)throw new Error("Invalid command schema");let i=await this.execute();return typeof i<"u"?i:0}};Sd.isOption=lG.isOptionSymbol;Sd.Default=[];Gv.Command=Sd});var jv=y(vd=>{"use strict";Object.defineProperty(vd,"__esModule",{value:!0});var cG=80,Yv=Array(cG).fill("\u2501");for(let r=0;r<=24;++r)Yv[Yv.length-r]=`\x1B[38;5;${232+r}m\u2501`;var rme={header:r=>`\x1B[1m\u2501\u2501\u2501 ${r}${r.length`\x1B[1m${r}\x1B[22m`,error:r=>`\x1B[31m\x1B[1m${r}\x1B[22m\x1B[39m`,code:r=>`\x1B[36m${r}\x1B[39m`},ime={header:r=>r,bold:r=>r,error:r=>r,code:r=>r};function nme(r){let e=r.split(` -`),t=e.filter(n=>n.match(/\S/)),i=t.length>0?t.reduce((n,s)=>Math.min(n,s.length-s.trimStart().length),Number.MAX_VALUE):0;return e.map(n=>n.slice(i).trimRight()).join(` -`)}function sme(r,{format:e,paragraphs:t}){return r=r.replace(/\r\n?/g,` -`),r=nme(r),r=r.replace(/^\n+|\n+$/g,""),r=r.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 - -`),r=r.replace(/\n(\n)?\n*/g,"$1"),t&&(r=r.split(/\n/).map(i=>{let n=i.match(/^\s*[*-][\t ]+(.*)/);if(!n)return i.match(/(.{1,80})(?: |$)/g).join(` -`);let s=i.length-i.trimStart().length;return n[1].match(new RegExp(`(.{1,${78-s}})(?: |$)`,"g")).map((o,a)=>" ".repeat(s)+(a===0?"- ":" ")+o).join(` -`)}).join(` - -`)),r=r.replace(/(`+)((?:.|[\n])*?)\1/g,(i,n,s)=>e.code(n+s+n)),r=r.replace(/(\*\*)((?:.|[\n])*?)\1/g,(i,n,s)=>e.bold(n+s+n)),r?`${r} -`:""}vd.formatMarkdownish=sme;vd.richFormat=rme;vd.textFormat=ime});var ly=y(Ar=>{"use strict";Object.defineProperty(Ar,"__esModule",{value:!0});var lt=ry(),ay=iy();function Vi(r){lt.DEBUG&&console.log(r)}var uG={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:lt.HELP_COMMAND_INDEX};function qv(){return{nodes:[Li(),Li(),Li()]}}function gG(r){let e=qv(),t=[],i=e.nodes.length;for(let n of r){t.push(i);for(let s=0;s{if(e.has(i))return;e.add(i);let n=r.nodes[i];for(let o of Object.values(n.statics))for(let{to:a}of o)t(a);for(let[,{to:o}]of n.dynamics)t(o);for(let{to:o}of n.shortcuts)t(o);let s=new Set(n.shortcuts.map(({to:o})=>o));for(;n.shortcuts.length>0;){let{to:o}=n.shortcuts.shift(),a=r.nodes[o];for(let[l,c]of Object.entries(a.statics)){let u=Object.prototype.hasOwnProperty.call(n.statics,l)?n.statics[l]:n.statics[l]=[];for(let g of c)u.some(({to:f})=>g.to===f)||u.push(g)}for(let[l,c]of a.dynamics)n.dynamics.some(([u,{to:g}])=>l===u&&c.to===g)||n.dynamics.push([l,c]);for(let l of a.shortcuts)s.has(l.to)||(n.shortcuts.push(l),s.add(l.to))}};t(lt.NODE_INITIAL)}function hG(r,{prefix:e=""}={}){if(lt.DEBUG){Vi(`${e}Nodes are:`);for(let t=0;tl!==lt.NODE_ERRORED).map(({state:l})=>({usage:l.candidateUsage,reason:null})));if(a.every(({node:l})=>l===lt.NODE_ERRORED))throw new ay.UnknownSyntaxError(e,a.map(({state:l})=>({usage:l.candidateUsage,reason:l.errorMessage})));i=pG(a)}if(i.length>0){Vi(" Results:");for(let s of i)Vi(` - ${s.node} -> ${JSON.stringify(s.state)}`)}else Vi(" No results");return i}function ome(r,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(r.statics,lt.END_OF_INPUT)){for(let{to:t}of r.statics[lt.END_OF_INPUT])if(t===lt.NODE_SUCCESS)return!0}return!1}function ame(r,e,t){let i=t&&e.length>0?[""]:[],n=Jv(r,e,t),s=[],o=new Set,a=(l,c,u=!0)=>{let g=[c];for(;g.length>0;){let h=g;g=[];for(let p of h){let C=r.nodes[p],w=Object.keys(C.statics);for(let B of Object.keys(C.statics)){let v=w[0];for(let{to:D,reducer:T}of C.statics[v])T==="pushPath"&&(u||l.push(v),g.push(D))}}u=!1}let f=JSON.stringify(l);o.has(f)||(s.push(l),o.add(f))};for(let{node:l,state:c}of n){if(c.remainder!==null){a([c.remainder],l);continue}let u=r.nodes[l],g=ome(u,c);for(let[f,h]of Object.entries(u.statics))(g&&f!==lt.END_OF_INPUT||!f.startsWith("-")&&h.some(({reducer:p})=>p==="pushPath"))&&a([...i,f],l);if(!!g)for(let[f,{to:h}]of u.dynamics){if(h===lt.NODE_ERRORED)continue;let p=IG(f,c);if(p!==null)for(let C of p)a([...i,C],l)}}return[...s].sort()}function Ame(r,e){let t=Jv(r,[...e,lt.END_OF_INPUT]);return dG(e,t.map(({state:i})=>i))}function pG(r){let e=0;for(let{state:t}of r)t.path.length>e&&(e=t.path.length);return r.filter(({state:t})=>t.path.length===e)}function dG(r,e){let t=e.filter(g=>g.selectedIndex!==null);if(t.length===0)throw new Error;let i=t.filter(g=>g.requiredOptions.every(f=>f.some(h=>g.options.find(p=>p.name===h))));if(i.length===0)throw new ay.UnknownSyntaxError(r,t.map(g=>({usage:g.candidateUsage,reason:null})));let n=0;for(let g of i)g.path.length>n&&(n=g.path.length);let s=i.filter(g=>g.path.length===n),o=g=>g.positionals.filter(({extra:f})=>!f).length+g.options.length,a=s.map(g=>({state:g,positionalCount:o(g)})),l=0;for(let{positionalCount:g}of a)g>l&&(l=g);let c=a.filter(({positionalCount:g})=>g===l).map(({state:g})=>g),u=CG(c);if(u.length>1)throw new ay.AmbiguousSyntaxError(r,u.map(g=>g.candidateUsage));return u[0]}function CG(r){let e=[],t=[];for(let i of r)i.selectedIndex===lt.HELP_COMMAND_INDEX?t.push(i):e.push(i);return t.length>0&&e.push({...uG,path:mG(...t.map(i=>i.path)),options:t.reduce((i,n)=>i.concat(n.options),[])}),e}function mG(r,e,...t){return e===void 0?Array.from(r):mG(r.filter((i,n)=>i===e[n]),...t)}function Li(){return{dynamics:[],shortcuts:[],statics:{}}}function Wv(r){return r===lt.NODE_SUCCESS||r===lt.NODE_ERRORED}function sy(r,e=0){return{to:Wv(r.to)?r.to:r.to>2?r.to+e-2:r.to+e,reducer:r.reducer}}function EG(r,e=0){let t=Li();for(let[i,n]of r.dynamics)t.dynamics.push([i,sy(n,e)]);for(let i of r.shortcuts)t.shortcuts.push(sy(i,e));for(let[i,n]of Object.entries(r.statics))t.statics[i]=n.map(s=>sy(s,e));return t}function Ei(r,e,t,i,n){r.nodes[e].dynamics.push([t,{to:i,reducer:n}])}function Qc(r,e,t,i){r.nodes[e].shortcuts.push({to:t,reducer:i})}function xo(r,e,t,i,n){(Object.prototype.hasOwnProperty.call(r.nodes[e].statics,t)?r.nodes[e].statics[t]:r.nodes[e].statics[t]=[]).push({to:i,reducer:n})}function xd(r,e,t,i){if(Array.isArray(e)){let[n,...s]=e;return r[n](t,i,...s)}else return r[e](t,i)}function IG(r,e){let t=Array.isArray(r)?Pd[r[0]]:Pd[r];if(typeof t.suggest>"u")return null;let i=Array.isArray(r)?r.slice(1):[];return t.suggest(e,...i)}var Pd={always:()=>!0,isOptionLike:(r,e)=>!r.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(r,e)=>r.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(r,e,t,i)=>!r.ignoreOptions&&e===t,isBatchOption:(r,e,t)=>!r.ignoreOptions&<.BATCH_REGEX.test(e)&&[...e.slice(1)].every(i=>t.includes(`-${i}`)),isBoundOption:(r,e,t,i)=>{let n=e.match(lt.BINDING_REGEX);return!r.ignoreOptions&&!!n&<.OPTION_REGEX.test(n[1])&&t.includes(n[1])&&i.filter(s=>s.names.includes(n[1])).every(s=>s.allowBinding)},isNegatedOption:(r,e,t)=>!r.ignoreOptions&&e===`--no-${t.slice(2)}`,isHelp:(r,e)=>!r.ignoreOptions&<.HELP_REGEX.test(e),isUnsupportedOption:(r,e,t)=>!r.ignoreOptions&&e.startsWith("-")&<.OPTION_REGEX.test(e)&&!t.includes(e),isInvalidOption:(r,e)=>!r.ignoreOptions&&e.startsWith("-")&&!lt.OPTION_REGEX.test(e)};Pd.isOption.suggest=(r,e,t=!0)=>t?null:[e];var oy={setCandidateState:(r,e,t)=>({...r,...t}),setSelectedIndex:(r,e,t)=>({...r,selectedIndex:t}),pushBatch:(r,e)=>({...r,options:r.options.concat([...e.slice(1)].map(t=>({name:`-${t}`,value:!0})))}),pushBound:(r,e)=>{let[,t,i]=e.match(lt.BINDING_REGEX);return{...r,options:r.options.concat({name:t,value:i})}},pushPath:(r,e)=>({...r,path:r.path.concat(e)}),pushPositional:(r,e)=>({...r,positionals:r.positionals.concat({value:e,extra:!1})}),pushExtra:(r,e)=>({...r,positionals:r.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(r,e)=>({...r,positionals:r.positionals.concat({value:e,extra:Po})}),pushTrue:(r,e,t=e)=>({...r,options:r.options.concat({name:e,value:!0})}),pushFalse:(r,e,t=e)=>({...r,options:r.options.concat({name:t,value:!1})}),pushUndefined:(r,e)=>({...r,options:r.options.concat({name:e,value:void 0})}),pushStringValue:(r,e)=>{var t;let i={...r,options:[...r.options]},n=r.options[r.options.length-1];return n.value=((t=n.value)!==null&&t!==void 0?t:[]).concat([e]),i},setStringValue:(r,e)=>{let t={...r,options:[...r.options]},i=r.options[r.options.length-1];return i.value=e,t},inhibateOptions:r=>({...r,ignoreOptions:!0}),useHelp:(r,e,t)=>{let[,,i]=e.match(lt.HELP_REGEX);return typeof i<"u"?{...r,options:[{name:"-c",value:String(t)},{name:"-i",value:i}]}:{...r,options:[{name:"-c",value:String(t)}]}},setError:(r,e,t)=>e===lt.END_OF_INPUT?{...r,errorMessage:`${t}.`}:{...r,errorMessage:`${t} ("${e}").`},setOptionArityError:(r,e)=>{let t=r.options[r.options.length-1];return{...r,errorMessage:`Not enough arguments to option ${t.name}.`}}},Po=Symbol(),Ay=class{constructor(e,t){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=t}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:t=this.arity.trailing,extra:i=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:t,extra:i,proxy:n})}addPositional({name:e="arg",required:t=!0}={}){if(!t&&this.arity.extra===Po)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!t&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!t&&this.arity.extra!==Po?this.arity.extra.push(e):this.arity.extra!==Po&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:t=0}={}){if(this.arity.extra===Po)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let i=0;i1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(i))throw new Error(`The arity must be an integer, got ${i}`);if(i<0)throw new Error(`The arity must be positive, got ${i}`);this.allOptionNames.push(...e),this.options.push({names:e,description:t,arity:i,hidden:n,required:s,allowBinding:o})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:t=!0}={}){let i=[this.cliOpts.binaryName],n=[];if(this.paths.length>0&&i.push(...this.paths[0]),e){for(let{names:o,arity:a,hidden:l,description:c,required:u}of this.options){if(l)continue;let g=[];for(let h=0;h`:`[${f}]`)}i.push(...this.arity.leading.map(o=>`<${o}>`)),this.arity.extra===Po?i.push("..."):i.push(...this.arity.extra.map(o=>`[${o}]`)),i.push(...this.arity.trailing.map(o=>`<${o}>`))}return{usage:i.join(" "),options:n}}compile(){if(typeof this.context>"u")throw new Error("Assertion failed: No context attached");let e=qv(),t=lt.NODE_INITIAL,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);t=ss(e,Li()),xo(e,lt.NODE_INITIAL,lt.START_OF_INPUT,t,["setCandidateState",{candidateUsage:i,requiredOptions:n}]);let s=this.arity.proxy?"always":"isNotOptionLike",o=this.paths.length>0?this.paths:[[]];for(let a of o){let l=t;if(a.length>0){let f=ss(e,Li());Qc(e,l,f),this.registerOptions(e,f),l=f}for(let f=0;f0||!this.arity.proxy){let f=ss(e,Li());Ei(e,l,"isHelp",f,["useHelp",this.cliIndex]),xo(e,f,lt.END_OF_INPUT,lt.NODE_SUCCESS,["setSelectedIndex",lt.HELP_COMMAND_INDEX]),this.registerOptions(e,l)}this.arity.leading.length>0&&xo(e,l,lt.END_OF_INPUT,lt.NODE_ERRORED,["setError","Not enough positional arguments"]);let c=l;for(let f=0;f0||f+1!==this.arity.leading.length)&&xo(e,h,lt.END_OF_INPUT,lt.NODE_ERRORED,["setError","Not enough positional arguments"]),Ei(e,c,"isNotOptionLike",h,"pushPositional"),c=h}let u=c;if(this.arity.extra===Po||this.arity.extra.length>0){let f=ss(e,Li());if(Qc(e,c,f),this.arity.extra===Po){let h=ss(e,Li());this.arity.proxy||this.registerOptions(e,h),Ei(e,c,s,h,"pushExtraNoLimits"),Ei(e,h,s,h,"pushExtraNoLimits"),Qc(e,h,f)}else for(let h=0;h0&&xo(e,u,lt.END_OF_INPUT,lt.NODE_ERRORED,["setError","Not enough positional arguments"]);let g=u;for(let f=0;fo.length>s.length?o:s,"");if(i.arity===0)for(let s of i.names)Ei(e,t,["isOption",s,i.hidden||s!==n],t,"pushTrue"),s.startsWith("--")&&!s.startsWith("--no-")&&Ei(e,t,["isNegatedOption",s],t,["pushFalse",s]);else{let s=ss(e,Li());for(let o of i.names)Ei(e,t,["isOption",o,i.hidden||o!==n],s,"pushUndefined");for(let o=0;o=0&&eAme(i,n),suggest:(n,s)=>ame(i,n,s)}}};Ar.CliBuilder=Dd;Ar.CommandBuilder=Ay;Ar.NoLimits=Po;Ar.aggregateHelpStates=CG;Ar.cloneNode=EG;Ar.cloneTransition=sy;Ar.debug=Vi;Ar.debugMachine=hG;Ar.execute=xd;Ar.injectNode=ss;Ar.isTerminalNode=Wv;Ar.makeAnyOfMachine=gG;Ar.makeNode=Li;Ar.makeStateMachine=qv;Ar.reducers=oy;Ar.registerDynamic=Ei;Ar.registerShortcut=Qc;Ar.registerStatic=xo;Ar.runMachineInternal=Jv;Ar.selectBestState=dG;Ar.simplifyMachine=fG;Ar.suggest=IG;Ar.tests=Pd;Ar.trimSmallerBranches=pG});var yG=y(zv=>{"use strict";Object.defineProperty(zv,"__esModule",{value:!0});var lme=bc(),kd=class extends lme.Command{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,t){let i=new kd(t);i.path=e.path;for(let n of e.options)switch(n.name){case"-c":i.commands.push(Number(n.value));break;case"-i":i.index=Number(n.value);break}return i}async execute(){let e=this.commands;if(typeof this.index<"u"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: -`),this.context.stdout.write(` -`);let t=0;for(let i of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[i].commandClass,{prefix:`${t++}. `.padStart(5)}));this.context.stdout.write(` -`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. -`)}}};zv.HelpCommand=kd});var vG=y(Vv=>{"use strict";Object.defineProperty(Vv,"__esModule",{value:!0});var cme=ry(),wG=bc(),ume=J("tty"),gme=ly(),hn=jv(),fme=yG();function hme(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var BG=hme(ume),bG=Symbol("clipanion/errorCommand");function pme(){return process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout<"u"&&process.stdout.isTTY?8:1}var OA=class{constructor({binaryLabel:e,binaryName:t="...",binaryVersion:i,enableCapture:n=!1,enableColors:s}={}){this.registrations=new Map,this.builder=new gme.CliBuilder({binaryName:t}),this.binaryLabel=e,this.binaryName=t,this.binaryVersion=i,this.enableCapture=n,this.enableColors=s}static from(e,t={}){let i=new OA(t);for(let n of e)i.register(n);return i}register(e){var t;let i=new Map,n=new e;for(let l in n){let c=n[l];typeof c=="object"&&c!==null&&c[wG.Command.isOption]&&i.set(l,c)}let s=this.builder.command(),o=s.cliIndex,a=(t=e.paths)!==null&&t!==void 0?t:n.paths;if(typeof a<"u")for(let l of a)s.addPath(l);this.registrations.set(e,{specs:i,builder:s,index:o});for(let[l,{definition:c}]of i.entries())c(s,l);s.setContext({commandClass:e})}process(e){let{contexts:t,process:i}=this.builder.compile(),n=i(e);switch(n.selectedIndex){case cme.HELP_COMMAND_INDEX:return fme.HelpCommand.from(n,t);default:{let{commandClass:s}=t[n.selectedIndex],o=this.registrations.get(s);if(typeof o>"u")throw new Error("Assertion failed: Expected the command class to have been registered.");let a=new s;a.path=n.path;try{for(let[l,{transformer:c}]of o.specs.entries())a[l]=c(o.builder,l,n);return a}catch(l){throw l[bG]=a,l}}break}}async run(e,t){var i;let n,s={...OA.defaultContext,...t},o=(i=this.enableColors)!==null&&i!==void 0?i:s.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e)}catch(c){return s.stdout.write(this.error(c,{colored:o})),1}if(n.help)return s.stdout.write(this.usage(n,{colored:o,detailed:!0})),0;n.context=s,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(c,u)=>this.error(c,u),format:c=>this.format(c),process:c=>this.process(c),run:(c,u)=>this.run(c,{...s,...u}),usage:(c,u)=>this.usage(c,u)};let a=this.enableCapture?dme(s):SG,l;try{l=await a(()=>n.validateAndExecute().catch(c=>n.catch(c).then(()=>0)))}catch(c){return s.stdout.write(this.error(c,{colored:o,command:n})),1}return l}async runExit(e,t){process.exitCode=await this.run(e,t)}suggest(e,t){let{suggest:i}=this.builder.compile();return i(e,t)}definitions({colored:e=!1}={}){let t=[];for(let[i,{index:n}]of this.registrations){if(typeof i.usage>"u")continue;let{usage:s}=this.getUsageByIndex(n,{detailed:!1}),{usage:o,options:a}=this.getUsageByIndex(n,{detailed:!0,inlineOptions:!1}),l=typeof i.usage.category<"u"?hn.formatMarkdownish(i.usage.category,{format:this.format(e),paragraphs:!1}):void 0,c=typeof i.usage.description<"u"?hn.formatMarkdownish(i.usage.description,{format:this.format(e),paragraphs:!1}):void 0,u=typeof i.usage.details<"u"?hn.formatMarkdownish(i.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=typeof i.usage.examples<"u"?i.usage.examples.map(([f,h])=>[hn.formatMarkdownish(f,{format:this.format(e),paragraphs:!1}),h.replace(/\$0/g,this.binaryName)]):void 0;t.push({path:s,usage:o,category:l,description:c,details:u,examples:g,options:a})}return t}usage(e=null,{colored:t,detailed:i=!1,prefix:n="$ "}={}){var s;if(e===null){for(let l of this.registrations.keys()){let c=l.paths,u=typeof l.usage<"u";if(!c||c.length===0||c.length===1&&c[0].length===0||((s=c==null?void 0:c.some(h=>h.length===0))!==null&&s!==void 0?s:!1))if(e){e=null;break}else e=l;else if(u){e=null;continue}}e&&(i=!0)}let o=e!==null&&e instanceof wG.Command?e.constructor:e,a="";if(o)if(i){let{description:l="",details:c="",examples:u=[]}=o.usage||{};l!==""&&(a+=hn.formatMarkdownish(l,{format:this.format(t),paragraphs:!1}).replace(/^./,h=>h.toUpperCase()),a+=` -`),(c!==""||u.length>0)&&(a+=`${this.format(t).header("Usage")} -`,a+=` -`);let{usage:g,options:f}=this.getUsageByRegistration(o,{inlineOptions:!1});if(a+=`${this.format(t).bold(n)}${g} -`,f.length>0){a+=` -`,a+=`${hn.richFormat.header("Options")} -`;let h=f.reduce((p,C)=>Math.max(p,C.definition.length),0);a+=` -`;for(let{definition:p,description:C}of f)a+=` ${this.format(t).bold(p.padEnd(h))} ${hn.formatMarkdownish(C,{format:this.format(t),paragraphs:!1})}`}if(c!==""&&(a+=` -`,a+=`${this.format(t).header("Details")} -`,a+=` -`,a+=hn.formatMarkdownish(c,{format:this.format(t),paragraphs:!0})),u.length>0){a+=` -`,a+=`${this.format(t).header("Examples")} -`;for(let[h,p]of u)a+=` -`,a+=hn.formatMarkdownish(h,{format:this.format(t),paragraphs:!1}),a+=`${p.replace(/^/m,` ${this.format(t).bold(n)}`).replace(/\$0/g,this.binaryName)} -`}}else{let{usage:l}=this.getUsageByRegistration(o);a+=`${this.format(t).bold(n)}${l} -`}else{let l=new Map;for(let[f,{index:h}]of this.registrations.entries()){if(typeof f.usage>"u")continue;let p=typeof f.usage.category<"u"?hn.formatMarkdownish(f.usage.category,{format:this.format(t),paragraphs:!1}):null,C=l.get(p);typeof C>"u"&&l.set(p,C=[]);let{usage:w}=this.getUsageByIndex(h);C.push({commandClass:f,usage:w})}let c=Array.from(l.keys()).sort((f,h)=>f===null?-1:h===null?1:f.localeCompare(h,"en",{usage:"sort",caseFirst:"upper"})),u=typeof this.binaryLabel<"u",g=typeof this.binaryVersion<"u";u||g?(u&&g?a+=`${this.format(t).header(`${this.binaryLabel} - ${this.binaryVersion}`)} - -`:u?a+=`${this.format(t).header(`${this.binaryLabel}`)} -`:a+=`${this.format(t).header(`${this.binaryVersion}`)} -`,a+=` ${this.format(t).bold(n)}${this.binaryName} -`):a+=`${this.format(t).bold(n)}${this.binaryName} -`;for(let f of c){let h=l.get(f).slice().sort((C,w)=>C.usage.localeCompare(w.usage,"en",{usage:"sort",caseFirst:"upper"})),p=f!==null?f.trim():"General commands";a+=` -`,a+=`${this.format(t).header(`${p}`)} -`;for(let{commandClass:C,usage:w}of h){let B=C.usage.description||"undocumented";a+=` -`,a+=` ${this.format(t).bold(w)} -`,a+=` ${hn.formatMarkdownish(B,{format:this.format(t),paragraphs:!1})}`}}a+=` -`,a+=hn.formatMarkdownish("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(t),paragraphs:!0})}return a}error(e,t){var i,{colored:n,command:s=(i=e[bG])!==null&&i!==void 0?i:null}=t===void 0?{}:t;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let o="",a=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");a==="Error"&&(a="Internal Error"),o+=`${this.format(n).error(a)}: ${e.message} -`;let l=e.clipanion;return typeof l<"u"?l.type==="usage"&&(o+=` -`,o+=this.usage(s)):e.stack&&(o+=`${e.stack.replace(/^.*\n/,"")} -`),o}format(e){var t;return((t=e!=null?e:this.enableColors)!==null&&t!==void 0?t:OA.defaultContext.colorDepth>1)?hn.richFormat:hn.textFormat}getUsageByRegistration(e,t){let i=this.registrations.get(e);if(typeof i>"u")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(i.index,t)}getUsageByIndex(e,t){return this.builder.getBuilderByIndex(e).usage(t)}};OA.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:"getColorDepth"in BG.default.WriteStream.prototype?BG.default.WriteStream.prototype.getColorDepth():pme()};var QG;function dme(r){let e=QG;if(typeof e>"u"){if(r.stdout===process.stdout&&r.stderr===process.stderr)return SG;let{AsyncLocalStorage:t}=J("async_hooks");e=QG=new t;let i=process.stdout._write;process.stdout._write=function(s,o,a){let l=e.getStore();return typeof l>"u"?i.call(this,s,o,a):l.stdout.write(s,o,a)};let n=process.stderr._write;process.stderr._write=function(s,o,a){let l=e.getStore();return typeof l>"u"?n.call(this,s,o,a):l.stderr.write(s,o,a)}}return t=>e.run(r,t)}function SG(r){return r()}Vv.Cli=OA});var xG=y(Xv=>{"use strict";Object.defineProperty(Xv,"__esModule",{value:!0});var Cme=bc(),cy=class extends Cme.Command{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} -`)}};cy.paths=[["--clipanion=definitions"]];Xv.DefinitionsCommand=cy});var PG=y(_v=>{"use strict";Object.defineProperty(_v,"__esModule",{value:!0});var mme=bc(),uy=class extends mme.Command{async execute(){this.context.stdout.write(this.cli.usage())}};uy.paths=[["-h"],["--help"]];_v.HelpCommand=uy});var DG=y(Zv=>{"use strict";Object.defineProperty(Zv,"__esModule",{value:!0});var Eme=bc(),gy=class extends Eme.Command{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} -`)}};gy.paths=[["-v"],["--version"]];Zv.VersionCommand=gy});var kG=y(Rd=>{"use strict";Object.defineProperty(Rd,"__esModule",{value:!0});var Ime=xG(),yme=PG(),wme=DG();Rd.DefinitionsCommand=Ime.DefinitionsCommand;Rd.HelpCommand=yme.HelpCommand;Rd.VersionCommand=wme.VersionCommand});var FG=y($v=>{"use strict";Object.defineProperty($v,"__esModule",{value:!0});var RG=va();function Bme(r,e,t){let[i,n]=RG.rerouteArguments(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(","),a=new Set(o);return RG.makeCommandOption({definition(l){l.addOption({names:o,arity:s,hidden:n==null?void 0:n.hidden,description:n==null?void 0:n.description,required:n.required})},transformer(l,c,u){let g=typeof i<"u"?[...i]:void 0;for(let{name:f,value:h}of u.options)!a.has(f)||(g=g!=null?g:[],g.push(h));return g}})}$v.Array=Bme});var TG=y(ex=>{"use strict";Object.defineProperty(ex,"__esModule",{value:!0});var NG=va();function bme(r,e,t){let[i,n]=NG.rerouteArguments(e,t!=null?t:{}),s=r.split(","),o=new Set(s);return NG.makeCommandOption({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u=f);return u}})}ex.Boolean=bme});var OG=y(tx=>{"use strict";Object.defineProperty(tx,"__esModule",{value:!0});var LG=va();function Qme(r,e,t){let[i,n]=LG.rerouteArguments(e,t!=null?t:{}),s=r.split(","),o=new Set(s);return LG.makeCommandOption({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u!=null||(u=0),f?u+=1:u=0);return u}})}tx.Counter=Qme});var MG=y(rx=>{"use strict";Object.defineProperty(rx,"__esModule",{value:!0});var Sme=va();function vme(r={}){return Sme.makeCommandOption({definition(e,t){var i;e.addProxy({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){return i.positionals.map(({value:n})=>n)}})}rx.Proxy=vme});var UG=y(ix=>{"use strict";Object.defineProperty(ix,"__esModule",{value:!0});var xme=va(),Pme=ly();function Dme(r={}){return xme.makeCommandOption({definition(e,t){var i;e.addRest({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){let n=o=>{let a=i.positionals[o];return a.extra===Pme.NoLimits||a.extra===!1&&oo)}})}ix.Rest=Dme});var KG=y(nx=>{"use strict";Object.defineProperty(nx,"__esModule",{value:!0});var Fd=va(),kme=ly();function Rme(r,e,t){let[i,n]=Fd.rerouteArguments(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(","),a=new Set(o);return Fd.makeCommandOption({definition(l){l.addOption({names:o,arity:n.tolerateBoolean?0:s,hidden:n.hidden,description:n.description,required:n.required})},transformer(l,c,u){let g,f=i;for(let{name:h,value:p}of u.options)!a.has(h)||(g=h,f=p);return typeof f=="string"?Fd.applyValidator(g!=null?g:c,f,n.validator):f}})}function Fme(r={}){let{required:e=!0}=r;return Fd.makeCommandOption({definition(t,i){var n;t.addPositional({name:(n=r.name)!==null&&n!==void 0?n:i,required:r.required})},transformer(t,i,n){var s;for(let o=0;o{"use strict";Object.defineProperty(pn,"__esModule",{value:!0});var lf=va(),Tme=FG(),Lme=TG(),Ome=OG(),Mme=MG(),Ume=UG(),Kme=KG();pn.applyValidator=lf.applyValidator;pn.cleanValidationError=lf.cleanValidationError;pn.formatError=lf.formatError;pn.isOptionSymbol=lf.isOptionSymbol;pn.makeCommandOption=lf.makeCommandOption;pn.rerouteArguments=lf.rerouteArguments;pn.Array=Tme.Array;pn.Boolean=Lme.Boolean;pn.Counter=Ome.Counter;pn.Proxy=Mme.Proxy;pn.Rest=Ume.Rest;pn.String=Kme.String});var Xe=y(MA=>{"use strict";Object.defineProperty(MA,"__esModule",{value:!0});var Hme=iy(),Gme=bc(),Yme=jv(),jme=vG(),qme=kG(),Jme=HG();MA.UsageError=Hme.UsageError;MA.Command=Gme.Command;MA.formatMarkdownish=Yme.formatMarkdownish;MA.Cli=jme.Cli;MA.Builtins=qme;MA.Option=Jme});var YG=y((J$e,GG)=>{"use strict";GG.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var cf=y((W$e,sx)=>{"use strict";var Wme=YG(),jG=r=>{if(r<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],t=0,i=()=>{t--,e.length>0&&e.shift()()},n=(a,l,...c)=>{t++;let u=Wme(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{tnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>t},pendingCount:{get:()=>e.length}}),o};sx.exports=jG;sx.exports.default=jG});var Nd=y((V$e,qG)=>{var zme="2.0.0",Vme=Number.MAX_SAFE_INTEGER||9007199254740991,Xme=16;qG.exports={SEMVER_SPEC_VERSION:zme,MAX_LENGTH:256,MAX_SAFE_INTEGER:Vme,MAX_SAFE_COMPONENT_LENGTH:Xme}});var Td=y((X$e,JG)=>{var _me=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error("SEMVER",...r):()=>{};JG.exports=_me});var Sc=y((KA,WG)=>{var{MAX_SAFE_COMPONENT_LENGTH:ox}=Nd(),Zme=Td();KA=WG.exports={};var $me=KA.re=[],_e=KA.src=[],Ze=KA.t={},eEe=0,St=(r,e,t)=>{let i=eEe++;Zme(i,e),Ze[r]=i,_e[i]=e,$me[i]=new RegExp(e,t?"g":void 0)};St("NUMERICIDENTIFIER","0|[1-9]\\d*");St("NUMERICIDENTIFIERLOOSE","[0-9]+");St("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");St("MAINVERSION",`(${_e[Ze.NUMERICIDENTIFIER]})\\.(${_e[Ze.NUMERICIDENTIFIER]})\\.(${_e[Ze.NUMERICIDENTIFIER]})`);St("MAINVERSIONLOOSE",`(${_e[Ze.NUMERICIDENTIFIERLOOSE]})\\.(${_e[Ze.NUMERICIDENTIFIERLOOSE]})\\.(${_e[Ze.NUMERICIDENTIFIERLOOSE]})`);St("PRERELEASEIDENTIFIER",`(?:${_e[Ze.NUMERICIDENTIFIER]}|${_e[Ze.NONNUMERICIDENTIFIER]})`);St("PRERELEASEIDENTIFIERLOOSE",`(?:${_e[Ze.NUMERICIDENTIFIERLOOSE]}|${_e[Ze.NONNUMERICIDENTIFIER]})`);St("PRERELEASE",`(?:-(${_e[Ze.PRERELEASEIDENTIFIER]}(?:\\.${_e[Ze.PRERELEASEIDENTIFIER]})*))`);St("PRERELEASELOOSE",`(?:-?(${_e[Ze.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${_e[Ze.PRERELEASEIDENTIFIERLOOSE]})*))`);St("BUILDIDENTIFIER","[0-9A-Za-z-]+");St("BUILD",`(?:\\+(${_e[Ze.BUILDIDENTIFIER]}(?:\\.${_e[Ze.BUILDIDENTIFIER]})*))`);St("FULLPLAIN",`v?${_e[Ze.MAINVERSION]}${_e[Ze.PRERELEASE]}?${_e[Ze.BUILD]}?`);St("FULL",`^${_e[Ze.FULLPLAIN]}$`);St("LOOSEPLAIN",`[v=\\s]*${_e[Ze.MAINVERSIONLOOSE]}${_e[Ze.PRERELEASELOOSE]}?${_e[Ze.BUILD]}?`);St("LOOSE",`^${_e[Ze.LOOSEPLAIN]}$`);St("GTLT","((?:<|>)?=?)");St("XRANGEIDENTIFIERLOOSE",`${_e[Ze.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);St("XRANGEIDENTIFIER",`${_e[Ze.NUMERICIDENTIFIER]}|x|X|\\*`);St("XRANGEPLAIN",`[v=\\s]*(${_e[Ze.XRANGEIDENTIFIER]})(?:\\.(${_e[Ze.XRANGEIDENTIFIER]})(?:\\.(${_e[Ze.XRANGEIDENTIFIER]})(?:${_e[Ze.PRERELEASE]})?${_e[Ze.BUILD]}?)?)?`);St("XRANGEPLAINLOOSE",`[v=\\s]*(${_e[Ze.XRANGEIDENTIFIERLOOSE]})(?:\\.(${_e[Ze.XRANGEIDENTIFIERLOOSE]})(?:\\.(${_e[Ze.XRANGEIDENTIFIERLOOSE]})(?:${_e[Ze.PRERELEASELOOSE]})?${_e[Ze.BUILD]}?)?)?`);St("XRANGE",`^${_e[Ze.GTLT]}\\s*${_e[Ze.XRANGEPLAIN]}$`);St("XRANGELOOSE",`^${_e[Ze.GTLT]}\\s*${_e[Ze.XRANGEPLAINLOOSE]}$`);St("COERCE",`(^|[^\\d])(\\d{1,${ox}})(?:\\.(\\d{1,${ox}}))?(?:\\.(\\d{1,${ox}}))?(?:$|[^\\d])`);St("COERCERTL",_e[Ze.COERCE],!0);St("LONETILDE","(?:~>?)");St("TILDETRIM",`(\\s*)${_e[Ze.LONETILDE]}\\s+`,!0);KA.tildeTrimReplace="$1~";St("TILDE",`^${_e[Ze.LONETILDE]}${_e[Ze.XRANGEPLAIN]}$`);St("TILDELOOSE",`^${_e[Ze.LONETILDE]}${_e[Ze.XRANGEPLAINLOOSE]}$`);St("LONECARET","(?:\\^)");St("CARETTRIM",`(\\s*)${_e[Ze.LONECARET]}\\s+`,!0);KA.caretTrimReplace="$1^";St("CARET",`^${_e[Ze.LONECARET]}${_e[Ze.XRANGEPLAIN]}$`);St("CARETLOOSE",`^${_e[Ze.LONECARET]}${_e[Ze.XRANGEPLAINLOOSE]}$`);St("COMPARATORLOOSE",`^${_e[Ze.GTLT]}\\s*(${_e[Ze.LOOSEPLAIN]})$|^$`);St("COMPARATOR",`^${_e[Ze.GTLT]}\\s*(${_e[Ze.FULLPLAIN]})$|^$`);St("COMPARATORTRIM",`(\\s*)${_e[Ze.GTLT]}\\s*(${_e[Ze.LOOSEPLAIN]}|${_e[Ze.XRANGEPLAIN]})`,!0);KA.comparatorTrimReplace="$1$2$3";St("HYPHENRANGE",`^\\s*(${_e[Ze.XRANGEPLAIN]})\\s+-\\s+(${_e[Ze.XRANGEPLAIN]})\\s*$`);St("HYPHENRANGELOOSE",`^\\s*(${_e[Ze.XRANGEPLAINLOOSE]})\\s+-\\s+(${_e[Ze.XRANGEPLAINLOOSE]})\\s*$`);St("STAR","(<|>)?=?\\s*\\*");St("GTE0","^\\s*>=\\s*0.0.0\\s*$");St("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var Ld=y((_$e,zG)=>{var tEe=["includePrerelease","loose","rtl"],rEe=r=>r?typeof r!="object"?{loose:!0}:tEe.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};zG.exports=rEe});var hy=y((Z$e,_G)=>{var VG=/^[0-9]+$/,XG=(r,e)=>{let t=VG.test(r),i=VG.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:rXG(e,r);_G.exports={compareIdentifiers:XG,rcompareIdentifiers:iEe}});var Oi=y(($$e,tY)=>{var py=Td(),{MAX_LENGTH:ZG,MAX_SAFE_INTEGER:dy}=Nd(),{re:$G,t:eY}=Sc(),nEe=Ld(),{compareIdentifiers:Od}=hy(),Kn=class{constructor(e,t){if(t=nEe(t),e instanceof Kn){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>ZG)throw new TypeError(`version is longer than ${ZG} characters`);py("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?$G[eY.LOOSE]:$G[eY.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>dy||this.major<0)throw new TypeError("Invalid major version");if(this.minor>dy||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>dy||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};tY.exports=Kn});var vc=y((eet,sY)=>{var{MAX_LENGTH:sEe}=Nd(),{re:rY,t:iY}=Sc(),nY=Oi(),oEe=Ld(),aEe=(r,e)=>{if(e=oEe(e),r instanceof nY)return r;if(typeof r!="string"||r.length>sEe||!(e.loose?rY[iY.LOOSE]:rY[iY.FULL]).test(r))return null;try{return new nY(r,e)}catch{return null}};sY.exports=aEe});var aY=y((tet,oY)=>{var AEe=vc(),lEe=(r,e)=>{let t=AEe(r,e);return t?t.version:null};oY.exports=lEe});var lY=y((ret,AY)=>{var cEe=vc(),uEe=(r,e)=>{let t=cEe(r.trim().replace(/^[=v]+/,""),e);return t?t.version:null};AY.exports=uEe});var uY=y((iet,cY)=>{var gEe=Oi(),fEe=(r,e,t,i)=>{typeof t=="string"&&(i=t,t=void 0);try{return new gEe(r,t).inc(e,i).version}catch{return null}};cY.exports=fEe});var os=y((net,fY)=>{var gY=Oi(),hEe=(r,e,t)=>new gY(r,t).compare(new gY(e,t));fY.exports=hEe});var Cy=y((set,hY)=>{var pEe=os(),dEe=(r,e,t)=>pEe(r,e,t)===0;hY.exports=dEe});var CY=y((oet,dY)=>{var pY=vc(),CEe=Cy(),mEe=(r,e)=>{if(CEe(r,e))return null;{let t=pY(r),i=pY(e),n=t.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in t)if((a==="major"||a==="minor"||a==="patch")&&t[a]!==i[a])return s+a;return o}};dY.exports=mEe});var EY=y((aet,mY)=>{var EEe=Oi(),IEe=(r,e)=>new EEe(r,e).major;mY.exports=IEe});var yY=y((Aet,IY)=>{var yEe=Oi(),wEe=(r,e)=>new yEe(r,e).minor;IY.exports=wEe});var BY=y((cet,wY)=>{var BEe=Oi(),bEe=(r,e)=>new BEe(r,e).patch;wY.exports=bEe});var QY=y((uet,bY)=>{var QEe=vc(),SEe=(r,e)=>{let t=QEe(r,e);return t&&t.prerelease.length?t.prerelease:null};bY.exports=SEe});var vY=y((get,SY)=>{var vEe=os(),xEe=(r,e,t)=>vEe(e,r,t);SY.exports=xEe});var PY=y((fet,xY)=>{var PEe=os(),DEe=(r,e)=>PEe(r,e,!0);xY.exports=DEe});var my=y((het,kY)=>{var DY=Oi(),kEe=(r,e,t)=>{let i=new DY(r,t),n=new DY(e,t);return i.compare(n)||i.compareBuild(n)};kY.exports=kEe});var FY=y((pet,RY)=>{var REe=my(),FEe=(r,e)=>r.sort((t,i)=>REe(t,i,e));RY.exports=FEe});var TY=y((det,NY)=>{var NEe=my(),TEe=(r,e)=>r.sort((t,i)=>NEe(i,t,e));NY.exports=TEe});var Md=y((Cet,LY)=>{var LEe=os(),OEe=(r,e,t)=>LEe(r,e,t)>0;LY.exports=OEe});var Ey=y((met,OY)=>{var MEe=os(),UEe=(r,e,t)=>MEe(r,e,t)<0;OY.exports=UEe});var ax=y((Eet,MY)=>{var KEe=os(),HEe=(r,e,t)=>KEe(r,e,t)!==0;MY.exports=HEe});var Iy=y((Iet,UY)=>{var GEe=os(),YEe=(r,e,t)=>GEe(r,e,t)>=0;UY.exports=YEe});var yy=y((yet,KY)=>{var jEe=os(),qEe=(r,e,t)=>jEe(r,e,t)<=0;KY.exports=qEe});var Ax=y((wet,HY)=>{var JEe=Cy(),WEe=ax(),zEe=Md(),VEe=Iy(),XEe=Ey(),_Ee=yy(),ZEe=(r,e,t,i)=>{switch(e){case"===":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r===t;case"!==":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r!==t;case"":case"=":case"==":return JEe(r,t,i);case"!=":return WEe(r,t,i);case">":return zEe(r,t,i);case">=":return VEe(r,t,i);case"<":return XEe(r,t,i);case"<=":return _Ee(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};HY.exports=ZEe});var YY=y((Bet,GY)=>{var $Ee=Oi(),eIe=vc(),{re:wy,t:By}=Sc(),tIe=(r,e)=>{if(r instanceof $Ee)return r;if(typeof r=="number"&&(r=String(r)),typeof r!="string")return null;e=e||{};let t=null;if(!e.rtl)t=r.match(wy[By.COERCE]);else{let i;for(;(i=wy[By.COERCERTL].exec(r))&&(!t||t.index+t[0].length!==r.length);)(!t||i.index+i[0].length!==t.index+t[0].length)&&(t=i),wy[By.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;wy[By.COERCERTL].lastIndex=-1}return t===null?null:eIe(`${t[2]}.${t[3]||"0"}.${t[4]||"0"}`,e)};GY.exports=tIe});var qY=y((bet,jY)=>{"use strict";jY.exports=function(r){r.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var Ud=y((Qet,JY)=>{"use strict";JY.exports=Ht;Ht.Node=xc;Ht.create=Ht;function Ht(r){var e=this;if(e instanceof Ht||(e=new Ht),e.tail=null,e.head=null,e.length=0,r&&typeof r.forEach=="function")r.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var t=0,i=arguments.length;t1)t=e;else if(this.head)i=this.head.next,t=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)t=r(t,i.value,n),i=i.next;return t};Ht.prototype.reduceReverse=function(r,e){var t,i=this.tail;if(arguments.length>1)t=e;else if(this.tail)i=this.tail.prev,t=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)t=r(t,i.value,n),i=i.prev;return t};Ht.prototype.toArray=function(){for(var r=new Array(this.length),e=0,t=this.head;t!==null;e++)r[e]=t.value,t=t.next;return r};Ht.prototype.toArrayReverse=function(){for(var r=new Array(this.length),e=0,t=this.tail;t!==null;e++)r[e]=t.value,t=t.prev;return r};Ht.prototype.slice=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Ht;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>r;i--,n=n.prev)t.push(n.value);return t};Ht.prototype.splice=function(r,e,...t){r>this.length&&(r=this.length-1),r<0&&(r=this.length+r);for(var i=0,n=this.head;n!==null&&i{"use strict";var sIe=Ud(),Pc=Symbol("max"),Pa=Symbol("length"),uf=Symbol("lengthCalculator"),Hd=Symbol("allowStale"),Dc=Symbol("maxAge"),xa=Symbol("dispose"),WY=Symbol("noDisposeOnSet"),Ii=Symbol("lruList"),zs=Symbol("cache"),VY=Symbol("updateAgeOnGet"),lx=()=>1,ux=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let t=this[Pc]=e.max||1/0,i=e.length||lx;if(this[uf]=typeof i!="function"?lx:i,this[Hd]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[Dc]=e.maxAge||0,this[xa]=e.dispose,this[WY]=e.noDisposeOnSet||!1,this[VY]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[Pc]=e||1/0,Kd(this)}get max(){return this[Pc]}set allowStale(e){this[Hd]=!!e}get allowStale(){return this[Hd]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[Dc]=e,Kd(this)}get maxAge(){return this[Dc]}set lengthCalculator(e){typeof e!="function"&&(e=lx),e!==this[uf]&&(this[uf]=e,this[Pa]=0,this[Ii].forEach(t=>{t.length=this[uf](t.value,t.key),this[Pa]+=t.length})),Kd(this)}get lengthCalculator(){return this[uf]}get length(){return this[Pa]}get itemCount(){return this[Ii].length}rforEach(e,t){t=t||this;for(let i=this[Ii].tail;i!==null;){let n=i.prev;zY(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[Ii].head;i!==null;){let n=i.next;zY(this,e,i,t),i=n}}keys(){return this[Ii].toArray().map(e=>e.key)}values(){return this[Ii].toArray().map(e=>e.value)}reset(){this[xa]&&this[Ii]&&this[Ii].length&&this[Ii].forEach(e=>this[xa](e.key,e.value)),this[zs]=new Map,this[Ii]=new sIe,this[Pa]=0}dump(){return this[Ii].map(e=>by(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[Ii]}set(e,t,i){if(i=i||this[Dc],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[uf](t,e);if(this[zs].has(e)){if(s>this[Pc])return gf(this,this[zs].get(e)),!1;let l=this[zs].get(e).value;return this[xa]&&(this[WY]||this[xa](e,l.value)),l.now=n,l.maxAge=i,l.value=t,this[Pa]+=s-l.length,l.length=s,this.get(e),Kd(this),!0}let o=new gx(e,t,s,n,i);return o.length>this[Pc]?(this[xa]&&this[xa](e,t),!1):(this[Pa]+=o.length,this[Ii].unshift(o),this[zs].set(e,this[Ii].head),Kd(this),!0)}has(e){if(!this[zs].has(e))return!1;let t=this[zs].get(e).value;return!by(this,t)}get(e){return cx(this,e,!0)}peek(e){return cx(this,e,!1)}pop(){let e=this[Ii].tail;return e?(gf(this,e),e.value):null}del(e){gf(this,this[zs].get(e))}load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-t;o>0&&this.set(n.k,n.v,o)}}}prune(){this[zs].forEach((e,t)=>cx(this,t,!1))}},cx=(r,e,t)=>{let i=r[zs].get(e);if(i){let n=i.value;if(by(r,n)){if(gf(r,i),!r[Hd])return}else t&&(r[VY]&&(i.value.now=Date.now()),r[Ii].unshiftNode(i));return n.value}},by=(r,e)=>{if(!e||!e.maxAge&&!r[Dc])return!1;let t=Date.now()-e.now;return e.maxAge?t>e.maxAge:r[Dc]&&t>r[Dc]},Kd=r=>{if(r[Pa]>r[Pc])for(let e=r[Ii].tail;r[Pa]>r[Pc]&&e!==null;){let t=e.prev;gf(r,e),e=t}},gf=(r,e)=>{if(e){let t=e.value;r[xa]&&r[xa](t.key,t.value),r[Pa]-=t.length,r[zs].delete(t.key),r[Ii].removeNode(e)}},gx=class{constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,this.maxAge=s||0}},zY=(r,e,t,i)=>{let n=t.value;by(r,n)&&(gf(r,t),r[Hd]||(n=void 0)),n&&e.call(i,n.value,n.key,r)};XY.exports=ux});var as=y((xet,tj)=>{var kc=class{constructor(e,t){if(t=aIe(t),e instanceof kc)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new kc(e.raw,t);if(e instanceof fx)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!$Y(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&gIe(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=ZY.get(i);if(n)return n;let s=this.options.loose,o=s?Mi[Qi.HYPHENRANGELOOSE]:Mi[Qi.HYPHENRANGE];e=e.replace(o,wIe(this.options.includePrerelease)),jr("hyphen replace",e),e=e.replace(Mi[Qi.COMPARATORTRIM],lIe),jr("comparator trim",e,Mi[Qi.COMPARATORTRIM]),e=e.replace(Mi[Qi.TILDETRIM],cIe),e=e.replace(Mi[Qi.CARETTRIM],uIe),e=e.split(/\s+/).join(" ");let a=s?Mi[Qi.COMPARATORLOOSE]:Mi[Qi.COMPARATOR],l=e.split(" ").map(f=>fIe(f,this.options)).join(" ").split(/\s+/).map(f=>yIe(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new fx(f,this.options)),c=l.length,u=new Map;for(let f of l){if($Y(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return ZY.set(i,g),g}intersects(e,t){if(!(e instanceof kc))throw new TypeError("a Range is required");return this.set.some(i=>ej(i,t)&&e.set.some(n=>ej(n,t)&&i.every(s=>n.every(o=>s.intersects(o,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new AIe(e,this.options)}catch{return!1}for(let t=0;tr.value==="<0.0.0-0",gIe=r=>r.value==="",ej=(r,e)=>{let t=!0,i=r.slice(),n=i.pop();for(;t&&i.length;)t=i.every(s=>n.intersects(s,e)),n=i.pop();return t},fIe=(r,e)=>(jr("comp",r,e),r=dIe(r,e),jr("caret",r),r=hIe(r,e),jr("tildes",r),r=mIe(r,e),jr("xrange",r),r=IIe(r,e),jr("stars",r),r),Xi=r=>!r||r.toLowerCase()==="x"||r==="*",hIe=(r,e)=>r.trim().split(/\s+/).map(t=>pIe(t,e)).join(" "),pIe=(r,e)=>{let t=e.loose?Mi[Qi.TILDELOOSE]:Mi[Qi.TILDE];return r.replace(t,(i,n,s,o,a)=>{jr("tilde",r,i,n,s,o,a);let l;return Xi(n)?l="":Xi(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:Xi(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(jr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,jr("tilde return",l),l})},dIe=(r,e)=>r.trim().split(/\s+/).map(t=>CIe(t,e)).join(" "),CIe=(r,e)=>{jr("caret",r,e);let t=e.loose?Mi[Qi.CARETLOOSE]:Mi[Qi.CARET],i=e.includePrerelease?"-0":"";return r.replace(t,(n,s,o,a,l)=>{jr("caret",r,n,s,o,a,l);let c;return Xi(s)?c="":Xi(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:Xi(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(jr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(jr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),jr("caret return",c),c})},mIe=(r,e)=>(jr("replaceXRanges",r,e),r.split(/\s+/).map(t=>EIe(t,e)).join(" ")),EIe=(r,e)=>{r=r.trim();let t=e.loose?Mi[Qi.XRANGELOOSE]:Mi[Qi.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{jr("xRange",r,i,n,s,o,a,l);let c=Xi(s),u=c||Xi(o),g=u||Xi(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),jr("xRange return",i),i})},IIe=(r,e)=>(jr("replaceStars",r,e),r.trim().replace(Mi[Qi.STAR],"")),yIe=(r,e)=>(jr("replaceGTE0",r,e),r.trim().replace(Mi[e.includePrerelease?Qi.GTE0PRE:Qi.GTE0],"")),wIe=r=>(e,t,i,n,s,o,a,l,c,u,g,f,h)=>(Xi(i)?t="":Xi(n)?t=`>=${i}.0.0${r?"-0":""}`:Xi(s)?t=`>=${i}.${n}.0${r?"-0":""}`:o?t=`>=${t}`:t=`>=${t}${r?"-0":""}`,Xi(c)?l="":Xi(u)?l=`<${+c+1}.0.0-0`:Xi(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:r?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),BIe=(r,e,t)=>{for(let i=0;i0){let n=r[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Gd=y((Pet,oj)=>{var Yd=Symbol("SemVer ANY"),ff=class{static get ANY(){return Yd}constructor(e,t){if(t=bIe(t),e instanceof ff){if(e.loose===!!t.loose)return e;e=e.value}px("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===Yd?this.value="":this.value=this.operator+this.semver.version,px("comp",this)}parse(e){let t=this.options.loose?rj[ij.COMPARATORLOOSE]:rj[ij.COMPARATOR],i=e.match(t);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new nj(i[2],this.options.loose):this.semver=Yd}toString(){return this.value}test(e){if(px("Comparator.test",e,this.options.loose),this.semver===Yd||e===Yd)return!0;if(typeof e=="string")try{e=new nj(e,this.options)}catch{return!1}return hx(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof ff))throw new TypeError("a Comparator is required");if((!t||typeof t!="object")&&(t={loose:!!t,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new sj(e.value,t).test(this.value);if(e.operator==="")return e.value===""?!0:new sj(this.value,t).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=hx(this.semver,"<",e.semver,t)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=hx(this.semver,">",e.semver,t)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};oj.exports=ff;var bIe=Ld(),{re:rj,t:ij}=Sc(),hx=Ax(),px=Td(),nj=Oi(),sj=as()});var jd=y((Det,aj)=>{var QIe=as(),SIe=(r,e,t)=>{try{e=new QIe(e,t)}catch{return!1}return e.test(r)};aj.exports=SIe});var lj=y((ket,Aj)=>{var vIe=as(),xIe=(r,e)=>new vIe(r,e).set.map(t=>t.map(i=>i.value).join(" ").trim().split(" "));Aj.exports=xIe});var uj=y((Ret,cj)=>{var PIe=Oi(),DIe=as(),kIe=(r,e,t)=>{let i=null,n=null,s=null;try{s=new DIe(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new PIe(i,t))}),i};cj.exports=kIe});var fj=y((Fet,gj)=>{var RIe=Oi(),FIe=as(),NIe=(r,e,t)=>{let i=null,n=null,s=null;try{s=new FIe(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new RIe(i,t))}),i};gj.exports=NIe});var dj=y((Net,pj)=>{var dx=Oi(),TIe=as(),hj=Md(),LIe=(r,e)=>{r=new TIe(r,e);let t=new dx("0.0.0");if(r.test(t)||(t=new dx("0.0.0-0"),r.test(t)))return t;t=null;for(let i=0;i{let a=new dx(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||hj(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||hj(t,s))&&(t=s)}return t&&r.test(t)?t:null};pj.exports=LIe});var mj=y((Tet,Cj)=>{var OIe=as(),MIe=(r,e)=>{try{return new OIe(r,e).range||"*"}catch{return null}};Cj.exports=MIe});var Qy=y((Let,wj)=>{var UIe=Oi(),yj=Gd(),{ANY:KIe}=yj,HIe=as(),GIe=jd(),Ej=Md(),Ij=Ey(),YIe=yy(),jIe=Iy(),qIe=(r,e,t,i)=>{r=new UIe(r,i),e=new HIe(e,i);let n,s,o,a,l;switch(t){case">":n=Ej,s=YIe,o=Ij,a=">",l=">=";break;case"<":n=Ij,s=jIe,o=Ej,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(GIe(r,e,i))return!1;for(let c=0;c{h.semver===KIe&&(h=new yj(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(r,f.semver))return!1;if(f.operator===l&&o(r,f.semver))return!1}return!0};wj.exports=qIe});var bj=y((Oet,Bj)=>{var JIe=Qy(),WIe=(r,e,t)=>JIe(r,e,">",t);Bj.exports=WIe});var Sj=y((Met,Qj)=>{var zIe=Qy(),VIe=(r,e,t)=>zIe(r,e,"<",t);Qj.exports=VIe});var Pj=y((Uet,xj)=>{var vj=as(),XIe=(r,e,t)=>(r=new vj(r,t),e=new vj(e,t),r.intersects(e));xj.exports=XIe});var kj=y((Ket,Dj)=>{var _Ie=jd(),ZIe=os();Dj.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>ZIe(u,g,t));for(let u of o)_Ie(u,e,t)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var Rj=as(),Sy=Gd(),{ANY:Cx}=Sy,qd=jd(),mx=os(),$Ie=(r,e,t={})=>{if(r===e)return!0;r=new Rj(r,t),e=new Rj(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=eye(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},eye=(r,e,t)=>{if(r===e)return!0;if(r.length===1&&r[0].semver===Cx){if(e.length===1&&e[0].semver===Cx)return!0;t.includePrerelease?r=[new Sy(">=0.0.0-0")]:r=[new Sy(">=0.0.0")]}if(e.length===1&&e[0].semver===Cx){if(t.includePrerelease)return!0;e=[new Sy(">=0.0.0")]}let i=new Set,n,s;for(let h of r)h.operator===">"||h.operator===">="?n=Fj(n,h,t):h.operator==="<"||h.operator==="<="?s=Nj(s,h,t):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=mx(n.semver,s.semver,t),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!qd(h,String(n),t)||s&&!qd(h,String(s),t))return null;for(let p of e)if(!qd(h,String(p),t))return!1;return!0}let a,l,c,u,g=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=Fj(n,h,t),a===h&&a!==n)return!1}else if(n.operator===">="&&!qd(n.semver,String(h),t))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=Nj(s,h,t),l===h&&l!==s)return!1}else if(s.operator==="<="&&!qd(s.semver,String(h),t))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},Fj=(r,e,t)=>{if(!r)return e;let i=mx(r.semver,e.semver,t);return i>0?r:i<0||e.operator===">"&&r.operator===">="?e:r},Nj=(r,e,t)=>{if(!r)return e;let i=mx(r.semver,e.semver,t);return i<0?r:i>0||e.operator==="<"&&r.operator==="<="?e:r};Tj.exports=$Ie});var $r=y((Get,Oj)=>{var Ex=Sc();Oj.exports={re:Ex.re,src:Ex.src,tokens:Ex.t,SEMVER_SPEC_VERSION:Nd().SEMVER_SPEC_VERSION,SemVer:Oi(),compareIdentifiers:hy().compareIdentifiers,rcompareIdentifiers:hy().rcompareIdentifiers,parse:vc(),valid:aY(),clean:lY(),inc:uY(),diff:CY(),major:EY(),minor:yY(),patch:BY(),prerelease:QY(),compare:os(),rcompare:vY(),compareLoose:PY(),compareBuild:my(),sort:FY(),rsort:TY(),gt:Md(),lt:Ey(),eq:Cy(),neq:ax(),gte:Iy(),lte:yy(),cmp:Ax(),coerce:YY(),Comparator:Gd(),Range:as(),satisfies:jd(),toComparators:lj(),maxSatisfying:uj(),minSatisfying:fj(),minVersion:dj(),validRange:mj(),outside:Qy(),gtr:bj(),ltr:Sj(),intersects:Pj(),simplifyRange:kj(),subset:Lj()}});var Ix=y(vy=>{"use strict";Object.defineProperty(vy,"__esModule",{value:!0});vy.VERSION=void 0;vy.VERSION="9.1.0"});var Gt=y((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(r,e,t){if(t||arguments.length===2)for(var i=0,n=e.length,s;i{(function(r,e){typeof define=="function"&&define.amd?define([],e):typeof xy=="object"&&xy.exports?xy.exports=e():r.regexpToAst=e()})(typeof self<"u"?self:Mj,function(){function r(){}r.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},r.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},r.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var C=this.disjunction();this.consumeChar("/");for(var w={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(w,"global");break;case"i":o(w,"ignoreCase");break;case"m":o(w,"multiLine");break;case"u":o(w,"unicode");break;case"y":o(w,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:w,value:C,loc:this.loc(0)}},r.prototype.disjunction=function(){var p=[],C=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(C)}},r.prototype.alternative=function(){for(var p=[],C=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(C)}},r.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},r.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var C;switch(this.popChar()){case"=":C="Lookahead";break;case"!":C="NegativeLookahead";break}a(C);var w=this.disjunction();return this.consumeChar(")"),{type:C,value:w,loc:this.loc(p)}}l()},r.prototype.quantifier=function(p){var C,w=this.idx;switch(this.popChar()){case"*":C={atLeast:0,atMost:1/0};break;case"+":C={atLeast:1,atMost:1/0};break;case"?":C={atLeast:0,atMost:1};break;case"{":var B=this.integerIncludingZero();switch(this.popChar()){case"}":C={atLeast:B,atMost:B};break;case",":var v;this.isDigit()?(v=this.integerIncludingZero(),C={atLeast:B,atMost:v}):C={atLeast:B,atMost:1/0},this.consumeChar("}");break}if(p===!0&&C===void 0)return;a(C);break}if(!(p===!0&&C===void 0))return a(C),this.peekChar(0)==="?"?(this.consumeChar("?"),C.greedy=!1):C.greedy=!0,C.type="Quantifier",C.loc=this.loc(w),C},r.prototype.atom=function(){var p,C=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(C),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},r.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` -`),n("\r"),n("\u2028"),n("\u2029")]}},r.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},r.prototype.characterClassEscape=function(){var p,C=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,C=!0;break;case"s":p=f;break;case"S":p=f,C=!0;break;case"w":p=g;break;case"W":p=g,C=!0;break}return a(p),{type:"Set",value:p,complement:C}},r.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(` -`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},r.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var C=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:C}},r.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},r.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},r.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},r.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},r.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` -`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},r.prototype.characterClass=function(){var p=[],C=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),C=!0);this.isClassAtom();){var w=this.classAtom(),B=w.type==="Character";if(B&&this.isRangeDash()){this.consumeChar("-");var v=this.classAtom(),D=v.type==="Character";if(D){if(v.value=this.input.length)throw Error("Unexpected end of input");this.idx++},r.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,t=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,C){p.length!==void 0?p.forEach(function(w){C.push(w)}):C.push(p)}function o(p,C){if(p[C]===!0)throw"duplicate flag "+C;p[C]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(` -`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var C in p){var w=p[C];p.hasOwnProperty(C)&&(w.type!==void 0?this.visit(w):Array.isArray(w)&&w.forEach(function(B){this.visit(B)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:r,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var ky=y(hf=>{"use strict";Object.defineProperty(hf,"__esModule",{value:!0});hf.clearRegExpParserCache=hf.getRegExpAst=void 0;var tye=Py(),Dy={},rye=new tye.RegExpParser;function iye(r){var e=r.toString();if(Dy.hasOwnProperty(e))return Dy[e];var t=rye.pattern(e);return Dy[e]=t,t}hf.getRegExpAst=iye;function nye(){Dy={}}hf.clearRegExpParserCache=nye});var Yj=y(dn=>{"use strict";var sye=dn&&dn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(dn,"__esModule",{value:!0});dn.canMatchCharCode=dn.firstCharOptimizedIndices=dn.getOptimizedStartCodesIndices=dn.failedOptimizationPrefixMsg=void 0;var Kj=Py(),As=Gt(),Hj=ky(),Da=wx(),Gj="Complement Sets are not supported for first char optimization";dn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: -`;function oye(r,e){e===void 0&&(e=!1);try{var t=(0,Hj.getRegExpAst)(r),i=Fy(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===Gj)e&&(0,As.PRINT_WARNING)(""+dn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+r.toString()+` > -`)+` Complement Sets cannot be automatically optimized. - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,As.PRINT_ERROR)(dn.failedOptimizationPrefixMsg+` -`+(" Failed parsing: < "+r.toString()+` > -`)+(" Using the regexp-to-ast library version: "+Kj.VERSION+` -`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}dn.getOptimizedStartCodesIndices=oye;function Fy(r,e,t){switch(r.type){case"Disjunction":for(var i=0;i=Da.minOptimizationVal)for(var f=u.from>=Da.minOptimizationVal?u.from:Da.minOptimizationVal,h=u.to,p=(0,Da.charCodeToOptimizedIndex)(f),C=(0,Da.charCodeToOptimizedIndex)(h),w=p;w<=C;w++)e[w]=w}}});break;case"Group":Fy(o.value,e,t);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&yx(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,As.values)(e)}dn.firstCharOptimizedIndices=Fy;function Ry(r,e,t){var i=(0,Da.charCodeToOptimizedIndex)(r);e[i]=i,t===!0&&aye(r,e)}function aye(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==t){var n=(0,Da.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=t.toLowerCase();if(s!==t){var n=(0,Da.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function Uj(r,e){return(0,As.find)(r.value,function(t){if(typeof t=="number")return(0,As.contains)(e,t);var i=t;return(0,As.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function yx(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?(0,As.isArray)(r.value)?(0,As.every)(r.value,yx):yx(r.value):!1}var Aye=function(r){sye(e,r);function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.found=!1,i}return e.prototype.visitChildren=function(t){if(this.found!==!0){switch(t.type){case"Lookahead":this.visitLookahead(t);return;case"NegativeLookahead":this.visitNegativeLookahead(t);return}r.prototype.visitChildren.call(this,t)}},e.prototype.visitCharacter=function(t){(0,As.contains)(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?Uj(t,this.targetCharCodes)===void 0&&(this.found=!0):Uj(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(Kj.BaseRegExpVisitor);function lye(r,e){if(e instanceof RegExp){var t=(0,Hj.getRegExpAst)(e),i=new Aye(r);return i.visit(t),i.found}else return(0,As.find)(e,function(n){return(0,As.contains)(r,n.charCodeAt(0))})!==void 0}dn.canMatchCharCode=lye});var wx=y(Je=>{"use strict";var jj=Je&&Je.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Je,"__esModule",{value:!0});Je.charCodeToOptimizedIndex=Je.minOptimizationVal=Je.buildLineBreakIssueMessage=Je.LineTerminatorOptimizedTester=Je.isShortPattern=Je.isCustomPattern=Je.cloneEmptyGroups=Je.performWarningRuntimeChecks=Je.performRuntimeChecks=Je.addStickyFlag=Je.addStartOfInput=Je.findUnreachablePatterns=Je.findModesThatDoNotExist=Je.findInvalidGroupType=Je.findDuplicatePatterns=Je.findUnsupportedFlags=Je.findStartOfInputAnchor=Je.findEmptyMatchRegExps=Je.findEndOfInputAnchor=Je.findInvalidPatterns=Je.findMissingPatterns=Je.validatePatterns=Je.analyzeTokenTypes=Je.enableSticky=Je.disableSticky=Je.SUPPORT_STICKY=Je.MODES=Je.DEFAULT_MODE=void 0;var qj=Py(),ir=Jd(),Se=Gt(),pf=Yj(),Jj=ky(),Do="PATTERN";Je.DEFAULT_MODE="defaultMode";Je.MODES="modes";Je.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function cye(){Je.SUPPORT_STICKY=!1}Je.disableSticky=cye;function uye(){Je.SUPPORT_STICKY=!0}Je.enableSticky=uye;function gye(r,e){e=(0,Se.defaults)(e,{useSticky:Je.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` -`],tracer:function(v,D){return D()}});var t=e.tracer;t("initCharCodeToOptimizedIndexMap",function(){wye()});var i;t("Reject Lexer.NA",function(){i=(0,Se.reject)(r,function(v){return v[Do]===ir.Lexer.NA})});var n=!1,s;t("Transform Patterns",function(){n=!1,s=(0,Se.map)(i,function(v){var D=v[Do];if((0,Se.isRegExp)(D)){var T=D.source;return T.length===1&&T!=="^"&&T!=="$"&&T!=="."&&!D.ignoreCase?T:T.length===2&&T[0]==="\\"&&!(0,Se.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],T[1])?T[1]:e.useSticky?Qx(D):bx(D)}else{if((0,Se.isFunction)(D))return n=!0,{exec:D};if((0,Se.has)(D,"exec"))return n=!0,D;if(typeof D=="string"){if(D.length===1)return D;var H=D.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),j=new RegExp(H);return e.useSticky?Qx(j):bx(j)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;t("misc mapping",function(){o=(0,Se.map)(i,function(v){return v.tokenTypeIdx}),a=(0,Se.map)(i,function(v){var D=v.GROUP;if(D!==ir.Lexer.SKIPPED){if((0,Se.isString)(D))return D;if((0,Se.isUndefined)(D))return!1;throw Error("non exhaustive match")}}),l=(0,Se.map)(i,function(v){var D=v.LONGER_ALT;if(D){var T=(0,Se.isArray)(D)?(0,Se.map)(D,function(H){return(0,Se.indexOf)(i,H)}):[(0,Se.indexOf)(i,D)];return T}}),c=(0,Se.map)(i,function(v){return v.PUSH_MODE}),u=(0,Se.map)(i,function(v){return(0,Se.has)(v,"POP_MODE")})});var g;t("Line Terminator Handling",function(){var v=oq(e.lineTerminatorCharacters);g=(0,Se.map)(i,function(D){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,Se.map)(i,function(D){if((0,Se.has)(D,"LINE_BREAKS"))return D.LINE_BREAKS;if(nq(D,v)===!1)return(0,pf.canMatchCharCode)(v,D.PATTERN)}))});var f,h,p,C;t("Misc Mapping #2",function(){f=(0,Se.map)(i,vx),h=(0,Se.map)(s,iq),p=(0,Se.reduce)(i,function(v,D){var T=D.GROUP;return(0,Se.isString)(T)&&T!==ir.Lexer.SKIPPED&&(v[T]=[]),v},{}),C=(0,Se.map)(s,function(v,D){return{pattern:s[D],longerAlt:l[D],canLineTerminator:g[D],isCustom:f[D],short:h[D],group:a[D],push:c[D],pop:u[D],tokenTypeIdx:o[D],tokenType:i[D]}})});var w=!0,B=[];return e.safeMode||t("First Char Optimization",function(){B=(0,Se.reduce)(i,function(v,D,T){if(typeof D.PATTERN=="string"){var H=D.PATTERN.charCodeAt(0),j=Sx(H);Bx(v,j,C[T])}else if((0,Se.isArray)(D.START_CHARS_HINT)){var $;(0,Se.forEach)(D.START_CHARS_HINT,function(W){var Z=typeof W=="string"?W.charCodeAt(0):W,A=Sx(Z);$!==A&&($=A,Bx(v,A,C[T]))})}else if((0,Se.isRegExp)(D.PATTERN))if(D.PATTERN.unicode)w=!1,e.ensureOptimizations&&(0,Se.PRINT_ERROR)(""+pf.failedOptimizationPrefixMsg+(" Unable to analyze < "+D.PATTERN.toString()+` > pattern. -`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var V=(0,pf.getOptimizedStartCodesIndices)(D.PATTERN,e.ensureOptimizations);(0,Se.isEmpty)(V)&&(w=!1),(0,Se.forEach)(V,function(W){Bx(v,W,C[T])})}else e.ensureOptimizations&&(0,Se.PRINT_ERROR)(""+pf.failedOptimizationPrefixMsg+(" TokenType: <"+D.name+`> is using a custom token pattern without providing parameter. -`)+` This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),w=!1;return v},[])}),t("ArrayPacking",function(){B=(0,Se.packArray)(B)}),{emptyGroups:p,patternIdxToConfig:C,charCodeToPatternIdxToConfig:B,hasCustom:n,canBeOptimized:w}}Je.analyzeTokenTypes=gye;function fye(r,e){var t=[],i=Wj(r);t=t.concat(i.errors);var n=zj(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(hye(s)),t=t.concat(eq(s)),t=t.concat(tq(s,e)),t=t.concat(rq(s)),t}Je.validatePatterns=fye;function hye(r){var e=[],t=(0,Se.filter)(r,function(i){return(0,Se.isRegExp)(i[Do])});return e=e.concat(Vj(t)),e=e.concat(_j(t)),e=e.concat(Zj(t)),e=e.concat($j(t)),e=e.concat(Xj(t)),e}function Wj(r){var e=(0,Se.filter)(r,function(n){return!(0,Se.has)(n,Do)}),t=(0,Se.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:ir.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,Se.difference)(r,e);return{errors:t,valid:i}}Je.findMissingPatterns=Wj;function zj(r){var e=(0,Se.filter)(r,function(n){var s=n[Do];return!(0,Se.isRegExp)(s)&&!(0,Se.isFunction)(s)&&!(0,Se.has)(s,"exec")&&!(0,Se.isString)(s)}),t=(0,Se.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:ir.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,Se.difference)(r,e);return{errors:t,valid:i}}Je.findInvalidPatterns=zj;var pye=/[^\\][\$]/;function Vj(r){var e=function(n){jj(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(qj.BaseRegExpVisitor),t=(0,Se.filter)(r,function(n){var s=n[Do];try{var o=(0,Jj.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return pye.test(s.source)}}),i=(0,Se.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' - See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ir.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Je.findEndOfInputAnchor=Vj;function Xj(r){var e=(0,Se.filter)(r,function(i){var n=i[Do];return n.test("")}),t=(0,Se.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:ir.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return t}Je.findEmptyMatchRegExps=Xj;var dye=/[^\\[][\^]|^\^/;function _j(r){var e=function(n){jj(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(qj.BaseRegExpVisitor),t=(0,Se.filter)(r,function(n){var s=n[Do];try{var o=(0,Jj.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return dye.test(s.source)}}),i=(0,Se.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ir.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Je.findStartOfInputAnchor=_j;function Zj(r){var e=(0,Se.filter)(r,function(i){var n=i[Do];return n instanceof RegExp&&(n.multiline||n.global)}),t=(0,Se.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:ir.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return t}Je.findUnsupportedFlags=Zj;function $j(r){var e=[],t=(0,Se.map)(r,function(s){return(0,Se.reduce)(r,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,Se.contains)(e,a)&&a.PATTERN!==ir.Lexer.NA&&(e.push(a),o.push(a)),o},[])});t=(0,Se.compact)(t);var i=(0,Se.filter)(t,function(s){return s.length>1}),n=(0,Se.map)(i,function(s){var o=(0,Se.map)(s,function(l){return l.name}),a=(0,Se.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:ir.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}Je.findDuplicatePatterns=$j;function eq(r){var e=(0,Se.filter)(r,function(i){if(!(0,Se.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==ir.Lexer.SKIPPED&&n!==ir.Lexer.NA&&!(0,Se.isString)(n)}),t=(0,Se.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:ir.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return t}Je.findInvalidGroupType=eq;function tq(r,e){var t=(0,Se.filter)(r,function(n){return n.PUSH_MODE!==void 0&&!(0,Se.contains)(e,n.PUSH_MODE)}),i=(0,Se.map)(t,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:ir.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}Je.findModesThatDoNotExist=tq;function rq(r){var e=[],t=(0,Se.reduce)(r,function(i,n,s){var o=n.PATTERN;return o===ir.Lexer.NA||((0,Se.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,Se.isRegExp)(o)&&mye(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,Se.forEach)(r,function(i,n){(0,Se.forEach)(t,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. -See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:ir.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}Je.findUnreachablePatterns=rq;function Cye(r,e){if((0,Se.isRegExp)(e)){var t=e.exec(r);return t!==null&&t.index===0}else{if((0,Se.isFunction)(e))return e(r,0,[],{});if((0,Se.has)(e,"exec"))return e.exec(r,0,[],{});if(typeof e=="string")return e===r;throw Error("non exhaustive match")}}function mye(r){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,Se.find)(e,function(t){return r.source.indexOf(t)!==-1})===void 0}function bx(r){var e=r.ignoreCase?"i":"";return new RegExp("^(?:"+r.source+")",e)}Je.addStartOfInput=bx;function Qx(r){var e=r.ignoreCase?"iy":"y";return new RegExp(""+r.source,e)}Je.addStickyFlag=Qx;function Eye(r,e,t){var i=[];return(0,Se.has)(r,Je.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Je.DEFAULT_MODE+`> property in its definition -`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,Se.has)(r,Je.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Je.MODES+`> property in its definition -`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,Se.has)(r,Je.MODES)&&(0,Se.has)(r,Je.DEFAULT_MODE)&&!(0,Se.has)(r.modes,r.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+Je.DEFAULT_MODE+": <"+r.defaultMode+`>which does not exist -`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,Se.has)(r,Je.MODES)&&(0,Se.forEach)(r.modes,function(n,s){(0,Se.forEach)(n,function(o,a){(0,Se.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> -`),type:ir.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}Je.performRuntimeChecks=Eye;function Iye(r,e,t){var i=[],n=!1,s=(0,Se.compact)((0,Se.flatten)((0,Se.mapValues)(r.modes,function(l){return l}))),o=(0,Se.reject)(s,function(l){return l[Do]===ir.Lexer.NA}),a=oq(t);return e&&(0,Se.forEach)(o,function(l){var c=nq(l,a);if(c!==!1){var u=sq(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,Se.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,pf.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. - This Lexer has been defined to track line and column information, - But none of the Token Types can be identified as matching a line terminator. - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS - for details.`,type:ir.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}Je.performWarningRuntimeChecks=Iye;function yye(r){var e={},t=(0,Se.keys)(r);return(0,Se.forEach)(t,function(i){var n=r[i];if((0,Se.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}Je.cloneEmptyGroups=yye;function vx(r){var e=r.PATTERN;if((0,Se.isRegExp)(e))return!1;if((0,Se.isFunction)(e))return!0;if((0,Se.has)(e,"exec"))return!0;if((0,Se.isString)(e))return!1;throw Error("non exhaustive match")}Je.isCustomPattern=vx;function iq(r){return(0,Se.isString)(r)&&r.length===1?r.charCodeAt(0):!1}Je.isShortPattern=iq;Je.LineTerminatorOptimizedTester={test:function(r){for(var e=r.length,t=this.lastIndex;t Token Type -`)+(" Root cause: "+e.errMsg+`. -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===ir.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. -`+(" The problem is in the <"+r.name+`> Token Type -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}Je.buildLineBreakIssueMessage=sq;function oq(r){var e=(0,Se.map)(r,function(t){return(0,Se.isString)(t)&&t.length>0?t.charCodeAt(0):t});return e}function Bx(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}Je.minOptimizationVal=256;var Ny=[];function Sx(r){return r255?255+~~(r/255):r}}});var df=y(Nt=>{"use strict";Object.defineProperty(Nt,"__esModule",{value:!0});Nt.isTokenType=Nt.hasExtendingTokensTypesMapProperty=Nt.hasExtendingTokensTypesProperty=Nt.hasCategoriesProperty=Nt.hasShortKeyProperty=Nt.singleAssignCategoriesToksMap=Nt.assignCategoriesMapProp=Nt.assignCategoriesTokensProp=Nt.assignTokenDefaultProps=Nt.expandCategories=Nt.augmentTokenTypes=Nt.tokenIdxToClass=Nt.tokenShortNameIdx=Nt.tokenStructuredMatcherNoCategories=Nt.tokenStructuredMatcher=void 0;var ei=Gt();function Bye(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Nt.tokenStructuredMatcher=Bye;function bye(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Nt.tokenStructuredMatcherNoCategories=bye;Nt.tokenShortNameIdx=1;Nt.tokenIdxToClass={};function Qye(r){var e=aq(r);Aq(e),cq(e),lq(e),(0,ei.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Nt.augmentTokenTypes=Qye;function aq(r){for(var e=(0,ei.cloneArr)(r),t=r,i=!0;i;){t=(0,ei.compact)((0,ei.flatten)((0,ei.map)(t,function(s){return s.CATEGORIES})));var n=(0,ei.difference)(t,e);e=e.concat(n),(0,ei.isEmpty)(n)?i=!1:t=n}return e}Nt.expandCategories=aq;function Aq(r){(0,ei.forEach)(r,function(e){uq(e)||(Nt.tokenIdxToClass[Nt.tokenShortNameIdx]=e,e.tokenTypeIdx=Nt.tokenShortNameIdx++),xx(e)&&!(0,ei.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),xx(e)||(e.CATEGORIES=[]),gq(e)||(e.categoryMatches=[]),fq(e)||(e.categoryMatchesMap={})})}Nt.assignTokenDefaultProps=Aq;function lq(r){(0,ei.forEach)(r,function(e){e.categoryMatches=[],(0,ei.forEach)(e.categoryMatchesMap,function(t,i){e.categoryMatches.push(Nt.tokenIdxToClass[i].tokenTypeIdx)})})}Nt.assignCategoriesTokensProp=lq;function cq(r){(0,ei.forEach)(r,function(e){Px([],e)})}Nt.assignCategoriesMapProp=cq;function Px(r,e){(0,ei.forEach)(r,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,ei.forEach)(e.CATEGORIES,function(t){var i=r.concat(e);(0,ei.contains)(i,t)||Px(i,t)})}Nt.singleAssignCategoriesToksMap=Px;function uq(r){return(0,ei.has)(r,"tokenTypeIdx")}Nt.hasShortKeyProperty=uq;function xx(r){return(0,ei.has)(r,"CATEGORIES")}Nt.hasCategoriesProperty=xx;function gq(r){return(0,ei.has)(r,"categoryMatches")}Nt.hasExtendingTokensTypesProperty=gq;function fq(r){return(0,ei.has)(r,"categoryMatchesMap")}Nt.hasExtendingTokensTypesMapProperty=fq;function Sye(r){return(0,ei.has)(r,"tokenTypeIdx")}Nt.isTokenType=Sye});var Dx=y(Ty=>{"use strict";Object.defineProperty(Ty,"__esModule",{value:!0});Ty.defaultLexerErrorProvider=void 0;Ty.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(r){return"Unable to pop Lexer Mode after encountering Token ->"+r.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(r,e,t,i,n){return"unexpected character: ->"+r.charAt(e)+"<- at offset: "+e+","+(" skipped "+t+" characters.")}}});var Jd=y(Rc=>{"use strict";Object.defineProperty(Rc,"__esModule",{value:!0});Rc.Lexer=Rc.LexerDefinitionErrorType=void 0;var Vs=wx(),nr=Gt(),vye=df(),xye=Dx(),Pye=ky(),Dye;(function(r){r[r.MISSING_PATTERN=0]="MISSING_PATTERN",r[r.INVALID_PATTERN=1]="INVALID_PATTERN",r[r.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",r[r.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",r[r.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",r[r.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",r[r.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",r[r.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",r[r.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",r[r.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",r[r.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",r[r.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",r[r.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(Dye=Rc.LexerDefinitionErrorType||(Rc.LexerDefinitionErrorType={}));var Wd={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` -`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:xye.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(Wd);var kye=function(){function r(e,t){var i=this;if(t===void 0&&(t=Wd),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof t=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. -a boolean 2nd argument is no longer supported`);this.config=(0,nr.merge)(Wd,t);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===Wd.lineTerminatorsPattern)i.config.lineTerminatorsPattern=Vs.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===Wd.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,nr.isArray)(e)?(s={modes:{}},s.modes[Vs.DEFAULT_MODE]=(0,nr.cloneArr)(e),s[Vs.DEFAULT_MODE]=Vs.DEFAULT_MODE):(o=!1,s=(0,nr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Vs.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,Vs.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,nr.forEach)(s.modes,function(u,g){s.modes[g]=(0,nr.reject)(u,function(f){return(0,nr.isUndefined)(f)})});var a=(0,nr.keys)(s.modes);if((0,nr.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Vs.validatePatterns)(u,a))}),(0,nr.isEmpty)(i.lexerDefinitionErrors)){(0,vye.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,Vs.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,nr.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,nr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,nr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- -`);throw new Error(`Errors detected in definition of Lexer: -`+c)}(0,nr.forEach)(i.lexerDefinitionWarning,function(u){(0,nr.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(Vs.SUPPORT_STICKY?(i.chopInput=nr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=nr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=nr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=nr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=nr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,nr.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(t.ensureOptimizations&&!(0,nr.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. - Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. - Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,Pye.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,nr.toFastProperties)(i)})})}return r.prototype.tokenize=function(e,t){if(t===void 0&&(t=this.defaultMode),!(0,nr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,nr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- -`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: -`+n)}var s=this.tokenizeInternal(e,t);return s},r.prototype.tokenizeInternal=function(e,t){var i=this,n,s,o,a,l,c,u,g,f,h,p,C,w,B,v,D,T=e,H=T.length,j=0,$=0,V=this.hasCustom?0:Math.floor(e.length/10),W=new Array(V),Z=[],A=this.trackStartLines?1:void 0,ae=this.trackStartLines?1:void 0,ge=(0,Vs.cloneEmptyGroups)(this.emptyGroups),_=this.trackStartLines,L=this.config.lineTerminatorsPattern,N=0,ue=[],we=[],Te=[],Pe=[];Object.freeze(Pe);var Le=void 0;function se(){return ue}function Ae(dr){var Bi=(0,Vs.charCodeToOptimizedIndex)(dr),_n=we[Bi];return _n===void 0?Pe:_n}var be=function(dr){if(Te.length===1&&dr.tokenType.PUSH_MODE===void 0){var Bi=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(dr);Z.push({offset:dr.startOffset,line:dr.startLine!==void 0?dr.startLine:void 0,column:dr.startColumn!==void 0?dr.startColumn:void 0,length:dr.image.length,message:Bi})}else{Te.pop();var _n=(0,nr.last)(Te);ue=i.patternIdxToConfig[_n],we=i.charCodeToPatternIdxToConfig[_n],N=ue.length;var pa=i.canModeBeOptimized[_n]&&i.config.safeMode===!1;we&&pa?Le=Ae:Le=se}};function fe(dr){Te.push(dr),we=this.charCodeToPatternIdxToConfig[dr],ue=this.patternIdxToConfig[dr],N=ue.length,N=ue.length;var Bi=this.canModeBeOptimized[dr]&&this.config.safeMode===!1;we&&Bi?Le=Ae:Le=se}fe.call(this,t);for(var le;jc.length){c=a,u=g,le=tt;break}}}break}}if(c!==null){if(f=c.length,h=le.group,h!==void 0&&(p=le.tokenTypeIdx,C=this.createTokenInstance(c,j,p,le.tokenType,A,ae,f),this.handlePayload(C,u),h===!1?$=this.addToken(W,$,C):ge[h].push(C)),e=this.chopInput(e,f),j=j+f,ae=this.computeNewColumn(ae,f),_===!0&&le.canLineTerminator===!0){var It=0,Ur=void 0,oi=void 0;L.lastIndex=0;do Ur=L.test(c),Ur===!0&&(oi=L.lastIndex-1,It++);while(Ur===!0);It!==0&&(A=A+It,ae=f-oi,this.updateTokenEndLineColumnLocation(C,h,oi,It,A,ae,f))}this.handleModes(le,be,fe,C)}else{for(var pi=j,pr=A,di=ae,ai=!1;!ai&&j <"+e+">");var n=(0,nr.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",r.NA=/NOT_APPLICABLE/,r}();Rc.Lexer=kye});var HA=y(Si=>{"use strict";Object.defineProperty(Si,"__esModule",{value:!0});Si.tokenMatcher=Si.createTokenInstance=Si.EOF=Si.createToken=Si.hasTokenLabel=Si.tokenName=Si.tokenLabel=void 0;var Xs=Gt(),Rye=Jd(),kx=df();function Fye(r){return wq(r)?r.LABEL:r.name}Si.tokenLabel=Fye;function Nye(r){return r.name}Si.tokenName=Nye;function wq(r){return(0,Xs.isString)(r.LABEL)&&r.LABEL!==""}Si.hasTokenLabel=wq;var Tye="parent",hq="categories",pq="label",dq="group",Cq="push_mode",mq="pop_mode",Eq="longer_alt",Iq="line_breaks",yq="start_chars_hint";function Bq(r){return Lye(r)}Si.createToken=Bq;function Lye(r){var e=r.pattern,t={};if(t.name=r.name,(0,Xs.isUndefined)(e)||(t.PATTERN=e),(0,Xs.has)(r,Tye))throw`The parent property is no longer supported. -See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,Xs.has)(r,hq)&&(t.CATEGORIES=r[hq]),(0,kx.augmentTokenTypes)([t]),(0,Xs.has)(r,pq)&&(t.LABEL=r[pq]),(0,Xs.has)(r,dq)&&(t.GROUP=r[dq]),(0,Xs.has)(r,mq)&&(t.POP_MODE=r[mq]),(0,Xs.has)(r,Cq)&&(t.PUSH_MODE=r[Cq]),(0,Xs.has)(r,Eq)&&(t.LONGER_ALT=r[Eq]),(0,Xs.has)(r,Iq)&&(t.LINE_BREAKS=r[Iq]),(0,Xs.has)(r,yq)&&(t.START_CHARS_HINT=r[yq]),t}Si.EOF=Bq({name:"EOF",pattern:Rye.Lexer.NA});(0,kx.augmentTokenTypes)([Si.EOF]);function Oye(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:r.tokenTypeIdx,tokenType:r}}Si.createTokenInstance=Oye;function Mye(r,e){return(0,kx.tokenStructuredMatcher)(r,e)}Si.tokenMatcher=Mye});var Cn=y(Wt=>{"use strict";var ka=Wt&&Wt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Wt,"__esModule",{value:!0});Wt.serializeProduction=Wt.serializeGrammar=Wt.Terminal=Wt.Alternation=Wt.RepetitionWithSeparator=Wt.Repetition=Wt.RepetitionMandatoryWithSeparator=Wt.RepetitionMandatory=Wt.Option=Wt.Alternative=Wt.Rule=Wt.NonTerminal=Wt.AbstractProduction=void 0;var lr=Gt(),Uye=HA(),ko=function(){function r(e){this._definition=e}return Object.defineProperty(r.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),r.prototype.accept=function(e){e.visit(this),(0,lr.forEach)(this.definition,function(t){t.accept(e)})},r}();Wt.AbstractProduction=ko;var bq=function(r){ka(e,r);function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(t){},enumerable:!1,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(ko);Wt.NonTerminal=bq;var Qq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.orgText="",(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.Rule=Qq;var Sq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbiguities=!1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.Alternative=Sq;var vq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.Option=vq;var xq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.RepetitionMandatory=xq;var Pq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.RepetitionMandatoryWithSeparator=Pq;var Dq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.Repetition=Dq;var kq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.RepetitionWithSeparator=kq;var Rq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(t){this._definition=t},enumerable:!1,configurable:!0}),e}(ko);Wt.Alternation=Rq;var Ly=function(){function r(e){this.idx=1,(0,lr.assign)(this,(0,lr.pick)(e,function(t){return t!==void 0}))}return r.prototype.accept=function(e){e.visit(this)},r}();Wt.Terminal=Ly;function Kye(r){return(0,lr.map)(r,zd)}Wt.serializeGrammar=Kye;function zd(r){function e(s){return(0,lr.map)(s,zd)}if(r instanceof bq){var t={type:"NonTerminal",name:r.nonTerminalName,idx:r.idx};return(0,lr.isString)(r.label)&&(t.label=r.label),t}else{if(r instanceof Sq)return{type:"Alternative",definition:e(r.definition)};if(r instanceof vq)return{type:"Option",idx:r.idx,definition:e(r.definition)};if(r instanceof xq)return{type:"RepetitionMandatory",idx:r.idx,definition:e(r.definition)};if(r instanceof Pq)return{type:"RepetitionMandatoryWithSeparator",idx:r.idx,separator:zd(new Ly({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof kq)return{type:"RepetitionWithSeparator",idx:r.idx,separator:zd(new Ly({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof Dq)return{type:"Repetition",idx:r.idx,definition:e(r.definition)};if(r instanceof Rq)return{type:"Alternation",idx:r.idx,definition:e(r.definition)};if(r instanceof Ly){var i={type:"Terminal",name:r.terminalType.name,label:(0,Uye.tokenLabel)(r.terminalType),idx:r.idx};(0,lr.isString)(r.label)&&(i.terminalLabel=r.label);var n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(i.pattern=(0,lr.isRegExp)(n)?n.source:n),i}else{if(r instanceof Qq)return{type:"Rule",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error("non exhaustive match")}}}Wt.serializeProduction=zd});var My=y(Oy=>{"use strict";Object.defineProperty(Oy,"__esModule",{value:!0});Oy.RestWalker=void 0;var Rx=Gt(),mn=Cn(),Hye=function(){function r(){}return r.prototype.walk=function(e,t){var i=this;t===void 0&&(t=[]),(0,Rx.forEach)(e.definition,function(n,s){var o=(0,Rx.drop)(e.definition,s+1);if(n instanceof mn.NonTerminal)i.walkProdRef(n,o,t);else if(n instanceof mn.Terminal)i.walkTerminal(n,o,t);else if(n instanceof mn.Alternative)i.walkFlat(n,o,t);else if(n instanceof mn.Option)i.walkOption(n,o,t);else if(n instanceof mn.RepetitionMandatory)i.walkAtLeastOne(n,o,t);else if(n instanceof mn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,t);else if(n instanceof mn.RepetitionWithSeparator)i.walkManySep(n,o,t);else if(n instanceof mn.Repetition)i.walkMany(n,o,t);else if(n instanceof mn.Alternation)i.walkOr(n,o,t);else throw Error("non exhaustive match")})},r.prototype.walkTerminal=function(e,t,i){},r.prototype.walkProdRef=function(e,t,i){},r.prototype.walkFlat=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkOption=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkAtLeastOne=function(e,t,i){var n=[new mn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkAtLeastOneSep=function(e,t,i){var n=Fq(e,t,i);this.walk(e,n)},r.prototype.walkMany=function(e,t,i){var n=[new mn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkManySep=function(e,t,i){var n=Fq(e,t,i);this.walk(e,n)},r.prototype.walkOr=function(e,t,i){var n=this,s=t.concat(i);(0,Rx.forEach)(e.definition,function(o){var a=new mn.Alternative({definition:[o]});n.walk(a,s)})},r}();Oy.RestWalker=Hye;function Fq(r,e,t){var i=[new mn.Option({definition:[new mn.Terminal({terminalType:r.separator})].concat(r.definition)})],n=i.concat(e,t);return n}});var Cf=y(Uy=>{"use strict";Object.defineProperty(Uy,"__esModule",{value:!0});Uy.GAstVisitor=void 0;var Ro=Cn(),Gye=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case Ro.NonTerminal:return this.visitNonTerminal(t);case Ro.Alternative:return this.visitAlternative(t);case Ro.Option:return this.visitOption(t);case Ro.RepetitionMandatory:return this.visitRepetitionMandatory(t);case Ro.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case Ro.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case Ro.Repetition:return this.visitRepetition(t);case Ro.Alternation:return this.visitAlternation(t);case Ro.Terminal:return this.visitTerminal(t);case Ro.Rule:return this.visitRule(t);default:throw Error("non exhaustive match")}},r.prototype.visitNonTerminal=function(e){},r.prototype.visitAlternative=function(e){},r.prototype.visitOption=function(e){},r.prototype.visitRepetition=function(e){},r.prototype.visitRepetitionMandatory=function(e){},r.prototype.visitRepetitionMandatoryWithSeparator=function(e){},r.prototype.visitRepetitionWithSeparator=function(e){},r.prototype.visitAlternation=function(e){},r.prototype.visitTerminal=function(e){},r.prototype.visitRule=function(e){},r}();Uy.GAstVisitor=Gye});var Xd=y(Ui=>{"use strict";var Yye=Ui&&Ui.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Ui,"__esModule",{value:!0});Ui.collectMethods=Ui.DslMethodsCollectorVisitor=Ui.getProductionDslName=Ui.isBranchingProd=Ui.isOptionalProd=Ui.isSequenceProd=void 0;var Vd=Gt(),Qr=Cn(),jye=Cf();function qye(r){return r instanceof Qr.Alternative||r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionMandatory||r instanceof Qr.RepetitionMandatoryWithSeparator||r instanceof Qr.RepetitionWithSeparator||r instanceof Qr.Terminal||r instanceof Qr.Rule}Ui.isSequenceProd=qye;function Fx(r,e){e===void 0&&(e=[]);var t=r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionWithSeparator;return t?!0:r instanceof Qr.Alternation?(0,Vd.some)(r.definition,function(i){return Fx(i,e)}):r instanceof Qr.NonTerminal&&(0,Vd.contains)(e,r)?!1:r instanceof Qr.AbstractProduction?(r instanceof Qr.NonTerminal&&e.push(r),(0,Vd.every)(r.definition,function(i){return Fx(i,e)})):!1}Ui.isOptionalProd=Fx;function Jye(r){return r instanceof Qr.Alternation}Ui.isBranchingProd=Jye;function Wye(r){if(r instanceof Qr.NonTerminal)return"SUBRULE";if(r instanceof Qr.Option)return"OPTION";if(r instanceof Qr.Alternation)return"OR";if(r instanceof Qr.RepetitionMandatory)return"AT_LEAST_ONE";if(r instanceof Qr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(r instanceof Qr.RepetitionWithSeparator)return"MANY_SEP";if(r instanceof Qr.Repetition)return"MANY";if(r instanceof Qr.Terminal)return"CONSUME";throw Error("non exhaustive match")}Ui.getProductionDslName=Wye;var Nq=function(r){Yye(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.separator="-",t.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},t}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var i=t.terminalType.name+this.separator+"Terminal";(0,Vd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitNonTerminal=function(t){var i=t.nonTerminalName+this.separator+"Terminal";(0,Vd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(jye.GAstVisitor);Ui.DslMethodsCollectorVisitor=Nq;var Ky=new Nq;function zye(r){Ky.reset(),r.accept(Ky);var e=Ky.dslMethods;return Ky.reset(),e}Ui.collectMethods=zye});var Tx=y(Fo=>{"use strict";Object.defineProperty(Fo,"__esModule",{value:!0});Fo.firstForTerminal=Fo.firstForBranching=Fo.firstForSequence=Fo.first=void 0;var Hy=Gt(),Tq=Cn(),Nx=Xd();function Gy(r){if(r instanceof Tq.NonTerminal)return Gy(r.referencedRule);if(r instanceof Tq.Terminal)return Mq(r);if((0,Nx.isSequenceProd)(r))return Lq(r);if((0,Nx.isBranchingProd)(r))return Oq(r);throw Error("non exhaustive match")}Fo.first=Gy;function Lq(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;)s=t[i],o=(0,Nx.isOptionalProd)(s),e=e.concat(Gy(s)),i=i+1,n=t.length>i;return(0,Hy.uniq)(e)}Fo.firstForSequence=Lq;function Oq(r){var e=(0,Hy.map)(r.definition,function(t){return Gy(t)});return(0,Hy.uniq)((0,Hy.flatten)(e))}Fo.firstForBranching=Oq;function Mq(r){return[r.terminalType]}Fo.firstForTerminal=Mq});var Lx=y(Yy=>{"use strict";Object.defineProperty(Yy,"__esModule",{value:!0});Yy.IN=void 0;Yy.IN="_~IN~_"});var Yq=y(ls=>{"use strict";var Vye=ls&&ls.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(ls,"__esModule",{value:!0});ls.buildInProdFollowPrefix=ls.buildBetweenProdsFollowPrefix=ls.computeAllProdsFollows=ls.ResyncFollowsWalker=void 0;var Xye=My(),_ye=Tx(),Uq=Gt(),Kq=Lx(),Zye=Cn(),Hq=function(r){Vye(e,r);function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,i,n){},e.prototype.walkProdRef=function(t,i,n){var s=Gq(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new Zye.Alternative({definition:o}),l=(0,_ye.first)(a);this.follows[s]=l},e}(Xye.RestWalker);ls.ResyncFollowsWalker=Hq;function $ye(r){var e={};return(0,Uq.forEach)(r,function(t){var i=new Hq(t).startWalking();(0,Uq.assign)(e,i)}),e}ls.computeAllProdsFollows=$ye;function Gq(r,e){return r.name+e+Kq.IN}ls.buildBetweenProdsFollowPrefix=Gq;function ewe(r){var e=r.terminalType.name;return e+r.idx+Kq.IN}ls.buildInProdFollowPrefix=ewe});var _d=y(Ra=>{"use strict";Object.defineProperty(Ra,"__esModule",{value:!0});Ra.defaultGrammarValidatorErrorProvider=Ra.defaultGrammarResolverErrorProvider=Ra.defaultParserErrorProvider=void 0;var mf=HA(),twe=Gt(),_s=Gt(),Ox=Cn(),jq=Xd();Ra.defaultParserErrorProvider={buildMismatchTokenMessage:function(r){var e=r.expected,t=r.actual,i=r.previous,n=r.ruleName,s=(0,mf.hasTokenLabel)(e),o=s?"--> "+(0,mf.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+t.image+"' <--";return a},buildNotAllInputParsedMessage:function(r){var e=r.firstRedundant,t=r.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(r){var e=r.expectedPathsPerAlt,t=r.actual,i=r.previous,n=r.customUserDescription,s=r.ruleName,o="Expecting: ",a=(0,_s.first)(t).image,l=` -but found: '`+a+"'";if(n)return o+n+l;var c=(0,_s.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,_s.map)(c,function(h){return"["+(0,_s.map)(h,function(p){return(0,mf.tokenLabel)(p)}).join(", ")+"]"}),g=(0,_s.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences: -`+g.join(` -`);return o+f+l},buildEarlyExitMessage:function(r){var e=r.expectedIterationPaths,t=r.actual,i=r.customUserDescription,n=r.ruleName,s="Expecting: ",o=(0,_s.first)(t).image,a=` -but found: '`+o+"'";if(i)return s+i+a;var l=(0,_s.map)(e,function(u){return"["+(0,_s.map)(u,function(g){return(0,mf.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: - `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(Ra.defaultParserErrorProvider);Ra.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(r,e){var t="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- -inside top level rule: ->`+r.name+"<-";return t}};Ra.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(r,e){function t(u){return u instanceof Ox.Terminal?u.terminalType.name:u instanceof Ox.NonTerminal?u.nonTerminalName:""}var i=r.name,n=(0,_s.first)(e),s=n.idx,o=(0,jq.getProductionDslName)(n),a=t(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` - appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. - For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES - `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` -`),c},buildNamespaceConflictError:function(r){var e=`Namespace conflict found in grammar. -`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+r.name+`>. -`)+`To resolve this make sure each Terminal and Non-Terminal names are unique -This is easy to accomplish by using the convention that Terminal names start with an uppercase letter -and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(r){var e=(0,_s.map)(r.prefixPath,function(n){return(0,mf.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous alternatives: <"+r.ambiguityIndices.join(" ,")+`> due to common lookahead prefix -`+("in inside <"+r.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX -For Further details.`;return i},buildAlternationAmbiguityError:function(r){var e=(0,_s.map)(r.prefixPath,function(n){return(0,mf.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous Alternatives Detected: <"+r.ambiguityIndices.join(" ,")+"> in "+(" inside <"+r.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,i},buildEmptyRepetitionError:function(r){var e=(0,jq.getProductionDslName)(r.repetition);r.repetition.idx!==0&&(e+=r.repetition.idx);var t="The repetition <"+e+"> within Rule <"+r.topLevelRule.name+`> can never consume any tokens. -This could lead to an infinite loop.`;return t},buildTokenNameError:function(r){return"deprecated"},buildEmptyAlternationError:function(r){var e="Ambiguous empty alternative: <"+(r.emptyChoiceIdx+1)+">"+(" in inside <"+r.topLevelRule.name+`> Rule. -`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(r){var e=`An Alternation cannot have more than 256 alternatives: -`+(" inside <"+r.topLevelRule.name+`> Rule. - has `+(r.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(r){var e=r.topLevelRule.name,t=twe.map(r.leftRecursionPath,function(s){return s.name}),i=e+" --> "+t.concat([e]).join(" --> "),n=`Left Recursion found in grammar. -`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) -`)+(`without consuming any Tokens. The grammar path that causes this is: - `+i+` -`)+` To fix this refactor your grammar to remove the left recursion. -see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(r){return"deprecated"},buildDuplicateRuleNameError:function(r){var e;r.topLevelRule instanceof Ox.Rule?e=r.topLevelRule.name:e=r.topLevelRule;var t="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+r.grammarName+"<-";return t}}});var Wq=y(GA=>{"use strict";var rwe=GA&&GA.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(GA,"__esModule",{value:!0});GA.GastRefResolverVisitor=GA.resolveGrammar=void 0;var iwe=Hn(),qq=Gt(),nwe=Cf();function swe(r,e){var t=new Jq(r,e);return t.resolveRefs(),t.errors}GA.resolveGrammar=swe;var Jq=function(r){rwe(e,r);function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var t=this;(0,qq.forEach)((0,qq.values)(this.nameToTopRule),function(i){t.currTopLevel=i,i.accept(t)})},e.prototype.visitNonTerminal=function(t){var i=this.nameToTopRule[t.nonTerminalName];if(i)t.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:iwe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(nwe.GAstVisitor);GA.GastRefResolverVisitor=Jq});var $d=y(Lr=>{"use strict";var Fc=Lr&&Lr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Lr,"__esModule",{value:!0});Lr.nextPossibleTokensAfter=Lr.possiblePathsFrom=Lr.NextTerminalAfterAtLeastOneSepWalker=Lr.NextTerminalAfterAtLeastOneWalker=Lr.NextTerminalAfterManySepWalker=Lr.NextTerminalAfterManyWalker=Lr.AbstractNextTerminalAfterProductionWalker=Lr.NextAfterTokenWalker=Lr.AbstractNextPossibleTokensWalker=void 0;var zq=My(),Ut=Gt(),owe=Tx(),Dt=Cn(),Vq=function(r){Fc(e,r);function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,Ut.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Ut.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(t,i){i===void 0&&(i=[]),this.found||r.prototype.walk.call(this,t,i)},e.prototype.walkProdRef=function(t,i,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Ut.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(zq.RestWalker);Lr.AbstractNextPossibleTokensWalker=Vq;var awe=function(r){Fc(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(t,i,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new Dt.Alternative({definition:s});this.possibleTokTypes=(0,owe.first)(o),this.found=!0}},e}(Vq);Lr.NextAfterTokenWalker=awe;var Zd=function(r){Fc(e,r);function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(zq.RestWalker);Lr.AbstractNextTerminalAfterProductionWalker=Zd;var Awe=function(r){Fc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkMany=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Ut.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkMany.call(this,t,i,n)},e}(Zd);Lr.NextTerminalAfterManyWalker=Awe;var lwe=function(r){Fc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkManySep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Ut.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkManySep.call(this,t,i,n)},e}(Zd);Lr.NextTerminalAfterManySepWalker=lwe;var cwe=function(r){Fc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Ut.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOne.call(this,t,i,n)},e}(Zd);Lr.NextTerminalAfterAtLeastOneWalker=cwe;var uwe=function(r){Fc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Ut.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOneSep.call(this,t,i,n)},e}(Zd);Lr.NextTerminalAfterAtLeastOneSepWalker=uwe;function Xq(r,e,t){t===void 0&&(t=[]),t=(0,Ut.cloneArr)(t);var i=[],n=0;function s(c){return c.concat((0,Ut.drop)(r,n+1))}function o(c){var u=Xq(s(c),e,t);return i.concat(u)}for(;t.length=0;ge--){var _=B.definition[ge],L={idx:p,def:_.definition.concat((0,Ut.drop)(h)),ruleStack:C,occurrenceStack:w};g.push(L),g.push(o)}else if(B instanceof Dt.Alternative)g.push({idx:p,def:B.definition.concat((0,Ut.drop)(h)),ruleStack:C,occurrenceStack:w});else if(B instanceof Dt.Rule)g.push(fwe(B,p,C,w));else throw Error("non exhaustive match")}}return u}Lr.nextPossibleTokensAfter=gwe;function fwe(r,e,t,i){var n=(0,Ut.cloneArr)(t);n.push(r.name);var s=(0,Ut.cloneArr)(i);return s.push(1),{idx:e,def:r.definition,ruleStack:n,occurrenceStack:s}}});var eC=y(_t=>{"use strict";var $q=_t&&_t.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(_t,"__esModule",{value:!0});_t.areTokenCategoriesNotUsed=_t.isStrictPrefixOfPath=_t.containsPath=_t.getLookaheadPathsForOptionalProd=_t.getLookaheadPathsForOr=_t.lookAheadSequenceFromAlternatives=_t.buildSingleAlternativeLookaheadFunction=_t.buildAlternativesLookAheadFunc=_t.buildLookaheadFuncForOptionalProd=_t.buildLookaheadFuncForOr=_t.getProdType=_t.PROD_TYPE=void 0;var sr=Gt(),_q=$d(),hwe=My(),jy=df(),YA=Cn(),pwe=Cf(),li;(function(r){r[r.OPTION=0]="OPTION",r[r.REPETITION=1]="REPETITION",r[r.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",r[r.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",r[r.ALTERNATION=5]="ALTERNATION"})(li=_t.PROD_TYPE||(_t.PROD_TYPE={}));function dwe(r){if(r instanceof YA.Option)return li.OPTION;if(r instanceof YA.Repetition)return li.REPETITION;if(r instanceof YA.RepetitionMandatory)return li.REPETITION_MANDATORY;if(r instanceof YA.RepetitionMandatoryWithSeparator)return li.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof YA.RepetitionWithSeparator)return li.REPETITION_WITH_SEPARATOR;if(r instanceof YA.Alternation)return li.ALTERNATION;throw Error("non exhaustive match")}_t.getProdType=dwe;function Cwe(r,e,t,i,n,s){var o=tJ(r,e,t),a=Kx(o)?jy.tokenStructuredMatcherNoCategories:jy.tokenStructuredMatcher;return s(o,i,a,n)}_t.buildLookaheadFuncForOr=Cwe;function mwe(r,e,t,i,n,s){var o=rJ(r,e,n,t),a=Kx(o)?jy.tokenStructuredMatcherNoCategories:jy.tokenStructuredMatcher;return s(o[0],a,i)}_t.buildLookaheadFuncForOptionalProd=mwe;function Ewe(r,e,t,i){var n=r.length,s=(0,sr.every)(r,function(l){return(0,sr.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,sr.map)(l,function(D){return D.GATE}),u=0;u{"use strict";var Hx=zt&&zt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(zt,"__esModule",{value:!0});zt.checkPrefixAlternativesAmbiguities=zt.validateSomeNonEmptyLookaheadPath=zt.validateTooManyAlts=zt.RepetionCollector=zt.validateAmbiguousAlternationAlternatives=zt.validateEmptyOrAlternative=zt.getFirstNoneTerminal=zt.validateNoLeftRecursion=zt.validateRuleIsOverridden=zt.validateRuleDoesNotAlreadyExist=zt.OccurrenceValidationCollector=zt.identifyProductionForDuplicates=zt.validateGrammar=void 0;var er=Gt(),Sr=Gt(),No=Hn(),Gx=Xd(),Ef=eC(),bwe=$d(),Zs=Cn(),Yx=Cf();function Qwe(r,e,t,i,n){var s=er.map(r,function(h){return Swe(h,i)}),o=er.map(r,function(h){return jx(h,h,i)}),a=[],l=[],c=[];(0,Sr.every)(o,Sr.isEmpty)&&(a=(0,Sr.map)(r,function(h){return AJ(h,i)}),l=(0,Sr.map)(r,function(h){return lJ(h,e,i)}),c=gJ(r,e,i));var u=Pwe(r,t,i),g=(0,Sr.map)(r,function(h){return uJ(h,i)}),f=(0,Sr.map)(r,function(h){return aJ(h,r,n,i)});return er.flatten(s.concat(c,o,a,l,u,g,f))}zt.validateGrammar=Qwe;function Swe(r,e){var t=new oJ;r.accept(t);var i=t.allProductions,n=er.groupBy(i,nJ),s=er.pick(n,function(a){return a.length>1}),o=er.map(er.values(s),function(a){var l=er.first(a),c=e.buildDuplicateFoundError(r,a),u=(0,Gx.getProductionDslName)(l),g={message:c,type:No.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},f=sJ(l);return f&&(g.parameter=f),g});return o}function nJ(r){return(0,Gx.getProductionDslName)(r)+"_#_"+r.idx+"_#_"+sJ(r)}zt.identifyProductionForDuplicates=nJ;function sJ(r){return r instanceof Zs.Terminal?r.terminalType.name:r instanceof Zs.NonTerminal?r.nonTerminalName:""}var oJ=function(r){Hx(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}(Yx.GAstVisitor);zt.OccurrenceValidationCollector=oJ;function aJ(r,e,t,i){var n=[],s=(0,Sr.reduce)(e,function(a,l){return l.name===r.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});n.push({message:o,type:No.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}zt.validateRuleDoesNotAlreadyExist=aJ;function vwe(r,e,t){var i=[],n;return er.contains(e,r)||(n="Invalid rule override, rule: ->"+r+"<- cannot be overridden in the grammar: ->"+t+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:No.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:r})),i}zt.validateRuleIsOverridden=vwe;function jx(r,e,t,i){i===void 0&&(i=[]);var n=[],s=tC(e.definition);if(er.isEmpty(s))return[];var o=r.name,a=er.contains(s,r);a&&n.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:i}),type:No.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=er.difference(s,i.concat([r])),c=er.map(l,function(u){var g=er.cloneArr(i);return g.push(u),jx(r,u,t,g)});return n.concat(er.flatten(c))}zt.validateNoLeftRecursion=jx;function tC(r){var e=[];if(er.isEmpty(r))return e;var t=er.first(r);if(t instanceof Zs.NonTerminal)e.push(t.referencedRule);else if(t instanceof Zs.Alternative||t instanceof Zs.Option||t instanceof Zs.RepetitionMandatory||t instanceof Zs.RepetitionMandatoryWithSeparator||t instanceof Zs.RepetitionWithSeparator||t instanceof Zs.Repetition)e=e.concat(tC(t.definition));else if(t instanceof Zs.Alternation)e=er.flatten(er.map(t.definition,function(o){return tC(o.definition)}));else if(!(t instanceof Zs.Terminal))throw Error("non exhaustive match");var i=(0,Gx.isOptionalProd)(t),n=r.length>1;if(i&&n){var s=er.drop(r);return e.concat(tC(s))}else return e}zt.getFirstNoneTerminal=tC;var qx=function(r){Hx(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alternations=[],t}return e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}(Yx.GAstVisitor);function AJ(r,e){var t=new qx;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){var a=er.dropRight(o.definition),l=er.map(a,function(c,u){var g=(0,bwe.nextPossibleTokensAfter)([c],[],null,1);return er.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:No.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(er.compact(l))},[]);return n}zt.validateEmptyOrAlternative=AJ;function lJ(r,e,t){var i=new qx;r.accept(i);var n=i.alternations;n=(0,Sr.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=er.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,Ef.getLookaheadPathsForOr)(l,r,c,a),g=xwe(u,a,r,t),f=fJ(u,a,r,t);return o.concat(g,f)},[]);return s}zt.validateAmbiguousAlternationAlternatives=lJ;var cJ=function(r){Hx(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}(Yx.GAstVisitor);zt.RepetionCollector=cJ;function uJ(r,e){var t=new qx;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:o}),type:No.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}zt.validateTooManyAlts=uJ;function gJ(r,e,t){var i=[];return(0,Sr.forEach)(r,function(n){var s=new cJ;n.accept(s);var o=s.allProductions;(0,Sr.forEach)(o,function(a){var l=(0,Ef.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,Ef.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,Sr.isEmpty)((0,Sr.flatten)(f))){var h=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:No.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}zt.validateSomeNonEmptyLookaheadPath=gJ;function xwe(r,e,t,i){var n=[],s=(0,Sr.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,Sr.forEach)(l,function(u){var g=[c];(0,Sr.forEach)(r,function(f,h){c!==h&&(0,Ef.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,Ef.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=er.map(s,function(a){var l=(0,Sr.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:No.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function fJ(r,e,t,i){var n=[],s=(0,Sr.reduce)(r,function(o,a,l){var c=(0,Sr.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,Sr.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,Sr.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty(If,"__esModule",{value:!0});If.validateGrammar=If.resolveGrammar=void 0;var Wx=Gt(),Dwe=Wq(),kwe=Jx(),hJ=_d();function Rwe(r){r=(0,Wx.defaults)(r,{errMsgProvider:hJ.defaultGrammarResolverErrorProvider});var e={};return(0,Wx.forEach)(r.rules,function(t){e[t.name]=t}),(0,Dwe.resolveGrammar)(e,r.errMsgProvider)}If.resolveGrammar=Rwe;function Fwe(r){return r=(0,Wx.defaults)(r,{errMsgProvider:hJ.defaultGrammarValidatorErrorProvider}),(0,kwe.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}If.validateGrammar=Fwe});var yf=y(En=>{"use strict";var rC=En&&En.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(En,"__esModule",{value:!0});En.EarlyExitException=En.NotAllInputParsedException=En.NoViableAltException=En.MismatchedTokenException=En.isRecognitionException=void 0;var Nwe=Gt(),dJ="MismatchedTokenException",CJ="NoViableAltException",mJ="EarlyExitException",EJ="NotAllInputParsedException",IJ=[dJ,CJ,mJ,EJ];Object.freeze(IJ);function Twe(r){return(0,Nwe.contains)(IJ,r.name)}En.isRecognitionException=Twe;var qy=function(r){rC(e,r);function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),Lwe=function(r){rC(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=dJ,s}return e}(qy);En.MismatchedTokenException=Lwe;var Owe=function(r){rC(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=CJ,s}return e}(qy);En.NoViableAltException=Owe;var Mwe=function(r){rC(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=EJ,n}return e}(qy);En.NotAllInputParsedException=Mwe;var Uwe=function(r){rC(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=mJ,s}return e}(qy);En.EarlyExitException=Uwe});var Vx=y(Ki=>{"use strict";Object.defineProperty(Ki,"__esModule",{value:!0});Ki.attemptInRepetitionRecovery=Ki.Recoverable=Ki.InRuleRecoveryException=Ki.IN_RULE_RECOVERY_EXCEPTION=Ki.EOF_FOLLOW_KEY=void 0;var Jy=HA(),cs=Gt(),Kwe=yf(),Hwe=Lx(),Gwe=Hn();Ki.EOF_FOLLOW_KEY={};Ki.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function zx(r){this.name=Ki.IN_RULE_RECOVERY_EXCEPTION,this.message=r}Ki.InRuleRecoveryException=zx;zx.prototype=Error.prototype;var Ywe=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,cs.has)(e,"recoveryEnabled")?e.recoveryEnabled:Gwe.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=yJ)},r.prototype.getTokenToInsert=function(e){var t=(0,Jy.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t},r.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},r.prototype.tryInRepetitionRecovery=function(e,t,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),C=new Kwe.MismatchedTokenException(p,u,s.LA(0));C.resyncedTokens=(0,cs.dropRight)(l),s.SAVE_ERROR(C)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,t);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},r.prototype.shouldInRepetitionRecoveryBeTried=function(e,t,i){return!(i===!1||e===void 0||t===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))},r.prototype.getFollowsForInRuleRecovery=function(e,t){var i=this.getCurrentGrammarPath(e,t),n=this.getNextPossibleTokenTypes(i);return n},r.prototype.tryInRuleRecovery=function(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new zx("sad sad panda")},r.prototype.canPerformInRuleRecovery=function(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)},r.prototype.canRecoverWithSingleTokenInsertion=function(e,t){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,cs.isEmpty)(t))return!1;var n=this.LA(1),s=(0,cs.find)(t,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},r.prototype.canRecoverWithSingleTokenDeletion=function(e){var t=this.tokenMatcher(this.LA(2),e);return t},r.prototype.isInCurrentRuleReSyncSet=function(e){var t=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(t);return(0,cs.contains)(i,e)},r.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),t=this.LA(1),i=2;;){var n=t.tokenType;if((0,cs.contains)(e,n))return n;t=this.LA(i),i++}},r.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Ki.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(i)}},r.prototype.buildFullFollowKeyStack=function(){var e=this,t=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,cs.map)(t,function(n,s){return s===0?Ki.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(t[s-1])}})},r.prototype.flattenFollowSet=function(){var e=this,t=(0,cs.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,cs.flatten)(t)},r.prototype.getFollowSetFromFollowKey=function(e){if(e===Ki.EOF_FOLLOW_KEY)return[Jy.EOF];var t=e.ruleName+e.idxInCallingRule+Hwe.IN+e.inRule;return this.resyncFollows[t]},r.prototype.addToResyncTokens=function(e,t){return this.tokenMatcher(e,Jy.EOF)||t.push(e),t},r.prototype.reSyncTo=function(e){for(var t=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,t);return(0,cs.dropRight)(t)},r.prototype.attemptInRepetitionRecovery=function(e,t,i,n,s,o,a){},r.prototype.getCurrentGrammarPath=function(e,t){var i=this.getHumanReadableRuleStack(),n=(0,cs.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:t};return s},r.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,cs.map)(this.RULE_STACK,function(t){return e.shortRuleNameToFullName(t)})},r}();Ki.Recoverable=Ywe;function yJ(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=Jy.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(r,e,t,f)}Ki.attemptInRepetitionRecovery=yJ});var Wy=y(qt=>{"use strict";Object.defineProperty(qt,"__esModule",{value:!0});qt.getKeyForAutomaticLookahead=qt.AT_LEAST_ONE_SEP_IDX=qt.MANY_SEP_IDX=qt.AT_LEAST_ONE_IDX=qt.MANY_IDX=qt.OPTION_IDX=qt.OR_IDX=qt.BITS_FOR_ALT_IDX=qt.BITS_FOR_RULE_IDX=qt.BITS_FOR_OCCURRENCE_IDX=qt.BITS_FOR_METHOD_TYPE=void 0;qt.BITS_FOR_METHOD_TYPE=4;qt.BITS_FOR_OCCURRENCE_IDX=8;qt.BITS_FOR_RULE_IDX=12;qt.BITS_FOR_ALT_IDX=8;qt.OR_IDX=1<{"use strict";Object.defineProperty(zy,"__esModule",{value:!0});zy.LooksAhead=void 0;var Fa=eC(),$s=Gt(),wJ=Hn(),Na=Wy(),Nc=Xd(),qwe=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,$s.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:wJ.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,$s.has)(e,"maxLookahead")?e.maxLookahead:wJ.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,$s.isES2015MapSupported)()?new Map:[],(0,$s.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},r.prototype.preComputeLookaheadFunctions=function(e){var t=this;(0,$s.forEach)(e,function(i){t.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,Nc.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,$s.forEach)(s,function(g){var f=g.idx===0?"":g.idx;t.TRACE_INIT(""+(0,Nc.getProductionDslName)(g)+f,function(){var h=(0,Fa.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||t.maxLookahead,g.hasPredicates,t.dynamicTokensEnabled,t.lookAheadBuilderForAlternatives),p=(0,Na.getKeyForAutomaticLookahead)(t.fullRuleNameToShort[i.name],Na.OR_IDX,g.idx);t.setLaFuncCache(p,h)})}),(0,$s.forEach)(o,function(g){t.computeLookaheadFunc(i,g.idx,Na.MANY_IDX,Fa.PROD_TYPE.REPETITION,g.maxLookahead,(0,Nc.getProductionDslName)(g))}),(0,$s.forEach)(a,function(g){t.computeLookaheadFunc(i,g.idx,Na.OPTION_IDX,Fa.PROD_TYPE.OPTION,g.maxLookahead,(0,Nc.getProductionDslName)(g))}),(0,$s.forEach)(l,function(g){t.computeLookaheadFunc(i,g.idx,Na.AT_LEAST_ONE_IDX,Fa.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,Nc.getProductionDslName)(g))}),(0,$s.forEach)(c,function(g){t.computeLookaheadFunc(i,g.idx,Na.AT_LEAST_ONE_SEP_IDX,Fa.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,Nc.getProductionDslName)(g))}),(0,$s.forEach)(u,function(g){t.computeLookaheadFunc(i,g.idx,Na.MANY_SEP_IDX,Fa.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,Nc.getProductionDslName)(g))})})})},r.prototype.computeLookaheadFunc=function(e,t,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(t===0?"":t),function(){var l=(0,Fa.buildLookaheadFuncForOptionalProd)(t,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,Na.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,t);a.setLaFuncCache(c,l)})},r.prototype.lookAheadBuilderForOptional=function(e,t,i){return(0,Fa.buildSingleAlternativeLookaheadFunction)(e,t,i)},r.prototype.lookAheadBuilderForAlternatives=function(e,t,i,n){return(0,Fa.buildAlternativesLookAheadFunc)(e,t,i,n)},r.prototype.getKeyForAutomaticLookahead=function(e,t){var i=this.getLastExplicitRuleShortName();return(0,Na.getKeyForAutomaticLookahead)(i,e,t)},r.prototype.getLaFuncFromCache=function(e){},r.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},r.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},r.prototype.setLaFuncCache=function(e,t){},r.prototype.setLaFuncCacheUsingMap=function(e,t){this.lookAheadFuncsCache.set(e,t)},r.prototype.setLaFuncUsingObj=function(e,t){this.lookAheadFuncsCache[e]=t},r}();zy.LooksAhead=qwe});var bJ=y(To=>{"use strict";Object.defineProperty(To,"__esModule",{value:!0});To.addNoneTerminalToCst=To.addTerminalToCst=To.setNodeLocationFull=To.setNodeLocationOnlyOffset=void 0;function Jwe(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset{"use strict";Object.defineProperty(jA,"__esModule",{value:!0});jA.defineNameProp=jA.functionName=jA.classNameFromInstance=void 0;var Xwe=Gt();function _we(r){return SJ(r.constructor)}jA.classNameFromInstance=_we;var QJ="name";function SJ(r){var e=r.name;return e||"anonymous"}jA.functionName=SJ;function Zwe(r,e){var t=Object.getOwnPropertyDescriptor(r,QJ);return(0,Xwe.isUndefined)(t)||t.configurable?(Object.defineProperty(r,QJ,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}jA.defineNameProp=Zwe});var kJ=y(vi=>{"use strict";Object.defineProperty(vi,"__esModule",{value:!0});vi.validateRedundantMethods=vi.validateMissingCstMethods=vi.validateVisitor=vi.CstVisitorDefinitionError=vi.createBaseVisitorConstructorWithDefaults=vi.createBaseSemanticVisitorConstructor=vi.defaultVisit=void 0;var us=Gt(),iC=Xx();function vJ(r,e){for(var t=(0,us.keys)(r),i=t.length,n=0;n: - `+(""+s.join(` - -`).replace(/\n/g,` - `)))}}};return t.prototype=i,t.prototype.constructor=t,t._RULE_NAMES=e,t}vi.createBaseSemanticVisitorConstructor=$we;function eBe(r,e,t){var i=function(){};(0,iC.defineNameProp)(i,r+"BaseSemanticsWithDefaults");var n=Object.create(t.prototype);return(0,us.forEach)(e,function(s){n[s]=vJ}),i.prototype=n,i.prototype.constructor=i,i}vi.createBaseVisitorConstructorWithDefaults=eBe;var _x;(function(r){r[r.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",r[r.MISSING_METHOD=1]="MISSING_METHOD"})(_x=vi.CstVisitorDefinitionError||(vi.CstVisitorDefinitionError={}));function xJ(r,e){var t=PJ(r,e),i=DJ(r,e);return t.concat(i)}vi.validateVisitor=xJ;function PJ(r,e){var t=(0,us.map)(e,function(i){if(!(0,us.isFunction)(r[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,iC.functionName)(r.constructor)+" CST Visitor.",type:_x.MISSING_METHOD,methodName:i}});return(0,us.compact)(t)}vi.validateMissingCstMethods=PJ;var tBe=["constructor","visit","validateVisitor"];function DJ(r,e){var t=[];for(var i in r)(0,us.isFunction)(r[i])&&!(0,us.contains)(tBe,i)&&!(0,us.contains)(e,i)&&t.push({msg:"Redundant visitor method: <"+i+"> on "+(0,iC.functionName)(r.constructor)+` CST Visitor -There is no Grammar Rule corresponding to this method's name. -`,type:_x.REDUNDANT_METHOD,methodName:i});return t}vi.validateRedundantMethods=DJ});var FJ=y(Vy=>{"use strict";Object.defineProperty(Vy,"__esModule",{value:!0});Vy.TreeBuilder=void 0;var wf=bJ(),ti=Gt(),RJ=kJ(),rBe=Hn(),iBe=function(){function r(){}return r.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,ti.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:rBe.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=ti.NOOP,this.cstFinallyStateUpdate=ti.NOOP,this.cstPostTerminal=ti.NOOP,this.cstPostNonTerminal=ti.NOOP,this.cstPostRule=ti.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=wf.setNodeLocationFull,this.setNodeLocationFromNode=wf.setNodeLocationFull,this.cstPostRule=ti.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=ti.NOOP,this.setNodeLocationFromNode=ti.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=wf.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=wf.setNodeLocationOnlyOffset,this.cstPostRule=ti.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=ti.NOOP,this.setNodeLocationFromNode=ti.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=ti.NOOP,this.setNodeLocationFromNode=ti.NOOP,this.cstPostRule=ti.NOOP,this.setInitialNodeLocation=ti.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},r.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},r.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},r.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.setInitialNodeLocationFullRegular=function(e){var t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.cstInvocationStateUpdate=function(e,t){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},r.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},r.prototype.cstPostRuleFull=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?(i.endOffset=t.endOffset,i.endLine=t.endLine,i.endColumn=t.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},r.prototype.cstPostRuleOnlyOffset=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?i.endOffset=t.endOffset:i.startOffset=NaN},r.prototype.cstPostTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,wf.addTerminalToCst)(i,t,e),this.setNodeLocationFromToken(i.location,t)},r.prototype.cstPostNonTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,wf.addNoneTerminalToCst)(i,t,e),this.setNodeLocationFromNode(i.location,e.location)},r.prototype.getBaseCstVisitorConstructor=function(){if((0,ti.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,RJ.createBaseSemanticVisitorConstructor)(this.className,(0,ti.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},r.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,ti.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,RJ.createBaseVisitorConstructorWithDefaults)(this.className,(0,ti.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},r.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},r.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},r.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},r}();Vy.TreeBuilder=iBe});var TJ=y(Xy=>{"use strict";Object.defineProperty(Xy,"__esModule",{value:!0});Xy.LexerAdapter=void 0;var NJ=Hn(),nBe=function(){function r(){}return r.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(r.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),r.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):NJ.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?NJ.END_OF_FILE:this.tokVector[t]},r.prototype.consumeToken=function(){this.currIdx++},r.prototype.exportLexerState=function(){return this.currIdx},r.prototype.importLexerState=function(e){this.currIdx=e},r.prototype.resetLexerState=function(){this.currIdx=-1},r.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},r.prototype.getLexerPosition=function(){return this.exportLexerState()},r}();Xy.LexerAdapter=nBe});var OJ=y(_y=>{"use strict";Object.defineProperty(_y,"__esModule",{value:!0});_y.RecognizerApi=void 0;var LJ=Gt(),sBe=yf(),Zx=Hn(),oBe=_d(),aBe=Jx(),ABe=Cn(),lBe=function(){function r(){}return r.prototype.ACTION=function(e){return e.call(this)},r.prototype.consume=function(e,t,i){return this.consumeInternal(t,e,i)},r.prototype.subrule=function(e,t,i){return this.subruleInternal(t,e,i)},r.prototype.option=function(e,t){return this.optionInternal(t,e)},r.prototype.or=function(e,t){return this.orInternal(t,e)},r.prototype.many=function(e,t){return this.manyInternal(e,t)},r.prototype.atLeastOne=function(e,t){return this.atLeastOneInternal(e,t)},r.prototype.CONSUME=function(e,t){return this.consumeInternal(e,0,t)},r.prototype.CONSUME1=function(e,t){return this.consumeInternal(e,1,t)},r.prototype.CONSUME2=function(e,t){return this.consumeInternal(e,2,t)},r.prototype.CONSUME3=function(e,t){return this.consumeInternal(e,3,t)},r.prototype.CONSUME4=function(e,t){return this.consumeInternal(e,4,t)},r.prototype.CONSUME5=function(e,t){return this.consumeInternal(e,5,t)},r.prototype.CONSUME6=function(e,t){return this.consumeInternal(e,6,t)},r.prototype.CONSUME7=function(e,t){return this.consumeInternal(e,7,t)},r.prototype.CONSUME8=function(e,t){return this.consumeInternal(e,8,t)},r.prototype.CONSUME9=function(e,t){return this.consumeInternal(e,9,t)},r.prototype.SUBRULE=function(e,t){return this.subruleInternal(e,0,t)},r.prototype.SUBRULE1=function(e,t){return this.subruleInternal(e,1,t)},r.prototype.SUBRULE2=function(e,t){return this.subruleInternal(e,2,t)},r.prototype.SUBRULE3=function(e,t){return this.subruleInternal(e,3,t)},r.prototype.SUBRULE4=function(e,t){return this.subruleInternal(e,4,t)},r.prototype.SUBRULE5=function(e,t){return this.subruleInternal(e,5,t)},r.prototype.SUBRULE6=function(e,t){return this.subruleInternal(e,6,t)},r.prototype.SUBRULE7=function(e,t){return this.subruleInternal(e,7,t)},r.prototype.SUBRULE8=function(e,t){return this.subruleInternal(e,8,t)},r.prototype.SUBRULE9=function(e,t){return this.subruleInternal(e,9,t)},r.prototype.OPTION=function(e){return this.optionInternal(e,0)},r.prototype.OPTION1=function(e){return this.optionInternal(e,1)},r.prototype.OPTION2=function(e){return this.optionInternal(e,2)},r.prototype.OPTION3=function(e){return this.optionInternal(e,3)},r.prototype.OPTION4=function(e){return this.optionInternal(e,4)},r.prototype.OPTION5=function(e){return this.optionInternal(e,5)},r.prototype.OPTION6=function(e){return this.optionInternal(e,6)},r.prototype.OPTION7=function(e){return this.optionInternal(e,7)},r.prototype.OPTION8=function(e){return this.optionInternal(e,8)},r.prototype.OPTION9=function(e){return this.optionInternal(e,9)},r.prototype.OR=function(e){return this.orInternal(e,0)},r.prototype.OR1=function(e){return this.orInternal(e,1)},r.prototype.OR2=function(e){return this.orInternal(e,2)},r.prototype.OR3=function(e){return this.orInternal(e,3)},r.prototype.OR4=function(e){return this.orInternal(e,4)},r.prototype.OR5=function(e){return this.orInternal(e,5)},r.prototype.OR6=function(e){return this.orInternal(e,6)},r.prototype.OR7=function(e){return this.orInternal(e,7)},r.prototype.OR8=function(e){return this.orInternal(e,8)},r.prototype.OR9=function(e){return this.orInternal(e,9)},r.prototype.MANY=function(e){this.manyInternal(0,e)},r.prototype.MANY1=function(e){this.manyInternal(1,e)},r.prototype.MANY2=function(e){this.manyInternal(2,e)},r.prototype.MANY3=function(e){this.manyInternal(3,e)},r.prototype.MANY4=function(e){this.manyInternal(4,e)},r.prototype.MANY5=function(e){this.manyInternal(5,e)},r.prototype.MANY6=function(e){this.manyInternal(6,e)},r.prototype.MANY7=function(e){this.manyInternal(7,e)},r.prototype.MANY8=function(e){this.manyInternal(8,e)},r.prototype.MANY9=function(e){this.manyInternal(9,e)},r.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},r.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},r.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},r.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},r.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},r.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},r.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},r.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},r.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},r.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},r.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},r.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},r.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},r.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},r.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},r.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},r.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},r.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},r.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},r.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},r.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},r.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},r.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},r.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},r.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},r.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},r.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},r.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},r.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},r.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},r.prototype.RULE=function(e,t,i){if(i===void 0&&(i=Zx.DEFAULT_RULE_CONFIG),(0,LJ.contains)(this.definedRulesNames,e)){var n=oBe.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:Zx.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,t,i);return this[e]=o,o},r.prototype.OVERRIDE_RULE=function(e,t,i){i===void 0&&(i=Zx.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,aBe.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,t,i);return this[e]=s,s},r.prototype.BACKTRACK=function(e,t){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,t),!0}catch(n){if((0,sBe.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},r.prototype.getGAstProductions=function(){return this.gastProductionsCache},r.prototype.getSerializedGastProductions=function(){return(0,ABe.serializeGrammar)((0,LJ.values)(this.gastProductionsCache))},r}();_y.RecognizerApi=lBe});var HJ=y($y=>{"use strict";Object.defineProperty($y,"__esModule",{value:!0});$y.RecognizerEngine=void 0;var kr=Gt(),Gn=Wy(),Zy=yf(),MJ=eC(),Bf=$d(),UJ=Hn(),cBe=Vx(),KJ=HA(),nC=df(),uBe=Xx(),gBe=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,uBe.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=nC.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,kr.has)(t,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 - For Further details.`);if((0,kr.isArray)(e)){if((0,kr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. - Note that the first argument for the parser constructor - is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 - For Further details.`)}if((0,kr.isArray)(e))this.tokensMap=(0,kr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,kr.has)(e,"modes")&&(0,kr.every)((0,kr.flatten)((0,kr.values)(e.modes)),nC.isTokenType)){var i=(0,kr.flatten)((0,kr.values)(e.modes)),n=(0,kr.uniq)(i);this.tokensMap=(0,kr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,kr.isObject)(e))this.tokensMap=(0,kr.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=KJ.EOF;var s=(0,kr.every)((0,kr.values)(e),function(o){return(0,kr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?nC.tokenStructuredMatcherNoCategories:nC.tokenStructuredMatcher,(0,nC.augmentTokenTypes)((0,kr.values)(this.tokensMap))},r.prototype.defineRule=function(e,t,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' -Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,kr.has)(i,"resyncEnabled")?i.resyncEnabled:UJ.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,kr.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:UJ.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<t},r.prototype.orInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(Gn.OR_IDX,t),n=(0,kr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(t,e.ERR_MSG)},r.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new Zy.NotAllInputParsedException(t,e))}},r.prototype.subruleInternal=function(e,t,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,t,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},r.prototype.subruleInternalError=function(e,t,i){throw(0,Zy.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:i),delete e.partialCstResult),e},r.prototype.consumeInternal=function(e,t,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,t,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},r.prototype.consumeInternalError=function(e,t,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new Zy.MismatchedTokenException(n,t,s))},r.prototype.consumeInternalRecovery=function(e,t,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===cBe.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},r.prototype.saveRecogState=function(){var e=this.errors,t=(0,kr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}},r.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},r.prototype.ruleInvocationStateUpdate=function(e,t,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t,e)},r.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},r.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},r.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},r.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),KJ.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();$y.RecognizerEngine=gBe});var YJ=y(ew=>{"use strict";Object.defineProperty(ew,"__esModule",{value:!0});ew.ErrorHandler=void 0;var $x=yf(),eP=Gt(),GJ=eC(),fBe=Hn(),hBe=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,eP.has)(e,"errorMessageProvider")?e.errorMessageProvider:fBe.DEFAULT_PARSER_CONFIG.errorMessageProvider},r.prototype.SAVE_ERROR=function(e){if((0,$x.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,eP.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(r.prototype,"errors",{get:function(){return(0,eP.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),r.prototype.raiseEarlyExitException=function(e,t,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,GJ.getLookaheadPathsForOptionalProd)(e,s,t,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new $x.EarlyExitException(u,this.LA(1),this.LA(0)))},r.prototype.raiseNoAltException=function(e,t){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,GJ.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new $x.NoViableAltException(c,this.LA(1),l))},r}();ew.ErrorHandler=hBe});var JJ=y(tw=>{"use strict";Object.defineProperty(tw,"__esModule",{value:!0});tw.ContentAssist=void 0;var jJ=$d(),qJ=Gt(),pBe=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,qJ.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,jJ.nextPossibleTokensAfter)([i],t,this.tokenMatcher,this.maxLookahead)},r.prototype.getNextPossibleTokenTypes=function(e){var t=(0,qJ.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new jJ.NextAfterTokenWalker(n,e).startWalking();return s},r}();tw.ContentAssist=pBe});var e3=y(nw=>{"use strict";Object.defineProperty(nw,"__esModule",{value:!0});nw.GastRecorder=void 0;var In=Gt(),Lo=Cn(),dBe=Jd(),XJ=df(),_J=HA(),CBe=Hn(),mBe=Wy(),iw={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(iw);var WJ=!0,zJ=Math.pow(2,mBe.BITS_FOR_OCCURRENCE_IDX)-1,ZJ=(0,_J.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:dBe.Lexer.NA});(0,XJ.augmentTokenTypes)([ZJ]);var $J=(0,_J.createTokenInstance)(ZJ,`This IToken indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze($J);var EBe={name:`This CSTNode indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},IBe=function(){function r(){}return r.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},r.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var t=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)t(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},r.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var t=0;t<10;t++){var i=t>0?t:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},r.prototype.ACTION_RECORD=function(e){},r.prototype.BACKTRACK_RECORD=function(e,t){return function(){return!0}},r.prototype.LA_RECORD=function(e){return CBe.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new Lo.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),t.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` - This error was thrown during the "grammar recording phase" For more info see: - https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}},r.prototype.optionInternalRecord=function(e,t){return sC.call(this,Lo.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){sC.call(this,Lo.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){sC.call(this,Lo.RepetitionMandatoryWithSeparator,t,e,WJ)},r.prototype.manyInternalRecord=function(e,t){sC.call(this,Lo.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){sC.call(this,Lo.RepetitionWithSeparator,t,e,WJ)},r.prototype.orInternalRecord=function(e,t){return yBe.call(this,e,t)},r.prototype.subruleInternalRecord=function(e,t,i){if(rw(t),!e||(0,In.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,In.peek)(this.recordingProdStack),o=e.ruleName,a=new Lo.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?EBe:iw},r.prototype.consumeInternalRecord=function(e,t,i){if(rw(t),!(0,XJ.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,In.peek)(this.recordingProdStack),o=new Lo.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),$J},r}();nw.GastRecorder=IBe;function sC(r,e,t,i){i===void 0&&(i=!1),rw(t);var n=(0,In.peek)(this.recordingProdStack),s=(0,In.isFunction)(e)?e:e.DEF,o=new r({definition:[],idx:t});return i&&(o.separator=e.SEP),(0,In.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),iw}function yBe(r,e){var t=this;rw(e);var i=(0,In.peek)(this.recordingProdStack),n=(0,In.isArray)(r)===!1,s=n===!1?r:r.DEF,o=new Lo.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});(0,In.has)(r,"MAX_LOOKAHEAD")&&(o.maxLookahead=r.MAX_LOOKAHEAD);var a=(0,In.some)(s,function(l){return(0,In.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,In.forEach)(s,function(l){var c=new Lo.Alternative({definition:[]});o.definition.push(c),(0,In.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,In.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),t.recordingProdStack.push(c),l.ALT.call(t),t.recordingProdStack.pop()}),iw}function VJ(r){return r===0?"":""+r}function rw(r){if(r<0||r>zJ){var e=new Error("Invalid DSL Method idx value: <"+r+`> - `+("Idx value must be a none negative value smaller than "+(zJ+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var r3=y(sw=>{"use strict";Object.defineProperty(sw,"__esModule",{value:!0});sw.PerformanceTracer=void 0;var t3=Gt(),wBe=Hn(),BBe=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,t3.has)(e,"traceInitPerf")){var t=e.traceInitPerf,i=typeof t=="number";this.traceInitMaxIdent=i?t:1/0,this.traceInitPerf=i?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=wBe.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,t3.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r}();sw.PerformanceTracer=BBe});var i3=y(ow=>{"use strict";Object.defineProperty(ow,"__esModule",{value:!0});ow.applyMixins=void 0;function bBe(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(r.prototype,n,s):r.prototype[n]=t.prototype[n]}})})}ow.applyMixins=bBe});var Hn=y(Cr=>{"use strict";var o3=Cr&&Cr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Cr,"__esModule",{value:!0});Cr.EmbeddedActionsParser=Cr.CstParser=Cr.Parser=Cr.EMPTY_ALT=Cr.ParserDefinitionErrorType=Cr.DEFAULT_RULE_CONFIG=Cr.DEFAULT_PARSER_CONFIG=Cr.END_OF_FILE=void 0;var _i=Gt(),QBe=Yq(),n3=HA(),a3=_d(),s3=pJ(),SBe=Vx(),vBe=BJ(),xBe=FJ(),PBe=TJ(),DBe=OJ(),kBe=HJ(),RBe=YJ(),FBe=JJ(),NBe=e3(),TBe=r3(),LBe=i3();Cr.END_OF_FILE=(0,n3.createTokenInstance)(n3.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(Cr.END_OF_FILE);Cr.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:a3.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});Cr.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var OBe;(function(r){r[r.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",r[r.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",r[r.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",r[r.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",r[r.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",r[r.LEFT_RECURSION=5]="LEFT_RECURSION",r[r.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",r[r.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",r[r.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",r[r.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",r[r.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",r[r.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(OBe=Cr.ParserDefinitionErrorType||(Cr.ParserDefinitionErrorType={}));function MBe(r){return r===void 0&&(r=void 0),function(){return r}}Cr.EMPTY_ALT=MBe;var aw=function(){function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(t),i.initLexerAdapter(),i.initLooksAhead(t),i.initRecognizerEngine(e,t),i.initRecoverable(t),i.initTreeBuilder(t),i.initContentAssist(),i.initGastRecorder(t),i.initPerformanceTracer(t),(0,_i.has)(t,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. - Please use the flag on the relevant DSL method instead. - See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES - For further details.`);this.skipValidations=(0,_i.has)(t,"skipValidations")?t.skipValidations:Cr.DEFAULT_PARSER_CONFIG.skipValidations}return r.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},r.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var t;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,_i.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,_i.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,s3.resolveGrammar)({rules:(0,_i.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,_i.isEmpty)(n)&&e.skipValidations===!1){var s=(0,s3.validateGrammar)({rules:(0,_i.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,_i.values)(e.tokensMap),errMsgProvider:a3.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,_i.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,QBe.computeAllProdsFollows)((0,_i.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,_i.values)(e.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,_i.isEmpty)(e.definitionErrors))throw t=(0,_i.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: - `+t.join(` -------------------------------- -`))})},r.DEFER_DEFINITION_ERRORS_HANDLING=!1,r}();Cr.Parser=aw;(0,LBe.applyMixins)(aw,[SBe.Recoverable,vBe.LooksAhead,xBe.TreeBuilder,PBe.LexerAdapter,kBe.RecognizerEngine,DBe.RecognizerApi,RBe.ErrorHandler,FBe.ContentAssist,NBe.GastRecorder,TBe.PerformanceTracer]);var UBe=function(r){o3(e,r);function e(t,i){i===void 0&&(i=Cr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,_i.cloneObj)(i);return s.outputCst=!0,n=r.call(this,t,s)||this,n}return e}(aw);Cr.CstParser=UBe;var KBe=function(r){o3(e,r);function e(t,i){i===void 0&&(i=Cr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,_i.cloneObj)(i);return s.outputCst=!1,n=r.call(this,t,s)||this,n}return e}(aw);Cr.EmbeddedActionsParser=KBe});var l3=y(Aw=>{"use strict";Object.defineProperty(Aw,"__esModule",{value:!0});Aw.createSyntaxDiagramsCode=void 0;var A3=Ix();function HBe(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+A3.VERSION+"/diagrams/":i,s=t.css,o=s===void 0?"https://unpkg.com/chevrotain@"+A3.VERSION+"/diagrams/diagrams.css":s,a=` - - - - - -`,l=` - -`,c=` -